rand() macht variablen kaputt

Gast #971303
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
Gast #971424
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.
Gast #971780
>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.
Gast #971965
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.