AVR-gcc tablice dwuwymiarowe

Loading thread data ...

Krzysztof wrote: [...]

Bo inicjalizujesz jak tablice jednowymiarowa.

= { {0x50,0xA0,0x00,0x41,0xF6,0x10,11}, {0x58,0x00,0x00,0x41,0xFC,0x9C,11}, {0x5F,0x60,0x00,0x42,0x02,0x26,13}, {0x42,0x04,0x9C,0x42,0x00,0x00,9}, {0x66,0xC0,0x00,0x42,0x06,0x00,14}, {0x49,0x00,0x00,0x42,0x0B,0x02,10}, {0x50,0xC0,0x00,0x42,0x10,0x3F,11}, {0x58,0x20,0x00,0x42,0x14,0x9C,12}, {0x5F,0x00,0x00,0x42,0x18,0x4D,13}, {0x66,0xE0,0x00,0x42,0x1B,0x77,14}, {0x42,0x22,0x00,0x42,0x24,0x9C,9}, {0x49,0x80,0x00,0x42,0x27,0xCF,10}, {0x50,0xE0,0x00,0x42,0x2A,0x6D,11}, {0x58,0x40,0x00,0x42,0x2C,0x9C,12}, {0x5F,0xA0,0x00,0x42,0x2E,0x75,13}, {0x67,0x00,0x00,0x42,0x30,0x0A,14} };

Reply to
drazsyrd

Nadmienie tylko, ze niektore kompilatory akceptuja takze pierwsza wersje, odpowiednio rozmieszczajac dane w pamieci, tak ze suma sumarum dostajemy "tablice tablic".

Reply to
arkadiusz.antoniak

Wydaje mi sie, ze robi to kazdy kompilator. Tak naprawde, nie ma tablic wielowymiarowych (tak jak w innych jezykach programowania: VB, C#, Java). Nazwa tablicy jest niejawnym wskaznikiem na pierwszy element tablicy.

Zrob test:

int tt[][3] = {{1,2,3}, {4,5,6}}; int* ptr = (int*)tt;

for (int i = 0; i < 6; i++) printf("%d\n", *(ptr + i));

Reply to
drazsyrd

To kiedys bylo w standardzie C wymienione. Nie wiem jak w nowszych wersjach. Ale jak widac koledze kompilator zglosil tylko warning.

Oj sie mylisz. Tzn jest, ale jest tez czyms wiecej. W tych innych jezykach bywa bardzo podobnie, choc za obiektowe nie recze.

a sprobuj: printf("%d\n", *(tt + i));

:-)

J.

Reply to
J.F.

IMHO aż warning :)

Reply to
arkadiusz.antoniak

J.F. wrote: [...]

[...]

Zgadza sie. Dosc niefortunne było moje sformułowanie. Chodzilo mi o to, ze tablica wielowymiarowa pamietana jest jako liniwa tablica elementow. Jezeli tablica deklarowana jest jako wielowymiarowa, to pomiedzy elementami podtablic nie sa w pamieci umieszczane zadne inne dane (dlatego swobodnie moze byc dokonany cast na tablice jednowymiarowa i dostawac sie do wszystkich elementow tablicy wielowymiarowej). Wrocmy do poprzedniego przykladu (mysle ze teraz bedzie jescze lepiej widac):

int a = -1; int tt[][3] = {{1,2,3}, {4,5,6}}; int b = -2; int* ptr = (int*)tt;

for (int i = -1; i < 7; i++) printf("%d\n", *(ptr + i));

W innych jezykach moze byc bardzo niepodobnie :) Zwlaszcz, ze czesc z jezykow pozwala definiowac tablice o indeksach roznych od 0 do (size - 1) albo wielkosc podtablic moze byc rozna (w c/c++ tylko prostokatne, dopiero tablica wskaznikow pozwala symulowac tablice wielowymiarowe o roznych rozmiarach podtablic).

Reply to
drazsyrd

J.F. wrote: [...]

for (int i = 0; i < 2; i++) for(int j = 0; j < 3; j++) printf("%d\n", *(*(tt + i) + j));

tt jest niejawnym wskaznikiem na pierwszy element tablicy tt.

Reply to
drazsyrd

drazsyrd wrote: [...]

Moze jeszcze jasniej.

Tablica jednowymiarowa w pamieci wyglada tak:

x0, x1, x2, x3, .....

gdzie x0, x1, .... to kolejne elementy tablicy jakiegos typu "bazowego" (mniejsza, co to jest)

w tablicy wielowymiarowej, elementami tablicy wiekszego wymiaru sa podtablice, elementami "najnizszej" podtablicy sa elementy "bazowe".

Ale w pamieci nie ma, pomiedzy podtablicami zadnych wskaznikow. Czyli nie ma czegos takiego:

p1, x0, x1, x2, p2, x3, x4, x5 (gdzie p0, p1 to hipotetyczne wskazniki na podtablice)

tylko dalej:

x0, x1, x2, x3, x4, x5

Tak wiec patrzac na obszar pamieci zajmowany przez tablice jedno, lub wielowymiarowa, widzimy to samo.

Reply to
drazsyrd

Warning oznacza ze udalo mu sie wygenerowac poprawny kod.

A czy zgodny z zamiarami programisty ... to trzeba sprawdzic :-)

J.

Reply to
J.F.

raczej brak bledow, niz obecnosc warningow ;). tak jakby ktos chcial sie wglebiac... ;)

trzeba :)

Reply to
arkadiusz.antoniak

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.