【问题标题】:Swapping function c交换功能 c
【发布时间】:2012-04-14 05:47:55
【问题描述】:

我必须为冒泡排序编写交换函数
这就是我所拥有的:

void swap(int arr[], int size, int i, int j)
{
    int temp = *(arr+i);
    *(arr + i) = *(arr+j);
    *(arr+j) = temp;
}

当我尝试运行时,出现以下错误:

警告 C4013:“交换”未定义;假设 extern 返回 int 错误 C2371:“交换”:重新定义;不同的基本类型

当我将函数更改为int 的类型时,它确实有效,知道为什么吗?

我不需要原型,因为它在主函数之前...是吗?

这是整个代码:

//BubbleSort

    void bubbleSort(int arr[], int size)
    {
        int i,j;
        for(i=0; i < size; i++)
        {
            for(j=i+1; j < size; j++)
            {
                if(*(arr+i) > *(arr+j))
                {
                     /*temp = *(arr+i);
                    *(arr + i) = *(arr + j);
                    *(arr + j) = temp;*/
                    swap(arr,i,j);
                }
            }
        }
    }
    void swap(int arr[], int i, int j)
    {
        int temp = *(arr+i);
        *(arr + i) = *(arr+j);
        *(arr+j) = temp;
    }
    void main()
    {
        int i, arr[] = {8,0,6,-22,9};
        bubbleSort(arr, sizeof(arr)/sizeof(int));
        for(i=0; i < sizeof(arr)/sizeof(int); i++)
        {
            printf("%d, ",*(arr+i));
        }
        printf("\n");
    }

【问题讨论】:

  • 当方法具有 void 类型时,您将返回 0。仅当类型不为 void 时才返回值。
  • +1 反对毫无意义、无法解释的反对票。
  • 不,如果函数在使用之前定义,则不需要隔离原型。定义还提供了原型。
  • 贴出整个代码,包括调用者。
  • 如果您使用的是冒泡排序,那么您能做的最好的事情就是辞掉工作,找一份不涉及编程的工作。如果这是家庭作业,请将其标记为家庭作业。

标签: c swap bubble-sort


【解决方案1】:

bubbleSort() 内部,您调用了一个名为 swap() 的函数,但在代码中,没有定义或声明名为 swap() 的函数。

解决方案一:将swap()的定义移到bubbleSort()的定义之前
方案二:在定义bubbleSort()之前先指定swap()的原型

【讨论】:

  • 如果它与 C++ 交换冲突,那么代码一定是用错误的语言编译的,C++。
  • 是的......不幸的是,很多人没有正确配置 MS Visual Studio 以防止 C++ 编译。
【解决方案2】:

您需要将void swap(int arr[], int i, int j) 放在void bubbleSort() 之上,因为您在bubbleSort() 中使用swap()

如果不是,你会遇到 C 的隐式声明,即在main() 中,你调用的是bubbleSort(),而bubbleSort() 将调用swap(),但此时bubbleSort() 确实不知道swap() 的声明,因为它是在它下面声明的。因此,您的编译器理解的是您正在调用 swap(),即 implicitly declared

然后,当你的编译器遇到你真正的void swap(int arr[], int i, int j) 声明时,它会抱怨这是一个重新定义。

除了将swap() 声明移到最顶部之外,您还可以通过将函数声明放在最顶部以及separately 下面的定义来解决。


此外,您似乎没有正确使用指针,因为您已经将int arr[] 传递到swap() 函数中,您可以在其中进行@unwind 指出的直接交换:

const int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;

考虑一下swap()

void swap(int *x, int *y){
int temp = *x;
*x=*y;
*y=temp;
}

这对你来说很重要,你可以通过将地址传递给函数来实际更改变量的content,例如swap(int *x, int *y),这将非常方便。示例:

int x,y;
x=1;
y=1;
increment_both_coordinate(x,y);
//after this call, you want to have x = 2, y = 2

这只能使用类似于swap(int *x, int *y)的方法来实现。这只是一个插图,当您将来看到它们时,您会明白这有多么有用。

【讨论】:

    【解决方案3】:

    这是一个交换整数的函数:

    void swap(int *x, int *y) {
        *x = *x ^ *y;
        *y = *x ^ *y;
        *x = *x ^ *y;
    }
    
    int main(int argc, char* argv) {
    
        int a,b;
    
        a = 5;
        b = 10;
        swap(&a, &b);
        printf("a = %d, b = %d\n", a, b);
        return 0;
    }
    

    您可以这样交换两个数组单元格:swap(&amp;arr[i], &amp;arr[j]);

    【讨论】:

      【解决方案4】:

      使用“void”表示函数不返回任何值,但实际上你的函数返回“0”,这是一个int类型。所以你应该在函数定义之前使用int而不是void。

      【讨论】:

        【解决方案5】:

        因为您返回的是 0。取出 return 语句应该没问题,尤其是因为您操作的是指针而不是复制值。

        【讨论】:

          【解决方案6】:

          如果函数为 void,则不能返回数字。

          改变你的

          return 0;
          

          return;
          

          【讨论】:

            【解决方案7】:

            您似乎缺少该函数的适当原型。

            添加

            void swap(int arr[], int size, int i, int j);
            

            在第一次通话之前。

            此外,在索引中使用这种以指针为中心的表示法并没有什么意义,尤其是因为您将 arr 参数声明为数组,所以会造成混淆。使用起来更干净:

            const int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            

            注意const 也用于temp 值,因为它在分配后不会改变。 3 行函数没什么大不了的,但这是一个好习惯。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-11-15
              • 2018-08-29
              • 2012-02-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多