View Full Version : [C++] Return nelle funzioni
sangueimpazzito
24-08-2004, 16:32
Ciao ragazzi.
Ho una domanda stupida...
Ho una funzione che preso in input un array e la sua dimensione, deve cercare se al suo interno c'è un numero X (7, per esempio).
Se lo trova deve ritornare la sua posizione.
Ho fatto così:
int * ricerca (int * A, int DIM)
{
for (int I=0; I<DIM; I++)
{
if ( A[I]==7 )
{
return &A[I];
}
}
}
Ma mi chiedevo...
Se non lo trova cosa succede?!?
Grazie a tutti per la disponibilità...
:D
Metti un return NULL; in fondo, prima dell'ultima parentesi... Ovviamente chi chiama la funzione deve controllare il valore ritornato...
sangueimpazzito
24-08-2004, 18:14
Ho provato, ma continua ad andarmi in segmentation fault...
:cry:
sangueimpazzito
25-08-2004, 10:06
Originariamente inviato da cionci
Metti un return NULL; in fondo, prima dell'ultima parentesi... Ovviamente chi chiama la funzione deve controllare il valore ritornato...
Sto diventando pazzo...
Chiamata della funzione:
POSIZIONE=*(ricerca(A, DIM)); // A=array, DIM=dimensione array
Funzione:
int * ricerca (int * A, int DIM)
{
for (int j=0; j<DIM; j++)
{
if ( A[j]==7 )
{
TROVATO=true;
return &A[j];
}
}
return NULL;
}
La variabile TROVATO è globale e mi serve nel main per dire in output se l'ha trovato o meno.
Se lo trova, tutto ok.
Se non lo trova, va in Segmentation fault (core dumped), immagino perchè provi a dereferenziare NULL.
Non mi vengono idee per come uscirne...
C'è qualcuno che può darmi una mano?!?
Grazie mille.
:cry:
ilsensine
25-08-2004, 10:38
int *pos = ricerca(...);
if(!pos) {
printf("Non trovato\n");
...
} else {
printf("trovato: %d\n", *pos);
...
}
sangueimpazzito
25-08-2004, 12:20
Originariamente inviato da ilsensine
int *pos = ricerca(...);
if(!pos) {
printf("Non trovato\n");
...
} else {
printf("trovato: %d\n", *pos);
...
}
Grazie mille della soluzione, ma devo per forza risolvere ritornando alla funzione principale il booleano TROVATO e l'eventuale posizione.
:cry:
ma a e' un puntatore, non e' una varialile che contiene qualcosa.
deve puntare ad un'area di memoria che contiene qualcosa.
ciao.
ilsensine
25-08-2004, 13:36
Originariamente inviato da sangueimpazzito
Grazie mille della soluzione, ma devo per forza risolvere ritornando alla funzione principale il booleano TROVATO e l'eventuale posizione.
:cry:
Ignoro il motivo per cui devi fare una simile cosa quando hai a disposizione una soluzione "pulita"; puoi risolvere il problema solo con qualche brutto hack, ad es:
int * ricerca (int * A, int DIM)
{
static int hick_hock_hack = -1;
for (int j=0; j<DIM; j++)
{
if ( A[j]==7 )
{
TROVATO=true;
return &A[j];
}
}
TROVATO=false;
return &hick_hock_hack;
}
nb IO quell'obrobrio non l'ho MAI scritto, ok? :D
Fenomeno85
25-08-2004, 13:56
Originariamente inviato da ilsensine
int * ricerca (int * A, int DIM)
scusate ma che significa questa dichiarazione della funzione, non le ho mai dichiarate con * :wtf:
~§~ Sempre E Solo Lei ~§~
ilsensine
25-08-2004, 14:00
cosa è "int *" in linguaggio c/c++? ;)
Fenomeno85
25-08-2004, 14:13
Originariamente inviato da ilsensine
cosa è "int *" in linguaggio c/c++? ;)
non serve x i puntatori??
~§~ Sempre E Solo Lei ~§~
ilsensine
25-08-2004, 14:16
Originariamente inviato da Fenomeno85
non serve x i puntatori??
...e quindi è una funzione che restituisce un puntatore.
Fenomeno85
25-08-2004, 14:20
Originariamente inviato da ilsensine
...e quindi è una funzione che restituisce un puntatore.
ah ... grazie :D
~§~ Sempre E Solo Lei ~§~
sangueimpazzito
25-08-2004, 14:39
Originariamente inviato da ilsensine
Ignoro il motivo per cui devi fare una simile cosa quando hai a disposizione una soluzione "pulita"
Grazie infinite dell'interessamento.
Vuoi il motivo?!?
Eccolo:
Implementare in C++ una funzione che ricevuti come parametri un array di interi e la sua dimensione, ricerchi all'interno dell'array un elemento di valore X.
La funzione, nel caso che lo trovi, deve restituire un booleano con valore true e la posizione in cui l'ha trovato.
Nel caso che non lo trovi, deve restituire il booleano con valore false.
:cry:
Infatti fa in questo modo... Ritorni NULL...cioè zero...che equivale a falso...
int *pos = ricerca(...);
if(!pos) {
printf("Non trovato\n");
...
} else {
printf("trovato: %d\n", *pos);
...
}
ilsensine
25-08-2004, 14:52
Originariamente inviato da sangueimpazzito
Implementare in C++ una funzione che ricevuti come parametri un array di interi e la sua dimensione, ricerchi all'interno dell'array un elemento di valore X.
La funzione, nel caso che lo trovi, deve restituire un booleano con valore true e la POSIZIONE in cui l'ha trovato.
La "posizione" non è altro che il valore della variabile "j" quando A[j]==7 :D
int ricerca (int * A, int DIM)
{
for (int j=0; j<DIM; j++)
{
if ( A[j]==7 )
{
TROVATO=true;
return j;
}
}
return -1;
}
ilsensine
25-08-2004, 14:56
Qualunque sia la soluzione, nota l'assoluta inutilità di restiruire il booleano "trovato" quando restituisci la "posizione". Restituisci semplicemente una "posizione impossibile" se l'elemento non è trovato.
Se proprio devi, almeno non usare una orrenda variabile globale.
sangueimpazzito
25-08-2004, 15:39
Originariamente inviato da ilsensine
La "posizione" non è altro che il valore della variabile "j" quando A[j]==7 :D
:doh:
Azz, è vero...
L'esercizio era più semplice di quello che pensassi.
int ricerca (int * A, int DIM)
{
for (int j=0; j<DIM; j++)
{
if ( A[j]==7 )
{
return j;
}
}
return NULL;
}
Però con il return NULL mi da un "warning"...
Pazienza! :asd:
Tralasciando l'inutile variabile booleana, se io volessi ritornare un puntatore all'elemento che ho appena trovato...
Originariamente inviato da ilsensine
int *pos = ricerca(...);
if(!pos) {
printf("Non trovato\n");
...
} else {
printf("trovato: %d\n", *pos);
...
}
Voi mi suggerite questo.
Scusatemi ma non l'ho capita...
:boh:
Ringrazio nuovamente tutti...
ilsensine
25-08-2004, 15:43
Originariamente inviato da sangueimpazzito
Però con il return NULL mi da un "warning"...
Pazienza! :asd:
Nessuna pazienza, è un BUG (viene castato in 0!)
Se la funzione ritorna "int", il valore da ritornare di default è "-1".
ilsensine
25-08-2004, 15:44
Originariamente inviato da sangueimpazzito
Tralasciando l'inutile variabile booleana, se io volessi ritornare un puntatore all'elemento che ho appena trovato...
Voi mi suggerite questo.
Scusatemi ma non l'ho capita...
:boh:
"se il puntatore pos è NULL, allora l'elemento non è trovato; altrimenti pos punta all'elemento trovato".
sangueimpazzito
25-08-2004, 16:49
Originariamente inviato da ilsensine
Nessuna pazienza, è un BUG (viene castato in 0!)
Se la funzione ritorna "int", il valore da ritornare di default è "-1".
Ok, ok...
Non lo faccio più.
:D
Originariamente inviato da ilsensine
"se il puntatore pos è NULL, allora l'elemento non è trovato; altrimenti pos punta all'elemento trovato".
Ora ho capito...
if(!pos) {
printf("Non trovato\n");
...
} else {
printf("trovato: %d\n", *pos);
...
}
Credevo che questo qui sopra fosse un pezzo della funzione...
Invece va nel main, vero?!?
:D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.