Czy można stworzyc tablice dynamiczna dwuwymiarowa ?

0

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 ?

1

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)

1

Do takich rzeczy używa się wektorów. Tablica nie zmienia swoich rozmiarów.

3

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.

0

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.

0

Chyba cię Razi pogięło. Dałeś najgorszą możliwą radę.

1

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);
   }
}
1

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.

1

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....
}

0

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...

1

Czy ty czytać nie potrafisz? Wiesz w ogóle o co chodzi autorowi wątku? Bo na pewno nie o to, coś naskrobał.

1

Z tego programu co naskrobales to cieknie (memory leak) aż mokro..

0

no może i cieknie ale chciałem tylko pokazać że w C++ można wszystko....wiem o co chodziło autorowi wątku.

2

No, póki co pokazałeś, że można i w C++ napisać spierdolony kod.

0

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?

2

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.

2

to nie chodzi tylko o to - po prostu miałem dość.

1

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.
0

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.....

1 użytkowników online, w tym zalogowanych: 0, gości: 1