Dato che la funzione palindromo è sbagliata, mostra quella corretta
Dato che la funzione palindromo è sbagliata, mostra quella corretta
No MP tecnici (non rispondo nemmeno!), usa il forum.
Secondo me ci sono problemi anche in altre parti del codice. Ad esempio, cosa sarebbe questo?
codice:int n = 0; int *vet1; vet1 = new int [n];
Praticamente metti n=0 e poi allochi un vettore di dimensione zero? Direi che è da rivedere!
Questa versione sembra funzionante:
codice:#include <iostream> #include <fstream> using namespace std; void leggi (int riemp,int *vet1); bool palindromo (int riemp,int *vet1); int main () { //int n = 0; int *vet1; vet1 = new int [5]{1,2,3,2,1}; int riemp = 5; //leggi (riemp,vet1); if (palindromo (riemp,vet1)==true) cout << "\n\nil vettore e' palindromo"; else if (palindromo (riemp,vet1)==false) cout << "\n\nil vettore non e' palindromo"; cout << "\n\n"; system("pause"); } void leggi (int riemp,int *vet1) { ifstream file; file.open("dati.txt",ios::in); while(!file.eof()) { file >> vet1[riemp++]; } cout << "il vettore che hai caricato e':\n\n"; for (int i=0; i<riemp; i++) { cout << vet1[i]; } } bool palindromo (int riemp,int *vet1) { for (int i=0; i<riemp; i++) { if(vet1[i] != vet1[riemp-i-1]) return false; } return true; }
ma ho fatto l'inserimento del vettore direttamente da codice. Prova a sistemare la lettura da file e poi dovresti esserci.
ho risolto finalmente xD in sostanza ho unito le funzioni leggi e palindromo,poi ho spostato la stampa dal main alla funzione palindromo e mi va benissimo.Devo essere sincero non ho proprio ben afferrato del perchè ora va,probabilmente i problemi di visibilità che avevo all'inizio si sono risolti.
ah poi minomic quella parte di codice che mi hai indicato tu sarebbe l'allocazione dinamica dell'array.codice:#include <iostream>#include <fstream> using namespace std; void leggi (int riemp,int *vet1); int main () { int n = 0; int *vet1; vet1 = new int [n]; int riemp = 0; leggi (riemp,vet1); cout << "\n\n"; system("pause"); } void leggi (int riemp,int *vet1) { ifstream file; file.open("dati.txt",ios::in); while(!file.eof()) { file >> vet1[riemp++]; } cout << "il vettore che hai caricato e':\n\n"; for (int i=0;i<riemp;i++) { cout << vet1[i]; } cout << "\n"; bool palindromo = true; for (int i=0;i<riemp;i++) { if(vet1[i] != vet1[riemp-i-1]) palindromo = false; } if (palindromo == true) cout << "\n\nil vettore e' palindromo"; else cout << "\n\nil vettore non e' palindromo"; }
OK per l'allocazione ma... cosa allochi? Se n vale zero, quando fai new int [n] cosa ottieni? Secondo me continua ad esserci qualcosa che non va... Poi magari funziona per qualche strano motivo, ma non è detto che un programma che funziona sia anche corretto.
perfettamente d'accordo e per essere sincero una spiegazione al corso non l'abbiamo mai avuta e quello volte che sono state fatte delle domande la risposta è stata "si fa così".Io per esempio per l'allocazione dinamica avrei impostato che tu devi dargli la dimensione facendo cin >> dimensione e poi vet = new int [dim],però sono capitate occasione in cui ci dicevano "e se non sai quanta roba c'è nel file tu che ne sai della dimensione perciò il miglior modo e' quello". Tra l'altro molti per l'allocazione dinamica (es. su youtube,google) usano la funzione malloc che noi non abbiamo proprio trattato.
Ultima modifica di Mrhide1; 04-01-2016 a 11:50
Così è sbagliato, non ci sono discorsi che tengano.
Se funziona è solo per "fortuna" che la memoria sporcata non sia utile al processo.
La new è la soluzione corretta per il C++ (la malloc lo sarebbe stata per il C) ma va usata dopo che sai quanti sono i caratteri da leggere, vedendo prima quanto è lungo il file.
No MP tecnici (non rispondo nemmeno!), usa il forum.
cosa è sbagliato? l'algoritmo che ho usato per il programma o la cosa che ho detto su come avrei fatto l'allocazione dinamica inserendo da tastiera la dimensione?
Io parlo della riga vet1 = new int [n];
No MP tecnici (non rispondo nemmeno!), usa il forum.
Per dare un'idea (anche se molto parziale), possiamo dire che queste sono alcune possibilità:
1. chiedi la dimensione del vettore e poi allochi
codice:cout << "Inserire la dimensione del vettore: "; int n; cin >> n; // adesso posso allocare il vettore int* vettore = new int[n];
2. allochi una quantità "sufficiente" di memoria e poi la usi:
codice:int size = 1000; int* vettore = new int[size];
Ovviamente ci sono diversi problemi: chi lo dice quanta memoria è sufficiente? Cosa succede se poi risulta essere poca? E se invece è troppa, è grave lasciarla inutilizzata (e quindi, in un certo senso, sprecarla)?
3. usi una struttura dati dinamica, cioè una per cui non hai bisogno di conoscere in anticipo la dimensione, ma che si "gonfia" quando inserisci un nuovo elemento. Forse è un argomento che non avete ancora trattato ma, se sei curioso, puoi guardare ad esempio i vector.
L'unica costante è quello che ti abbiamo detto io e oregon: allocare con n=0 è certamente sbagliato e può portare a comportamenti imprevedibili.
Capisco,allora in futuro userò il metodo del chiedere la dimensione la vedo più accettabile come soluzione e certamente non voglio ritrovarmi con comportamenti imprevedibile già il DEV C++ ne ha abbastanza di suo,comunque grazie a entrambi per i chiarimenti.