Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Array Dinamico
Forum - C/C++ - Array Dinamico

Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 21:30
Giovedì, 27/03/2014
Riassumo semplicemente il mio problema.
c'è un classe i cui unici parametri privati sono un array dinamico di stringhe (string) e una dimensiona D.
Ho un metodo pubblico ADD (string X) che aggiunge una stringa all'array.. come? aumentando (dinamicamente) la dimensione di uno (ovviamente). Il fatto è che mi si crasha il programma in runtime e non capisco il perché... :grr:

Faccio un esempio pratico per farvi capire meglio.
Codice sorgente - presumibilmente C++

  1. class classe{
  2.   private:
  3.     string* V;
  4.     int d;
  5.   public:
  6.     classe(){
  7.           V = new string[10];
  8.     }
  9.     void add(string x){
  10.             if( !contains(x) ){
  11.                 string* tmp = new string[d + 1];
  12.                 for(int i = 0; i < d; i++)
  13.                      tmp[i] = V[i];
  14.                 delete[] V;
  15.                 V = tmp;
  16.                 d++;
  17.             }
  18.         }
  19. };
  20.  
  21. int main(){
  22.  classe cl;
  23.  cl.add("ciao");
  24. }


Ultima modifica effettuata da bububs il 27/03/2014 alle 21:31


Parte della disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.  [cit. Isaac Asimov]
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:56
Giovedì, 27/03/2014
Prima di tutto lo fai per completare un esercizio/compito o perché ti serve un programma del genere?

Nel secondo caso, non ha senso usare un array di string ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 951
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:03
Giovedì, 27/03/2014
Ciao!

Il programma non funziona perchè non inizializzi d ( il registro della dimensione del vettore ) nel costruttore della classe.
Dovresti impostare un' altra variabile per il conteggio degli elementi effettivamente presenti nel vettore.
A mio parere non è efficiente riallaccare l' intero vettore ad ogni chiamata del metodo ADD( ). Controlla se nel vettore c'è spazio sufficiente prima di aumentare la dimensione, e nel caso sia necessario, raddoppia la capacità.


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 6:47
Venerdì, 28/03/2014
Intanto grazie a entrambi per l'interessamento al mio problema. Inizio a rispondervi uno alla volta.
Nessuno, so che vi sono numerose varianti molto piu funzionali di questa ma sono costretto ad usarla perche è un esercizio, molto piu piu elaborato, e richiede tutto cio'.
Detto cio'  mettiamo il caso che aggiunga una funzione "allarga" come mi ha suggerito Marco. Come sarebbe gestita? Per il fatto della dimensione il parametro D è richiesto dal programma e non posso farne a meno.. purtroppo. :_doubt:


Parte della disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.  [cit. Isaac Asimov]
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:40
Venerdì, 28/03/2014
Infatti ti avevo proprio chiesto se era per un compito.

Per la questione di d, forse non hai capito. Tu non dai mai un valore iniziale a d e questa è la causa del tuo errore.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 951
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:26
Venerdì, 28/03/2014
Testo quotato

Postato originariamente da bububs:Intanto grazie a entrambi per l'interessamento al mio problema. Inizio a rispondervi uno alla volta.
Nessuno, so che vi sono numerose varianti molto piu funzionali di questa ma sono costretto ad usarla perche è un esercizio, molto piu piu elaborato, e richiede tutto cio'.
Detto cio'  mettiamo il caso che aggiunga una funzione "allarga" come mi ha suggerito Marco. Come sarebbe gestita? Per il fatto della dimensione il parametro D è richiesto dal programma e non posso farne a meno.. purtroppo. :_doubt:

Come ha suggerito nessuno, nel costruttore devi necessariamente inizializzare d, inoltre ti serve una variabile per il conteggio degli elementi effettivamente registrati nel vettore.
Esempio:
Codice sorgente - presumibilmente C++

  1. class classe{
  2.   private:
  3.     string* V;
  4.     int d, elementi;
  5.   public:
  6.     classe(){
  7.           d=10; // Assegno una dimensione iniziale al vettore
  8.           elementi=0; // Indice degli elementi presenti
  9.           V = new string[d];
  10.     }
  11.     void add(string x){
  12.             if( elementi>=d ){
  13.                  allarga() // Richiamo la funzione per ridimensionare il vettore.
  14.             }
  15.             v[elementi]=x;
  16.             elementi++; // Aggiorno l'indice degli elementi registrati.
  17.         }
  18. };


Ultima modifica effettuata da Poggi Marco il 28/03/2014 alle 14:30


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 0:04
Sabato, 29/03/2014
Ringrazio entrambi, ho risolto come da voi suggerito. Grazie mille :k:


Parte della disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.  [cit. Isaac Asimov]
PM Quote