PDA

View Full Version : [C] richiamare in main un valore in funzione void


J3X
17-02-2008, 10:39
salve a tutti,,,
poniamo il caso che in una funzione void ci sia un calcolo... (una espressione, il calcolo dell'epsilon macchina, qualcosa che dia un numero...)
è possibile in qualche modo che nel main() riesca ad estrarre quel numero che mi interessa e stamparlo magari col printf ?

esempio...
questa dovrebbe essere la funzione dell'epsilon...


float eps,f1,f2;

f1=1.0;
while(f2!=1)
{
eps=f1;
f1=f1/2.0;
f2=f1+1.0;
}
printf("Epsilon Macchina: %e \n", eps);
/* il valore che mi interessa è eps */


inutile dirmi che sarebbe più semplice dichiararla float o double o scriverla direttamente in main,,, ma come posso scriverla void e richiamarla in main?:confused: :muro:

grazie :sperem:

cionci
17-02-2008, 10:53
E' possibile, ma devi passare un parametro come puntatore alla funzione. Ad esempio:

float epsilon;
miafunzione(&epsilon);

e poi lo stampi. La funzione resta void, ma operi sul puntatore per ritornare il valore al chiamante.

La funzione diventa:

void miafunzione(float *eps)
{
float f1,f2;

f1=1.0;
while(f2!=1)
{
*eps=f1;
f1=f1/2.0;
f2=f1+1.0;
}
}

J3X
17-02-2008, 11:07
grazie :D
ok... fin qui più o meno c'ero arrivato (girando su internet... :stordita: ) ma con i puntatori non sono ancora molto abile :stordita:

quindi dandomele col cucchiaino queste cose... prima del main ci metto il prototipo
void miafunzione(float *eps)

poi nel main? per stampare il valore che vado a scrivere?

#include <stdio.h>
void miafunzione(float *eps);
main()
{
printf (valore epsilon: %e, /* ??? */ );
}


scusa la gnoransa... ma sto agli inizi :fagiano:

cionci
17-02-2008, 11:24
grazie :D
ok... fin qui più o meno c'ero arrivato (girando su internet... :stordita: ) ma con i puntatori non sono ancora molto abile :stordita:

quindi dandomele col cucchiaino queste cose... prima del main ci metto il prototipo
void miafunzione(float *eps)

poi nel main? per stampare il valore che vado a scrivere?

#include <stdio.h>
void miafunzione(float *eps);
main()
{
printf (valore epsilon: %e, /* ??? */ );
}


scusa la gnoransa... ma sto agli inizi :fagiano:
Te l'avevo scritto ;)


main()
{
float epsilon;
miafunzione(&epsilon);
printf ("valore epsilon: %e", epsilon);
}

slartibartfast
17-02-2008, 11:30
devi passare il parametro come indirizzo, nel tuo esempio:#include <stdio.h>
void miafunzione(float *eps);
main()
{
float e = 1.0;
miafunzione (&e);
printf ("valore epsilon: %e", e);
}

void miafunzione(float *eps)
{
float f1,f2;

f1=*eps;
while(f2!=1)
{
*eps=f1;
f1=f1/2.0;
f2=f1+1.0;
}
}

J3X
17-02-2008, 11:43
ora provo...
grazie 1000 a tutti :D

J3X
17-02-2008, 23:29
ragazzi... per prima tutto ok e vi ringrazio ancora :)

ora c'è un altro problemino...

in pratica l'ordinamento INSERTION SORT fatto sempre come void(...) pure dovrei farlo funzionare chiamandolo dal main() con un output del tipo...

quanti numeri vuoi inserire?
3
inserisci i 3 numeri:
20 -5 12
la lista ordinata è: -5 12 20


il fatto è che non so nemmeno quale sia l'insertion sort corretto...
se questo http://it.wikipedia.org/wiki/Insertion_sort#C
questo: http://www.mat.uniroma3.it/users/liverani/IN1/insertion_sort.shtml
o un altro... :muro: :cry:

ho fatto qualcosa ricollegandomi alla tecnica di prima... ma sono andato un pò per tentativi e sinceramente mi vergogno pure di postarlo... :stordita:

:help: ve ne sarò grato! :help:

k0nt3
18-02-2008, 00:49
il fatto è che non so nemmeno quale sia l'insertion sort corretto...
se questo http://it.wikipedia.org/wiki/Insertion_sort#C
questo: http://www.mat.uniroma3.it/users/liverani/IN1/insertion_sort.shtml
o un altro... :muro: :cry:

in realtà fanno proprio la stessa cosa tutte e due :D

ho fatto qualcosa ricollegandomi alla tecnica di prima... ma sono andato un pò per tentativi e sinceramente mi vergogno pure di postarlo... :stordita:

:help: ve ne sarò grato! :help:
mai vergognarsi :read: posta che verrai aiutato ;) altrimenti non possiamo capire dove sbagli

J3X
18-02-2008, 09:18
mai vergognarsi :read: posta che verrai aiutato ;) altrimenti non possiamo capire dove sbagli
ok... :( ma non mi linciate :stordita:
mi sono usciti questi orrori... il risultato finale è questo che ovviamente non funziona... piccole modifiche o da rifare tutto? :muro:

#include <stdlib.h>
#include <stdio.h>

#define MAX 100


void insertion_sort(int x[], int n);


int main()
{
int v, i, x[i], n;
/*lettura*/
printf("Numero di elementi: ");
scanf("%d", &n);
printf("Inserisci %d elementi: \n", n);
for (i=0; i<n; i++)
scanf("%d", &x[i]);


/*chiamata insertionsort*/
insertion_sort(&x, n);


/*stampa*/
for (i=0; i<n; i++)
printf("%d ", x[i]);
printf("\n");


}/*__fine main()__*/





void insertion_sort(int x[], int n)
{
int i, j, app;

for (i=1; i<n; i++) {
app = x[i];
j = i-1;
while (j>=0 && x[j]>app) {
x[j+1] = x[j];
j--;
}
x[j+1] = app;
}

}

e quest'altro.....

#include <stdio.h>
#include <stdlib.h>


void InsertionSort(int *x[], int n);


main()
{
int i, x[i], n;



printf("numero elementi da inserire: ");
scanf ("%d", &n);



printf("\ninserire gli elementi (max %d):\n", n);
for (i=0; i<n; i++)
scanf("%d", &x[i]);

InsertionSort(&x[], n);

printf ("Lista ordinata con InsertionSort: \n");

for (i=0; i<n; i++)
{
printf ("%d ", x[i]);
}

}/*__fine main()__*/



void InsertionSort(int *x[], int n)
{
int i, a[i], j, app;

for (i = 1; i < n; i++)
{
app = a[i];
for (j = i - 1; (j >= 0) && (a[j] > app); j--)
{
x[j+1] = x[j];
}
a[j + 1] = app;
}
for (i=0; i=n; i++)
*x[i]=a[i] ;

}



come modifico quello che più si avvicina al funzionante? :muro:
:help:

cionci
18-02-2008, 09:39
Questo non si può fare: int v, i, x[i], n;
insertion_sort(&x, n);

La chiamata è errata.

J3X: ci sono una marea di errori. Difficile correggere, credo che tu faccia prima a studiarti il tutto ;)
Se chiedi in ingresso il numero di elementi devi fare l'allocazione dinamica del vettore.

J3X
18-02-2008, 09:45
:stordita:
quelli che vedi su sono il risultato di tentativi.... sono partito con cose un pò più logiche, poi dove mi dava errori rattoppavo :(
mi diceva che in x[] non era dichiarata la grandezza... quindi ho messo x[i], ma non era dichiarato i, e quindi l'ho messo prima e tutto ok:D

per allocazione dinamica intendi malloc? tipo
A=(int*)malloc(sizeof(int)*n);
ma dove lo vado a posizionare e come lo collego?
ho provato qualcosa pure con questo ma non mi è uscito granchè...

come posso fare per richiamare l'insertion sort nel main?
:mc:

cionci
18-02-2008, 09:52
La firma della funzione insertion sort deve essere questa.

void InsertionSort(int *x, int n);

x è un vettore allocato dinamicamente e lo usi come un vettore normale.

J3X
18-02-2008, 10:08
quindi nel secondo codice che ho scritto prima dovrei mettere il prototipo come hai scritto tu...
però nel main mi esce sempre che per x[] -array size missing in `x'-
ma esistono degli esempi già fatti e me li studio da lì... perchè mi servirebbe sapere come si fa per capirlo...
con le funzioni prima ho fatto pure altri esercizi e si sono trovati :)
questo lo so che è più complicato e mi servirebbe vederlo... :sperem:

cionci
18-02-2008, 10:12
però nel main mi esce sempre che per x[] -array size missing in `x'-
Te l'ho detto, non si può dichiarare così, con i incognito.

O fai:

int *x;

x = (int *)malloc(sizeof(int) * n); //solo dopo che hai già preso in input n

o fai:


int x[10]; //e non prendi in input n, ma ti limiti a 10 elementi

J3X
18-02-2008, 10:19
benissimo... grazie :D
ho scritto questo... nessun errore al compilatore... :)
ma mi riscrive i numeri così come li ho messi...:mbe:
#include <stdio.h>
#include <stdlib.h>



void InsertionSort(int *x, int n);


main()
{
int *x, i, n;



printf("numero elementi da inserire: ");
scanf ("%d", &n);

x=(int*)malloc(sizeof(int)*n);

printf("\ninserire gli elementi (max %d):\n", n);
for (i=0; i<n; i++)
scanf("%d", &x[i]);

InsertionSort(&x[0], n);

printf ("Lista ordinata con InsertionSort: \n");

for (i=0; i<n; i++)
{
printf ("%d ", x[i]);
}

}/*__fine main()__*/


void InsertionSort(int *x, int n)
{
int i, a[i], j, app;

for (i = 1; i < n; i++)
{
app = a[i];
for (j = i - 1; (j >= 0) && (a[j] > app); j--)
{
x[j+1] = x[j];
}
a[j + 1] = app;
}

}

J3X
18-02-2008, 10:37
ma che de....pravato :doh:
nei fasulli tentativi ho modificato il sacro codice dell'insertion sort di wikipedia.. e rimettendolo preciso preciso ora si trova :yeah:
#include <stdio.h>
#include <stdlib.h>



void InsertionSort(int *x, int n);


main()
{
int *x, i, n;



printf("numero elementi da inserire: ");
scanf ("%d", &n);

x=(int*)malloc(sizeof(int)*n);

printf("\ninserire gli elementi (max %d):\n", n);
for (i=0; i<n; i++)
scanf("%d", &x[i]);

InsertionSort(&x[0], n);

printf ("Lista ordinata con InsertionSort: \n");

for (i=0; i<n; i++)
{
printf ("%d ", x[i]);
}

}/*__fine main()__*/


void InsertionSort(int *x, int n)
{
int i, j, app;

for (i = 1; i < n; i++)
{
app = x[i];

for (j = i - 1; (j >= 0) && (x[j] > app); j--)
{
x[j+1] = x[j];
}

x[j + 1] = app;
}



}


grazie un milione !!!!! :sofico:
ora me lo studio e faccio anche altri esempi con array e allocazione dinamica :yeah:

grazieeeeeeeeeeeeeeeeeeeeeeeeeeee

cionci
18-02-2008, 10:47
Questo:

InsertionSort(&x[0], n);

equivale a questo:

InsertionSort(x, n);

J3X
18-02-2008, 10:57
Questo:

InsertionSort(&x[0], n);

equivale a questo:

InsertionSort(x, n);

mmmhhh.. meglio :D

J3X
18-02-2008, 11:37
una info...
ma nell'algoritmo insertionsort... "app" che ruolo svolge?:confused: variabile di appoggio?
:stordita:

cionci
18-02-2008, 11:38
Sì, una variabile dove mettere temporaneamente un elemento.

J3X
18-02-2008, 11:45
ah ok, grazie ancora :)