8052 i tablica przekazywana do funkcji

Sep 26, 2003 16 Replies

Witam,



zaczynam dopiero pisac w C (Keil) na 8052 i mam ma³y problemik. Otó¿ deklarujê tablicê:



BYTE Registers[16];



przy starcie procka zapisujê do niej domyslne wartosci, np:



Registers[0] = 0x00; Registers[1] = 0x20; Registers[2] = 0x09; ... itd do 15



i jest te¿ funkcja, której chcê przekazaæ wska¼nik do wybranego elementu tablicy, a nastêpnie w funkcji odczytaæ okre¶lon± liczbê elementów pocz±wszy od tego przekazanego wska¼nika. Wygl±da to tak:


- prototyp funkcji: VOID SendData(PBYTE pbBuffer);


- przyk³ad wywo³ania funkcji: SendData((PBYTE) Registers[5]);



PROBLEM polega na tym, ¿e dane które odczytujê w funkcji nie maj± nic wspólnego z danymi z tymi danymi zapisanymi wczesniej do tablicy . DLACZEGO ???



Z góry dziêki, Karol M.



[...]

O ile PBYTE to jest BYTE*, to powinienes przekazywac wskazanie na element, a nie jego zawartosc. Czyli twoje wywolanie powinno wygldac tak: SendData(&Registers[5]);

Z tego ze zmieniasz typ wnioskuje, ze kompilator pyskowal, ale ty zamiast wziac pod uwage jego pretensje, po prostu zmieniles typ.

No i efekty sa jakie sa. Gratuluje wspanialego pomyslu na skomplikowanie sobie zycia :) A na przyszlosc polecam wlaczyc wszelkie mozliwe ostrzezenia i testy poprawnosci i dokladnie sie zastanowic dlaczego sie pojawily.

pzdr. j.

Jacek R. Radzikowski:

albo SendData(Registers+5);

co do reszty to podpisuję się wszystkimi nogami.

Waldek

U¿ytkownik "Jacek R. Radzikowski" snipped-for-privacy@piranet.org napisa³ w wiadomo¶ci [...]

[..]

:) Dziêki za odpowiedz i sorry za lamerstwo. O trzeciej w nocy nie da siê ju¿ my¶leæ.

Pozdrawiam, Karol M.

Mozna. Ale, brrr... az mnie zeby rozbolaly jak zobaczylem ten zapis. Jak sie dopiero uczy to niech lepiej niech nie siega do sztuczek.

j.

U¿ytkownik "Jacek R. Radzikowski" snipped-for-privacy@piranet.org napisa³ w wiadomo¶ci news:bl1f25$3mb$ snipped-for-privacy@www.itl.waw.pl...

jest to jak najbardziej poprawny zapis jesli chodzi o jezyk C nie ma tutaj zadnych sztuczek powiedzialbym ze wieksze komplikacje sa z pobieraniem adresu dla 5 elementu tablicy ale rzeczywiscie jak sie uczy no to moze ten bedzie dla niego bardziej zrozumialy

pozdr Krzysztof

No cóż. Kwestia biu^Wgustu :) Ja też pisze w C juz od ladnych kilku lat i praktyka nauczyła mnie (dość bolesnie) unikać operacji arytmetycznych na wskaźnikach. W swoich programach z arytmetyki wskaźnikowej uzżwam tylko inkrementacji i dekrementacji, a reszte zalatwiam indeksowaniem tablicowym. Jest to dla mnie (i nie tylko) o wiele czytelniejsze i "poprwne politycznie" ;) A dla kompilatora to i tak wszystko jedno.

Amen. :)

pzdr. j.

Ale myslisz ze Registers[5] co robi ? Ba - w prawdziwym C [za keila i inne wynalazki nie recze] Registers[5] == 5[Registers]

Roznie bywa. Wczesne Turbo C operacji tablicowych nie potrafilo zoptymalizowac i co chwile obliczalo adres.

P.S. Panowie - a w ogole to jestescie pewni ze ta SendData(PBYTE) to wysyla obszar danych ? Bez podania dlugosci to by \0 bylo ogranicznikiem tekstu do wyslania .. czyli nie mozna by 00h przeslac .. w prockach to chyba malo uzyteczna sprawa..

J.

d³ugosc jest w pewnym rejestrze dostêpnym globalnie, g³ównie chodzilo tylko o to, ze nie mialo byc Registers[5] tylko Registers+5 i tu by³ czeski b³±d spowodowany chyba zaæmieniem umys³u. Generalnie procedura jest ¿ywcem wyciêta z przyk³adu napisanego przez Texas Instruments, tulko tam by³ przekazywany adres calej tablicy a ja z rozpedu doda³em na koñcu ten [].

Po skorygowaniu dzia³a prawid³owo, jeszcze raz dziekuje za sugestie.

Pozdrawiam, Karol.

C to faktycznie nie bardzo :-)

Oj uwazaj - sa delikatne roznice. W prostych konstrukcjach nie, ale w bardziej zaawansowanych wyjda..

Ale identycznie namieszaja ci odwolania tablicowe.

Dla czlowieka zas. Jesli chodzi o 5-ty element tablicy - Registers[5] wydaje sie naturalne. Ale jesli chodzi o elementy od 5-tego dalej ... hm, no niby faktycznie Registers+5 moze zmylic, ale &...[5] tez.

Powiedzmy nie blad a wada. Ciagle generowalo to poprawny program.

J.

W artykule <bl8clc$66s$ snipped-for-privacy@www.itl.waw.pl> Jacek R. Radzikowski napisal(a):

Jo! A ja pamiętam (chyba z PCKuriera) przykład z jakiegoś konkursu C. W wywołaniu programu dawało się dwie liczby, a program generował w trybie tekstowym mapę świata z zaznaczonym położeniem (te dwie liczby). Treść też miał niezłą i zajmował w sumie kilka linijek...

Marcin Stanisz

Wiesz, stwierdzenie, ze jezyk C byl projektowany z _jakakolwiek_ mysla to bardzo ryzykowna teza. ;-) Nie jestem nawet pewien, czy on w ogole byl projektowany...

Pozdrawiam Piotr Wyderski

Oczywiscie ze byl. Jezyk C : jezyk w ktorym napisano Unix. Unix : system napisany w jezyku C :-)

J.

Przypadkiem z C nie było tak: C=B++ ;)

W.

U¿ytkownik "Jacek R. Radzikowski" snipped-for-privacy@piranet.org napisa³ w wiadomo¶ci news:bla7o8$lu5$ snipped-for-privacy@www.itl.waw.pl

Domy¶lam siê, ¿e definitywnie odbiegaj±cych od oficjalnej wyk³adni zawartej w The Camel Book? ;) Korzystaj±c z tego ostatniego zawsze mia³em wra¿enie, ¿e Larry najpierw powiedzia³ "hop", a potem przez parê lat przekonywa³ siê w co wskoczy³ (Co nie zmienia faktu, ¿e chcia³bym mieæ tak± wyobra¼niê ) ;-)))

Próbowa³em wygooglowaæ, ale nie trafi³em. Masz mo¿e jaki¶ namiar?

Dosc mocno. I lepiej przystajacych do rzeczywistosci :)

To Ty chyba BrainFucka nie widziales :) (tak, jest taki jezyk. Nie, nie wiem po co i do czego:)) BTW. BF powinien sie niezle nadawac na kod maszynowy jakiegos procesora :)

snipped-for-privacy@kasprzol.mieszka.sobie.na.o2.pl>

j.

PS: perl jest bardzo przyjemnym jezykiem :)

Nowsza skladnia jest OK, starsza jest mniej czytelna. Ale mnie nie o skladnie chodzi; jednym z najczesciej wystepujacych slow w definikcji C i C++ jest "znaczenie: nie zdefiniowano". :-)

Na pewno nie pomylilem, ale Perl to jeszcze wiekszy dziwolag. :-)

Pozdrawiam Piotr Wyderski

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required