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: 5714
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 967
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: 5714
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 967
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