Stack In C - несовместимый тип 'int' - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть этот код прямо здесь. Я пытаюсь реализовать, но я получил и ошибка, и я не представляю, как я могу избавиться от этого. Это стек. Я должен вызвать функцию, чтобы вставить значения в нее, но компилятор продолжает показывать эту ошибку и не позволяет мне делать что-либо еще.

Passing 'pilha' to parameter of incompatible type 'int'

pilha * cria_pilha(){
    pilha *pi;
    pi = malloc(sizeof(pilha));

    if (!pi) {
        pi -> topo = 0;
    }
    return pi;

}

и я пытаюсь вызвать его здесь.

int main (int argc, const char * argv[]){
    //Cria vetor de struct preenchido com a quantidade MAX_ELEMENTOS
    pilha * pi = cria_pilha();
    pilha p[MAX_ELEMENTOS] = {1, 2, 3, 4, 5,
                             6, 7, 8, 9, 10};


    //Call the function Stack, then pass by argument p[]
    //stacking the values MAX_ELEMENTS times.

    for (int i = 0; i < MAX_ELEMENTOS; i++) {
        //The error happens here. I already identified the cause but
        //I've got no idea how to solve it. Any help please?
        empilha(pi, p[i]);  --  Passing 'pilha' to parameter of incompatible type 'int'
    }

    for (int i = 0; i < MAX_ELEMENTOS; i++) {
        desempilha(pi);
    }
}

Я вызываю функцию int empilha(pilha *pi, int p);, которая по моим Понимание имеет pilha * pi, который не совместим с типом int. Как я могу решить эту проблему?

Вот весь мой код.

#include <stdio.h>
#include <stdlib.h>
#define MAX_ELEMENTOS 10

typedef struct {
    int elementos[MAX_ELEMENTOS];
    int topo;
} pilha;

pilha * cria_pilha(){
    pilha *pi;
    pi = malloc(sizeof(pilha));

    if (!pi) {
        pi -> topo = 0;
    }
    return pi;

}

int empilha(pilha *pi, int p);
int desempilha(pilha *pi);
int tamanho (pilha *pi);
void destroi(pilha *pi);

int main (int argc, const char * argv[]){
    //Cria vetor de struct preenchido com a quantidade MAX_ELEMENTOS
    pilha * pi = cria_pilha();
    pilha p[MAX_ELEMENTOS] = {1, 2, 3, 4, 5,
                             6, 7, 8, 9, 10};


    //Chama função empilhar, passa por argumento o velho p[]
    //para função empilha MAX_ELEMENTOS vezes.
    for (int i = 0; i < MAX_ELEMENTOS; i++) {
        empilha(pi, p[i]);
    }

    for (int i = 0; i < MAX_ELEMENTOS; i++) {
        desempilha(pi);
    }

}

int empilha(pilha *pi, int p){
    if (pi == NULL || pi -> elementos == ((int*)MAX_ELEMENTOS)) {
        printf("Erro, pilha cheia.\n");
        return 0;
    }

    pi -> elementos[pi->topo] = p;
    pi -> topo = pi -> topo + 1;
    return 1;
}

int desempilha(pilha *pi){
    if (pi == NULL || pi -> elementos[0] == 0) {
        return 0;
    }

    pi -> topo = pi -> topo -1;
    return pi -> elementos[pi->topo];
}

int tamanho(pilha *pi){
    return pi -> topo;
}

void destroi(pilha *pi){
    free(pi);
}

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

В этом вызове

empilha(pi, p[i]);

второй аргумент имеет тип pilha из-за этого объявления

pilha p[MAX_ELEMENTOS] = {1, 2, 3, 4, 5,
                         6, 7, 8, 9, 10};

, но функция ожидает аргумент типа int

int empilha(pilha *pi, int p);

Обратите внимание на то, что неправильно именовать идентификаторы, используя не-английские sh слова. Код в таком случае не читается.

Также использование инициализаторов без фигурных скобок для инициализации агрегатов делает код подверженным ошибкам и неясным.

0 голосов
/ 29 апреля 2020

относительно:

pilha *pi;
pi = malloc(sizeof(pilha));

if (!pi) {
    pi -> topo = 0;
}

, если if() истинно, то вызов malloc() завершился неудачно и pi содержит NULL.

, когда вызов malloc() происходит сбой, pi -> topo = 0; пытается выполнить запись по адресу чуть выше адреса 0x00.

Это приводит к неопределенному поведению, и назначение должно привести к событию ошибки сегмента.

относительно:

for (int i = 0; i < MAX_ELEMENTOS; i++) {
    empilha(pi, p[i]);
}

этот блок кода и функцию: empilha() можно заменить на:

memcpy( pi->elementos, p, MAX_ELEMENTOS * sizeof( int ));

OT: в функции: empilha(), это:

if (pi == NULL || pi -> elementos == ((int*)MAX_ELEMENTOS)) {
    printf("Erro, pilha cheia.\n");
    return 0;
}

уже должен быть проверен перед вызовом этой функции.

OT: относительно:

printf("Erro, pilha cheia.\n"); 

сообщения об ошибках должны выводиться на stderr, а не stdout. Предложите:

fprintf( stderr, "Erro, pilha cheia.\n");

относительно выражения:

((int*)MAX_ELEMENTOS) 

это то же самое, что:

int *10; 

Определенно не то, что вы хотите, и это ничего не проверяет

...