Inufelipe Postado Maio 11, 2007 Denunciar Share Postado Maio 11, 2007 Olá galera do Script Brasil Forum.Eu estou criando uma mini-bliblioteca,para facilitar a vida na hora de mecher comarquivos.#include <stdio.h> #include <iostream> #include <string.h> #include <cstring> class Dater{ private: FILE *f; char nome[256]; public: Dater(char nomet[]){ if(fopen(nomet,"r") == NULL){ f = fopen(nomet,"w"); fclose(f); } strcpy(nome,nomet); } char* get(){ char cnt[256]; if(fopen(nome,"r")){ f = fopen(nome,"r"); fscanf(f,"%s",&cnt); fclose(f); return cnt; } } void put(char* val){ if(fopen(nome,"w")){ f = fopen(nome,"w"); fprintf(f,"%s",val); fclose(f); } } void add(char* val){ if(fopen(nome,"w")){ f = fopen(nome,"w"); fprintf(f,"%s",strcat(val,get())); fclose(f); } } }; int main(){ Dater date("teste.txt"); printf("%s",date.get()); } na hora da compilação(uso o g++): $ g++ src/dater.cpp -o dater src/dater.cpp: In member function 'char* Dater::get()': src/dater.cpp:19: warning: address of local variable 'cnt' returnede na hora de compilar:É VASIO!!!se alguémpoder me ajudar...falous. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jonas de Abreu Postado Maio 11, 2007 Denunciar Share Postado Maio 11, 2007 Voce precisa alocar de forma dinamica a variavel cnt pois o escopo dela é local e ela vai desaparecer assim que a funcao get terminar. Use:char *cnt; cnt = (char *) malloc(sizeof(char) * 256);Depois use-a normalmente como voce faria se ela fosse um vetor. Apenas não esqueca de liberar a memoria dela quando ela não for mais usada, com a funcao free. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Inufelipe Postado Maio 11, 2007 Autor Denunciar Share Postado Maio 11, 2007 Isso eu uso dentro da função GET ?oque é :malloc???(char *)???sizeof()??* 256 ???falous Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jonas de Abreu Postado Maio 11, 2007 Denunciar Share Postado Maio 11, 2007 Voce coloca dentro da funcao get().O malloc é uma funcao para fazer alocacao dinamica de memoria. Quando voce declara algo como char[256], voce esta indicando que voce quer que ele aloque (de forma estatica) 256 posicoes de char pra voce, certo? Eu fiz de forma semelhante mas de forma dinamica usando o malloc.O malloc devolve um ponteiro do tipo void*. Por isso, para usalo como um vetor de char (char*) eu usei precisei mudar o tipo dele dando um cast. Quando voce coloca um tipo entre parenteses como eu fiz, voce esta indicando pro compilador que a partir daquele momento o que estiver a direita deve ser tratado como o tipo que esta dentro dos parenteses.O sizeof() é uma funcao do preprocessador do C. O preprocessador é o responsavel por pegar seus #defines e inseri-los no codigo antes do processamento. A funcao sizeof() me devolve o numero de bytes que tem qualquer tipo ou variavel que eu coloque dentro dela. (Voce precisa saber o numero de bytes pois o malloc aloca um determinado numero de bytes para voce)O * 256 foi usado porque eu queria 256 posicoes no vetor. Uma simples conta: se o tipo que eu quero tem 4 bytes e eu quero um vetor com 100 posicoes, eu preciso de 400 bytes. Foi essa ideia que eu usei. Lembrando que como eu não sei o numero de bytes do char, eu usei a funcao sizeof() para isso.Espero ter esclarecido um pouco as coisas. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Inufelipe Postado Maio 12, 2007 Autor Denunciar Share Postado Maio 12, 2007 (editado) Cara você é muito bom...Mais eu só não entendi uma coisa...Em vez de usar o Return, eu uso uma varivel globalou ponteiro ?e, se eu usar o new em vez do malloc ?e qual a diferença entre free() e delete?falou Editado Maio 12, 2007 por Inufelipe Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jonas de Abreu Postado Maio 13, 2007 Denunciar Share Postado Maio 13, 2007 Em vez de usar o Return, eu uso uma varivel globalou ponteiro ?Eu não entendi direito a sua duvida.... Porque a funcao get vai precisar do return (porque voce quer que ela devolva a sua string, não é?). então voce vai dar um return no vetor cnt (que agora foi alocado dinamicamente com o malloc). Quando voce aloca memoria dinamicamente ela não esta limitada ao escopo (tipo... eu to falando de escopo de variavel e não sei se voce sabe o que é isso, se for o caso pergunte e eu te explico) da funcao onde foi criada. Desde que voce tenha o ponteiro voce pode acessa-la atravez dele. (e o ponteiro pode ser passado para outras funcoes sem problemas com o escopo)O new e delete cumprem mais ou menos a mesma funcao do malloc e free. A diferenca é que os dois primeiros usam os dois ultimos e funcionam apenas para classes. Um array de caracteres não é uma classe (pelo menos em C++). Voce pode usar a classe string do C++ no lugar do vetor de char e usar new e delete. Mas como voce usou um char* (mesmo o char[] tambem é um ponteiro, mas restrito) voce precisa usar malloc e free. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Inufelipe Postado Maio 15, 2007 Autor Denunciar Share Postado Maio 15, 2007 Cara valeu mesmo!!!!!a postagem de Felipe poderoso,dis que eu posso usar string function(){};porem aqui, no compilador G++, isto não é posivelapesar de eu ter achado mais massa o MALOC e o FREE,só gostaria de saber se meu compilador esta com problema.falous Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Inufelipe
Olá galera do Script Brasil Forum.
Eu estou criando uma mini-bliblioteca,
para facilitar a vida na hora de mecher com
arquivos.
na hora da compilação(uso o g++):e na hora de compilar:
É VASIO!!!
se alguém
poder me ajudar...
falous.
Link para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.