Duvida com vetor de ponteiros struct

1. Duvida com vetor de ponteiros struct

william jussim
jussim

(usa Ubuntu)

Enviado em 14/09/2018 - 16:20h

Boa tarde pessoal,
Estou com uma dúvida. Estou estudando C e me deparei com um problema no meu código. Tenho um tipo de dado abstrato chamado cliiente. O tipo cliente possui um vetor de X posições para um tipo de dado chamado Projeto. O que não consegui compreender é o seguinte:
Toda variavel do tipo projeto tem um ponteiro do tipo cliente que armazena o endereço de memória do seu respectivo cliente. E toda variavel do tipo projeto possui um vetor de ponteiros para o tipo projeto. (Cada cliente pode ter N projetos, mas cada projeto pertence somente a um cliente).
Quando excluo um cliente eu faço todo o meu vetor de clientes a partir da posição a ser excluida voltar uma posição. Como a variavel do tipo cliente tem um vetor de projetos e armazena o endereço dos projetos cadastradas consigo mover as posicoes do cliente sem perder os projetos que ela possui. Porém nas variaveis do tipo projeto eu armazeno o endereço de uma variavem do tipo cliente, entao quando eu mudo as posições do meu vetor de cliente, o endereço armazenado no ponteiro dentro do variavel projeto precisa ser alterado para que ele aponte para o cliente correto.
A seguir esta o codigo da minha função de excluir projetos, eu imaginei que desta forma iria funcionar, porém o programa encerra a execução assim que recebe a confirmação da usuário para a exclusão.

Desculpe pelo texto longo, tentei sintetizar da melhor forma o prolema. Se alguem puder me ajudar a entender o porque a miha lógica não funcionou e me explicar a lógica correta eu agradeço

void excluirCliente (cliente *p, projeto *pPro, int *contCli, int *contPro){
int del;
int i=pesquisaCliente(p, contCli);//Recebe como resultado a posição no vetor do cliente a ser excluido
int a = i, c, b=0;

if (i>-1){
printf("\nDeseja excluir este Cliente? <1 - Sim / 0 - Não>");
scanf("%d",&del);

if(del==1){

while(i<(*contCli)){
p[i]=p[i+1];
while (b<(p[i].lista)){//roda o laço em todo o vetor de ponteiros para projetos dentro de cliente
p[i].codigo[b]->cli=&p[i];
b++;
}
b=0;
i++;
}
(*contCli)--;
}
printf("\nCliente Excluido com sucesso");
}
}



  


2. Re: Duvida com vetor de ponteiros struct

Paulo
paulo1205

(usa Ubuntu)

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

jussim escreveu:

void excluirCliente (cliente *p, projeto *pPro, int *contCli, int *contPro){
int del;
int i=pesquisaCliente(p, contCli);//Recebe como resultado a posição no vetor do cliente a ser excluido


Você não mostrou a função pesquisaCliente(), mas geralmente uma função de pesquisa não precisaria receber um ponteiro para a quantidade de caracteres, uma vez que não deveria alterar a quantidade de elementos). Será que você não deveria ter usado *contCli como segundo argumento, em vez de apenas contCli?

	int a = i, c, b=0;

if (i>-1){
printf("\nDeseja excluir este Cliente? <1 - Sim / 0 - Não>");


Para ficar mais claro para o usuário qual cliente ele está excluindo, não seria melhor informar o nome ou o código (ou algum outro atributo descritivo) do cliente encontrado?

E será que não seria bom você imprimir uma mensagem informando caso o cliente não tenha sido encontrado (uma cláusula else para o if acima)?

		scanf("%d",&del);

if(del==1){

while(i<(*contCli)){


Aqui a comparação provavelmente deveria ser i<*contCli-1, porque mais abaixo você vai usar um i+1 que pode ultrapassar um valor seguro de índice do array.

				p[i]=p[i+1];
while (b<(p[i].lista)){//roda o laço em todo o vetor de ponteiros para projetos dentro de cliente
p[i].codigo[b]->cli=&p[i];
b++;
}
b=0;


Você poderia simplificar as cinco linhas acima, e deixar o código mais fácil de entender, trocando o while por um for.
				for(b=0; b<p[i].lista; b++)
p[i].codigo[b]->cli=p+i; // p+i, sendo p um ponteiro e i um inteiro, é a mesma coisa que &p[i].


				i++;
}
(*contCli)--;
}
printf("\nCliente Excluido com sucesso");
}
}







Patrocínio

Site hospedado pelo provedor HostGator.
Linux banner
Linux banner
Linux banner

Artigos

Dicas

Viva o Android

Tópicos

Top 10 do mês

Scripts