PDA

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

cionci
24-08-2004, 17:17
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:

x110
25-08-2004, 12:53
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:

cionci
25-08-2004, 14:44
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