View Full Version : [C] richiamare in main un valore in funzione void
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:
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;
}
}
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:
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;
}
}
ora provo...
grazie 1000 a tutti :D
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:
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
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:
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.
: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:
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.
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:
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
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;
}
}
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
Questo:
InsertionSort(&x[0], n);
equivale a questo:
InsertionSort(x, n);
Questo:
InsertionSort(&x[0], n);
equivale a questo:
InsertionSort(x, n);
mmmhhh.. meglio :D
una info...
ma nell'algoritmo insertionsort... "app" che ruolo svolge?:confused: variabile di appoggio?
:stordita:
Sì, una variabile dove mettere temporaneamente un elemento.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.