Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Strabush

[Duvida] Structs - Resolvido

Mensagens Recomendadas

Strabush

Boa tarde.

Bem, estou com uma dúvida acerca de estruturas e tipos de estrutura.

Basicamente o programa faz o seguinte, adiciona um nome á struct, struct esta pode ter 10 "nomes".

O código é mais ou menos assim:

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

struct cliente{
char nomeCliente[255];                        /* DADOS DO CLIENTE */
};
typedef struct cliente CLIENTE;

void criaCliente(CLIENTE * p){
         printf("Nome Cliente: ");
         scanf("%[^\n]", &p->nomeCliente);
}

int main(){
int nClientes=0;
CLIENTE cliente[10]; 

if (nClientes >=10 ) printf("Não há mais espaço para guardar dados");
  else {
            cliente[nClientes]=criaCliente(&cliente[nClientes]);
            nClientes ++;}
}

Simplicando o código é este. No entanto ao compila-lo assinala-me um erro, precisamente na antepenultima linha, que diz que " cannot convert from 'void' to 'CLIENTE' ". Alguém me pode ajudar?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Estás a fazer uma coisa esquisita. Tens uma função do tipo void e depois "estás a receber" em cliente[nClientes] um void. Se estás a passar por referência a posição não precisas de receber. Basta fazeres:

criaCliente(&cliente[nClientes]);


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

Obrigado desde já.

Ve a antepenultima linha do código, já assim está. Eu acho que tenho de mudar o tipo da função criaCliente, ao invés de void, por CLIENTE, mas no entanto esta função tem de retornar alguma coisa, o quê?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Tu não precisas de retornar nada porque já estás a passar por referência, só retornavas se passasses por valor.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

Nesta linha de código:

cliente[nClientes]=criaCliente(&cliente[nClientes]);

Mudei e ficou assim:

criaCliente(&cliente[nClientes]);

Agora surge outra dúvida. Ele automaticamente vai adicionando os dados á cada valor da estrutura, e se eu quiser listar(imprimir/mostrar), o valor da estrutura de todos os clientes, de 1 á 5 por exemplo, como faço?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

Mas neste caso o array é um struct, é tão simples assim?

Btw, tenho isto, mas ao imprimir aparece algo estranho:

void mostraCliente(CLIENTE * p){  
printf("Nome: %s\n", p->nomeCliente);
}

int main(){
     int i;

   for(i=0; i <= nClientes; i++)
        mostraCliente(&cliente[nClientes]);

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

Problema resolvido. Era só mudar isto:

for(i=0; i <= nClientes; i++)
        mostraCliente(&cliente[nClientes]);

Para isto:

for(i=0; i < nClientes; i++)
        mostraCliente(&cliente[i]);

:biggrin:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Atenção que se for só para mostrar a informação não precisas de todo de passar por referência. Podes perfeitamente passar por valor e mostrar só a informação, sem andares a utilizar o operador ->.

Acho que ainda não percebeste muito bem o que é passagem por referência.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

Só uma pergunta:

scanf("%[^\n]", &p->nomeCliente);

Isto está a funcionar?

Está sim, no fundo o que faz é copiar todos os caracteres digitados e guardar na variavel nomeCliente da struct. Tenho trabalhado no VisualStudio2010, ele dá warnings quanto ao scanf, mas não impede a execução do código. Outro input melhor que o scanf é o fgets certo?

Ja tenho o código todo feito. É possível adicionar 10 clientes, marcar 100 consultas, listar os clientes existentes, procurar por clientes, procurar e listar as consultas também. Está perfeito agora.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Pois, dá esse warning porque supostamente o operador & está aí a mais, visto que p->nomeCliente já tem o endereço da string.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

Pois, dá esse warning porque supostamente o operador & está aí a mais, visto que p->nomeCliente já tem o endereço da string.

Sem o "&" dá erro, nem corre se quer.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

Este:

0xC0000005: Access violation writing location 0x0000cccc

E depois aparece outra aba com códigos em Assembly. Isto no Visual Studio.

Btw, correr ele corre, mas na hora de digitar os dados do "pc->dia", sem o "&" ele dá o tal erro, até o CMD bloqueia.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.