Czy można stworzyc tablice dynamiczna dwuwymiarowa ?

Odpowiedz Nowy wątek
2011-08-23 11:08
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 ?

Pozostało 580 znaków

2011-08-23 11:13
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)


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2011-08-23 11:14

Pozostało 580 znaków

2011-08-23 11:14
1

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


Pozostało 580 znaków

2011-08-23 11:20
Kumashiro
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.

Nie wiem gdzie widzisz to "c".. Ten temat nie jest otagowany - ujemny 2011-08-23 13:37
LOL,ślepy...zapodaj ujemy ctrl+f,wpisz "Tagi:" i zdziw się - MasterBLB 2011-08-23 15:04
sory rzeczywiście. - ujemny 2011-08-23 18:56

Pozostało 580 znaków

2011-08-23 14:19
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.

To jest dobre do testów jak jedna osoba programuje np jak zrobic dynamiecznie i na wektorach a inna na sztywno sprawdza bo wprowadza na przyklad testowe dane wiec moze sobie zrobic 100 na 100 i sprawdzi na 20 x 20 ale finalnie musi byc na nieskonczona ilosc danych. Tak jak sie projektuje kazda aplikacje. Nie mozna z gory zalozyc chyba ze sie to oprogramuje ze moze byc max 100. ale tutaj tak nie moze byc :( - masterO 2011-08-23 14:36
No to zamiast tab[100][100] to **tab i w funkcjach zarządzania dodatkowo sie mallociem i reallociem bawić. Ale z tego co wiem, to lepiej na start dać więcej niż potem czekać aż znajdzie odpowiednio długi fragment wolnej pamięci. - Razi91 2011-08-23 14:49

Pozostało 580 znaków

2011-08-23 14:28
Rev
0

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


Pozostało 580 znaków

2011-08-23 14:39
nnn
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);
   }
}
Tak naprawdę tablicę dwuwymiarowe są przechowywane w komputerze jako jednowymiarowe - bez "tablice wskaźników" lub "<nie wiem jak się nazywają te tablice co się deklaruje tak: typ x[23][3444]>" - krwq 2011-08-23 18:55

Pozostało 580 znaków

2011-08-23 14:47
Rev
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.


Pozostało 580 znaków

2011-08-23 14:47
nnn
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....
}

Pozostało 580 znaków

2011-08-23 14:48
nnn
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...

Pozostało 580 znaków

2011-08-23 15:15
Rev
1

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


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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