我有这个程序来制作和填充数组。然后将它发送到一个名为reverse的函数,该函数反转数组中的顺序。编译器不断给出错误。我不太清楚为什么。
CODE
let url = NSURL(string: "TestB://com.dali.TestB")!
UIApplication.sharedApplication().openURL(url)
它一直给我这个错误
void reverse(int* array, int size) {
for (int i = 0; i < size/2; i++) {
int temp = array[i];
array[i] = array[size-i];
array[size-i] = temp;
} // end of for loop
} // end of reverse
int main( int argc, char** argv ) {
int array[8];
// get and print size of the array
int size = sizeof(array) / sizeof(array[0]);
printf("Size is %d\n", size);
// populate array
for (int i = 0; i < size; i++) {
array[i] = i;
} // end of for loop
// display array before reversing
for (int i = 0; i < size; i++) {
printf("%d ", array[i]);
} // end of for loop
// new line
printf("\n");
// reverse the array
reverse(&array, size);
// display the array again after reversing
for (int i = 0;i < size; i++) {
printf("%d ", array[i]);
} // end of for loop
} // end of main
答案 0 :(得分:0)
我确实解决了这个问题,可能你会使用这段代码:
#include <iostream>
void displayArray(int table[], int size);
void rev(int table[], int size);
void fillTheArray(int table[], int size);
int main(int argc, char** argv) {
int myArray[8];
int size = sizeof(myArray) / sizeof(myArray[0]);
std::cout << "Array size is: " << size << std::endl;
fillTheArray(myArray, size);
displayArray(myArray, size);
std::cout << std::endl;
rev(myArray, size);
displayArray(myArray, size);
std::cin.get();
return 0;
}
void fillTheArray(int table[], int size) {
for (int i = 0; i < size; i++) {
table[i] = i;
}
}
void displayArray(int table[], int size) {
for (int i = 0; i < size; i++) {
std::cout << table[i] << " ";
}
std::cout << std::endl;
}
void rev(int table[], int size) {
int *start = table;
int *end = table + (size - 1);
for (int i = 0; i < size; i++) {
if (start < end) {
int temp = *end;
*end = *start;
*start = temp;
}
start++;
end--;
}
}
答案 1 :(得分:0)
我在这段代码中看到两个错误。首先是:将参数传递给函数的错误方法:
// reverse the array
reverse(&array, size);
您应该这样做(数组名称是指向该数组第一个元素的指针):
reverse(array, size);
第二个问题是反向器-您尝试访问一些超出范围的随机内存:
array[i] = array[size-i];
请记住,在C ++数组索引的开头不是0,而不是1。因此,如果您的数组大小为8,则此数组的最大索引为7(0、1、2、3、4、5、6、7)。您的代码应如下所示:
array[i] = array[size -i -1];
它应该可以按预期工作。
这是我的指针解决方案:
void reverse(int arr[], int count)
{
int* head = arr;
int* tail = arr + count - 1;
for (int i = 0; i < count/2; ++i)
{
if (head < tail)
{
int tmp = *tail;
*tail = *head;
*head = tmp;
head++; tail--;
}
}
for (int i = 0; i < count; ++i)
{
std::cout << arr[i] << " ";
}
}
或只使用C ++中构建的函数:'algorithm'库中的std :: reverse。
关于stackoverflow的很多示例都包含以下示例: Reverse Contents in Array
答案 2 :(得分:-1)
您修复了代码中的大部分编译器错误,除了一个。
该行
reverse(&array, size);
应该是
reverse(array, size);
修复后,您必须修复reverse
中的逻辑错误。
您使用错误的索引访问数组的上半部分。
void reverse(int* array, int size) {
for (int i = 0; i < size/2; i++) {
int temp = array[i];
array[i] = array[size-i]; // When i is 0, you are accessing array[size]
// That is incorrect.
array[size-i] = temp;
} // end of for loop
} // end
您需要使用
void reverse(int* array, int size) {
for (int i = 0; i < size/2; i++) {
int temp = array[i];
array[i] = array[size-i-1];
array[size-i-1] = temp;
}
}
接近算法的另一种方法是使用两个索引。
void reverse(int* array, int size) {
for (int i = 0, j = size-1; i < j; ++i, --j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
工作计划:http://ideone.com/ReVnGR。
答案 3 :(得分:-2)
你将** int而不是* int传递给反向方法:
reverse(&array, size);
通过它:
reverse(array, size);