Ir ao conteúdo

mlkneutro

Membro Júnior
  • Posts

    2
  • Cadastrado em

  • Última visita

Tudo que mlkneutro postou

  1. O motivo de usar dupla referencia esta explicado nesse codigo, o endereco com ponteiro unico não volta pro ponteiro da funcao que chamou, e é aquele ponteiro que precisa receber o endereco da alocação dinamica da string, claro que eu poderia retornar um ponteiro no fim da execucao, mas eu perderia o poder de retornar a quantidade de letras, coisa que preciso no programa. int digText(char *text, FILE *f){ text = malloc(sizeof(char)); int indice = 0; do{ text = fgetc(f); if(text[indice]!='\n'){ text = realloc(text, sizeof(char)*(indice+1)); } indice++; }while(text[indice-1]!='\n'); return indice+1; } e contasArec não é diretamente ligado ao caixa, é uma struct de um arquivo que nas especificacoes do trabalho tera que ficar separado.
  2. Isolei uma parte de um codigo de um trabalho, e explicando do inicio, basicamente, tenho duas struct que tem dois campos de pointers de tipos em comuns (tm *), e sendo assim, não queria ter que fazer duas funcoes pra limpar a memória desse campo delas, queria fazer somente uma, fiz um algoritmo com a ideia de utilizar o cast para converter um ponteiro generico para o tipo da struct necessária e só depois limpar os campos, mas não funcionou, por curiosidade testei o mesmo codigo com um ponteiro sem ser da time.h, e deu certo, e se eu limpo até mesmo normalmente o tm *, tb da erro de execução, estou manipulando erroneamente a funcao localtime? Em depuracao mostra estar recebendo todos os valores da forma correta. Edit: Só uma att, por localtime retornar um tm *, eu fiz dessa forma por imaginar que ele ja esta alocando um local na memória do tamanho de tm, e retorne somente seu endereco. Codigo que não funciona: #include<stdlib.h> #include<string.h> #include<errno.h> #include <stdarg.h> #include <time.h> typedef struct lancamentoCaixa{ time_t codigoCompra; int modoPagamento; float valor; float valorPago; float troco; struct tm*data; }lancamentoCaixa; typedef struct contaArec{ int codigoCliente; time_t codigoCompra; int modoPagamento; int parcelas; float valorParc; float entrada; struct tm*dataAluga; }contaArec; void limpaData(int escolha, int quantidadeLanc, void *endereco){ for(int i = 0; i<quantidadeLanc; i++){ switch(escolha){ case 1: free(((lancamentoCaixa *)endereco)[i].data); ((lancamentoCaixa *)endereco)[i].data = NULL; break; case 2: free(((contaArec *)endereco)[i].dataAluga); ((contaArec *)endereco)[i].dataAluga = NULL; break; } } } int main(){ time_t seg; time(&seg); contaArec teste; lancamentoCaixa teste2; teste.dataAluga = localtime(&seg); teste2.data = localtime(&seg); //free(teste2.data); //caso descomentar essa linha, o erro começa a acontecer aqui limpaData(1, 1, &teste2); } Codigo que funciona: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include <stdarg.h> #include <time.h> typedef struct teste{ char *nome; }teste; typedef struct testeee2{ char *nome; }testeee2; int digText(FILE *f, char **text){ int indice = 0; text[0] = malloc(sizeof(char)); do{ text[0][indice] = fgetc(f); if(text[0][indice]!='\n'){ text[0] = realloc(text[0], sizeof(char)*(indice+1)); } indice++; }while(text[0][indice-1] != '\n'); text[0][indice-1] = '\0'; return indice+1; } void limpaNome(int escolha, int quantidade, void *end){ /*funcao recebe um endereco de uma struct teste ou testeeee2 por meio de um ponteiro generico, e converte ele pra forma adequada através do primeiro argumento da funcao, limpando assim adequadamente*/ for(int i = 0; i<quantidade; i++){ switch(escolha){ case 1: free(((teste *)end)[i].nome); ((teste *)end)[i].nome = NULL; break; case 2: free(((testeee2 *)end)[i].nome); ((testeee2 *)end)[i].nome = NULL; break; } } } int main(){ teste agora; testeee2 agoraggg; digText(stdin, &agora.nome); digText(stdin, &agoraggg.nome); printf("%s\n%s\n", agora.nome, agoraggg.nome); limpaNome(1, 1, &agora); }

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!