2 предупреждения: «int *» отличается по уровням косвенности от «int **» и отличается типами для формального и фактического параметра 3 - PullRequest
0 голосов
/ 30 августа 2018

Я написал код, который предполагает удаление повторяющихся элементов в массиве целых чисел без сортировки.

Для этой задачи я написал функцию с именем 'removeDuplicateElements', который получает массив и его строку и возвращает динамически размещаемый новый массив, который на самом деле является исходным массивом с удалением всех его дублирующих элементов. Эта функция также возвращает по ссылке размер нового массива.

Я также использовал в своем коде функции, которые создают динамический массив и распечатывают его.

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

void printArray(int* arr, int size);
int* buildArray(int size);
int* removeDuplicateElements(int *arr, int size, int *newSize);

void main()
{
    int size;
    int *newSize;
    int *arr;
    int *newArr;

    printf("please enter a number for the size of array: ");
    scanf("%d", &size);
    printf("\nenter %d numbers: ", size);
    arr = buildArray(size);
    printf("\nthe array after removing the duplicate elements  is: ");
    newArr = removeDuplicateElements(arr, size, &newSize);
    size = *newSize;
    printArray(newArr, size);
    free(newArr);
    free(arr);
}

void printArray(int* arr, int size)
{
    int i;
    for (i = 0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}


int* buildArray(int size)
{
    int i;
    int* arr = (int*)malloc(size * sizeof(int));

    if (!arr)
    {
        printf("ERROR! Not enough memory!\n");
        exit(1);
    }

    for (i = 0; i < size; i++)
        scanf("%d", &arr[i]);

    return arr;
}

int* removeDuplicateElements(int *arr, int size, int *newSize)
{
    int *newArr;
    int count = size, i, j;

    for(i=1;i<size;i++)
        for(j=0;j<size;j++)
            if (arr[i] == arr[j] && i!=j)
            {
                count--;
                break;
            }
    newArr = (int*)malloc(count * sizeof(int));

    count = 1;
    newArr[0] = arr[0];

    for (i = 1; i < size; i++)
        for (j = 0; j < size; j++)
        {
            if (arr[i] == arr[j] && i!=j)
                    break;
            else if (j == size - 1)
                newArr[count++] = arr[i];
        }

    *newSize = count;
    return newArr;
}

Теперь, когда я запускаю этот код - я получаю два следующих предупреждения:

warning C4047: 'function': 'int *' differs in levels of indirection from 'int **'
warning C4024: 'removeDuplicateElements': different types for formal and actual parameter 3

Я пытался получить помощь от qeustions с похожей проблемой, но я все еще не понимаю, что не так и почему я получаю эти предупреждения. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 30 августа 2018

Вы передаете int** в качестве третьего аргумента для removeDuplicateElements, но получаете int*.

int *newSize;
newArr = removeDuplicateElements(arr, size, &newSize);

ваш прототип,

int* removeDuplicateElements(int *arr, int size, int *newSize)

должно быть

int* removeDuplicateElements(int *arr, int size, int **newSize)

Или вы можете использовать int*, как показано ниже.

int newSize;
newArr = removeDuplicateElements(arr, size, &newSize);
size = newSize;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...