Sign in to follow this  
Inufelipe

Progama Mudo, Como Posso Descubrir O Problema ?

Recommended Posts

Olá galera do Script Brasil Forum.

Eu estou criando uma mini-bliblioteca,

para facilitar a vida na hora de mecher com

arquivos.

#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' returned

e na hora de compilar:

É VASIO!!!

se alguém

poder me ajudar...

falous.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Cara você é muito bom...

Mais eu só não entendi uma coisa...

Em vez de usar o Return, eu uso uma varivel global

ou ponteiro ?

e, se eu usar o new em vez do malloc ?

e qual a diferença entre free() e delete?

falou

Edited by Inufelipe

Share this post


Link to post
Share on other sites
Em vez de usar o Return, eu uso uma varivel global

ou 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.

Share this post


Link to post
Share on other sites

Cara valeu mesmo!!!!!

a postagem de Felipe poderoso,

dis que eu posso usar string function(){};

porem aqui, no compilador G++, isto não é posivel

apesar de eu ter achado mais massa o MALOC e o FREE,

só gostaria de saber se meu compilador esta com problema.

falous

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this