Hallo. Dies ist Teil eines Programms für einen AT90USBxxx. Mir ist unerklärlich warum folgendes passiert: unsigned char bla[28]; Ich lasse zufällige Zahlen erzeugen: char zufall1 = (rand() & 0xff); char zufall2 = (rand() & 0xff); char zufall3 = (rand() & 0xff); char zufall4 = (rand() & 0xff); Dann vergebe ich diese 4 Zahlen an zwei stellen im Kode. ... bla[1] = zufall1; bla[2] = zufall2; bla[3] = zufall3; bla[4] = zufall4; ... ... bla[5] = zufall1; bla[6] = zufall2; bla[7] = zufall3; bla[8] = zufall4; ... Doch dann ist bla[1] != bla[5], bla[2] != bla[6], usw... ?! Wenn ich gar folgendes mache: bla[0] = zufall1; bla[1] = zufall1; bla[2] = zufall1; bla[3] = zufall1; bla[4] = zufall1; bla[5] = zufall1; bla[6] = zufall1; bla[7] = zufall1; bla[8] = zufall1; bla[9] = zufall1; dann steht in jedem Feld bla[0] bis bla[9] eine andere Zahl! Ich habe keine Ahnung wieso das so ist. Der Wert einer Variablen kann sich doch nicht bei jeder Zuweisung von selbst ändern. Vielleicht habt ihr eine Idee warum das so ist. Viele Grüße, Matthias
Bist du sicher, dass da kein Makro ala #define zufall (rand() & 0xff) steht?
sehr sicher. Als ich Pseudo-Zufallszahlen per Hand erzeugen wollte habe nach etwas probieren noch etwas weiteres bemerkt: unsigned short int s = 1234; ... unsigned short int p = 3181; unsigned short int q = 3701; unsigned short int n = (p * q) & 0xffff; s = (s * s) % n; Wenn ich die Variable s in der Funktion definiere, dann geht es so wie es soll. Sobald ich aber die Variable s außerhalb der Funktion in den Deklarationen definiere, dann tritt der oben erwähnte Effekt wieder ein und jedes Mal wenn ich die Variable einer anderen zuweise kommt etwas anderes raus. Ich bin echt am Ende meines Verständisses dafür.
hmmm irgendwie kommt mir das short ein bissl komisch darin vor ... müsste das nicht ein long sein?
>Ich bin echt am Ende meines Verständisses dafür. Wenn man zu viel RAM belegt können solche Effekte auftreten. Der Stack wächst dann eventuell in den Variablenbereich und überschreibt dort Werte. Also, wie Simon schon sagte: >Sourcecode herzeigen.
Mittlerweile konnte ich einen Workaround finden. Offenbar sind bestimmte Kodeteile davon nicht betroffen. Ich habe einfach den Wert von rand() an einer (völlig) anderen Stelle im Kode geholt. Ich benutze den IAR Compiler. Allerwahrscheinlichst ist dies ein Bug im Compiler. Ein Speicherüberlauf würde auch andere Symptome mitsichbringen. Dennoch vielen Dank für eure Hilfe.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.