C++ problema con vettore di puntatori
Vi metto tutto il codice ma il problema è alla fine:
Devo creare un vettore di puntatori ad un record chiamato PRODOTTO.
Devo allocare e deallocare dinamicamente il vettore ed è questo il problema, xkè non riesco a chiamare le funzioni, sbaglio qualcosa ma non capisco..
La funzione CREA_MAGAZZINO penso sia creata bene
le funzione VISUALIZZA E ELIMINA MAGAZZINO mi danno problemi
MAIN
Magazzino.h
Magazzino.cpp
Devo creare un vettore di puntatori ad un record chiamato PRODOTTO.
Devo allocare e deallocare dinamicamente il vettore ed è questo il problema, xkè non riesco a chiamare le funzioni, sbaglio qualcosa ma non capisco..
La funzione CREA_MAGAZZINO penso sia creata bene
le funzione VISUALIZZA E ELIMINA MAGAZZINO mi danno problemi
MAIN
#include <iostream.h> #include <stdlib.h> #include "Magazzino.h" int main() { int dim; Prodotto *prod; Prodotto *Magazzino; cout<<"Le operazioni da eseguire sono:" <<endl; cout<<"1)Crea prodotto\n"; cout<<"2)Visualizza prodotto\n"; cout<<"3)Cancella prodotto\n"; cout<<"4)Crea magazzino\n"; cout<<"5)Distruggi una posizione nel magazzino\n"; cout<<"6)Visualizza nel magazzino\n"; cout<<"0)Esci\n"; int num; do { cout<<"Inserisci un numero: "; cin>>num; cout <<endl; switch (num) { case 1: prod=Crea_Prodotto(); break; case 2: Visualizza_DatiProdotto(prod); break; case 3: Distruggi_Prodotto(prod); break; case 4: Magazzino=Crea_Magazzino(dim); break; case 5: Elimina_Prodotto(Magazzino); //CORREGGERE QUI break; case 6: Visualizza_Magazzino(Magazzino, dim); break; default: break; } }while(num!=0); return 0; }
Magazzino.h
#ifndef MAGAZZINO_H_ #define MAGAZZINO_H_ typedef char stringa[256]; typedef struct { stringa Codice; stringa Descrizione; int Qta; }Prodotto; Prodotto *Crea_Prodotto(); //creo il prodotto void Visualizza_DatiProdotto(const Prodotto*); //visualizzo il prodotto void Distruggi_Prodotto(Prodotto*); //distruggo il prodotto Prodotto *Crea_Magazzino(int &); //alloca vettore di puntatori void Elimina_Prodotto(Prodotto *); //Dealloca il prodotto nel vettore void Visualizza_Magazzino(Prodotto *, int); //Mostra tutti i prodotti #endif /* MAGAZZINO_H_ */
Magazzino.cpp
/* * Magazzino.cpp * * Created on: 06/nov/2011 * Author: Angelo */ #include <iostream.h> #include <stdlib.h> #include "Magazzino.h" Prodotto *Crea_Prodotto() //creo prodotto allocando il puntatore a prodotto dinamicamente { Prodotto *prod= new Prodotto; cout<<"Inserisci codice: "; cin>>prod->Codice; cout<<"Inserisci descrizione: "; cin>>prod->Descrizione; cout<<"Inserisci Qta: "; cin>>prod->Qta; return prod; } void Visualizza_DatiProdotto(const Prodotto *prod) //visualizzo il prodotto { cout<<"Il codice è: " <<prod->Codice <<endl; cout<<"La descrizione è: " <<prod->Descrizione <<endl; cout<<"Il Qta è: " <<prod->Qta <<endl; } void Distruggi_Prodotto(Prodotto *prod) //distruggo il prodotto { delete prod; } Prodotto *Crea_Magazzino(int &dim) //alloca vettore di puntatori { cout<<"Inserisci dimensione del vettore Magazzino: "; cin>>dim; cout<<"Alloco il vettore...\n"; Prodotto *Magazzino = new Prodotto[dim]; for (int i=1;i<=dim;i++) { cout<<"Inserisci il " <<i <<" prodotto:\n"; Magazzino[i]=*Crea_Prodotto(); } return Magazzino; } void Elimina_Prodotto(Prodotto *Magazzino) //dealloca il vettore ad una data posizione { int pos; cout<<"A quale posizione del vettore si vuole eliminare il prodotto? Inserisci: "; cin>>pos; cout<<"Prodotto eliminato\n"; } void Visualizza_Magazzino(Prodotto *Magazzino, int dim) //Mostra tutti i prodotti { cout<<"I prodotti inseriti sono:\n"; for (int i=1;i<=dim;i++) { } }
Risposte
C'è una ragione per allocare dinamicamente i prodotti del vettore? Ho l'impressione che serva solo per complicarti la vita e peggiorare le performance dell'applicazione (non che in questo caso siano necessarie performance particolari).
Ci sono in effetti due importanti decisioni da prendere nell'eliminazione del prodotto. Prima di tutto, se ogni prodotto è determinato dalla sua posizione, allora è necessario stabilire quale dovrebbe essere l'effetto dell'eliminazione. In particolare: i prodotti devono rimanere in ordine o è possibile cambiare l'ordine dei prodotti? È accettabile avere dei "buchi" all'interno dell'array dei prodotti? Ci sono principalmente tre strategie per cancellare un prodotto:
1. Deallocare la memoria del prodotto e settare la corrispondente posizione dell'array a NULL in modo da sapere se un prodotto è disponibile o meno.
2. Deallocare la memoria del prodotto, settare il puntatore nella posizione corrente a NULL e poi scambiare questo puntatore con l'ultimo prodotto non nullo del magazzino.
3. Deallocare la memoria del prodotto, spostare tutti i prodotti successivi di una posizione in modo da coprire il buco e settare a NULL il puntatore nella posizione vecchia del puntatore all'ultimo elemento (spero si capisca, nel caso ti scrivo lo pseudocodice che è alla fine molto più facile della spiegazione).
Usando una lista sarebbe in un certo senso più facile. Gli ultimi due punti si potrebbero implementare anche senza puntatori se si supponesse che il codice deve essere non nullo o la quantità non nulla.
La visualizzazione dipende ovviamente da come fai l'eliminazione.
Ci sono in effetti due importanti decisioni da prendere nell'eliminazione del prodotto. Prima di tutto, se ogni prodotto è determinato dalla sua posizione, allora è necessario stabilire quale dovrebbe essere l'effetto dell'eliminazione. In particolare: i prodotti devono rimanere in ordine o è possibile cambiare l'ordine dei prodotti? È accettabile avere dei "buchi" all'interno dell'array dei prodotti? Ci sono principalmente tre strategie per cancellare un prodotto:
1. Deallocare la memoria del prodotto e settare la corrispondente posizione dell'array a NULL in modo da sapere se un prodotto è disponibile o meno.
2. Deallocare la memoria del prodotto, settare il puntatore nella posizione corrente a NULL e poi scambiare questo puntatore con l'ultimo prodotto non nullo del magazzino.
3. Deallocare la memoria del prodotto, spostare tutti i prodotti successivi di una posizione in modo da coprire il buco e settare a NULL il puntatore nella posizione vecchia del puntatore all'ultimo elemento (spero si capisca, nel caso ti scrivo lo pseudocodice che è alla fine molto più facile della spiegazione).
Usando una lista sarebbe in un certo senso più facile. Gli ultimi due punti si potrebbero implementare anche senza puntatori se si supponesse che il codice deve essere non nullo o la quantità non nulla.
La visualizzazione dipende ovviamente da come fai l'eliminazione.
Il testo dell'esercizio mi chiede di creare proprio il vettore di puntatori a prodotto e non mi dice poi se vuole che l'array sia legato a NULL in quella determinata posizione oppure scalare di posizione.
Nel caso volessi deallocare il puntatore dal prodotto e porlo a NULL, in quel codice che stavo iniziando, come passo i parametri alla funzione e scrivo il codice? Così cerco di capire il ragionamento che devo applicare
Nel caso volessi deallocare il puntatore dal prodotto e porlo a NULL, in quel codice che stavo iniziando, come passo i parametri alla funzione e scrivo il codice? Così cerco di capire il ragionamento che devo applicare
Per deallocare un prodotto devi semplicemente scrivere:
e per impostare il valore di questo stesso puntatore a NULL devi invece scrivere nella riga successiva:
delete Magazzino[i];
e per impostare il valore di questo stesso puntatore a NULL devi invece scrivere nella riga successiva:
Magazzino[i] = NULL;
il problema è che se scrivo delete Magazzino[pos], non posso farlo...è errore :S
Mostra il codice che ti da errore.
type struct Prodotto argument given to delete, expected pointer
Ed in realtà il programma si blocca proprio quando chiamo la funzione, come se sbagliassi a passare forse i parametri
Ed in realtà il programma si blocca proprio quando chiamo la funzione, come se sbagliassi a passare forse i parametri
se invece di scrivere delete, facessi uno switch degli elementi da destra a sinistra fino alla posizione desiderata e poi dò al programma chiamante la nuova dimensione ridotta??
Il problema non è nell'istruzione del delete, ma nel tipo che hai scelto per il parametro. Tu hai un array di puntatori a Prodotto per cui quando passi l'array ad una funzione dovresti avere un puntatore a puntatori a Prodotto. Cioè Prodotto **Magazzino..
ed è un errore? :S
void Elimina_Prodotto(Prodotto *Magazzino) //dealloca il vettore ad una data posizione
deve diventare
void Elimina_Prodotto(Prodotto **Magazzino) //dealloca il vettore ad una data posizione
ok fatto in questo modo e va tutto ok:P
void Elimina_Prodotto(Prodotto *Magazzino, int &dim) //dealloca il vettore ad una data posizione { int pos; cout<<"A quale posizione del vettore si vuole eliminare il prodotto? Parti da 0..Inserisci: "; cin>>pos; if(pos=1) delete []Magazzino; for (int i=pos;i<dim;i++) { Magazzino[i]=Magazzino[i+1]; } dim--; } void Visualizza_Magazzino(Prodotto *Magazzino, int dim) //Mostra tutti i prodotti { Prodotto *prod; cout<<"I prodotti inseriti sono:\n"; for (int i=1;i<=dim;i++) { cout<<"Il " <<i <<" prodotto è:\n"; prod=&Magazzino[i]; //VEDI QUESTA RIGA!!! Visualizza_DatiProdotto(prod); }