Ir para conteúdo
Fórum Script Brasil
  • 0

Progama Mudo, Como Posso Descubrir O Problema ?


Inufelipe

Pergunta

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.

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0
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.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...