Быстрая сортировка - C (СИ) (247974)
Формулировка задачи:
Есть программа написанная на си. Она генерирует массив и проводит на нём быструю сортировку в пределах заданного диапазона.
ПРоблема в том что она крашится, после вывода сгенерированного массива. Я нашёл что краш происходит после вызова функции quicksort рекурсивно.
Также есть предупреждения при компиляции.
Что мне гуглить, подскажите пожалуйста? Указатели в программе я вроде верно использовал.
#include <stdio.h>//подключение библиотек #include <stdlib.h> #include <time.h> #define MAX_ARR_SIZE 1024//обозначение MAX_ARR_SIZE как 1024 void swap(char *x, char *y)//функция обмена элементов местами { char z = *x; *x = *y;//Разыменование указателей *y = z; } void gen_random_uniq( int arr_size, int *arr, int range_min, int range_max );//инициализация функции генерации массива int partition(char *A[],int lo,int hi)//Тело функции сортировки { int pivot,t,i,j;//объявление переменной pivot=*A[lo];//выбор элемента для сравнения i=lo;//левая граница j=hi;//правая граница while(*A[hi]>=pivot)//сдвиг границы слева i++; while(*A[j]>pivot)//сдвиг границы справа j--; if (i>=j)//если границу двигать некуда, то возращается позиция return j; swap(&A[i],&A[j]);//элементы меняются местами } void quicksort(char *A[], int lo, int hi)//Функция рекурсивного вызова сортировки { int p; if (lo<hi)//пока границы не сомкнутся p=partition(&A,lo,hi);//Вызов функции сортировки quicksort(&A,lo,p+1); // Место краша quicksort(&A,p-1,hi); //Аналогично вышенаписанному } int main(int argc, char *argv[] )//вводится размер массива и его диапазон в формате "a i j" где a-размер, i-минимальное значение элемента массива, а j-это минимальное значение элемента массива { int i, arr_size;//размер массива int arr[MAX_ARR_SIZE];//инициализация массива int range_min, range_max;//диапазон рандомных значения, которые могут принимать элементы массива srand( time( NULL ) ); if ( argc!=1+3 ) //Вывод справки о вводе { fprintf( stderr, "Usage: gen_random_uniq arr_size range_min range_max\n" ); exit( 1 ); } arr_size= atoi( argv[1] ); range_min= atoi( argv[2] ); range_max= atoi( argv[3] ); if ( arr_size<0 || arr_size>MAX_ARR_SIZE ) //проверка на корректность размера массива { fprintf( stderr, "Invalid array size\n" ); exit( 1 ); } gen_random_uniq( arr_size, arr, range_min, range_max );//вызов функции генерации массива printf( "random unique array: array size is %d, range is [%d;%d]\n",// вывод сгенерированных значений элементов массива и его размера arr_size, range_min, range_max ); for ( i= 0; i<arr_size; i++ ) { printf( " %d", arr[i] ); } printf( "\n" ); quicksort(&arr,3,argv[1]-3); //Вывод массива после быстрой сортировки for ( i=0; i<arr_size; i++ ) { printf( " %d", arr[i]); } printf("\n"); getchar(); getchar(); return 0; } /* main() */ /* ================================================================ */ void gen_random_uniq( int arr_size, int *parr, int range_min, int range_max ) //тело функции генерации массива { int i, j;//инициализация переменных int dup_flag; int rand_val, range_width= range_max-range_min+1; if ( range_width<1 || arr_size<0 || arr_size>range_width )//проверка на корректность данных { fprintf( stderr, "gen_random_uniq(): Invalid arguments\n" ); exit( 1 );//предупреждение о некорректном вводе } for ( i= 0; i<arr_size; i++ ) { for ( ; ; ) //Бесконечный цикл { rand_val= range_min+rand()%range_width;//Задание рандомного значения dup_flag= 0; //обнуление флага for ( j= 0; j<i; j++ ) { if ( rand_val == parr[j] ) //проверка задано ли рандомное значение { dup_flag= 1; //установка флага break; //выход из цикла } } if ( !dup_flag ) //Проверка на установку флага { break; //Если неустановлен, то следует выход из цикла } } parr[i]= rand_val;//Присваивание элементу массива рандомного значения } } /* gen_random_uniq() */
$ gcc -o main main.c main.c: In function ‘partition’: main.c:27:7: warning: passing argument 1 of ‘swap’ from incompatible pointer type [-Wincompatible-pointer-types] swap(&A[i],&A[j]);//элементы меняются местами ^ main.c:7:6: note: expected ‘char *’ but argument is of type ‘char **’ void swap(char *x, char *y)//функция обмена элементов местами ^~~~ main.c:27:13: warning: passing argument 2 of ‘swap’ from incompatible pointer type [-Wincompatible-pointer-types] swap(&A[i],&A[j]);//элементы меняются местами ^ main.c:7:6: note: expected ‘char *’ but argument is of type ‘char **’ void swap(char *x, char *y)//функция обмена элементов местами ^~~~ main.c: In function ‘quicksort’: main.c:35:15: warning: passing argument 1 of ‘partition’ from incompatible pointer type [-Wincompatible-pointer-types] p=partition(&A,lo,hi);//Вызов функции сортировки ^ main.c:15:6: note: expected ‘char **’ but argument is of type ‘char ***’ int partition(char *A[],int lo,int hi)//Тело функции сортировки ^~~~~~~~~ main.c:36:12: warning: passing argument 1 of ‘quicksort’ from incompatible pointer type [-Wincompatible-pointer-types] quicksort(&A,lo,p+1); // Место краша ^ main.c:31:7: note: expected ‘char **’ but argument is of type ‘char ***’ void quicksort(char *A[], int lo, int hi)//Функция рекурсивного вызова сортировки ^~~~~~~~~ main.c:37:12: warning: passing argument 1 of ‘quicksort’ from incompatible pointer type [-Wincompatible-pointer-types] quicksort(&A,p-1,hi); //Аналогично вышенаписанному ^ main.c:31:7: note: expected ‘char **’ but argument is of type ‘char ***’ void quicksort(char *A[], int lo, int hi)//Функция рекурсивного вызова сортировки ^~~~~~~~~ main.c: In function ‘main’: main.c:69:12: warning: passing argument 1 of ‘quicksort’ from incompatible pointer type [-Wincompatible-pointer-types] quicksort(&arr,3,argv[1]-3); ^ main.c:31:7: note: expected ‘char **’ but argument is of type ‘int (*)[1024]’ void quicksort(char *A[], int lo, int hi)//Функция рекурсивного вызова сортировки ^~~~~~~~~ main.c:69:19: warning: passing argument 3 of ‘quicksort’ makes integer from pointer without a cast [-Wint-conversion] quicksort(&arr,3,argv[1]-3); ^~~~ main.c:31:7: note: expected ‘int’ but argument is of type ‘char *’ void quicksort(char *A[], int lo, int hi)//Функция рекурсивного вызова сортировки
Решение задачи: «Быстрая сортировка»
textual
Листинг программы
char str[]; char* str;
Объяснение кода листинга программы
- Объявлена переменная типа char с именем
str
и размером в одной переменной. - В качестве значения указателя переменной
str
присваивается адрес первой ячейки массива. - В теле программы происходит использование переменной
str
как указателя на массив символов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д