我正在研究一个例子,当我运行它时,我的代码停止了。(请注意,我将问题翻译成英文,对于语法错误感到遗憾。) 以下是问题:
myShrink()
函数的原型是这样的:
void myShrink(int *param1, const int param2);
myShrink()
函数应该找到数组param1
的平均值然后如果它小于平均值则应该将元素递增1,或者如果它超过平均值则应该将元素递减1 。 param2
是数组中的一些元素。
以下是main()
功能的内容:
void myStretch(int *param1, const int param2);
int main () { int myArray[] = {2, 4, 2, 4, 2, 4};
int index;
myStretch(myArray, 6);
printf("UPDATED ARRAY: ");
for(index = 0; index < 6; index++){
printf("%d\t", myArray[index]);
}
return 0;
}
---------运行程序时的结果:-----
更新阵列:1 5 1 5 1 5
现在这是问题部分我们需要的是基本编程myShrink()
函数的内容,这是我的工作:
void myShrink(int *param1, const int param2)
{
int array[param2];
param1=array;//Using pointer to point elements of array
int average=0;
int i,j;
for(i=0;i<param2;i++)
{
average+=*(param1 + i);//Adding each element of array
}
average=average/param2;//Then dividing result to param2 to find average
for(j=0;j<param2;j++)
{
if(*(param1+j)<average)//if below average
{
*(param1+j)+=1;//increment
}
else if(*(param1+j)>average)//if above average
{
*(param1+j)-=1;//decrement
}
}
}
但是当我运行它时它停止工作。在哪里我犯了错误,我该如何解决?
答案 0 :(得分:0)
这样做:
#include<stdio.h>
void myStretch(int *param1, const int param2);
int main () { int myArray[] = {2, 4, 2, 4, 2, 4};
int index;
myStretch(myArray, 6);
printf("UPDATED ARRAY: ");
for(index = 0; index < 6; index++){
printf("\n%d\t", myArray[index]);
}
return 0;
}
void myStretch(int *param1, const int param2)
{
int average=0;
int i,j;
for(i=0;i<param2;i++)
{
average+=*(param1 + i);//Adding each element of array
}
average=average/param2;//Then dividing result to param2 to find average
for(j=0;j<param2;j++)
{
if(*(param1+j)<average)//if below average
{
(*(param1+j))+=1;//increment
}
else if(*(param1+j)>average)//if above average
{
printf("%d ",(*(param1+j)));
(*(param1+j))-=1;//decrement
}
}
}
现在首先:你的结果是错的。应该是3 3 3 3 3 3.由于这种情况下的平均值为3,因此2将变为3,而4也将变为3.其次,您不必在函数内部分配新数组。就这样做吧。第三个错误:
*(param1+j)>average
应替换为
(*(param1+j))>average
并且类似于低于标志。 更新:还要注意很多人认为数组[param2]是合法的还是不合法的。声明这样的数组时,它们被称为可变长度数组(VLA)。这在现代C编译器中是允许的,但是像Turbo C这样的旧编译器不允许这样做。
答案 1 :(得分:0)
在 myShrink 函数下面,'param1 = array;'之后声明 param1 开始指向内部有垃圾的数组。
void myShrink(int *param1, const int param2){
int array[param2];
param1=array;//Using pointer to point elements of array
int average=0;
int i,j;
//debug code to shows param1 points to array which has garage inside
int index =0 ;
for(index = 0; index < 6; index++){
printf("myDebug: %d\n", param1[index]);
}
for(i=0;i<param2;i++)
{
average+=*(param1 + i);//Adding each element of array
}
average=average/param2;//Then dividing result to param2 to find average
for(j=0;j<param2;j++)
{
if(*(param1+j)<average)//if below average
{
*(param1+j)+=1;//increment
}
else if(*(param1+j)>average)//if above average
{
*(param1+j)-=1;//decrement
}
}}