Ошибка сегментирования. Си сортировка
Опять поймала ошибку сегментирования, не могу понять, что я делаю не так. GDB пробовала пройтись, вылетает в мэйне и не могу понять, почему.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <time.h>
#include "Sorts.h"
int main(void)
{ clock_t start, end;
double cpu_time_used;
int size=100;
FILE *unsort = NULL;
FILE *sort = NULL;
FILE *sort2=NULL;
int *number1 = (int) malloc (size*sizeof(int));
int number;
unsort = fopen("Unsort.txt", "w");
if (unsort == NULL) {
printf("Error opening file");
return -1;
}
for (int i = 0; i<size;i++){
number = generate_number();
fwrite(&number, sizeof(int), 1, unsort);
}
fclose(unsort);
sort = fopen("sorted.txt", "w");
if (sort == NULL) {
printf("Error opening file");
return -1;
}
unsort = fopen("Unsort.txt", "r");
for(int i = 0; i < size; i++)
{
fscanf(unsort,"%d",number1[i]);
}
start = clock();
ShellSort(number1, size);
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
fprintf( stderr, "CPU time used for ShellSort = %lf\n", cpu_time_used );
for(int i = 0; i < size; i++)
{
fprintf(sort, "%d", number1[i]);
}
fclose(sort);
number1 = (int) realloc (size,sizeof(int));
sort2 = fopen("sort2.txt", "w");
if (sort2 == NULL) {
printf("Error opening file");
return -1;
}
for(int i = 0; i < size; i++)
{
fscanf(unsort,"%d",number1[i]);
}
start = clock();
MergeSort(number1, size);
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
fprintf( stderr, "CPU time used for MergeSort = %lf\n", cpu_time_used );
for(int i = 0; i < size; i++)
{
fprintf(sort2, "%d", number1[i]);
}
fclose(unsort);
free(number);
fclose(sort2);
return 0;
}
библиотека нормально подключается и работает, вроде.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stddef.h>
#include <stdint.h>
int generate_number()
{
srand(time(NULL));
int R=rand() % 100 - 50 ;
return R;
}
void ShellSort(int n, int *mass[])
{
int i, j, step;
int tmp;
for (step = n / 2; step > 0; step /= 2)
for (i = step; i < n; i++)
{
tmp = mass[i];
for (j = i; j >= step; j -= step)
{
if (tmp < mass[j - step])
mass[j] = mass[j - step];
else
break;
}
mass[j] = tmp;
}
}
void MergeSort(int n, int *mass[])
{
int mid = n / 2;
if (n % 2 == 1)
mid++;
int h = 1;
int *c = (int*)malloc(n * sizeof(int));
int step;
while (h < n)
{
step = h;
int i = 0;
int j = mid;
int k = 0;
while (step <= mid)
{
while ((i < step) && (j < n) && (j < (mid + step)))
{
if (mass[i] < mass[j])
{
c[k] = mass[i];
i++; k++;
}
else {
c[k] = mass[j];
j++; k++;
}
}
while (i < step)
{
c[k] = mass[i];
i++; k++;
}
while ((j < (mid + step)) && (j<n))
{
c[k] = mass[j];
j++; k++;
}
step = step + h;
}
h = h * 2;
for (i = 0; i<n; i++)
mass[i] = c[i];
}
Ответы (1 шт):
Странно, что оно вообще у вас компилируется -
void ShellSort(int n, int *mass[])
...
int tmp;
...
tmp = mass[i];
Вы передаете в сортировку массив указателей, после чего присваиваете указатель целому числу? Еще и сравниваете указатель и число?
if (tmp < mass[j - step])
То же самое в функции
void MergeSort(int n, int *mass[])
Вы даже явно делаете такое преобразование:
int *number1 = (int) malloc (size*sizeof(int));
Зачем? А если у вас x64 приложение? Вы жу урезаете указатель в 8 байт до 4...
Или вот наоборот:
fscanf(unsort,"%d",number1[i]);
Читать в не пойми куда - number1[i] - это значение типа int, а не адрес...
Или еще - функция описана как
void ShellSort(int n, int *mass[])
а вы ей передаете
ShellSort(number1, size);
вместо int - указатель, вместо массива указателей - целое число...
У вас налицо тягчайшее непонимание азов языка программирования, и исправить ваш код можно только одним - выбросив его, написать заново.