Tema: Re: C: masyvo elementu perdavimas funkcijai
Autorius: Kantega
Data: 2011-03-01 18:50:56
Chebra, jei jau apie C kalbam, gal galit paaiškinti dar vieną dalyką:
Nagrinėdamas savo funkciją WriteByteToDOG radau kad ji parašyta su "stiliaus" klaidom, nors sistema veikia:

void WriteByteToDOG(unsigned char ByteToSend){
unsigned char a;
a = ByteToSend>>4;
Write4bitsToDog(a); //šita funkcija "užvienetina" vyresnį ketvertuką ir išveda visą baitą į portą, 
Wait(1);                    //nes displėjus prijungtas per 4 bitų interfeisą, ir pirma reikia jam sušerti vyresnyji ketvertuką.
a = ByteToSend & 0x0F; //čia nereikalinga eilutė, nes
Write4bitsToDog(ByteToSend); // a toliau nebenaudojamas
} // sistema vistiek veikia, nes ketvertukai siunčiami teisingai, displėjus veikia

Įdomumai prasideda, kai aš pataisau paskutinę eilutę į tokią:
Write4bitsToDog(a); // sistema neveikia, displėjus pjauna grybą, aiškiai gaudamas "keistus" duomenis

sistemos veikimą "atstato" tokia kintamojo deklaracija:
unsigned volatile char a;

šitos funkcijos asm listingas nesiskiria, ar "a" deklaruotas paprastai ar su volatile.
Kompiliatoriaus optimizacijas visas esu išjungęs. 
Ar galėtų man kas paaiškinti ką ir kaip kompiliatorius padaro su tuo kintamuoju "a", kad sistema veikia tik su volatile?
Nes aš tikėjausi, kad paprastas kintamasis du kartus priskyrus jam reikšmes ir su juo iškvietus funkcijas turėtų veikti ir be "volatile"

Ar čia kur nors kitur kode yra dar viena žiopla ar kokia ten klaida?