Gal
Gal

Reputation: 13

Expression must have arithmetic type

While trying to write a code to find the intersection of two arrays,I came across a problem. I can't seem to modify a pointer inside a function. Inside my find_intersection I get the error while doing the realloc function,compiler states that "counter" has no arithmetic value. Any explanation on what went wrong here?

#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);
}
}

Upvotes: 1

Views: 23126

Answers (2)

user7860670
user7860670

Reputation: 37468

return arr3; attempts to return a pointer to int while function is declared to return just int. counter is a pointer to an int while you are using it as an regular int setting to 0 and so on.

Upvotes: 3

meaning-matters
meaning-matters

Reputation: 22936

In find_intersection() counter is a pointer to an int. To change it's value you need to use *counter instead of counter.

Upvotes: 6

Related Questions