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
Automatizando digitação de códigos 2FA no browser
Resolver problemas de Internet
Como compartilhar a tela do Ubuntu com uma Smart TV (LG, Samsung, etc.)
Como converter imagens PNG/JPEG para SVG em linha de comando
Fez porcaria no teu repositório Git? Aprenda a restaurar uma versão anterior do seu código!
Restaurando Fontes de Download do Hydra no Linux
Atualizando "na marra" o YT-DLP quando começa a dar erro de downloads
Como instalar o WPS com interface e corretor ortográfico em PT-BR no Arch Linux
[AJUDA] Problemas ao atualizar BIOS da Gigabyte B550M K rev. 1.1 — “RO... (5)
Impossível ativar audio 5.1 (1)
Inicializaçao lenta (alguns processos rodando) Debian 11 Bullseye [RES... (2)