我必须为我的冒泡排序编写一个交换函数 这就是我所拥有的:
void swap(int arr[], int size, int i, int j)
{
int temp = *(arr+i);
*(arr + i) = *(arr+j);
*(arr+j) = temp;
}
当我试图运行时,我收到以下错误: 警告C4013:'swap'undefined;假设extern返回int 错误C2371:'swap':重新定义;不同的基本类型\
当我更改int类型的函数时,它确实有效, 知道为什么吗?
谢谢大家!
编辑:对不起'返回0'只有在我把这个函数变成一个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");
}
答案 0 :(得分:2)
你似乎缺乏适合该功能的原型。
添加
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
值,因为它在分配后不会改变。在三线功能中没什么大不了的,但这是一个好习惯。
答案 1 :(得分:1)
原始问题包含所有代码后编辑
在bubbleSort()
内部调用名为swap()
的函数,但是在代码中的那一点,没有定义或声明名为swap()
的函数。
解决方案1:将swap()
的定义移至bubbleSort()
的定义之前
解决方案2:在定义swap()
bubbleSort()
的原型
显然
错误C2371:'swap':重新定义;不同的基本类型
在您定义自己的范围时,范围内还有另一个swap
函数。
也许this one?
答案 2 :(得分:1)
您需要在void swap(int arr[], int i, int j)
之上放置void bubbleSort()
,因为您在swap()
内使用bubbleSort()
。
如果不是,您将遇到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 :(得分:0)
如果该功能无效,则无法返回数字。
更改您的
return 0;
到
return;
答案 4 :(得分:0)
因为你正在返回0.取出return语句你应该没问题,特别是因为你操作指针而不是复制值。
答案 5 :(得分:0)
使用“void”意味着函数不返回任何值,但实际上你的函数返回“0”,这是一个int类型。所以你应该在函数定义之前使用int而不是void。
答案 6 :(得分:0)
这是一个交换整数的函数:
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(&arr[i], &arr[j]);