如何从void函数中检索数组并传递给Main中的其他函数?

时间:2018-02-13 01:30:35

标签: c arrays pointers

我是C的初学者

我遇到一个问题,即我将一系列成绩传递给main,并且需要将这些成绩转换为int并找到最大最大值和平均值。

规格

  • void getGrade(int argc, char *argv[])
  • int findMaximum(grade[])
  • int findMinimum(grade[])
  • float calculateAverage(grade[])
  • printResults(max, min, avg)

并且必须在main函数中按顺序调用它们。

我正在试图弄清楚如何访问阵列"等级"在getGrade中操作,以便能够将其传递给main中的其他函数。

int main(int argc, char *argv[]){
    getGrade(argc, argv)
    int max = findMaximum(grade);
    int min = findMinimum(grade);
    float avg = calculateAverage(grade);
    print results(max, min, avg);
    return 0;
}

void getGrade(int argc, char *argv[]){
    int i;
    int grade[argc - 1];
    for(i=0, i<argc -1; i++){
        grade[i] = atoi(*(argv + i + 1));
    }
}

3 个答案:

答案 0 :(得分:0)

无法在该函数之外访问数组grade,因为它是getGrade函数内的局部变量。

您必须首先填充grade数组,然后将其传递给其他函数。 我不建议把它变成全局变量。

int main(int argc, char *argv[]){
    // Allocate memory for grade.

    int* grade = malloc( (argc -1 )* sizeof(int) );

    // Pass additional parameter, for number of items in grade array.

    getGrade(grade , argc -1, argv );
    int max = findMaximum(grade, argc -1 );
    int min = findMinimum(grade, argc -1 );
    float avg = calculateAverage(grade, argc -1 );
    /*print*/ results(max, min, avg);

    free(grade); // Release the memory

    return 0;
}

答案 1 :(得分:0)

grade数组是getGrade中的局部变量,所以当函数退出时, 变量及其内容丢失。

您必须在调用此函数之前创建数组并传递 数组及其到函数的长度。您需要将功能修改为 接受长度:

void getGrade(grade, size_t len, char **argv);
int findMaximum(int *grade, size_t len);
int findMinimum(int *grade, size_t len);
float calculateAverage(int *grade, size_t len);
printResults(max, min, avg);


void getGrade(grade, size_t len, char **argv)
{
    for(size_t i = 0, i < len; i++)
        grade[i] = atoi(argv[i+1]);
}

int main(int argc, char **argv)
{
    int grades[argc - 1];
    size_t len = argc - 1;

    getGrade(grades, len, argv);

    int max = findMaximum(grades, len);
    int min = findMinimum(grades, len);
    float avg = calculateAverage(grades, len);
    print results(max, min, avg);

    return 0;
}

答案 2 :(得分:0)

您有几种选择:

  • 制作数组static。数组grade已被声明为自动变量(仅在其范围分隔符期间存在,它是函数体。但是如果你使它成为static它将其生命延长到所有程序生命周期(它是全局的)变量,尽管它的名称只能在函数体内部使用。)然后return指向它的指针。

    int *getGrade(int argc, char *argv[]){
        int i;
        static int grade[argc - 1];
        for(i=0; i<argc -1; i++){
            grade[i] = atoi(*(argv + i + 1));
        }
        return grade;
    }
    

    这不便于重入,因此您不能让多个线程同时使用该函数,因为它具有全局数据。此外,在完全使用上次调用的值之前,您无法调用该函数,因为只有一个数组grade

  • 使用malloc(3)分配数组并返回其指针。之后,当您不再需要指针时,可以free(3)它,因此它的内存将返回给系统。

    int *getGrade(int argc, char *argv[]){
        int i;
        int *grade = malloc((argc - 1) * sizeof *grade);
        for(i=0; i<argc -1; i++){
            grade[i] = atoi(*(argv + i + 1));
        }
        return grade;
    }
    

    不方便的是,你不知道(修道院)分配元素的数量,所以你必须以某种方式提供它。 (在这种情况下,您分配argc - 1元素,因此您知道数组大小。可重入:此函数的重入性取决于malloc(3)函数的重入性。现在,几乎malloc(3)的所有实现都可以在不同的线程中使用。

  • 从调用例程传递它。这样,您可以在每次函数调用时决定实际的数组,数组大小和其他方面。

    int *getGrade(int argc, char *argv[], int *passed_grade, int size)
    {
        int i;
        for(i=0; i<argc - 1; i++){
            passed_grade[i] = atoi(*(argv + i + 1)); /* <== I don't understand why you don't write argv[i + 1] instead of this unreadable thing (APART THAT IT'S INCORRECT) */
        }
        return passed_grade;  /* returning it makes it possible to use this function in an expression. */
    }
    
    ...
    
    /* then, in main() */
    #define N (argc - 1)
    
    int grade[N];
    int min = findMinimum(getGrade(argc, argv, grade, N), N);
    int max = findMaximum(grade, N); /* grade has already been initialized in last line */
    

    这种方法的不方便是携带比以前多两个参数,但它允许使用不同的阵列大小和。 可重入:此函数重入取决于传递的数组不是全局的。

在我看来,第三种方法是最好的,因为它通常不依赖于malloc(3)例程的可能阻塞(如果在某些实现中由多个线程使用,则可以阻止malloc) ,并且不依赖于static全局数据(使其不可重入)。

注意

  • 您发布的代码有多个编译错误(主要是语法:for循环中两个首次表达之间缺少分号;以及用于访问argv的索引存在问题阵列)

  • 最后一点,如果没有先将其转换为可编译示例,就无法编译和测试示例代码。不要这样做!发布一个完整,可测试和可验证的示例,因为我们无法猜测什么是简单的拼写错误或您身边的概念错误。有关详细信息,请参阅this