Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 代码错误:分段错误[每次]_C - Fatal编程技术网

C 代码错误:分段错误[每次]

C 代码错误:分段错误[每次],c,C,我正在编写这个C/C++程序,该程序假定可以找到不同大小数组的平均值、中值和模式。尽管如此,无论输入是什么,我总是会遇到分段错误。我的代码有什么问题?任何建议都将受到欢迎!: 代码如下: #include <stdio.h> //#include <string.h> //#include <math.h> #include <stdlib.h> 主要功能: int main() { int i; scanf(" %d ",&am

我正在编写这个C/C++程序,该程序假定可以找到不同大小数组的平均值、中值和模式。尽管如此,无论输入是什么,我总是会遇到分段错误。我的代码有什么问题?任何建议都将受到欢迎!:

代码如下:

#include <stdio.h>
//#include <string.h>
//#include <math.h>
#include <stdlib.h>
主要功能:

int main() {
    int i;
    scanf(" %d ",&i); //10
    double arr[i]; //array that contains all the values and will be sortted
    for (int j=0; j<i; j++) { //64630 11735 14216 99233 14470 4978 73429 38120 51135 67060
        scanf(" %lf ",&arr[j]);
    }
    printf("%.1lf\n%.1lf\n%.0lf",mean(arr,i),median(arr,i),mode(arr,i));
    return 0;
}
模式功能: 使用NumberOf函数确定重复次数最多的数组元素。返回最高等重复次数中的最低值

double mode(double arr[],int l){
    int maxA;
    int maxP;
    for (int i=0;i<l;i++) {
        int j = numberOf(arr[i],arr,l);
        if (j>maxA) {
            maxA = j;
            maxP = i;
        }
        else if (j==maxA && arr[maxP]>arr[i])
            maxP = i;
    }
    double d = arr[maxP];
    return d;
}
函数编号: 模式函数的助手函数。返回具有外观值的元素数量


您的代码有一系列错误。其中一些:

在这种情况下,您不需要在scanf中使用空格。这会导致读取错误。 为了改变函数的值,不需要向函数传递数组地址。数组总是通过引用传递。因此,将函数从void-sortdouble*[],int;要使sortdouble[],int;,无效;,在函数内部进行必要的更正,并使用sortarr,l调用它;而不是排序&arr,l; min函数声明了一个未初始化的变量minP,因此该变量包含内存中的垃圾。for循环并没有同时输入这两个if条件,所以函数结束并返回仍然未初始化的变量minP。然后使用该随机值访问数组中的索引:j=min0,arr,l;min返回一个随机数,然后arr2[i]=arr[j];访问禁止的内存区域,这将导致分段错误。mode函数中的变量maxP和maxA也存在同样的问题。
访问数组时必须始终小心,不要超出其界限,并始终确保在使用它们时初始化变量。正如其他人所评论的,我也强烈建议您学习如何调试程序,因为这将有助于您分析程序的执行情况并跟踪错误。

我将您的分段错误跟踪到了由median调用的排序例程。我没有修复排序,而是用库中的qsort替换,以说服自己这就是问题所在:

// Median Function:
// Uses the Sort Function. Assuming that works, returns the median.

int comparator(const void *p, const void *q) {

    double a = *((double *) p);
    double b = *((double *) q);

    return (a > b) - (a < b); // compare idiom
}

double median(double array[], int length) { 
    // sort(array, length);

    qsort(array, length, sizeof(double), &comparator);

    double d = array[length / 2];

    if (length % 2 != 0) {
        return d;
    }

    double dd = array[(length / 2) - 1];

    return (d + dd) / 2;
}
您可能应该在以下模式中初始化变量:


一个建议是,在调试程序中运行代码。这些并不是您要寻找的错误内容,但我可以告诉您:1。您正在使用scanf。2.呃,请不要用小写L作为变量名。3.看起来你没有任何努力去隔离你的代码的哪一部分是失败的,在这种情况下,它不应该花费太多。你把问题标记为C和C++,所以我们不能告诉你在使用哪种语言/编译器,你不知道崩溃发生在哪里,所以你显然太懒了,甚至一次都没有使用过调试器。把你的代码呈现为一个我们可以编译的程序,而不是分解成一个不连贯的部分集合。编辑您的帖子,向我们展示一个我们可以编译的程序,也许我们可以帮助您。没有C/C++程序。它不可能同时用两种语言写,因为它们不是同一种语言。选择您实际使用的标签,并仅使用该标签。如果你不确定你正在使用哪一个,请远离键盘,直到你找到它为止。完成后,修复标记和文本,并包括一个将演示问题的示例。启用足够多警告的编译允许编译器提供帮助。它警告我关于minP,但也警告了maxP和maxA。我使用了gcc-O3-g-std=c11-Wall-Wextra-Werror-Wmissing原型-Wstrict原型-Wold样式定义-c mess11.c,在将其固定到int mainvoid之后。详细信息。。。scanf中的空格。这会导致读取错误。->导致问题的是格式中的尾随空格。领先者是不必要的。
static int min(double minLookingTo,double arr[],int l) {
    int minP;
    double minA = minLookingTo;
    for (int i=0; i<l; i++) {
        if (arr[i] == -1)
            continue;
        if (minLookingTo<=arr[i] && arr[i]<=minA) {
            minP = i;
            minA = arr[i];
        }
    }
    return minP;
}
double mean(double arr[],int l){
    double total = 0;
    for (int i=0; i<l; i++) {
        total += arr[i];
    }
    return total/l;
}
double median(double arr[],int l){
    sort(&arr,l);
    double d = arr[(l/2)+1];
    double dd = arr[(l/2)];
    if (l%2!=0)
        return d;
    return (d+dd)/2;
}
double mode(double arr[],int l){
    int maxA;
    int maxP;
    for (int i=0;i<l;i++) {
        int j = numberOf(arr[i],arr,l);
        if (j>maxA) {
            maxA = j;
            maxP = i;
        }
        else if (j==maxA && arr[maxP]>arr[i])
            maxP = i;
    }
    double d = arr[maxP];
    return d;
}
int numberOf(double looking,double arr[],int l) {
    int amount = 0;
    for (int i=0; i<l; i++)
        if (looking == arr[i])
            amount++;
    return amount;
}
// Median Function:
// Uses the Sort Function. Assuming that works, returns the median.

int comparator(const void *p, const void *q) {

    double a = *((double *) p);
    double b = *((double *) q);

    return (a > b) - (a < b); // compare idiom
}

double median(double array[], int length) { 
    // sort(array, length);

    qsort(array, length, sizeof(double), &comparator);

    double d = array[length / 2];

    if (length % 2 != 0) {
        return d;
    }

    double dd = array[(length / 2) - 1];

    return (d + dd) / 2;
}
printf("%.1lf\n%.1lf\n%.0lf",mean(arr,i),median(arr,i),mode(arr,i));
double mode(double array[], int length) {
    int maxA = INT_MIN;
    int maxP = -1;

    for (int i = 0; i < length; i++) {
        int j = numberOf(array[i], array, length);

        if (j > maxA) {
            maxA = j;
            maxP = i;
        } else if (j == maxA && array[maxP] > array[i]) {
            maxP = i;
        }
    }

    return array[maxP];
}