2016-07-03 7 views
-1

Schnelle Erklärung: Ich möchte den Wörtern Zufallszahlen zuweisen, so dass jeder Buchstabe eine andere Nummer hat. Aus Bequemlichkeitsgründen habe ich Arrays anstelle von separaten Ein-Buchstaben-Variablen verwendet; Auf diese Weise weiß ich, dass "abc [1]" der Buchstabe "b" aus dem Wort "abc" ist. Die erste Zahl eines Wort mit unterschiedlichem Bereich Zahlen zu vermeiden, wie „075“Do ... while-Schleife unerwartetes Verhalten

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int abc[2]; 
int def[2]; 

void setRandom() 
{ 
    abc[0] = rand() %9+1; 
    do {abc[1] = rand() %10;} while (abc[1] == abc[0]); 
    do {abc[2] = rand() %10;} while (abc[2] == abc[1] || abc[2] == abc[0]); 

    printf("RANDOM abc %d %d %d", abc[0], abc[1], abc[2]); //printed just fine. 

    do {def[0] = rand() % 9 +1; } while (def[0] == abc[2] || def[0] == abc[1] || def[0] == abc[0]); //code seems to be stuck here 
    do {def[1] = rand() %10;} while (def[1] == def[0] || def[1] == abc[2] || def[1] == abc[1] || def[1] == abc[0]); 
    do {def[2] = rand() %10;} while (def[2] == def[1] || def[2] == def[0] || def[2] == abc[2] || def[2] == abc[1] || def[2] == abc[0]); 

    printf("RANDOM def %d %d %d", def[0], def[1], def[2]); //THIS CODE IS NEVER REACHED. WHY? 
} 

int main() 
{ 
    setRandom(); 
    printf("RANDOM SET"); 
} 

Ich bin mir bewusst, dass die Zahlen sind nicht wirklich zufällig. Ich bin mir bewusst, dass der Code unordentlich ist. Ich bin mir bewusst, dass es zu Brute-Force-Zahlen ineffizient ist. Ich bin mir bewusst, dass diese Art der Zahlensetzung schlecht ist, aber mir ist nichts Besseres eingefallen. Dieser Code wird die Aufgabe für meine Zwecke erledigen.

Das Problem ist, dass der obige Code beim Generieren der Zahl für def [0] stecken bleibt; es wird unendlich neue Zufallszahlen erzeugen, es scheint komplett zu sein, während es Teil der Schleife ist.

Sie können entweder vorschlagen, eine bessere Methode zu tun, was ich versuche, oder einfach eine Lösung für das Problem, entweder wird es gut, da das Projekt nicht groß ist, es wird nur als Rätsellöser verwendet.

+0

Haben Sie versucht, die Werte von 'def [0]' 'vs abc [0]', 'abc [1]' Inspektion und 'abc [2]'? –

+0

Sie können versuchen, ein einzelnes Array zu verwenden und Vergleichstests mit einer anderen Funktion durchzuführen. –

+1

Ihr Code ist C99, nicht (echt) C++ 11 (also es als C kennzeichnen). Dann kompiliere es mit allen Warnungen und Debug-Informationen (wenn du [GCC] (http://gcc.gnu.org/) als deinen Compiler verwendest, dann heißt das mit 'gcc -Wall -g') und verbessere es, bis du keine hast Warnungen. Dann ** benutze den Debugger ** (z.B. 'gdb'). Ihre Anfrage zur Fehlerbehebung ist hier nicht verfügbar. –

Antwort

1

Arrays in C/C++ sind nullbasiert. Erstellen abc[2] geben Sie nur 0 und 1 zu rechtmäßigen Zugriff. Alles über das Ende des Arrays hinaus ist undefiniertes Verhalten - in diesem Fall ist es wahrscheinlich, dass abc[2] (das dritte, nicht das zweite Element) auf def[0] zeigt.

Fix Ihren Code, so dass beide Erklärungen 3 Elemente zuweisen statt 2.

2

Das Problem ist, dass Sie die falsche Größe für Ihre Arrays gewählt haben. def[0] und abc[2] zeigen höchstwahrscheinlich auf den gleichen Ort.

Speziell erstellen Sie Arrays der Größe 2 und greifen dann auf 3 Elemente davon zu. Wechsel:

int abc[2]; 
int def[2]; 

zu:

int abc[3]; 
int def[3]; 

Siehe auch this answer als zu einer besseren Art und Weise zu tun, was Sie zu tun versuchen.