Forum: Mikrocontroller und Digitale Elektronik rand() macht variablen kaputt


von CRuS (Gast)


Lesenswert?

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

von daniel (Gast)


Lesenswert?

Bist du sicher, dass da kein Makro ala

#define zufall (rand() & 0xff)

steht?

von CRuS (Gast)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

Sourcecode herzeigen.

von Ulli V. (vex)


Lesenswert?

hmmm irgendwie kommt mir das short ein bissl komisch darin vor ... 
müsste das nicht ein long sein?

von holger (Gast)


Lesenswert?

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

von CRuS (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.