Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Strabush

[Duvida] Structs - Resolvido

Recommended Posts

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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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ê?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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]);

}

Share this post


Link to post
Share on other 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]);

:cheesygrin:

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
Baderous

Só uma pergunta:

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

Isto está a funcionar?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.