我在C中有以下代码:
SQL> select value from table(test_pkg.keyval_tab ('{12345=Gold}|{12346=Silver}'))
2* where key='12346';
VALUE
--------------------------------------------------------------------------------
Silver
SQL> select key from table(test_pkg.keyval_tab ('{12345=Gold}|{12346=Silver}'))
2 where value='Gold';
KEY
----------
12345
函数#include <stdio.h>
// Global variables :
int i;
int x[10];
int Nmax;
int sum;
// Functions used :
void Summation();
int Average(float avg); // This function will return avg
int main()
{
float avg;
printf("Mention how many numbers to be added\n");
scanf("%d",&Nmax);
printf("Enter %d numbers\n",Nmax);
for (i=0; i<Nmax; i++){
scanf("%d",&x[i]);
}
Summation();
Average(avg);
printf("%d %d %f\n",Nmax,sum,avg);
printf("Average = %.2f\n",avg);
return 0;
}
// Summation :
void Summation()
{
sum=0;
for (i=0; i<Nmax; i++) {
sum=sum+x[i];
}
printf("Sum of them = %d\n",sum);
}
// Average
int Average(float avg)
{
avg=(float)sum/(float)Nmax;
return avg;
}
不会返回预期的平均值。
相反,它显示了垃圾值。
典型的输入/输出:
Average
这里出了什么问题?希望我这里不需要指针或做我?
答案 0 :(得分:3)
对于平均函数,您将参数作为pass by value传递。一旦调用该函数,您就不会将返回值分配回main函数内的avg变量。所以你要打印的是main函数中声明的avg变量中的垃圾值。将您的代码更改为
avg = Average(avg);
这也是编写c程序的一种非常糟糕的方式。如果你不需要,请不要使用全局变量。
答案 1 :(得分:2)
int
和float
,这可能会导致问题。您永远不会在avg
中初始化main()
,使用参数而不是全局变量来避免混淆。您将avg
的值传递给Average()
,在这种情况下它完全没用。
在c函数中,函数的参数始终按值传递,因此avg
中的值Average()
未被修改,您可能认为这是因为您似乎对如何到处修改全局变量。事实是全局变量是意思,当然它们有它们的用途,例如,库中的全局状态可以存储在全局变量 1 中,但通常它们不是需要的。
试试这个
#include <stdio.h>
// Functions used :
float Summation(float *data, int size);
float Average(float *data, int size); // This function will return avg
int
main(void)
{
int size;
printf("Mention how many numbers to be added\n");
if (scanf("%d", &size) == 1)
{
float data[size];
float sum;
float average;
int i;
printf("Enter %d numbers\n", size);
for (i = 0 ; ((i < size) && (scanf("%f", &data[i]) == 1)) ; i++)
;
size = i;
sum = Summation(data, size);
average = Average(data, size);
printf("%d %f %f\n", size, sum, average);
printf("Average = %.2f\n", average);
}
return 0;
}
// Summation :
float
Summation(float *data, int size)
{
float sum;
sum = 0;
for (int i = 0 ; i < size ; i++)
sum = sum + data[i];
return sum;
}
// Average
float
Average(float *data, int size)
{
return Summation(data, size) / (float) size;
}
请注意,您&#34; 确实不需要Average()
功能。&#34;,尽管使API清洁可能很有用。
1 虽然我也不喜欢它,但它使得多线程环境中的库非常有限。有时候它会生成senes,但是你总是可以拥有一个包含所有需要数据的结构,并在每次调用库API时传递它。所以全局变量很少是好的。