【问题标题】:Swap function of elements in array数组中元素的交换函数
【发布时间】:2014-09-19 02:48:41
【问题描述】:

我要执行的最后一项任务是将数组的第一个元素 (array[0]) 的值与数组的最后一个元素 (array[2]) 交换;但是,每当我编译时,我都会收到这三个错误,似乎无法修复:

:4 redefinition of parameter 'array'

:32 incompatible type for argument 1 of 'swap'
:32 incompatible type for argument 2 of 'swap'

这是我的代码:

    #include <stdio.h>

    void
    swap(double *array[0],double *array[2])
       {
       int temp = *array[0];
       *array[0] = *array[2];
       *array[2] = temp;
       }
   int
   main(int argc, char **argv)
       { 

       double array[3] = {0};
       double realNumber;
       printf("array[0] is %f\n",array[0]);
       printf("array[1] is %f\n",array[1]);
       printf("array[2] is %f\n",array[2]);
       printf("enter the first real number:\n");
       scanf("%lf",&realNumber);
       array[0] = realNumber;
       printf("enter the second real number:\n");
       scanf("%lf",&realNumber);
       array[1] = realNumber;
       printf("enter the third real number:\n");
       scanf("%lf",&realNumber);
       array[2] = realNumber;
       printf("array[0] is %f\n",array[0]);
       printf("array[1] is %f\n",array[1]);
       printf("array[2] is %f\n",array[2]);

       swap(double array[0],double array[2]);

       printf("after swapping...\n");
       printf("array[0] is %f\n",array[0]);
       printf("array[1] is %f\n",array[1]);
       printf("array[2] is %f\n",array[2]);
       return 0;
       }

【问题讨论】:

  • @self,我闻起来像家庭作业。

标签: c arrays function pointers swap


【解决方案1】:

我强烈怀疑这个,

void
swap(double *array[0],double *array[2])
   {
   int temp = *array[0];
   *array[0] = *array[2];
   *array[2] = temp;
   }

应该是

void
swap(double *array, int a, int b)
   {
   double temp = *array[a]; /* <- it's a double */
   *array[a] = *array[b];
   *array[b] = temp;
   }

要称呼它,这个

swap(double array[0],double array[2]);

应该是

swap(array,0,2);

最后,如果您愿意,可以通过 temp 变量传入两个指针并使用 swap(array[0], array[2]) 调用它,

void swap(double *a, double *b) 
{ 
  double temp = *a;
  *a = *b;
  *b = temp;
}

【讨论】:

  • 他可以直接在数组内进行交换,而无需在交换函数中传递数组,因为您可以在c中通过引用传递,因此您实际上不需要数组参数
  • @嗯,是的,你的方式也很有效,只是发表了我现在意识到有点不必要的评论,起初似乎问题发布者想要这样......对不起垃圾邮件:),给了你当之无愧的 +1
【解决方案2】:

使用这个...更新的代码...

#include <stdio.h>

void swap(double *a,double *b)
   {
   double temp = *a;
   *a = *b;
   *b = temp;
   }    
int main(int argc, char **argv)
   { 

   double array[3] = {0};
   double realNumber;
   printf("array[0] is %lf\n",array[0]);
   printf("array[1] is %lf\n",array[1]);
   printf("array[2] is %lf\n",array[2]);
   printf("enter the first real number:\n");
   scanf("%lf",&realNumber);
   array[0] = realNumber;
   printf("enter the second real number:\n");
   scanf("%lf",&realNumber);
   array[1] = realNumber;
   printf("enter the third real number:\n");
   scanf("%lf",&realNumber);
   array[2] = realNumber;
   printf("array[0] is %lf\n",array[0]);
   printf("array[1] is %lf\n",array[1]);
   printf("array[2] is %lf\n",array[2]);

   swap(array,array+2);

   printf("after swapping...\n");
   printf("array[0] is %lf\n",array[0]);
   printf("array[1] is %lf\n",array[1]);
   printf("array[2] is %lf\n",array[2]);
   return 0;
   }

【讨论】:

  • 问题在于将值传递给函数和函数调用......当你调用一个函数时,你只需要指定你作为参数而不是数据类型传递的变量的名称......不要'不要在函数调用中使用数据类型...
  • errr,你的临时变量是一个 int
  • 不要只给他完整的代码而不做任何解释。 @ElliottFrisch 的回答更好地向他展示了他可以做很多事情的多种方式......
【解决方案3】:
redefinition of parameter 'array' : 

由于以下函数调用,您会收到此错误:

Error 1 :    
    swap(double array[0],double array[2]);

在调用函数时,我们从不将数据类型与变量一起传递,只需传递
参数。

Correction : 
    swap(array[0],array[2]);     // if you want to pass the values as parameters.
     //or
    swap(array, array); // for passing pointers to the array( pass by reference )      

您可以阅读有关按值传递和按引用传递的信息。需要注意的一点是,在 C
数组总是通过引用传递。

Error 2:
incompatible type for argument 1 of 'swap' :32 incompatible type for argument        
2 of 'swap' :

这个错误是因为你给的swap函数原型是

    void swap(double *array[0],double *array[2]);     
  1. 这不是提供函数原型的标准方式。

    1. 但是,当您调用函数时,您只传递了双精度值,而应该根据原型定义传递双精度数组的地址。

    更正:

    1. 原型声明:
      无效交换(双 *,双 *); // 通过引用传递
      无效交换(双,双); // 传值

2.映射正确的原型和它们各自的函数调用:

If you want to pass the base address of the array as argument :          
prototype : void swap(double *, double *);                   
call      : swap(array, array);             

但是这里我建议你不需要传递两个参数,如果它们相同的话。

If you want to pass a specific value stored in array at some index say 'i':
prototype : void swap(double, double);
call      : swap(array[i], array[j]);

其中 'i' 和 'j' 是数组的索引。

【讨论】:

    【解决方案4】:

    每次在变量名称前添加类型时,您都在声明该类型的新变量并使用该名称。

    所以你在main() 的顶部声明数组:

    double array[3] = {0};
    // ... some code in between
    swap(double array[0],double array[2]); // here you re-declare it
    

    这里不需要double,因为程序已经知道数组包含双精度数。这就是您收到redefinition of parameter 'array' 错误的原因。 删除第二条语句中的两个double 类型:

    double array[3] = {0};
    // ... some code in between
    swap(array[0], array[2]);
    

    另外,您的数组只包含一个元素,即0。但是您想交换不存在的第一个 array[0] 和第三个 array[2] 元素。创建一个更大的数组,例如:

    double array[3] = {0, 1, 2};
    // ... some code in between
    swap(array[0], array[2]);
    

    此外,您对swap 函数的定义也是错误的。

    void 
    swap(double *array[0],double *array[2])
    {
        int temp = *array[0];
        *array[0] = *array[2];
        *array[2] = temp;
    }
    

    您不需要[position] 部分作为参数。此函数是通用函数,不应只交换array[0]array[2]。您在这里只需要一个double *,因为array[position] 是一个double,这就是您传递给函数的内容。您通过引用传递此值(这就是您拥有* 的原因),以便交换实际上在函数之外工作,而不仅仅是在本地交换。

    Read more about pointer/references in C

    这是你应该拥有的:

    void swap(double *number1, double *number2)
    {
       int *temp = number1;
       number1 = number2;
       number2 = temp;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-21
      • 2021-06-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多