2017-05-28 37 views
0

我正在处理一个示例,当我运行它时,我的代码停止了woking(请注意,我将该问题翻译为英语,因此对于语法错误感到抱歉。) 这是问题:C指向数组示例的指针停止工作

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()函数a nd这里是我的工作:

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 
     } 
    } 
} 

但它停止工作,当我运行它。我犯了什么错误,我该如何解决?

+3

'param1 = param2'会导致你很多很多问题。 –

+0

@MichaelAlbers,我该如何解决它? –

+0

'int array [param2];'(在编译时无法确定大小的数组)是一种常见的编译器扩展,但不是标准的C++。如果你需要这样的东西,可以使用'std :: vector'(但你根本不用'array')。 – aschepler

回答

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这样的旧编译器不允许。

+0

谢谢。顺便说一下,你可以解释为什么'*(param1 + j)> average'应该被替换为'(*(param1 + j))> average'?为什么在这种情况下砖砌很重要? –

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 
    } 
}}