www.mikrocontroller.net

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


Autor: CRuS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist du sicher, dass da kein Makro ala

#define zufall (rand() & 0xff)

steht?

Autor: CRuS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sourcecode herzeigen.

Autor: Ulli Vex (vex)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: CRuS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.