2016-07-03 4 views
-1

Быстрое объяснение: Я хочу присвоить случайные числа словам так, чтобы каждая буква имела другое число. для удобства я использовал массивы вместо отдельных однобуквенных переменных; таким образом я знаю, что «abc [1]» является буквой «b» от слова «abc». Первый номер слова использует другой диапазон, чтобы избежать номера, как «075»Do ... while loop неожиданное поведение

#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"); 
} 

Я знаю, что числа не являются истинно случайными. Я знаю, что код грязный. Я знаю, что это неэффективно для чисел грубой силы. Я знаю, что этот способ установки чисел плох, но я не мог придумать ничего лучшего. Этот код выполнит эту задачу для моих целей.

Проблема в том, что приведенный выше код застревает при генерации номера для def [0]; он будет бесконечно генерировать новые случайные числа, он, кажется, полностью игнорирует «while» часть цикла.

Вы можете предложить лучший способ делать то, что я пытаюсь сделать, или просто решить проблему, либо будет прекрасно работать, так как проект не является чем-то большим, он просто используется как решатель головоломки.

+0

Вы пробовали проверить значение определения функции [0] '' против аЬса [0], 'а [1]', и 'аЬс [2]'? –

+0

Вы можете попробовать использовать один массив и выполнить проверку сравнения, используя, возможно, другую функцию. –

+1

Ваш код C99, а не (подлинный) C++ 11 (так что пометьте его как C). Затем скомпилируйте его со всеми предупреждениями и информацией об отладке (если вы используете [GCC] (http://gcc.gnu.org/) в качестве своего компилятора, чем средство с 'gcc -Wall -g') и улучшите его, пока не получите предупреждения. Затем ** используйте отладчик ** (например, 'gdb'). Ваш запрос на исправление-мой-код здесь не по теме. –

ответ

1

Массивы в C/C++ основаны на нуле. создание abc[2] дает вам только 0 и 1 для законного доступа. Все, что находится за концом массива, является неопределенным поведением - в этом случае вероятно, что abc[2] (третий, а не второй элемент) указывает на def[0].

Исправьте код так, что оба заявления выделить 3 элемента вместо 2.

2

Проблема в том, что вы выбрали неправильный размер для своих массивов. def[0] и abc[2], скорее всего, указывают на то же место.

В частности, вы создаете массивы размером 2, а затем получаете доступ к 3 элементам из них. Изменение:

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

к:

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

Смотрите также this answer, чтобы лучший способ сделать то, что вы пытаетесь сделать.