Ponteiros e funções [RESOLVIDO]

1. Ponteiros e funções [RESOLVIDO]

william jussim
jussim

(usa Ubuntu)

Enviado em 05/09/2018 - 19:29h

Boa Noite,

A situação é a seguinte, estou estudando C e estou com dificuldades em uma parte de um código. Tenho a seguinte funçao:

void incluirCliente (cliente *p){
printf("\nDigite o nome do Cliente: ");
gets (p->nome);
printf("\nDigite o CPF do Cliente: ");
scanf("%d", &p->cpf);
printf("\nDigite o endereco do Cliente: ");
gets(p->endereco);
printf("\nDigite o Telefone do Clinte: ");
scanf("%d", &p->telefone);
}
O tipo de dado 'cliente' foi criado anteriormente, no caso a função acima recebe como parametro o endereço de uma posição de vetor de uma variavel do tipo cliente. Porém após solicitar para digitar o endereço de cliente o codigo pula para o telefone, não deixando digitar a string do endereço. e ao exibir os dados da variavel nesta posiçao o CPF vem com uma numeração diferente e negativa.

Alguém me ajuda a entender o problema? Caso precise de mais partes posso postar outras partes do codigo tbm.



  


2. MELHOR RESPOSTA

MAURO BRITIVALDO
AnsiC

(usa Kali)

Enviado em 06/09/2018 - 10:23h

Olá, tudo bem?

A função gets captura os caracteres até o '\n', se há somente '\n' no fluxo, somente '\n' será capturado pela função.

A função scanf, normalmente, deixa o caractere de nova linha ('\n') no final de cada entrada no fluxo de dados do arquivo padrão de entrada -- stdin. A função gets interrompe sua captura sempre que o caractere de nova linha for lido. No algoritmo do problema em questão, gets interrompe sua leitura assim que encontrou o caractere '\n', antes deixado pela função scanf: os dados abandonados de outras entradas são conhecido por lixo, no caso o caractere de nova linha ('\n') é uma sobra que foi logicamente errada e lida.

Um ponteiro é um tipo de dados, pode ter o mesmo tratamento que os tipos primitivos.

Os ponteiros são uma implementação interna, implícita, que usa o tipo primitivo unsigned int de base de dados. O mais importante é que, podemos aplicar as mesmas notação, com pouco diferenças.

Assim sendo, para declarar um vetor do tipo int, segue assim:
int vet_int[VETSIZ]; 

Logo, para declara um vetor de ponteiros do tipo int, segue assim:
int* vet_intp[VETSIZ]; 

Assim notamos os vetores de tipos e ponteiros para tipos. Com relação aos protótipos de função, respeitamos o mesmo processo, por uma questão de consistência seguimos sempre a mesma notação escolhida para todos os casos, logo, segue assim:
void func1 (int  vti[]);  /**< Função com ponteiro para vetor do tipo int */
void func2 (int* vtip[]); /**< Função com ponteiro para vetor de ponteiros do tipo int */


Existem mais algumas formas de se notar, escolho essa notação por ser a mais inteligível.
O.k. ?! Tchau.

Att. AnsiC

3. Re: Ponteiros e funções [RESOLVIDO]

william jussim
jussim

(usa Ubuntu)

Enviado em 05/09/2018 - 21:50h

Então galera, esse problema consegui resolver, se alguem puder me explicar a parte teórica do porque no funcionou eu agradeço. Mas surgiu outra duvida agora. Como eu faço se eu quiser passar um vetor de ponteiros como parametro em uma função?


4. Re: Ponteiros e funções [RESOLVIDO]

william jussim
jussim

(usa Ubuntu)

Enviado em 06/09/2018 - 11:18h

Opa, Obrigado pela ajuda amigo. Mas estou com a seguinte situação, tenho o tipo de dados projeto que criei que contem duas variaveis do tipo caracter, duas do tipo inteiro e um ponteiro para uma variavel do tipo cliente.
Criei um vetor de 10 posições de uma variavel do tipo projeto e eu quero passar o endereço desse vetor como parametro em uma função. Dessa forma a minha função varreria todo o vetor. Mas estou com dificuldades nisso.

Estruturalmente compila, mas não exibe o esperado. A seguir esta o codigo da função.

void listaProjetos (projeto *p[10]){
int a=0;
while (a<2){
printf("\nProjeto: %s\n Inicio: %d/%d%/%d \nFim(Previsão): %d/%d/%d \nValor: R$ %.2f\nSituacao: %s", p[a]->nome, p[a]->inicio.dia, p[a]->inicio.mes, p[a]->inicio.ano, p[a]->fim.dia, p[a]->fim.mes, p[a]->fim.ano, p[a]->preco, p[a]->sit);
a++;
}
}

e a chamada da função:

listaProjetos(&pro);




5. Re: Ponteiros e funções [RESOLVIDO]

MAURO BRITIVALDO
AnsiC

(usa Kali)

Enviado em 06/09/2018 - 13:54h

Qual é o código da declaração pro?
... para ter algo definitivo a falar preciso saber o estado da declaração da variável pro


6. Re: Ponteiros e funções [RESOLVIDO]

william jussim
jussim

(usa Ubuntu)

Enviado em 06/09/2018 - 14:34h

projeto pro[2];

A variavel pro é um vetor de projeto de x posições.

o tipo projeto é do seguinte:

typedef struct Projeto {
char nome[50];
data inicio;
data fim;
float preco;
int situacao;
char sit[11];
}projeto;


7. Re: Ponteiros e funções

MAURO BRITIVALDO
AnsiC

(usa Kali)

Enviado em 06/09/2018 - 15:16h

...
Então, segue o mesmo raciocínio que a declaração, assim sendo:
projeto pro[2];  /**< é uma declaração para vetor do tipo projeto */
void func1 (projeto pro[]); /**< pro[] é um ponteiro, no protótipo da função */


Acesse dentro da função do mesmo jeito que antes fora dela.



8. Re: Ponteiros e funções [RESOLVIDO]

william jussim
jussim

(usa Ubuntu)

Enviado em 06/09/2018 - 15:21h

Nesse caso o "pro[]" seria um vetor que copiaria todo o conteudo do vetor original certo? se eu quisesse acessar diretamente uma posição do vetor pro que esta no meu main mas de dentro de uma função? Isto que estou quebrando a cabeça.


9. Re: Ponteiros e funções

MAURO BRITIVALDO
AnsiC

(usa Kali)

Enviado em 06/09/2018 - 15:32h

Não, não se trada de uma cópia, e se de uma ponteiro, as mudanças feitas na função serão feitas na mesma variável que vem da função de origem, no caso as duas variáveis apontam para o mesmo local na memória.


10. Re: Ponteiros e funções [RESOLVIDO]

william jussim
jussim

(usa Ubuntu)

Enviado em 06/09/2018 - 15:38h

Entendi, Vou testar aqui no codigo. Muito Obigado pelo Suporte.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts