Newsgroup: it.comp.lang.c++
Titolo: Puntatori e C++

 Vorrei sottoporvi un problema che mi si è presentato studiando il C++.
Stavo creando un programmino molto semplice per capire la logica dei
puntatori.
Dal metodo main, viene chiamata una funzione a cui vengono passati due
valori, viene calcolata la loro somma e viene restituito un puntatore al
valore ottenuto.
Ora, eseguendo il programma, i semplicissimi calcoli restituiscono la somma
corretta ma se procedo al debug riga per riga, mi viene restituito un valore
errato.
L'unica spiegazione che ho trovato è la seguente: la variabile in cui viene
inserito il risultato (a cui fa riferimento il puntatore) essendo locale,
all'uscita del ciclo viene distrutta, ma allora perchè eseguendo il
programma non in debug funziona correttamente ? E comunque anche se la
variabile viene persa, la locazione di memoria viene comunque passata
correttamente (come testimonia il debugger) e dovrebbe contenere l'ultimo
valore inserito, cioè il nostro risultato.
Ho risolto il problema utilizzando una variabile globale oppure dichiarando
il puntatore come STATIC, ma ancora non mi spiego il funzionamento non
corretto in debug.
Preciso che per compilare i file, utilizzo il Borland C++ versione 3.
Allego il programmino e grazie per la risposta.
#include <iostream.h>
#include <conio.h>
using namespace std;
int  *puntatore (int a, int b);
void main()
{  clrscr();
   int a, b, *c;
   cout << "Inserisci due numeri separati da uno spazio: ";
   cin >> a >> b;
   c = puntatore(a,b);
   cout << "La loro somma e' " << *c;
   getch();
}
int  *puntatore (int a, int b)
{  int e, *d;
   e = a + b;
   d = &e;
   return d;
}

 }
int* puntatore(int a, int b)    {
    static int somma;
    somma = a+b;
    return &somma;
}
In questo caso la variabile somma ha scope locale ma la sua durata è
garantita per tutto il funzionamento del programma. Oppure puoi
scrivere:
int* puntatore(int a, int b)    {
    int* somma = new int(a + b);
    return somma;
}
ma in questo caso nella funzione main va aggiunta la seguente linea,
dopo l'utilizzo del valore restituito da puntatore:
delete c;

 ha scritto nel messaggio
news:_zRA8.6222$US3.1...@twister1.libero.it...


 correttamente ?
Se provi il codice sopra con il tuo compilatore, probailmente scoprirai
che stampa 10. Questo non toglie che il codice coontiene un errore e che a
questo punto il comportamento è indefinito. "Comportameto indefinito"
("undefined behaviour") significa che qualsiasi cosa può accadere,
compreso qualcosa di molto simile a quello che il programmatore si
aspetta.
Max

 ha scritto nel messaggio
news:zoRA8.3716$CN3.1...@news2.tin.it...


}
Visto che ci sei spiegagli anche perché chiamare la funzione in questo
modo
int *sm,*sm1;
sm=puntatore(1,5);
sm1=puntatore(2,15);
std::cout<<"sm="<<*sm<<"\nsm1="<<*sm1<<"\n";
produce tale output:
sm=17
sm1=17
anzi, se ha capito la logica dei puntatori dovrebbe arrivarci da solo.
Il Ghenio
---------
// TODO: Place your ass here

 wrote in message
news:beTUPIjJx5hMHV...@4ax.com...

basta che scriva:
int *sm,*sm1;
sm=puntatore(1,5);
sm1=puntatore(2,15);
std::cout<<"sm="<< sm<< "\nsm1="<< sm1<<"\n";
e se ne renderà conto da solo... ;-)

 int main()
 2) Perche` hai cambiato la funzione da void ad int?
Questo č un dubbio che mi perseguita: se la funzione main
e` la principale, come puo` tornare valori? Perche` va indicato
il tipo?
Grazie in anticipo! :)
--
Lupin85Š - Newbie incallito.
"...surrender your ego, be free, be free..."

 Grazie in anticipo! :)
Prego ;)

 del genere.
L'errorlevel mi fa pensare al Clipper, o al Dbase.. non ricordo bene.
Allora cosa devo indicare? int?
--
Lupin85©


 Allora cosa devo indicare? int?
l'ERRORLEVEL era proprio del DOS, ma questi sono dettagli. Penso che
ogni S.O. abbia il proprio modo di ricevere quell'int che tu
restituisci tramite la funzione main. La funzione main, per inciso, va
dichiarata in una di queste forme:
int main();
int main(int);
int main(int, char**);
tutte le altre sono errate.
Non è una grande fatica, visto che nella definizione della main il
return può essere omesso (viene assunto come default return 0 in quel
caso). Tutto sommato scrivere la forma int main() invece di void
main() ti fa anche risparmiare un carattere! ;-)

 main() ti fa anche risparmiare un carattere! ;-)
Hai ragione! :)
Non e` cmq questione di caratteri, ma di imparare a programmare
secondo lo standard! ;)
Grazie ancora!


 int main(int argc, char *argv[])
no, se non sbaglio č equivalente alla terza forma.

 Allora cosa devo indicare? int?
errorlevel di per se non e` una caratteristica del C++ ma dei file batch 
del DOS. La convenzione di far restituire un valore ai programmi e` nata 
sotto unix, in modo che il sistema operativo potesse sapere se il 
programma ha eseguito correttamente le operazioni (condizione indicata 
con il convenzionale valore 0) oppure si e` verificato un qualche errore 
(indicato con un valore diverso da 0).
E` possibile che tu non faccia uso di questa caratteristica nei tuoi 
programmi, ma non importa: devi sempre e comunque mettere int main(), 
perche` lo standard non prevede altri tipi di ritorno per questa 
funzione.
ciao Anto
-- 
Antonio Cuni, 20 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 Antonio Cuni, 20 anni, studente
Se non sbaglio, fino a poco tempo fa erano 19... Auguri in ritardo! ^^


 Se non sbaglio, fino a poco tempo fa erano 19... Auguri in ritardo! ^^
si e` vero, ho compiuto gli anni il 13... grazie degli auguri.
ciao anto
-- 
Antonio Cuni, 20 anni, studente
