Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

Errore stack
(Questo messaggio è stato modificato l'ultima volta il: 02/12/2013, 19:46 da Cyanstack.)

Iscritto
Messaggi: 270
Discussioni: 40
Registrato: 10-2013
Mix: 0
error

15/10/2013, 22:14
#1
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
Il problema non è tanto il & che non cambia di fatto il funzionamento del programma, anche se è sufficiente scrivere
cin >> dna;

Il problema qui è un'altro, che dna è una variabile locale alla funzione main, quindi lo spazio per essa viene allocato sullo stack, peccato che hai allocato 1 solo byte (carattere, char), quindi quello che succede quando prelevi l'input dal cin e lo copi nella locazione puntata da dna stai copiando N bytes (dipende da quanto scrivi in input) direttamente nello stack, peccato che cosi facendo vai a sovrascrivere altre locazioni dello stack che contenevano altri dati utili al normale funzionamento del programma.
Nel caso particolare quello che succede è che vai a sovrascrivere l'indirizzo di ritorno della funzione nello stack, quindi appena finisce di visualizzare la messagebox e cerca di tornare al codice che ha chiamato la funzione main, cercando l'indirizzo di ritorno nello stack, quello che ci trova è del pattume.
Siccome quando compili in C++ con Visual a meno che non lo togli, di default hai attiva l'opzione che inserisce un codice di controllo dello stack per verificare che non si corrompa, questo codice si accorge del casino che hai fatto e ferma il tutto con un bell'errore di runtime, impedendo cosi che il programma continui creando magari ancora piu danni.

Questa era la versione lunga.
La versione corta è che potresti usare un array di caratteri per dna abbastanza capiente da contenere l'input:

    C++ Programming
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5.  
  6. int main ()
  7. {
  8. char dna[255]="";
  9. cout << "Inserisci una frase" << endl;
  10. cin >> dna;
  11.  
  12. MessageBoxA ( NULL , dna , "MessageBox Test" , MB_OK );
  13. return 0;
  14. }



Questo presenta però presenta due piccoli problemi,
uno che comunque se superi i 255 caratteri in input si incazza ancora,
due che prova a scrivere una frase tipo "ciao a tutti", vedrai che la messagebox ti farà vedere solo "ciao".
Questo perchè l'input dal cin si ferma allo spazio successivo al ciao
Allora per risolvere sti problemi conviene fare cosi:

    C++ Programming
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5.  
  6. int main ()
  7. {
  8. string dna;
  9. cout << "Inserisci una frase" << endl;
  10. getline(cin,dna);
  11.  
  12. MessageBoxA ( NULL , dna.c_str() , "MessageBox Test" , MB_OK );
  13. return 0;
  14. }



Cosi il getline preleva tutta la frase (compresi gli spazi) dal cin e la mette nella stringa dna (non è piu char[]),
non ci resta che chiamare la MessageBox passandogli la stringa dna convertita in array di caratteri tramite il metodo .c_str() della classe string.

si è capito qualcosa della spiega? Happywide


digger
16/10/2013, 0:14
#2
Cerca

Iscritto
Messaggi: 270
Discussioni: 40
Registrato: 10-2013
Mix: 0
Ho capito tutto , ti stimo Happywide

16/10/2013, 0:26
#3
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Mix: 0
Grande digger. Non ci sarei riuscito ... Ma come mai di solito a me gli spazi funzionavano?

16/10/2013, 18:42
#4
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
dovresti farmi vedere uno dei tuoi programmi, sono curioso Smile


digger
16/10/2013, 21:57
#5
Cerca

1 Life, 1 Avatar &lt;3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Mix: 0
Noooo muhuhahahah criceto mannaro non te li farò vedere xd xd xd

16/10/2013, 22:14
#6
Cerca


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  [Guida] Visual C++ 2010 - Errore MSVCR100.dll mancante (rimuovere dipendenze runtime) digger 10 27,574 28/05/2013, 11:19
Ultimo messaggio: digger
  Errore C++: 1>LINK : fatal error LNK1561: il punto d'ingresso deve essere definito Cato97 20 11,823 07/09/2011, 9:43
Ultimo messaggio: Cato97



Utenti che stanno guardando questa discussione: 1 Ospite(i)