#c #struct #segmentation-fault
#c #структура #ошибка сегментации
Вопрос:
Я пытаюсь создать программу сортировки на c. В частности, сортировку по корзинам. В любом случае, я вводил значения из исходного массива в свою структуру buckets (Canasta), и независимо от того, что я пробовал, я получаю ошибку ошибки сегментации. Я также прочитал здесь другие похожие вопросы и попробовал, что он говорит, но это не работает.
Сборка: сортировка gcc.сортировка c -o
Выполнить тест: $ ./ sort 5
Значение 5 — количество сегментов, которые должны быть созданы
Обновление: я забыл прокомментировать в этом разделе, в какой строке генерируется ошибка. И я добавил недостающий код. Спасибо.
Строка ошибки 78: basket[numcan].entrada[acum[numcan]] = lista[i];
Вот мой код:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#define MAX 200
#define HOLGURA 50
typedef struct intervalo{
int inf;
int sup;
} Intervalo;
typedef struct canasta{
Intervalo inter;
int *entrada;
int size;
} Canasta;
Canasta crearCanasta(Intervalo inter, int size){
Canasta *basket = NULL;
basket = (Canasta*)malloc(sizeof(Canasta));
basket->entrada = malloc(size * sizeof(int));
basket->inter = inter;
return *basket;
}
int * generarLista(){
static int lista[MAX];
time_t t;
/* Inicializa seed de rand() */
srand((unsigned) time(amp;t));
for(int i = 0; i < MAX; i ){
lista[i] = rand() % 200; // Random de 0 a 999
printf("lista: %d. ", lista[i]);
}
return lista;
}
int determinarCanasta(Intervalo * inter, int numhilos, int num){
for(int i = 0; i < numhilos; i ){
if(num > inter[i].inf amp;amp; num < inter[i].sup)
return i;
}
}
Intervalo * crearIntervalo(int tamArr, int numhilos){
Intervalo *aux = malloc(numhilos*sizeof(Intervalo));
aux[0].inf = 0;
aux[0].sup = tamArr HOLGURA;
for (int i = 1; i < numhilos; i ){
aux[i].inf = tamArr*i HOLGURA;
aux[i].sup = tamArr*(i 1) HOLGURA;
}
return aux;
}
int main(int argc, char const *argv[]){
int *lista = generarLista();
printf("Paso la generacion de listan");
int salida[MAX];
if(argv[1] > 0){
int tamArr = MAX / atoi(argv[1]); // Tamaño maximo del arreglo
Intervalo *inter = crearIntervalo(tamArr, atoi(argv[1])); // Arreglo de intervalos
printf("Paso generacion de intervalosn");
Canasta *basket = malloc(atoi(argv[1]) * sizeof(Canasta)); // Arreglo de canastas
printf("Paso asignacion de memoria de canastasn");
int numcan = 0;
int acum[atoi(argv[1])];
int array[atoi(argv[1])][tamArr HOLGURA];
for (int i = 0; i < atoi(argv[1]); i ){
basket[i] = crearCanasta(inter[i], atoi(argv[1]));
acum[i] = 0;
}
for(int i = 0; i < MAX; i ){
numcan = determinarCanasta(inter, atoi(argv[1]), lista[i]);
basket[numcan].entrada[acum[numcan]] = lista[i]; // This line makes the error
printf("%d. ", numcan);
// I also tried to make an auxiliary bidimensional array to store the values but I get the same error
//array[numcan][acum[numcan]] = lista[i];
acum[numcan] ;
}
printf("Paso determinacion de canastan");
}
else{
printf("ERROR: Ingresa un numero valido de canastas");
exit(0);
}
}
Я был бы признателен за любую помощь 🙂
Комментарии:
1. Выполните базовую отладку. Используйте отладчик. Он немедленно и точно сообщит вам, какая строка кода вызывает ошибку seg. Это минимальная информация, которую вы должны знать сами и опубликовать в вопросе. Отладчик также можно использовать для пошагового просмотра кода и проверки его по мере выполнения.
2. Продолжайте отладку. Например, вы смотрели на значение
numcan
иacum[numcan]
когда происходит сбой? Какие это значения и находятся ли они в пределах соответствующих массивов?3. Сбой при любом значении basket[numcan] , я даже пытался сделать что-то подобное
basket[0].entrada[acum[numcan]] = lista[i]
, и это работает, но, очевидно, мне нужно поместить каждое число в правильное поле. Я уверен, что зарезервировал память для массива structbasket
, поэтому я очень обеспокоен этой ошибкой. Кроме того, я проверил, что значения,determinarCanasta()
возвращаемые для numcan, в порядке.
Ответ №1:
Из того, что я видел в коде, ошибка сегмента возникает, когда determinarCanasta
функция никогда не возвращает i
значение на итерации. Трудно понять, какое поведение вы ожидаете, но оно правильно найдет интервал, если вы измените на if (num >= inter[i].inf amp;amp; num <= inter[i].sup)
(с <=
помощью и >=
). Другим решением является определение значения по умолчанию, которое будет возвращено в этом случае.
int determinarCanasta(Intervalo * inter, int numhilos, int num){
for (int i = 0; i < numhilos; i ) {
if (num >= inter[i].inf amp;amp; num <= inter[i].sup)
return i;
}
// return some value
return DEFAULT_VALUE;
}
Комментарии:
1. Большое спасибо GustavoBiage, я изменил
determinarCanasta()
функцию с учетом пропущенного значения интервала. И я избавился от ошибки сегментации. Оставляя условие следующим образом:if(num >= inter[i].inf amp;amp; num < inter[i].sup)