【问题标题】:Expression must have arithmetic type表达式必须具有算术类型
【发布时间】:2018-01-16 21:35:01
【问题描述】:

在尝试编写代码来查找两个数组的交集时,我遇到了一个问题。我似乎无法修改函数内的指针。 在我的 find_intersection 执行 realloc 函数时出现错误,编译器指出“计数器”没有算术值。 关于这里出了什么问题的任何解释?

#include <stdio.h>
#include <stdlib.h>

int quick_sort(int*, int, int);
void swap(int*, int*);
int partition(int *, int, int);
int input_array_dyn(int*n);
int *find_intersection(int*, int*, int*, int, int,int *);

main()
{
int size1, size2, *counter, i=0;
int *arr1 = input_array_dyn(&size1);
int *arr2 = input_array_dyn(&size2);

quick_sort(arr1, 0, size1 - 1);
quick_sort(arr2, 0, size2 - 1);

int *arr3 = (int*)calloc(size2, sizeof(int));
arr3= find_intersection(arr1, arr2, arr3, size1, size2, &counter);

printf("The size of the new array is:%d\n", counter);
while (i < counter)
{
    printf("%d\n", arr3[i]);
    i++;
}
free(arr1);
free(arr2);
free(arr3);
}

int *find_intersection(int *arr1, int *arr2, int *arr3, int SA, int SB, int *counter)
{
int i = 0, j = 0, n = 0;
*counter = 0;

while (i < SA &&j < SB)
{
    if (arr1[i] < arr2[j])
        i++;
    else if (arr2[j] < arr1[i])
        j++;
    else
    {
        arr3[n] = arr1[i];
        i++;
        n++;
        j++;
    }
}
counter = n;
arr3 = (int*)realloc(arr3, counter*sizeof(int));/*error here*/

return arr3;
}

int input_array_dyn(int*n)
{
int i;
int *a;
printf("Enter the size of the array:\n");
scanf("%d", n);
a = (int*)calloc(*n, sizeof(double));
assert(a);
printf("Enter the array elements:%d.\n", *n);
for (i = 0; i < *n; i++)
    scanf("%d", a + i);
return a;
}
void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
int partition(int *arr, int low, int high)
{
int pivot = arr[high];
int i = (low - 1);

for (int j = low; j <= high - 1; j++)
{
    if (arr[j] <= pivot)
    {
        i++;
        swap(&arr[i], &arr[j]);
    }
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}

int quick_sort(int *arr, int low, int high)
{
if (low < high)
{
    int pi = partition(arr, low, high);

    quick_sort(arr, low, pi - 1);
    quick_sort(arr, pi + 1, high);
}
}

【问题讨论】:

  • 不要描述错误,完整地逐字引用。
  • 通过添加注释来识别错误所指的行。
  • 我不太相信“我只留下了代码的相关部分”。一个真正的minimal reproducible example 我估计只有三分之一的长度。
  • "表达式必须有算术类型"倒数第二行。
  • 函数quick_sortinput_array_dyn 未知。 main() 的定义已过时但向后兼容。

标签: c pointers visual-studio-2015


【解决方案1】:

find_intersection()counter 中是一个指向int 的指针。要更改它的值,您需要使用*counter 而不是counter

【讨论】:

  • 所以,我已将所有 counter 更改为 *counter 并且它有效。谢谢!
  • @GalYacobi stackoverflow.com/help/someone-answers 您明确不需要做任何事情,但请确认您知道这一点。无论如何,当您阅读时,请拨打tour
【解决方案2】:

return arr3; 尝试返回指向 int 的指针,而函数被声明为仅返回 intcounter 是指向 int 的指针,而您将其用作常规 int 设置为 0 等等。

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2022-01-23
    相关资源
    最近更新 更多