|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 人中仙 于 2021-2-25 11:17 编辑
环境:CLion,MinGW64 6.0 ,Windows10 .
前言:在写快速排序之前,先写了打乱数组元素顺序的函数,但是在写打乱数组元素程序的过程中遇到了一些问题,研究了很长的时间没有结果,特来请教各位。
概述:在运行下列程序片段时,总会出现异常退出的错误,在调试时又会在for循环处出 0x0000005 错误,无法调试。怀疑是编译器问题,但是我的电脑里又没有其他编译器。
不能正常运行,也不能调试的代码如下:
- int ShuffleArray(int *array,int n){
- srand(time(NULL));
- for (int i = n-1; i >=0 ; --i) { //直接运行跳 0xC0000094错误,停止运行 ,Debug此处,跳0xC0000005,received signal SIGFPE, Arithmetic exception
- SwapElem(array,i,rand()%i);
- }
- return(0);
- }
复制代码
运行输出信息:
输出信息
能正常运行,但不能单步调试的代码如下:
- //与前一段代码的差别仅在于for语句内部的初值和条件
- int ShuffleArray(int *array,int n){
- srand(time(NULL));
- for (int i = n; i > 0; --i) { //直接运行没有问题,Debug到此处会跳 0xC0000005 停止运行
- SwapElem(array,(i-1),rand()%i);
- }
- return(0);
- }
复制代码
调试输出信息:
调试输出信息
完整的代码如下: //第75行为调试开关,切换两种代码的运行
- nclude <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #define ARRAY_MAX 20
- int InitArray(int *,int);
- int PrintArray(int *,int);
- int SwapElem(int *,int,int);
- int ShuffleArray(int *,int);
- int QuickSort(int *,int,int);
- int Partition(int *,int,int);
- int intArray[ARRAY_MAX];
- int main(){
- InitArray(intArray,ARRAY_MAX);
- PrintArray(intArray,ARRAY_MAX);
- ShuffleArray(intArray,ARRAY_MAX);
- PrintArray(intArray,ARRAY_MAX);
- }
- /**
- * fill the array with random numbers from 0 to ARRAY_MAX
- * @param array array name
- * @param n total number of array elements
- * @return 0
- */
- #define SEQUENCE //control value range of the elements.order or disorder.
- int InitArray(int *array,int n){
- #ifndef SEQUENCE
- int iUpperLimit = n*5;
- srand(time(NULL));
- #endif
- for (int i = 0; i < n; ++i) {
- #ifndef SEQUENCE
- array[i] = rand()%iUpperLimit;
- #else
- array[i] = i+1;
- #endif
- }
- return(0);
- }
- #undef SEQUENCE
- /**
- * print array elements
- * @param array array name
- * @param n total number of array
- * @return total number of array
- */
- int PrintArray(int *array,int n){
- for (int i = 0; i < n; ++i) {
- printf("%d ",array[i]);
- }
- putchar('\n');
- return(n);
- }
- /**
- * Exchange two elements in the array according to the sequence number of the array
- * @param array array name
- * @param a address of the first element which you want to exchange
- * @param b address of another
- * @return 0
- */
- int SwapElem(int *array,int a,int b){
- int tmp = 0;
- tmp = array[a];
- array[a] = array[b];
- array[b] = tmp;
- return 0;
- }
- #define TEST_ERR
- int ShuffleArray(int *array,int n){
- srand(time(NULL));
- #ifdef TEST_ERR
- for (int i = n-1; i >=0 ; --i) { //直接运行跳 0xC0000094错误,停止运行 ,Debug此处,跳0xC0000005,received signal SIGFPE, Arithmetic exception
- #else
- for (int i = n; i > 0; --i) { //直接运行没有问题,Debug到此处会跳 0xC0000005 停止运行
- #endif
- #ifdef TEST_ERR
- SwapElem(array,i,rand()%i);
- #else
- SwapElem(array,i-1,rand()%i);
- #endif
- }
- return(0);
- }
- #undef TEST_ERR
复制代码
- int ShuffleArray(int *array,int n){
- srand(time(NULL));
- for (int i = n-1; i >=0 ; --i) { //直接运行跳 0xC0000094错误,停止运行 ,Debug此处,跳0xC0000005,received signal SIGFPE, Arithmetic exception
- SwapElem(array,i,rand()%i);
- }
- return(0);
- }
复制代码
结束条件是 i >= 0
也就是 i 可以是 0
rand() % 0 是多少?
|
|