作为初学者,我在Visual Studio中遇到了一个错误,我无法弄清楚如何修复。
以下代码用于解决数组问题。数组内部会有重复的值,因此,程序必须删除它们并组织其余的数组,并返回数组的新大小。
例如:{1, 1, 2, 2, 5, 6, 8}
----> {1, 2, 5, 6, 8}
。
cup
整数计算未组织数组中的NULL
,并且稍后用于在组织内部切换值。
我得到的错误是:
**Warning C4047 '=': 'int' differs in levels of indirection from 'int *'**
和
**Warning C4047 '=': 'int' differs in levels of indirection from 'void *'**
在线:23
,25
,35
(我在下面的代码中添加了行号)。
void main() {
int a[] = { 1, 1, 1, 1, 2, 5, 6, 8, 8, 2, 5, 6, 2, 1, 8, 3 };
int sizearr, i;
sizearr = fixArr(a, sizeof(a));
for (i = 0; i < sizearr; i++) {
printf("%d ", a[i]);
}
}
int fixArr(int *ptr, int size) {
int arrS1, arrS2, cup;
for (arrS1 = 0; arrS1 < (size--); arrS1++) {
for (arrS2 = (arrS1++); arrS2 < size; arrS2++) {
//23
if (*(ptr + arrS1) = (ptr + arrS2)) {
cup++; //25
*(ptr + arrS2) = NULL;
}
}
}
for (arrS1 = 0; arrS1 < cup; arrS1++) {
for (arrS2 = 0; arrS2 < (size--); arrS2++) {
// 35
if (*(ptr + arrS2) = NULL) *(ptr + arrS2) = *(ptr + (arrS2++));
}
}
return cup;
}
答案 0 :(得分:0)
您的代码中存在以下几个问题:
sizeof(a)
不评估a
中的元素数,而是评估对象a
所需的字节数。如果a
是一个数组,则可以使用sizeof(a) / sizeof(a[0])
获取元素的数量,但如果a
是指针,则无法单独从a
确定元素的数量。
NULL
不是int
的有效值,您不能将此方法用于int
数组。
您的比较不正确:您使用赋值运算符=
而不是等于运算符==
。
在从fixArr
调用函数之前,您应该声明函数main
。
这是一个使用双指方法的更简单版本:使用一个索引进行迭代并将唯一元素与另一个索引存储在同一个数组中:
#include <stdio.h>
int fixArr(int *ptr, int size) {
int i; // index for reading (first finger)
int j; // index for writing (second finger)
int k; // index for searching duplicates
for (i = j = 0; i < size; i++) {
for (k = 0; k < j; k++) {
if (ptr[k] == ptr[i])
break;
}
if (k == j) { // element ptr[i] was not found
ptr[j] = ptr[i]; // copy new unique element
j++; // increment new element count
}
}
return j; // new size
}
int main(void) {
int a[] = { 1, 1, 1, 1, 2, 5, 6, 8, 8, 2, 5, 6, 2, 1, 8, 3 };
int size = sizeof(a) / sizeof(a[0]);
int i, newsize;
printf("original array:");
for (i = 0; i < size; i++) {
printf(" %d", a[i]);
}
printf("\n");
newsize = fixArr(a, size);
printf("fixed array:");
for (i = 0; i < newsize; i++) {
printf(" %d", a[i]);
}
printf("\n");
return 0;
}
答案 1 :(得分:-1)
阅读你的代码我发现了很多错误,例如sizeof(a)
没有返回数组的大小,因为在C中没有标准数组类型。只分配给指针的内存。因此,在您的情况下,sizeof(a)
返回指针a
的大小。这就是为什么你总是需要自己跟踪阵列的长度。
回到你的问题。我的简单解决方案是这样的:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int arr[] = {1,1,1,1,2,5,6,8,8,2,5,6,2,1,8,3};
size_t len = 16;
// create a new array with the same size as the original
// since there is no guarantee all of the numbers
// are not unique
int *new_array = (int *)calloc(len, sizeof(int)), new_len = 0;
// loop throught every number
for (int i = 0; i < len; i++) {
// if the current number, arr[i], is unique
int unique = 1;
// loop backwards to check if any of the previous
// number are the same as the current one
for (int j = i - 1; j > -1; j--) {
// if the same number if found, set unique to 0
// and break out of loop
if (arr[i] == arr[j]) {
unique = 0;
break;
}
}
// if looped all the way to index 0 without
// finding the same number, add it to the last index
// of our new array and increment it's size
if (unique) {
new_array[new_len] = arr[i];
new_len++;
}
}
// finally, if there have been found any duplicated,
// adjust the memory allocated to the new_array pointer
if (new_len < len) {
new_array = (int *)realloc(new_array, sizeof(int) * new_len);
}
// when you're done using your new array,
// free the memory allocated to it
free(new_array);
return 0;
}