Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-06-2010, 11:31   #1
_TeRmInEt_
Senior Member
 
L'Avatar di _TeRmInEt_
 
Iscritto dal: Sep 2004
Città: Rep. San Marino
Messaggi: 633
[C++] getline e vettore 2D

Codice:
string parserCSV(string& movienameFile, string& multiPlex) {
  ifstream file(movienameFile.c_str());
  const int ROW=3,COL=3;
  //std::vector<std::vector<string>  > array;
  string array[ROW][COL];
  if (file) {
    for (int i=0; i < ROW; i++) {
      string line;
      if (getline(file,line)) {
	stringstream iss(line);
	for (int j=0; j < COL; j++) {
	  if (getline(iss, array[i][j], ',')) {
	    cout << "array[" << i << "][" << j <<"] = " << array[i][j] << "\n";
	  }
	}
      }
    }
  }
  else {
    cout << "Errore apertura file" << endl;
  }
  return movienameFile;
}
Ho scritto questo codice, che fa uso di un array 2D per importare un file csv.

Il problema è che vorrei utilizzare un vector 2D, in modo da poter sfruttarela sua dinamicità dimensionale.

Ho fatto un paio di test ma non ne sono uscito fuori, avete qualche dritta?

Grazie
__________________
|| Do you like sbav?
_TeRmInEt_ è offline   Rispondi citando il messaggio o parte di esso
Old 03-06-2010, 12:55   #2
_TeRmInEt_
Senior Member
 
L'Avatar di _TeRmInEt_
 
Iscritto dal: Sep 2004
Città: Rep. San Marino
Messaggi: 633
Se invece dell'array imposto:

vector<vector<string> > array;

senza cambiare nient'altro il programam va in segfault...
__________________
|| Do you like sbav?
_TeRmInEt_ è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 11:48   #3
_TeRmInEt_
Senior Member
 
L'Avatar di _TeRmInEt_
 
Iscritto dal: Sep 2004
Città: Rep. San Marino
Messaggi: 633
up
__________________
|| Do you like sbav?
_TeRmInEt_ è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 14:59   #4
TRF83
Senior Member
 
L'Avatar di TRF83
 
Iscritto dal: Dec 2007
Città: Palestro
Messaggi: 1960
Quote:
Originariamente inviato da _TeRmInEt_ Guarda i messaggi
Se invece dell'array imposto:

vector<vector<string> > array;

senza cambiare nient'altro il programam va in segfault...
Proprio per la dinamicità dei vector, all'inizio hanno dimensione ZERO, quindi (immaginiamo di lavorare su un vector "semplice"), inizializzare un vector<string> vs; e poi fare subito vs[0]="ciao"; da errore, in quanto l'elemento in posizione 0 non è ancora stato "previsto". Puoi ovviare facendo vs.push_back() (tanto leggi in modo sequenziale;

Passando a ragionare "bidimensionalmente", oltre a dover fare la push_back sul vector (con elementi di tipo string), devi fare una push_back di tipo vector<string> sul tuo identificatore, così da allocare spazio per il tuo "sottovettore".
Più precisamente puoi provare qualcosa di simile:
Codice:
string parserCSV(string& movienameFile, string& multiPlex) {
  ifstream file(movienameFile.c_str());
  const int ROW=3,COL=3;
  vector<vector<string>  > array;
  if (file) {
    for (int i=0; i < ROW; i++) {
      vector<string> riga;      //una riga vuota, tanto per iniziare a riservare lo spazio per la riga i-esima
      string line;
      array.push_back(riga);  //notare che riga è ancora vuoto!
      if (getline(file,line)) {
	stringstream iss(line);
	for (int j=0; j < COL; j++) {
	  if (getline(iss, line, ',')) {    // riciclo line, tanto l'hai già letta e ci hai creato uno stringstream sopra..
            array[i].push_back(line);  // a questo punto array[i] esiste (grazie al push_back precedente) e il push_back su di esso, accoda la stringa appena letta
	    cout << "array[" << i << "][" << j <<"] = " << array[i][j] << "\n";
	  }
	}
      }
    }
  }
  else {
    cout << "Errore apertura file" << endl;
  }
  return movienameFile;
}
Se preferisci, puoi anche spostare la push_back(riga) fuori dal for su j (intendo dire DOPO il for), sostituendo array[i].push_back(line) con riga.push_back(line). Le operazioni che fai sono le stesse..una volta ti riservi dello spazio vuoto e lavori sull'identificatore generale, mentre nel secondo caso lavori sulla riga singola e la aggiungi una volta completata la scansione.
Prova a dargli un'occhiata e dimmi se le cose che ti ho scritto ti tornano (lh'o fatto ad occhio..potrei aver commesso qualche piccolo errore, per i quali ti chiedo già scusa!)
TRF83 è offline   Rispondi citando il messaggio o parte di esso
Old 08-06-2010, 07:37   #5
_TeRmInEt_
Senior Member
 
L'Avatar di _TeRmInEt_
 
Iscritto dal: Sep 2004
Città: Rep. San Marino
Messaggi: 633
In effetti rileggendo ora avevo scritto proprio una castroneria , un po' dura scrivere dentro ad un vettore vuoto

Il codice funziona ottimamente

Già che c'ero volevo chiederti come far ritornare l'array al main, mi conviene passarlo per reference?
__________________
|| Do you like sbav?
_TeRmInEt_ è offline   Rispondi citando il messaggio o parte di esso
Old 08-06-2010, 09:24   #6
TRF83
Senior Member
 
L'Avatar di TRF83
 
Iscritto dal: Dec 2007
Città: Palestro
Messaggi: 1960
Nel tuo codice ritornavi moviefileName che credo non ti serva (siccome glielo passavi come parametro, dal main conosci già il valore di tale variabile), quindi puoi anche farlo ritornare dalla funzione normalmente. Per fare le cose bene, potresti passarlo by reference, trasformare la funzione in int parserCVS(blah blah) e far ritornare un valore che indica se tutto è andato per il verso giusto, o c'è stato qualche errore (tra cui l'apertura del file). Sarebbe più elegante!
TRF83 è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2010, 13:58   #7
_TeRmInEt_
Senior Member
 
L'Avatar di _TeRmInEt_
 
Iscritto dal: Sep 2004
Città: Rep. San Marino
Messaggi: 633
No no i passaggio di variabili sono solo di esempio... non sono quei definitivi.

nel main prengo argv[] che lo passa alla funzione, la funzione mi deve ritornare il vettore di vettori.

Quindi che dici, inizializzo il vettore nel main e lo passo per reference alla funzione?

In questo modo la funzione lavora sul puntatore e a quel punto il passaggio è bello che fatto.

Che dici?
__________________
|| Do you like sbav?
_TeRmInEt_ è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 14:58   #8
TRF83
Senior Member
 
L'Avatar di TRF83
 
Iscritto dal: Dec 2007
Città: Palestro
Messaggi: 1960
Farei esattamente così (intendo il passaggio by reference)! Inoltre, come ti dicevo sopra, puoi lasciare la funzione di tipo int e far ritornare dalla stessa un codice di controllo (esempio: 0 tutto ok; -1 errore nell'apertura del file; -2 errore in lettura), così da gestire i vari eventi negativi che ti si possono presentare. Immagino, però, che sia un esercizio scolastico, per i quali quest controlli possono anche essere evitati, sbaglio?
TRF83 è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 15:19   #9
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da TRF83 Guarda i messaggi
Farei esattamente così (intendo il passaggio by reference)! Inoltre, come ti dicevo sopra, puoi lasciare la funzione di tipo int e far ritornare dalla stessa un codice di controllo (esempio: 0 tutto ok; -1 errore nell'apertura del file; -2 errore in lettura), così da gestire i vari eventi negativi che ti si possono presentare. Immagino, però, che sia un esercizio scolastico, per i quali quest controlli possono anche essere evitati, sbaglio?
Oddio l'utilizzo dei codici di ritorno fa molto programmazione procedurale.
Io userei le eccezioni per la gestione degli errori.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 18:24   #10
TRF83
Senior Member
 
L'Avatar di TRF83
 
Iscritto dal: Dec 2007
Città: Palestro
Messaggi: 1960
Beh..questa è una procedura! E poi implicherebbe il minor numero di modifiche.. Senza contare che l'overhead di try-catch(e finally, su usi Visual Studio..), non lo adoro.. Ma sono io che sono fissato con le performance assolute nei miei programmi! ^^
TRF83 è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 22:19   #11
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da TRF83 Guarda i messaggi
Beh..questa è una procedura! E poi implicherebbe il minor numero di modifiche.. Senza contare che l'overhead di try-catch(e finally, su usi Visual Studio..), non lo adoro.. Ma sono io che sono fissato con le performance assolute nei miei programmi! ^^
finally? Non è contemplato in C++.

Andare tutte le volte a controllare il valore di ritorno invece è ottimale, magari con un bello switch
E il giorno in cui dovrai aggiungere gli errori -3,-4 ecc è facile che dovrai modificare ovunque tu utilizzi quella funzione.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2010, 22:37   #12
TRF83
Senior Member
 
L'Avatar di TRF83
 
Iscritto dal: Dec 2007
Città: Palestro
Messaggi: 1960
Quote:
Originariamente inviato da tomminno Guarda i messaggi
finally? Non è contemplato in C++.
lo so..per questo dicevo "se usi Visual Studio"!

Quote:
Originariamente inviato da tomminno Guarda i messaggi
Andare tutte le volte a controllare il valore di ritorno invece è ottimale, magari con un bello switch
E il giorno in cui dovrai aggiungere gli errori -3,-4 ecc è facile che dovrai modificare ovunque tu utilizzi quella funzione.
Non dico sia ottimale, assolutamente, ma..in certe condizioni ti permette di saltare qualche controllo! (ad esempio, se dovessi richiamare due volte questa funzione di "parsing", la seconda volta già sai se il file c'è o meno..). Poi, ovvio, dipende dai casi..in questo caso, vista la semplicità della funzione, non starei a preoccuparmi del try..catch, anche e soprattutto per via del fatto che non credo sarà una funzione riutilizzata in altri progetti e che quindi, come giustamente fai notare, non sarà necessario modificare il codice ovunque ci sia un richiamo della stessa.. Credo inoltre che vada anche un pochino a gusti/abitudini! (ad esempio con c# viaggio solo di try..catch, anche per via delle ottime prestazioni del compilatore JIT! Con c++, invece..non so..non mi piace troppo, per questo, se posso, lo evito! )
TRF83 è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2010, 00:31   #13
_TeRmInEt_
Senior Member
 
L'Avatar di _TeRmInEt_
 
Iscritto dal: Sep 2004
Città: Rep. San Marino
Messaggi: 633
Eccezioni solo con try e catch... come da linee guida del progetto...

Tornando al codice mi sono accorto di un errore concettuale bello grosso...

Voglio usare un vettore per sfruttare la dinamicità dimensionale... peccato che poi si definisce:

Codice:
const int ROW=3,COL=3;
che manda alle ortiche l'utilità di usare i vettori!
Sto pensando come risolvere, certamente dal file csv devo leggere di quante righe e colonne è fatto, a quel punto posso definire ROW e COL, qualche idea?
__________________
|| Do you like sbav?
_TeRmInEt_ è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Dopo 23 anni di silenzio, Warcraft 3 spi...
Roblox sfida l'ecosistema gaming: app st...
OpenAI accusata di plagio dai migliori m...
Altro attacco hacker dell'IA: gli agenti...
Stiamo davvero perdendo il controllo del...
Microsoft perde un pilastro: Frank Shaw ...
Diablo V annunciato a sorpresa: il colpo...
Meno di 5 euro per il 5G: l'offerta Kena...
World of Warcraft: Forever è il Classic+...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:13.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v