Enviado em 28/04/2019 - 17:34h
Estou com uma duvida sobre a passagem de um ponteiro para ponteiro para uma função.void receivAll(int sockIn, uint8_t **buff) { ssize_t bytesReceived; uint8_t *p_buff = *buff; // ponteiro utilzado para percorrer 'buff' do { bytesReceived = recv(sockIn, p_buff, MAXBUFF, 0); if (bytesReceived == 0) // cliente desconectou { puts("cliente desconectado"); *buff = NULL; return; }
uint8_t *temp_buff; temp_buff = (uint8_t *) malloc(MAXBUFF); receivAll(sock, &temp_buff); if(temp_buff == NULL){ return DISCONECTED; }
uint8_t temp_buff[MAXBUFF]; receivAll(sock, &temp_buff); if(temp_buff == NULL){ return DISCONECTED; }
Enviado em 29/04/2019 - 05:54h
Na resposta anterior, eu estava no celular. Agora posso responder com mais cuidado.void receivAll(int sockIn, uint8_t **buff) { ssize_t bytesReceived; uint8_t *p_buff = *buff; // ponteiro utilzado para percorrer 'buff' do { bytesReceived = recv(sockIn, p_buff, MAXBUFF, 0); if (bytesReceived == 0) // cliente desconectou { puts("cliente desconectado"); *buff = NULL; return; }
uint8_t *temp_buff; temp_buff = (uint8_t *) malloc(MAXBUFF); receivAll(sock, &temp_buff); if(temp_buff == NULL){ return DISCONECTED; }
uint8_t temp_buff[MAXBUFF]; receivAll(sock, &temp_buff); if(temp_buff == NULL){ return DISCONECTED; }
char *pc=NULL; // Declaração com atribuição de valor inicial: cria espaço para guardar um endereço, e coloca nesse espaço o valor do ponteiro nulo. char ac[50]="Fulano de Tal"; // Declaração com atribuição de valor inicial (ou, mais propriamente, de valores iniciais a cada um 50 dos elementos). pc=malloc(50); // Posso alterar o valor gravado na região de memória designada por “pc”: // esse valor agora contém o endereço da região de memória alocada. ac="Beltrano d'Outro"; // ERRO: não posso reapontar um array para outro lugar (aqui, “ac” produz um valor // que sofre decaimento de tipo, tornando-se um ponteiro, mas esse ponteiro é calculado, // não é obtido de um lugar reservado na memória para guardá-lo, então não faz sentido // tentar alterar esse valor). // Fazendo de conta que o erro acima não aconteceu... *pc='E'; // Posso usar o ponteiro para alterar o valor armazenado na região para a qual ele aponta. *ac='E'; // Posso usar o ponteiro (mesmo obtido por decaimento) para alterar o valor armazenado // para a qual ele aponta (essa operação é equivalente a “ac[0]='E';” — agora a string contém o // nome “Eulano de Tal”). char **ppc; // Cria espaço para guardar um endereço. char (*pac)[50]; // Cria espaço para guardar um endereço. ppc=&pc; // Altero o valor, fazendo-o apontar para um objeto válido. pac=∾ // Altero o valor, fazendo-o apontar para um objeto válido. *ppc="Paulo1205"; // Uso o ponteiro para obter o objeto original, e altero o valor desse objeto // (vou provocar um vazamento de memória ao perder a referência a memória // alocada dinamicamente e guardada em “pc”, mas isso não vem ao caso aqui): // pc agora aponta para outro lugar, a string "Paulo1205". *pac="Berghetti"; // ERRO: Aqui também eu uso o ponteiro para obter o objeto original, e até aí // tudo bem, mas esse objeto se comporta como o objeto original se comportaria, // decaindo para um ponteiro obtido por cálculo e que, por conseguinte, não pode // ser alterado como parte de uma atribuição.
// Retorna a quantidade de bytes lidos: zero indica fim de dados e -1 indica erro. int receivAll(int sock, uint8_t *buff, size_t buffsize){ do { ssize_t recv_count=recv(sock, buff, buffsize, 0); if(recv_count<=0) return recv_count; // Retorna permaturamente. // Faz alguma coisa com bytes lidos. } while(alguma_condição); return algum_valor; // Provavelmente positivo, se tudo correu bem. }
Enviado em 28/04/2019 - 19:33h
Foi a maneira que encontrei, gambiarra, de conseguir fazer com que o ponteiro "temp_buff" aponte para NULL quando a condiçãoif(bytesReceived == 0)for satisfeita,
Enviado em 29/04/2019 - 17:48h
char (*pac)[50]; // Cria espaço para guardar um endereço. pac=∾ // Altero o valor, fazendo-o apontar para um objeto válido.
// Retorna a quantidade de bytes lidos: zero indica fim de dados e -1 indica erro. int receivAll(int sock, uint8_t *buff, size_t buffsize){ do { ssize_t recv_count=recv(sock, buff, buffsize, 0); if(recv_count<=0) return recv_count; // Retorna permaturamente. // Faz alguma coisa com bytes lidos. } while(alguma_condição); return algum_valor; // Provavelmente positivo, se tudo correu bem. }
Enviado em 29/04/2019 - 20:01h
Programa IRPF - Guia de Instalação e Resolução de alguns Problemas
Criando uma Infraestrutura para uma micro Empresa
Criar entrada (menuentry) ISO no Grub
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalando o Pi-Hole versão v5.18.4 depois do lançamento da versão v6.0
Instalar o VIM 9.1 no Debian 12
Como saber o range de um IP público?
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)
Discussão sobre monitoramento da integridade de arquivos (6)
Problema no boot do Linux Mint Cinnamon 22 (4)
Atualização do Google Chrome do Ubuntu [RESOLVIDO] (2)
Instalei Windows 11 e não alterou o Grub do Debian (1)
Jogos baixados na Central de Aplicativos mas que não abrem (0)