Czy da sie stworzyc dynamiczna tablice dwuwymiarowa tak by dodanie elementu powodowalo zweikszenie jej rozmiaru
w czasie rzeczywistym i tym samym jak skasuje element i przesune wszystkie dalsze o jeden wyzej to zeby rozmiar mogl byc zmniejszony ?
i przesune wszystkie dalsze o jeden wyzej
nie wiem o co chodzi
w c++ polecam wyszukiwanie w googlach: c++ vector
może szukasz czegoś takiego jak lista? (możesz to zaimplementować również w c), aczkolwiek w c++ jest to zrobione za ciebie więc lepiej użyć (list< list<int> > lista; - przykład na int, ale możesz zmienić na dowolny typ)
Do takich rzeczy używa się wektorów. Tablica nie zmienia swoich rozmiarów.
Koledzy, w tagach jest "C", nie "C++". Wektorów tam nie ma.
Odpowiadając na pytanie: nie da się. Możesz opakować sobie tablicę i robić relokacje, ale to jest upierdliwe, wrażliwe na błędy i niepotrzebnie przerzuca dane w pamięci. Drugim rozwiązaniem jest lista powiązana i zazwyczaj ten sposób się stosuje w takich przypadkach.
nie lepiej zarezerwować se miejsca więcej niż potrzeba i po prostu w innych zmiennych zapisać se aktualnie używany "rozmiar"?
Przeciętny komputer ma 1GiB RAMu, z czego 50% trzeba liczyć na systemowe pierdoły,, czyli 512MiB zostaje. To pozwala zrobić tablicę 134217728 intów, kwadrat 11585 komórek. Tablica "dynamiczna" o wcześniej ustalonym rozmiarze 100x100, jak przeciętnie potrzeba 20x20 w niczym nie przeszkodzi.
typedef struct {
int tab[100][100];
int width=0;
int height=0;
} Tab;
void setInTable(Tab *tab, int x, int y, int val); //przykładowa funkcja do zarządzania tablicą
Nie pamiętam jak się tam w C struktury robiło, bo zazwyczaj używam kompilatora C++
A wszelkie zachowanie tablicy trzeba sobie zaprogramować, jeśli nie jest dostarczone "standardowo". Nie wszystko jest podane gotowe na tacy, tzn. w standardowych bibliotekach.
Chyba cię Razi pogięło. Dałeś najgorszą możliwą radę.
oczywiście że się da. Można to zrobić na wiele sposobów. Tak naprawdę tablicę dwuwymiarowe są przechowywane w komputerze jako jednowymiarowe - a zaimplementowanie takiej tablicy tak żeby zmieniała swój rozmiar jest banalnie proste..
musisz tylko zrobić prawidłowe odwzorowanie tablicy jednowymiarowej na dwuwymiarową....
np. tablica intów:
tsize = 100;
int tempSize = tsize;
int * table = (int * ) malloc( tsize * sizeof(int));
for( i = 0; i < 200 ;i++ )
{
if( i >=tsize)
{
tempSize = tsize;
tsize = 2 * tsize; // w tym miejscu można sobie ustalić dowolny rozmiar ..można powiekszać tablicę o jeden element ale // to nie ma za bardzo sensu.....
int * temp = malloc( tempSize * sizeof( int ));
for .....
{
// przepisz zawartosc table do temp;
}
table * = malloc( sizeof(int) * tsize );
for.. przepisz temp do table
{
}
free(temp);
}
}
Ludzie, dajecie zupełnie niepotrzebne i złe rady. Kumashiro odpowiedział poprawnie na pytanie i na tym powinno się skończyć. Napisał też, że realokacje są złym pomysłem (między innymi dlatego, że są nadmiernie kosztowne), a wy ciągniecie to dalej.
nie wiem czy to dobry pomysł ale jak byś sobie zrobił listę powiązaną taką że każdy wagonik listy miałby wskaźnik do swoich sąsiadów: górny, dolny , prawy lewy to by może było lepsze ale nie próbowałem czegoś takiego robić..
można też zrobić tablica dynamiczną ze zwisającymi tablicami dynamicznymi.... czyli....
int ** table = (int **) malloc( sizoef( int * ) * 100 );
for( el in table )
{
el[i] = malloc( sizeof(int) * 200 ) ;//zwisająca tablica lub lista....
}
miało to wyglądać tak:
int ** table = (int ) malloc( sizoef( int * ) * 100 );
for( el in table )
{
el[i] = malloc( sizeof(int) * 200 ) ;//zwisająca tablica lub lista....
}
Artykuł na ten temat:
http://www.codeproject.com/KB/cpp/arrayDinamic.aspx
#include <iostream>
using namespace std;
int main()
{
int i, j, k, m, dim1, dim2, dim3;
cout << "Wpisz wymiary tablic: ";
cin >> dim1 >> dim2 >> dim3;
int (*pa)[dim2][dim3] = new int[dim1][dim2][dim3];
int ***pa = new int **[dim1];
for (i = 0; i < dim1; i++) {
pa[i]= new int *[dim2];
}
for (i = 0; i < dim1; i++) {
for (j = 0; j < dim2; j++) {
pa[i][j]= new int[dim3];
}
}
m = 0;
for (i = 0; i < dim1; i++)
for (j = 0; j < dim2; j++)
for (k = 0; k < dim3; k++)
pa[i][j][k] = m++;
cout << "Wartosc elementu (0,0,0): " << pa[0][0][0] << endl;
cout << "Wartosc elementu (1,2,1): " << pa[1][2][1] << endl; /
cout << " Wartosc ostatniego elementu " << pa[dim1 - 1][dim2 - 1][dim3 - 1];
cout << "\n\n";
delete[] pa;
system("PAUSE");
return 0;
}
w C++ wszystko się da...
Czy ty czytać nie potrafisz? Wiesz w ogóle o co chodzi autorowi wątku? Bo na pewno nie o to, coś naskrobał.
Z tego programu co naskrobales to cieknie (memory leak) aż mokro..
no może i cieknie ale chciałem tylko pokazać że w C++ można wszystko....wiem o co chodziło autorowi wątku.
No, póki co pokazałeś, że można i w C++ napisać spierdolony kod.
ale ja autorowi wątku nie dam gotowca - pokazałem mu tylko co da się w C++ a da się bardzo wiele...
dlaczego przy każdej mojej odpowiedzi pojawia się -1 -2 ..-n ...czy jakiś tajemniczy X próbuję mnie poniżyć w ten sposób?
nie zajmuję się już pisaniem programów za pieniądze - kiedyś to robiłem ale chcieli mnie zniszczyć i wykorzystywać więc dałem sobie z tym spokój.
to nie chodzi tylko o to - po prostu miałem dość.
w C także można napisać kod który da radę zrobić to o co chodzi autorowi.
typedef struct list List;
struct list
{
// wartość przechowywana (tu przydałyby się wzorce z C++)
int myInt;
// następna wartość oraz poprzednia
List* next;
List* prev;
};
// przy okazji przydałoby się przeładowanie operator[], ale, że C jest językiem proceduralnym, to łatwo można wszystkim zarządzać za pomocą funkcji.
gościu gdybym to ja napisał co ty to bym dostał poniżenie ale za to że ty to napisałeś to już jest ok.....