Newsgroup: it.comp.lang.c++
Titolo: Assegnazione dinamica della memoria

Per assegnare della memoria in modo dinamico, non è sufficente fare:
tipoelemento *variabile;
variabile=malloc(sizeof(tipoelemento));
??
Sia il Dev-C++ che il Borland Compiler mi dicono che non è possibile
convertire un void in un tipoelemento.
Poichè, e non ne so il motivo, non riesco ad allegare un file, come esempio
ho copiato e incollato in coda a questo mex un piccolo sorgente di un
programmino di esercizio, che non riesco a compilare proprio per il motivo
sopra descritto.
Grazie, e scusate se le mie domande sono sempre piuttosto stupide, ma non è
da molto che seguo il linguaggio c/c++.
paolo
legg...@tiscalinet.it
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct elemalb{char info[100];
               struct elemalb *destro;
               struct elemalb *sinistro;
              };
typedef struct elemalb *bintree;
void inserisci(bintree *albero, char stringa[]);
void stampa(bintree albero);
void main()
{
 bintree albero;
 char stringa[100];
 printf("\nScrivi la prima stringa da inserire nell'albero binario:\n");
 scanf("%s",&stringa);
 inserisci(&albero, stringa);
 printf("\nScrivi la seconda stringa da inserire nell'albero binario:\n");
 scanf("%s",&stringa);
 inserisci(&albero, stringa);
 printf("\nScrivi la terza stringa da inserire nell'albero binario:\n");
 scanf("%s",&stringa);
 inserisci(&albero, stringa);
 printf("\nScrivi la quarta stringa da inserire nell'albero binario:\n");
 scanf("%s",&stringa);
 inserisci(&albero, stringa);
 printf("\nScrivi la quinta stringa da inserire nell'albero binario:\n\n");
 scanf("%s",&stringa);
 inserisci(&albero, stringa);
 printf("\nLe stringhe inserite sono, in ordine:\n");
 stampa(albero);
}
void inserisci(bintree *albero, char stringa[])
{
 if(*albero==NULL)
 {
  *albero=malloc(sizeof(elemalb));
  strcpy((*albero)->info, stringa);
  (*albero)->destro=NULL;
  (*albero)->sinistro=NULL;
 }
 else if(strcmp(stringa, (*albero)->info)>0)
  inserisci(&((*albero)->destro), stringa);
 else if(strcmp(stringa, (*albero)->info)<0)
  inserisci(&((*albero)->sinistro), stringa);
}
void stampa(bintree albero)
{
 if(albero->sinistro==NULL)
 {
  printf("%s\n",albero->info);
  stampa(albero->destro);
 }
 else stampa(albero->sinistro);
}

convertire un void in un tipoelemento.
Già, hai bisogno di un cast, perché malloc restituisce void*.
Quindi:
puntatore = (tipo_puntatore) malloc (sizeof(tipo))
Ciao
Domenico


Prova con
   variabile = (tipoelemento*)malloc(sizeof(tipoelemento));
oppure visto che parliamo di c++:
variabile = new tipoelemento;
ciao Alberto

void main()
int main() 
;)
--
Andrea Laforgia (UIN 87230455)
----------------------------------------------------------
Non scrivetemi per e-mail, se non richiesto espressamente.
No replies in private e-mail, unless explicitly requested.
----------------------------------------------------------

 ??
Questo va bene in C ma in C++ è richiesto il cast.
EMG

  if(*albero==NULL)
Cosě prima dereferenzi il puntatore e poi ne controlli il contenuto...
*MALE*, SIGSEGV assicurato :-)
if(albero != NULL)
{
    /* qualunque cosa che usa *albero */
}
else
{
    /* albero non punta da nessuna parte, creiamolo */
    albero = (bintree *) malloc (sizeof(bintree));
{
Massimo

Grazie a tutti,ora con i vostri consigli applicati funziona :))))

*MALE*, SIGSEGV assicurato :-)
Non necessariamente.
Non se la routine accetta un puntatore a puntatore (radice = NULL). 
In questo caso deriferire e' perfettamente legale. Quella routine
somiglia molto al codice che scrivevo come suggerimento per inserire
elementi in un albero binario.
--
Andrea Laforgia (ICQ 87230455)