Ir para conteúdo
Fórum Script Brasil
  • 0

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


tek6

Pergunta

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 para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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!

Editado por tek6
Link para o comentário
Compartilhar em outros 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

Editado por Marcelo Utikawa da Fonseca
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...