Я начал изучать C и хотел программировать с его помощью bogosort. Я закодировал большую часть кода, но когда начал, у меня возникла ошибка сегментации, но я не знаю почему.
Это мой код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
int tries = 0;
int bogo[7];
int length = sizeof(bogo) / sizeof(bogo[0]);
void setBogo();
void printBogo();
bool bogoFinished();
void sortNew();
int main() {
setBogo();
while (!bogoFinished())
sortNew();
printBogo();
printf("Versuche benötigt: %d", tries);
return 0;
}
void setBogo() {
srand(time(NULL));
for (int i = 0; i < length; i++)
bogo[i] = rand() % 100;
}
void printBogo() {
for (int i = 0; i < length; i++)
printf("Pos.: %d, Value: %d\n", i, bogo[i]);
}
bool bogoFinished() {
int letzte = 0;
for (int i = 1; i < length; i++)
if (bogo[i] < bogo[letzte])
return false;
else letzte = i;
return true;
}
void sortNew() {
srand(time(NULL));
tries++;
for (int i = 0; i < length; i++) {
int value = bogo[i];
int ran = rand();
bogo[i] = bogo[ran];
bogo[ran] = value;
}
}
Как работает код: Сначала я устанавливаю все позиции в массиве случайным целым числом. Затем в цикле while проверяется, отсортирован массив или нет. Если это так, массив снова будет отсортирован случайным образом. Алгоритм инициализации массива раньше работал, так что думаю это вызвано где-то в курортной части.
Ну, у меня это работает нормально, и я не знаю, действительно ли это нужно
Это может работать до тех пор, пока не перестанет работать. И тогда вы не поймете, почему.





Виновником является bogo[i] = bogo[ran]; (и следующая строка тоже), поскольку rand() возвращает значения в диапазоне от 0 до RAND_MAX, что является неопределенным, но обычно довольно большим целым числом; определенно больше, чем ваш массив длиной 7.
Чтобы оставаться в пределах досягаемости, вместо этого используйте rand() % length.
Спасибо, это сработало нормально. Думал уже добавил, но вроде нет.