PDA

View Full Version : [C++]Allocazione Memoria


Gogeta ss4
16-09-2004, 15:00
Ciao a tutti, chi mi potrebbe spiegare gentilmente come si alloca lo spazio in memoria con l'operatore new?
Per esempio devo allocare una lista dove la testa della lista (punt_lista) è il puntatore della testa della lista

Thanks

cionci
16-09-2004, 16:12
Allochi una struttura o un classe in questo modo:

lista *punt_lista;

punt_lista = new lista;
punt_lista->next = NULL;
punt_lista->info = 0; //supponendo info intero


Viene istanziata e allocata una struttura/classe di tipo lista...il cui puntatore viene ritornato da new...

Comunque si tratta di un solo elemento di tipo lista...in tal caso sarà l'unico elemento della lista...

Gogeta ss4
16-09-2004, 16:53
guarda praticamente devo creare un programma che dato un elenco di articoli devo conoscere il guadagno totale, di ogni articolo si sa la quantità venduta, il prezzo di acquisto e di vendita.

Adesso io volevo usare una classe articolo e le liste.
Ma come faccio a fare in modo che dentro il campo informazione ci sia la classe??
Sinceramente la prof non c'è la spiegato e non saprei come fare.

La lista ha 2 campi: il campo informazione che deve contenere la classe e il campo next che punta alla lista dopo.
Thanks

P.S: Nel punt_lista=new lista, lista cosa sarebbe??

cionci
16-09-2004, 17:00
lista sarebbe il tipo di *punt_lista;

Per metterci la classe puoi fare in questo modo:

struct lista {
tuaclasse info;
lista *next;
};

Gogeta ss4
16-09-2004, 17:10
ok ci provo

Gogeta ss4
16-09-2004, 18:17
allora, sono arrivato al punto dove devo acquisire il dato e metterlo dentro il membro char nome_prodotto[50] della classe articolo.

E' giusto se faccio così??

cin >>ogg_art.nome_prodotto;
p->info.nome_prodotto=ogg_art.nome_prodotto

Se no come devo fare?

cionci
16-09-2004, 18:31
cin >> p->info.nome_prodotto;

Non puoi assegnare un char [50] ad una ltro char [50]... Dovresti usare strcpy per farlo...

Gogeta ss4
16-09-2004, 18:34
ok, senti quando compilo mi da un errore nella classe



class articolo
{
public: articolo(); //Costruttore
void insert(lista *); //Funzione per l'inserzione del prodotto
float guadagno(lista *); //Funzione che calcola il guadagno
private: char nome_prodotto[10]; //Vettore di caratteri contenente il nome del prodotto
char descrizione_prodotto[200]; //Vettore di caratteri contenente la descrizione del prodotto
int quantita_vendute; //Variabile che contiene la quantità dei prodotti venduti
float prezzo_vendita; //Variabile che contiene il prezzo di vendita
float prezzo_acquisto; //Variabile che contiene il prezzo di acquisto
float guadagno_totale; //Variabile che contiene il guadagno totale
};

#endif


Mi dice che non riesce a identificare (lista *)
In quella funzione mi serve per passare punt_lista

cionci
16-09-2004, 18:37
Hai definito lista prima della classe ?

cionci
16-09-2004, 18:38
Perchè inserisci la lista dentro alla classe ?!?!?

class articolo
{
public: articolo(); //Costruttore
void insert(lista *); //Funzione per l'inserzione del prodotto
float guadagno(lista *); //Funzione che calcola il guadagno

Gogeta ss4
16-09-2004, 18:40
e allora come faccio a passargli il punt_lista alla funzione?

Gogeta ss4
16-09-2004, 18:50
Ti posto tutto il codice così magari e meglio:



#ifndef articoli_h
#define articoli_h

class articolo
{
public: articolo(); //Costruttore
void insert(lista *); //Funzione per l'inserzione del prodotto
float guadagno(lista *); //Funzione che calcola il guadagno
private: char nome_prodotto[10]; //Vettore di caratteri contenente il nome del prodotto
char descrizione_prodotto[200]; //Vettore di caratteri contenente la descrizione del prodotto
int quantita_vendute; //Variabile che contiene la quantità dei prodotti venduti
float prezzo_vendita; //Variabile che contiene il prezzo di vendita
float prezzo_acquisto; //Variabile che contiene il prezzo di acquisto
float guadagno_totale; //Variabile che contiene il guadagno totale
};

#endif


------------------------------------


#include <iostream.h>
#include "classi.h"

articolo::articolo() //Il costruttore inizializza a 0
{
quantita_vendute=0;
prezzo_vendita=0;
prezzo_acquisto=0;
guadagno_totale=0;
}

void articolo::insert(lista *punt_lista)
{
articolo ogg_art;
register lista *p;
p=new lista;
cout <<"Inserisci il nome del prodotto venduto (MAX 10 LETTERE): ";
cin >>p->info.nome_prodotto;
cout <<"Descrivi Il Prodotto(MAX 200 LETTERE): ";
cin >>p->info.descrizione_prodotto;
cout <<"Quanti prodotti hai venduto?: ";
cin >>p->info.quantita_vendute;
cout <<"Inserisci il prezzo di vendita del prodotto: ";
cin >>p->info.prezzo_vendita;
cout <<"Inserisci il prezzo d'acquisto del prodotto: ";
cin >>p->info.prezzo_acquisto;
if(punt_lista==NULL) //caso lista vuota
{
p->next=NULL;
punt_lista=p;
}
else
{
p->next=punt_lista;
punt_lista=p;
}

}

float articolo::guadagno(lista *punt_lista)
{
articolo ogg_art;
register lista *p;
int prezzo_vend,prezzo_acqu,quantita_vend,totale=0;
for(p=punt_lista;p!=NULL;p=p->next)
{
prezzo_vend=p->info.prezzo_vendita;
prezzo_acqu=p->info.prezzo_acquisto;
quantita_vend=p->info.quantita_vendute;
totale+=(prezzo_vend-prezzo_acqu)*quantita_vend;
}
return totale;
}


---------------------------------------------



#include "stdafx.h"
#include "classi.h"
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>

struct lista_articoli
{
articolo info;
struct lista_articoli *next;
};


typedef struct lista_articoli lista;

int main(int argc, char* argv[])
{
articolo ogg_art;
lista *punt_lista=NULL;
int scelta,totale=0;
do
{
cout <<setw(20) <<"MENU' PRINCIPALE";
cout <<setw(15) <<"1)Inserisci Singolo Prodotto";
cout <<setw(15) <<"2)Controlla Gaudagno Totale";
cout <<setw(15) <<"0)Uscita";
cout <<setw(25) <<"Scelta: ";
cin >>scelta;
switch(scelta)
{
case 1: ogg_art.insert(punt_lista);
break;
case 2: totale+=ogg_art.guadagno(punt_lista);
cout <<"\nFinora hai guadagnato" <<totale <<"Euro";
break;
case 0: exit(EXIT_SUCCESS);
default: cout <<"\nOpzione non valida";
}
} while(scelta!=0);
return 0;
}


Grazie per la pazienza

cionci
16-09-2004, 18:57
Se articolo è anche la classe che è all'interno di lista allora così ha poco senso...

Le cose sono due...o definisci una classe lista...o le quelle funzioni le porti fuori dalla classe articolo...
Per la prima soluzione:

class lista {
articolo art;
lista *next;
public:
lista(const articolo a = articolo());
void insersci_in_coda(oggetto art);
articolo *cerca_prodotto(const char *nome_prodotto);
void collega(const lista &lst);
};

//Tanto per farti un esempio
lista::lista(const articolo a = articolo())
{
art = a; //attento che devi definire il costruttore di copia per articolo
//altrimenti devi fare la copia membro a membro dei dati
next = NULL;
}

//collega serbve per fare una specie di insrimento in testa
void lista::collega(const lista &lst)
{
next = &lst;
}

//ecco la ricerca sula lista effettuata in modo ricorsivo
void lista::insersci_in_coda(oggetto art)
{
if(next != NULL)
next->inserisci_in_coda(art);
else
next = new lista(art);
}

Gogeta ss4
16-09-2004, 19:02
ok, allora definisco una classe lista, ma va dopo o prima la classe articolo??

cionci
16-09-2004, 19:03
Dopo...altrimenti articolo non è definito...

Gogeta ss4
16-09-2004, 19:05
scusa e nella classe lista cosa dovrei mettere allora??
:confused: :confused:

cionci
16-09-2004, 19:10
In che senso ?

Gogeta ss4
16-09-2004, 19:16
Allora ecco il codice:



#include <iostream.h>
#include "stdafx.h"
#include "classi.h"
#include <iomanip.h>
#include <stdlib.h>

struct lista_articoli
{
articolo info;
struct lista_articoli *next;
};


typedef struct lista_articoli lista;

void insert(lista *); //Funzione per l'inserzione del prodotto
float guadagno(lista *); //Funzione che calcola il guadagno

int main(int argc, char* argv[])
{
lista *punt_lista=NULL;
int scelta;
float totale;
do
{
cout <<setw(10) <<"\nMENU' PRINCIPALE";
cout <<setw(15) <<"\n1)Inserisci Singolo Prodotto";
cout <<setw(15) <<"\n2)Controlla Gaudagno Totale";
cout <<setw(15) <<"\n0)Uscita";
cout <<setw(25) <<"\nScelta: ";
cin >>scelta;
switch(scelta)
{
case 1: insert(punt_lista);
break;
case 2: totale+=guadagno(punt_lista);
cout <<"\nFinora hai guadagnato" <<totale <<" Euro";
break;
case 0: exit(EXIT_SUCCESS);
default: cout <<"\nOpzione non valida";
}
} while(scelta!=0);
return 0;
}


//Funzioni

void insert(lista *punt_lista)
{
articolo ogg_art;
register lista *p;
p=new lista;
cout <<"Inserisci il nome del prodotto venduto (MAX 10 LETTERE): ";
cin >>p->info.nome_prodotto;
cout <<"Descrivi Il Prodotto(MAX 200 LETTERE): ";
cin >>p->info.descrizione_prodotto;
cout <<"Quanti prodotti hai venduto?: ";
cin >>p->info.quantita_vendute;
cout <<"Inserisci il prezzo di vendita del prodotto: ";
cin >>p->info.prezzo_vendita;
cout <<"Inserisci il prezzo d'acquisto del prodotto: ";
cin >>p->info.prezzo_acquisto;
if(punt_lista==NULL) //caso lista vuota
{
p->next=NULL;
punt_lista=p;
}
else
{
p->next=punt_lista;
punt_lista=p;
}
}

float guadagno(lista *punt_lista)
{
articolo ogg_art;
register lista *p;
int quantita_vend;
float prezzo_vend,prezzo_acqu,totale;
for(p=punt_lista;p!=NULL;p=p->next)
{
prezzo_vend=p->info.prezzo_vendita;
prezzo_acqu=p->info.prezzo_acquisto;
quantita_vend=p->info.quantita_vendute;
totale+=(prezzo_vend-prezzo_acqu)*quantita_vend;
}
return totale;
}





#include <iostream.h>
#include "stdafx.h"
#include "classi.h"
#include <iomanip.h>
#include <stdlib.h>

articolo::articolo() //Il costruttore inizializza a 0
{
quantita_vendute=0;
prezzo_vendita=0;
prezzo_acquisto=0;
guadagno_totale=0;
}




#ifndef ARTICOLO_H
#define ARTICOLO_H


class articolo
{
public: articolo(); //Costruttore
char nome_prodotto[10]; //Vettore di caratteri contenente il nome del prodotto
char descrizione_prodotto[200]; //Vettore di caratteri contenente la descrizione del prodotto
int quantita_vendute; //Variabile che contiene la quantità dei prodotti venduti
float prezzo_vendita; //Variabile che contiene il prezzo di vendita
float prezzo_acquisto; //Variabile che contiene il prezzo di acquisto
float guadagno_totale; //Variabile che contiene il guadagno totale
};

#endif


Allora il programma parte, dopo che faccio l'inserimento dei dati e voglio sapere il guadagno mi da un numero stranissimo, con il debug ho visto che non entra nel ciclo for della funzione del guadagno e non riesco a capire dovè l'errore.
Puoi illuminarmi? :)

Gogeta ss4
16-09-2004, 21:33
sono riuscito a mettere apposto, l'unica cosa che non riesco a capire e perchè non mi vede la manipolazione dello stream SETW...