我是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));
}
}
答案 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。