Re: AVR-gcc tablice dwuwymiarowe



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: arkadiusz.antoniak_at_nospam_wp.pl
Subject: Re: AVR-gcc tablice dwuwymiarowe
Date: 11 Apr 2006 08:31:52 -0700


Sebastor wrote:
Powinno byc tak np

unsigned char kanaly[2][2]={{1,2},{3,4}};

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


Poprzedni Następny
Wiadomość
Spis treści
From: drazsyrd <drazsyrd_at_nospam_poczta.onet.pl>
Subject: Re: AVR-gcc tablice dwuwymiarowe
Date: Wed, 12 Apr 2006 09:27:24 +0200


arkadiusz.antoniak_at_nospam_wp.pl wrote:
Sebastor wrote:

Powinno byc tak np

unsigned char kanaly[2][2]={{1,2},{3,4}};


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

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

Poprzedni Następny
Wiadomość
Spis treści
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: AVR-gcc tablice dwuwymiarowe
Date: Wed, 12 Apr 2006 10:24:06 +0200


On Wed, 12 Apr 2006 09:27:24 +0200, drazsyrd wrote:
unsigned char kanaly[2][2]={{1,2},{3,4}};

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

Wydaje mi sie, ze robi to kazdy kompilator.

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

Tak naprawde, nie ma tablic wielowymiarowych (tak jak w innych jezykach
programowania: VB, C#, Java). Nazwa tablicy jest niejawnym wskaznikiem
na pierwszy element tablicy.

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

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

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

-)

J.


Poprzedni Następny
Wiadomość
Spis treści
From: arkadiusz.antoniak_at_nospam_wp.pl
Subject: Re: AVR-gcc tablice dwuwymiarowe
Date: 12 Apr 2006 02:39:55 -0700


J=2EF. wrote:
kompilator zglosil tylko warning.

IMHO a=BF warning :)


Poprzedni Następny
Wiadomość
Spis treści
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: AVR-gcc tablice dwuwymiarowe
Date: Wed, 12 Apr 2006 14:13:53 +0200


On 12 Apr 2006 02:39:55 -0700, arkadiusz.antoniak_at_nospam_wp.pl wrote:
J.F. wrote:
kompilator zglosil tylko warning.

IMHO aż warning :)

Warning oznacza ze udalo mu sie wygenerowac poprawny kod.

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

J.



Poprzedni Następny
Wiadomość
Spis treści
From: arkadiusz.antoniak_at_nospam_wp.pl
Subject: Re: AVR-gcc tablice dwuwymiarowe
Date: 12 Apr 2006 08:01:09 -0700


J.F. wrote:
Warning oznacza ze udalo mu sie wygenerowac poprawny kod.

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

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

trzeba :)


Poprzedni Następny
Wiadomość
Spis treści
From: drazsyrd <drazsyrd_at_nospam_poczta.onet.pl>
Subject: Re: AVR-gcc tablice dwuwymiarowe
Date: Wed, 12 Apr 2006 12:04:43 +0200


J.F. wrote:
[...]

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

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

Poprzedni Następny
Wiadomość
Spis treści
From: drazsyrd <drazsyrd_at_nospam_poczta.onet.pl>
Subject: Re: AVR-gcc tablice dwuwymiarowe
Date: Wed, 12 Apr 2006 12:27:19 +0200


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.

Poprzedni Następny
Wiadomość
Spis treści
From: drazsyrd <drazsyrd_at_nospam_poczta.onet.pl>
Subject: Re: AVR-gcc tablice dwuwymiarowe
Date: Wed, 12 Apr 2006 12:11:37 +0200


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.