Newsgroup: it.comp.lang.c++
Titolo: [newbie]problema con stringa

E' da poco che sto studiano il c++ e sto facendo un piccolo programma di 
prova. Questo programma deve anche gestire una lista di stringhe e 
sembra che funzioni tutto tranne per il fatto che alla fine mi da un 
output strano, come se la memoria non fosse inizializzata. Qui c'e' il 
codice e il punto dove non funziona, scusate se e' lungo e magari la 
soluzione e' semplice, ma io non ci arrivo.
Il programma e' su 3 file separati e lo compilo (su linux) cosi':
g++ abc_main.cpp abc_classi.cpp -o abc
//*************************abc.h
#include <iostream>
#include <string.h>
typedef unsigned int uint;
//struttura di un messaggio dello stack
struct msg{
   char *messaggio;
   msg  *prox_msg;
};
class CMsgStack{
  private:
   msg *stack_pt;
  public:
   CMsgStack();
   ~CMsgStack();
   bool PeekTop(char*);
   bool PeekAll(char*);
   bool PushMsg(char*);
};
//********************abc_classi.cpp
#include "abc.h"
bool CMsgStack::PushMsg(char *p_messaggio)
{
   msg  *nuovo;
   msg  *corr;
   nuovo=(msg*)malloc(sizeof(msg));
   nuovo->prox_msg=stack_pt;
   nuovo->messaggio=(char*)malloc(strlen(p_messaggio)*sizeof(char));
   strcpy(nuovo->messaggio,p_messaggio);
   stack_pt=nuovo;
   return true;
}
bool CMsgStack::PeekTop(char *msg)
{
   uint len;
   len=strlen(stack_pt->messaggio);
   msg=(char*)calloc(len+1,sizeof(char));
   strcpy(msg,stack_pt->messaggio);
   return true;
}
//***************************abc_main.cpp
#include "life.h"
CMsgStack g_msgs;
int main()
{
   char *pt_str;
   g_msgs.PushMsg("messaggio di prova");
   g_msgs.PeekTop(pt_str);
   std::cout<<pt_str<<std::endl;
           //^^mi da in output @-x
   return 0;
}

    nuovo->messaggio=(char*)malloc(strlen(p_messaggio)*sizeof(char));
     nuovo->messaggio=(char*)malloc(strlen(p_messaggio)+1);
[sizeof(char)==1 per definizione]
-- 
Horst

Horst Kraemer ha scritto:

Vero, ma non risolve il problema.
In piu' ho notato che se aggiungo std::cout<<stack_pt->messaggio in 
qualunque punto di qualunque funzione membro di CMsgStack mi da in 
output la stringa corretta.
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 }
Altra versione
  bool CMsgStack::PeekTop(char **pmsg)
  {
     if (stack_pt==0) return false;
     *pmsg=(char*)malloc(strlen(stack_pt->messaggio)+1,1);
     strcpy(*pmsg,stack_pt->messaggio);
     return true;
 }
 g_msgs.PeekTop(&pt_str);
-- 
Horst

 
Ho provato questa che mi sembra piu' semplice e funziona. Solo che non 
capisco perche' l'altra non funziona, dato che in C funzioni di questo 
tipo non avevano problemi.


 }
Si tratta comunque di un approccio che ha più senso in C che
in C++, in primis perchè C++ offre std::stack e std::string
già pronti.
Scrivere il proprio stack può avere comunque un valore
didattico, ma in tal caso il vero problema è che ti occorre
un testo o degli esempi migliori: la notazione CMsgStack fa
pensare che si stiano utilizzando come esempi le famigerate
MFC, il che sconsiglio vivamente per i seguenti motivi:
- non sono nate come esempi, ma come codice di produzione;
- si tratta di codice di produzione vecchio per progetto e
   realizzazione, lontano dal C++ moderno;
- sono cucite addosso alle limitazioni e idiosincrasie dei
   compilatori Microsoft;
- usano le macro quando non dovrebbero;
- non usano i template quando dovrebbero.
Per trovare del materiale didattico, si può cominciare
qui:
 
http://www.emagsoftware.it/faqcpp.htm#6
Barone Frankenstein
-- 
There is no place like /home.

 MFC, il che sconsiglio vivamente per i seguenti motivi:
no, niente MFC, ho scritto tutto da 0 senza esempi, comunque grazie 
dell'aiuto.


 tipo non avevano problemi.
Questo non funziona nemmeno in C.
  void f(char *p)
  {
     p = malloc(sizeof("ciao")+1);
     strcpy(p,"ciao");
  }
  int main()
  {
     char *cp = "toto"; 
     f(cp);
     puts(cp);  /*  -> toto */
  }
Ma questo 
  void f(char *p)
  {
     strcpy(p,"ciao");
  }
  int main()
  {
     char *cp = malloc(10); 
     f(cp);
     puts(cp);  /* -> ciao */
     free(cp);
     ...
  }
funziona. Qui la stringa "ciao" viene copiata nella memoria puntata di
cp. Nel primo caso "ciao" viene copiata in memoria perduta se la
funzione f e' terminata.
-- 
Horst