Проблема с функцией, которая перемешивает и возводит в квадрат массив в C ++ - PullRequest
0 голосов
/ 24 октября 2019

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

int *randomizedField(int field[]){
    int temp = 0;
    int random = 0;
    int i = 0;
    int j = 0;
    while(field[i] != '\0'){
        field[i] = field[i] * field[i];
        i++;
    }
    while(field[j] != '\0'){
        random = rand() % i;
        temp = field[j];
        field[j] = field[random];
        field[random] = temp;
        j++;
    }
    return field;
}

1 Ответ

1 голос
/ 24 октября 2019

У вас неопределенное поведение в ваших циклах:

while(field[i] != '\0')

Вы читаете, пока не достигнете нулевого завершенного символа. Очевидно, вы никогда не знаете, когда достигнете этого, и это не будет концом вашего массива. Таким образом, вы пересекаете границы вашего указателя и вводите неопределенное поведение land.

С той стороны вы не можете найти размер вашего массива, потому что при передаче в функцию массив распадается науказатель, и вы не можете найти его размер с помощью sizeof(field)/sizeof(int).

Чтобы решить вашу проблему, передайте длину вашего массива функции или в идеальном случае используйте один из контейнеров STL, например std :: vector или std :: array .

Первый цикл будет выглядеть так:

for(int i = 0; i < field.size(); ++i) { 
   field[i] = field[i] * field[i]; 
   i++;
}

И сигнатура функции может быть:

void randomizedField(std::vector<int>& field)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...