Newsgroup: it.comp.lang.c++
Titolo: esercizio allocazione dinamica

ciao a tutti,
sto facendo questo esercizio sull'allocazione dinamica. Ecco la traccia:
Scrivere un programma che gestisce un array di record allocato
dinamicamente. Il record è costituito da un campo "chiave" e da un campo"
valore". Il programma effettua su tale struttura dati le seguenti
operazioni:
1)      creazione della struttura
2)      inserimento dei dati
3)      stampa dei dati
4)      distruzione della struttura
Organizzare il programma sui seguenti file:
1.      Tabella.h: contiene la dichiarazione della struttura "Record", la
dichiarazione di un tipo "Tabella" puntatore a "Record" e i prototipi delle
4 funzioni che implementano rispettivamente le 4 funzionalità sopra
elencate.
2.      Tabella.cpp: Contiene l'implementazione delle 4 funzioni
3.      Main.h: Contiene il programma "main" che dichiara una variabile
"tabella" di tipo Tabella, una variabile intera "num_entry" che rappresenta
il numero di elementi dell'array e chiama le funzioni producendo l'output
mostrato nel seguente esempio di esecuzione.
Scrivere un programma che gestisce un array di record allocato
dinamicamente. Il record è costituito da un campo "chiave" e da un campo"
valore". Il programma effettua su tale struttura dati le seguenti
operazioni:
1)      creazione della struttura
2)      inserimento dei dati
3)      stampa dei dati
4)      distruzione della struttura
Organizzare il programma sui seguenti file:
1.      Tabella.h: contiene la dichiarazione della struttura "Record", la
dichiarazione di un tipo "Tabella" puntatore a "Record" e i prototipi delle
4 funzioni che implementano rispettivamente le 4 funzionalità sopra
elencate.
2.      Tabella.cpp: Contiene l'implementazione delle 4 funzioni
3.      Main.h: Contiene il programma "main" che dichiara una variabile
"tabella" di tipo Tabella, una variabile intera "num_entry" che rappresenta
il numero di elementi dell'array e chiama le funzioni producendo l'output
mostrato nel seguente esempio di esecuzione.
Ecco come il mio file tabella.h:
struct Record {
 char chiave;
 int valore;};
 typedef Record* tabella;
sull'ultima riga non sono sicuro...:-((
ecco il mio codice per l'inserimento dei dati (non ho ancora fatto la
funzione, per ora è tutto nel main):
#include <iostream>
#include "tabella.h"
#include <cstdlib>
int main(int argc, char *argv[])
{  int n;
   tabella tab;
   cout<<"Creazione struttura";
   cout<<"Quante entry?";
   cin>>n;
   tabella a = new Record[n];
   for(int i=0; i<n; i++){
     cout<<"Inserisci la entry di posizione "<<i<<"\n";
     cout<<"chiave?";
     char id;
     cin>>id;
     tab->chiave = new char;
     strcpy(tab->chiave, id);
     cout<<"valore?";
     char val;
     cin>>val;
     tab->valore = new char;
     strcpy(tab->valore, val);
   }
  return 0;
}
quando compilo ricevo 6 errori:
16 main.cpp: assignment to `char' from `char *' lacks a cast
17 main.cpp:  passing `char' to argument 1 of `strcpy(char *, const char *)'
lacks a cast
17 main.cpp: passing `char' to argument 2 of `strcpy(char *, const char *)'
lacks a cast
21 main.cpp: assignment to `int' from `char *' lacks a cast
22 main.cpp: passing `int' to argument 1 of `strcpy(char *, const char *)'
lacks a cast
22 main.cpp: passing `char' to argument 2 of `strcpy(char *, const char *)'
lacks a cast
dove sbaglio???
ciao!

 ciao!
Saluti
R. I.

 Su tutto... o quasi... necessiti di una buona ripassata sul argomento...
bhe, dai ora mi è tutto + chiaro...il libro fa un casino con i typedef e non
c'è un vero esempio di array di strutture...:-((
grazie mille per l'aiuto!!! se ho problemi con le funzioni ti faccio un
fischio!
grazie ancora
maurizio

 dove sbaglio???
Vedi sopra.
E visto che si tratta di C++, e non di "C + cin + cout + new + new []", 
faresti bene a definire  Record come classe con un costruttore pubblico 
che inizializzi i membri (privati), invece che inizializzarli 
esternamente, piu` un metodo pubblico per accedere in lettura a chiave e 
valore, ed eventualmente un distruttore.
Ma non scoraggiarti. :-)
-- 
   |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
   |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
  _|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

 "tab = &(tabella[i])".
Pardon: tab = a[i];


 Ma non scoraggiarti. :-)
ah, questo è sicuro ;-))
per quanto riguarda le classi, non posso usarle perchè non le abbiamo ancora
introdotte...
ora sto (tentando) di dividere il codice in + funzioni...
ottengo l'errore:
5 tabella.cpp parse error before `='
ecco il mio file tabella.h:
struct Record {
 char chiave;
 int valore;
 };
typedef Record* tabella;
void alloca(int &nrec);
ecco il file tabella.cpp:
#include <iostream>
#include "tabella.h"
void alloca(int &nrec){
tabella = new Record[nrec];
}
ecco il file main.cpp:
#include <iostream>
#include "tabella.h"
#include <cstdlib>
int main()
{  int nrec;
   tabella tabella;
   cout<<"Creazione struttura\n";
   cout<<"Quante entry? ";
   cin>>nrec;
   alloca(nrec);
   for(int i=0; i<nrec; i++){
   cout<<"Inserisci la entry di posizione "<<"["<<i<<"]\n";
   cout<<"chiave?[carattere]:";
   cin >> tabella->chiave;
   cout<<"\nvalore?[intero]:";
   cin >> tabella->valore;
   }
  return 0;
}
credo sia un errore banale ma non riesco a trovarlo :-((
ciao!

 }
Cmq, complimenti, e` gia` molto meglio. :-)
Se poi fai rientrare ulteriormente le istruzioni nel corpo del ciclo 
for(;;), e` ancora meglio (per chi lo deve leggere, anche se per il 
compilatore e` uguale).  :-)


 compilatore e` uguale).  :-)
detto fatto ;-))
ciao e grazie! :-))
maurizio

 }
 > meglio eh??? ;-)
Quasi OK :-)
L'operatore "delete []" distrugge un array allocato dinamicamente in un 
colpo solo, e non serve sapere di quanti elementi e` fatto (se lo 
ricorda lui quando allochi con "new Record[nrec]". Quando arriverai a 
fare gli allocatori saprai anche come fa a ricordarselo ;-).
Per cui
     void
     distruggi(Tabella tabella)
     {
         delete [] tabella;
     }
senza ciclo for() (che tra l'altro era sbagliato, perche` se noti invoca 
nrec volte il distruttore sullo stesso array, e non si deve distruggere 
un oggetto gia` distrutto).


 maurizio
Saluti
R.I.

 spaziatura per motivi di leggibilità.
si, purtroppo è un vizio che ho quando provo in fretta del codice che
sicuramente dovrò modificare. Cmq se vedi le risposte succ. credo di aver
intentato correttamente...ciao!!!
maurizio

 maurizio
Ciao da un tuo collega dalla sede di Agnano...:)
-- 
// C Ya!
// Someone has already answered your question:
// 
http://www.google.com/advanced_group_search
// ** Cut "DO NOT DISTURB" to reply privately. **

 Ciao da un tuo collega dalla sede di Agnano...:)
azz! in che aula stai???
