Jump to content
Fórum Script Brasil
  • 0

[Dúvida] sobre qual o erro do código


tek6
 Share

Question

Boa Noite! Não intendo o erro desse código:

struct.c: Na função ‘main’:

struct.c:50:2: aviso: passing argument 1 of ‘inicia’ from incompatible pointer type [habilitado por padrão]

struct.c:27:6: nota: expected ‘struct pessoa *’ but argument is of type ‘struct pessoa **’

Ficarei grato se me ajudarem!

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

typedef struct Pessoa {
    char nome[20];
    int dataNasc[3];
    int telefone;
} pessoa;
//Preenche o cadastro - OPERADOR SETA ->
void preencher(pessoa *cadastro) {
    printf ("Digite um nome: ");
    gets (cadastro->nome);
    printf ("Digite a data de nascimento: ");
    scanf ("%d/%d/%d", &cadastro->dataNasc[0], &cadastro->dataNasc[1], &cadastro->dataNasc[2]);
    printf ("Digite o numero do celular: ");
    scanf ("%d", &cadastro->telefone);
}
//Mostra o cadastro
void mostrar(pessoa *cadastro) {
    printf ("%s\n", cadastro->nome);
    printf ("%02d/%02d/%d\n", cadastro->dataNasc[0], cadastro->dataNasc[1], cadastro->dataNasc[2]);
    printf ("%d\n", cadastro->telefone);
    printf ("\n");
}
//Inicializa as estruturas.nome[0] com ''
void inicia(pessoa *cadastro, int tamanho) {
    register int i;

    for (i = 0; i < tamanho; i++) {
        cadastro[i].nome[0] = '';
    }
}

int main(void) {
    pessoa *cadastro = NULL;
    int i, qtde;

    printf ("Digite a quantidade ");
    scanf ("%d", &qtde);
    fflush(stdin);
        //Aloca x espaço para cadastro
    cadastro = malloc(sizeof(pessoa) * qtde);
        //Testa se realmente foi alocado
    if (!(cadastro = malloc(qtde))) {
        printf ("não alocou.");
        exit(1);
    }

    inicia(&cadastro, qtde);

    for (i = 0; i < qtde; i++) {
        fflush(stdin);
        preencher(&cadastro[i]); //Passo o endereço de cadastro para a função
    }

    for (i = 0; i < qtde; i++) {
        mostrar(&cadastro[i]); //Passo o endereço de cadastro para a função
    }

    return 0;
}

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Olá!

O seu problema, conforme indicado pelo compilador, é com o argumento 1 passado para a função inicia. É informado que o tipo da variável passada como parâmetro é inválido.

A sua função inicia foi declarada da seguinte forma:

void inicia(pessoa *cadastro, int tamanho)
Já a variável sendo passada como parâmetro foi declarada da seguinte forma:
pessoa *cadastro = NULL;

Perceba que tanto a variável como o primeiro argumento da função inicia possuem o mesmo tipo: pessoa *

Ou seja: para chamar a função bastaria passar cadastro, sem o &.

Esse é o motivo de erro na compilação.

Quando você usa o &cadastro, você está dizendo: "endereço de cadastro", ou seja, um ponteiro.

Isso faz o tipo da variável cadastro mudar de pessoa * para pessoa **, tornando incompatível com a função.

Link to comment
Share on other sites

  • 0

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

typedef struct Pessoa {
    char nome[20];
    int dataNasc[3];
    int telefone;
} pessoa;
//Preenche o cadastro - OPERADOR SETA ->
void preencher(pessoa *cadastro) {
    printf ("Digite um nome: ");
    gets (cadastro->nome);
    printf ("Digite a data de nascimento: ");
    scanf ("%d/%d/%d", &cadastro->dataNasc[0], &cadastro->dataNasc[1], &cadastro->dataNasc[2]);
    printf ("Digite o numero do celular: ");
    scanf ("%d", &cadastro->telefone);
}
//Mostra o cadastro
void mostrar(pessoa *cadastro) {
    printf ("%s\n", cadastro->nome);
    printf ("%02d/%02d/%d\n", cadastro->dataNasc[0], cadastro->dataNasc[1], cadastro->dataNasc[2]);
    printf ("%d\n", cadastro->telefone);
    printf ("\n");
}
//Inicializa as estruturas.nome[0] com ''
void inicia(pessoa *cadastro, int tamanho) {
    register int i;

    for (i = 0; i < tamanho; i++) {
        cadastro[i].nome[0] = '';
    }
}

int main(void) {
    pessoa *cadastro = NULL;
    int i, qtde;

    printf ("Digite a quantidade ");
    scanf ("%d", &qtde);
    fflush(stdin);
        //Aloca x espaço para cadastro
    cadastro = malloc(sizeof(pessoa) * qtde);
        //Testa se realmente foi alocado
    if (!(cadastro = malloc(qtde))) {
        printf ("não alocou.");
        exit(1);
    }

    inicia(cadastro, qtde);

    for (i = 0; i < qtde; i++) {
        fflush(stdin);
        preencher(&cadastro[i]); //Passo o endereço de cadastro para a função
    }

    for (i = 0; i < qtde; i++) {
        mostrar(&cadastro[i]); //Passo o endereço de cadastro para a função
    }

    return 0;
}

Consertei, compilo. Mas ainda tem um erro, não consigo escrever em cadastro->nome. Já tentei inicicalizar esse campo com a funçao inicia , mas nada. Me ajuda de novo por favor!

Edited by tek6
Link to comment
Share on other sites

  • 0

O problema é que o scanf usa do buffer de entrada (teclado) apenas o que você pediu.

Assim, quando colocamos "%d", ele vai ler apenas o número digitado. Porém nós digitamos o número e o enter no final. Isso quer dizer que sempre fica sobrando o enter no buffer de entrada.

Quando o gets vai ler o nome, ele lê tudo até o primeiro enter. Mas como já tem o enter no buffer, ele acha que já terminou e sai antes de você digitar qualquer coisa.

Para contornar este problema pode ser adicionado este código antes de gets ou scanf:

fflush(stdin);
Isso faz com que o buffer de entrada (standard input - stdin) seja descarregado, eliminando qualquer coisa que tenha ficado para trás. O problema é que tem plataformas que funcionam dessa forma (windows, por exemplo) e outras que não funcionam (como o linux). Outra forma é alterar todos os scanf para eliminar este último caracter. Para isso devemos ler ele também. O seu código deveria ser alterado de:
scanf ("%d", &qtde);
Para:
scanf ("%d%*c", &qtde);

Esse %*c no final vai fazer o scanf ler um caracter depois do número (no caso vai ler o enter, removendo-o do buffer). O * serve para avisar o scanf que esse valor é para ser descartado, não precisa salvar em nenhuma variável.

Espero que isso já resolva seu problema! :)

Abraços,

Marcelo Utikawa da Fonseca

Edited by Marcelo Utikawa da Fonseca
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.2k
    • Total Posts
      647.4k
×
×
  • Create New...