|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2005
Città: Montecatini terme
Messaggi: 309
|
[C] comando return per un vettore di una funzione:
Ciao a tutti, anticipo che sarò grato a chi risponderà a questo quesito.
devo creare una funzione che prende un vettore come ingresso e me lo renda in uscita...la devo precare del tipo: long double xx (long double y[], long double z[]) { ..... la funzione fa i suoi conti e mi rende un vettore ex r[] ..... return??????; } come faccio a dare a return il comando che mi esporta il vettore??? il metto void all'inizio, ma ho bisogno di scriverla come se fosse uno scalare. qualcuno mi puoi aiutare? grazie.marco
__________________
Asus M2N-SLI DELUXE - Athlon 64 X2 4600+ - 2x1GB Corsair XMS2 PC6400 - ATI HD3650 - 2x250GB SATA2 RAID-0 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
return r;
Però devi stare attento. Se il vettore lo crei all'interno della funzione ad esempio con Codice:
long double r[10]; return r; quello che otterrai è che all'uscita della funzione il vettore , in quanto automatico, verrà distrutto e quindi alla funzione chiamante ritornerai un dangling pointer. Due modi di fare questa cosa sono o dare alla funzione un terzo vettore come parametro dove verrà contenuto il risultato dell'operazione ad esempio : Codice:
void funzione(long double x[], long double y[], long double r[])
{
............codice............
return;
}
Codice:
long double* funzione(long double x[], long double y[])
{
long double *r = (long double *) malloc(sizeof(long double) * 10);
........ codice .......
return r;
}
Fornendo un vettore alla funzione dove memorizzare il risultato come nel primo caso permette al chiamante di dare in pasto alla funzione un vettore automatico che quindi non necessita di deallocazione con free, ad esempio : Codice:
long double r[10]; funzione(x,y,r);
__________________
GPU Compiler Engineer |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: May 2005
Città: Montecatini terme
Messaggi: 309
|
ho risolto seguendo il tuo primo consiglio.
questo è un esempio Quote:
ho capito male o no? COMUNQUE GRAZIE
__________________
Asus M2N-SLI DELUXE - Athlon 64 X2 4600+ - 2x1GB Corsair XMS2 PC6400 - ATI HD3650 - 2x250GB SATA2 RAID-0 |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
quando chiami la funzioni crei un solo vettore "c" che usi sia come input sia come output con : xl(c,c); Guardando il codice della funzione sinceramente mi chiedo come questa funzione possa ritornare il valore che vuoi dato che cambi i valori di input durante il calcolo. Sei sicuro che è proprio quello che vuoi fare? Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2005
Città: Montecatini terme
Messaggi: 309
|
una volta eseguito il comando
xl(c,c) il vettore c è stato (modificato).giusto? è quello che mi serve alla fine, se mi voglio tenere poi anche l'oroginale mi faccio una copia prima e sono ok? dimmmi se sbaglio.
__________________
Asus M2N-SLI DELUXE - Athlon 64 X2 4600+ - 2x1GB Corsair XMS2 PC6400 - ATI HD3650 - 2x250GB SATA2 RAID-0 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Il problema è un altro.
Il codice della funzione è questo : void xl (long double g[], long double f[]) { f[0] = (g[0] + 0.5 * (g[1] - g[0] - g[2])); f[1] = (g[0] + 0.5 * (g[1] - g[0] + g[2])); f[2] = g[2]; } f e g sono LO STESSO vettore. Quando fai f[0] = XXXXX anche g[0] viene modificato perchè f e g puntano alla stessa cosa. Nella seconda espressione (f[1] = XXXX) usi anche g[0] che è stato modificato dalla prima espressione (f[0] = XXXXX). In pratica in questa espressione : f[1] = (g[0] + 0.5 * (g[1] - g[0] + g[2])); g[0] non è più 3 (come specificato nella definizione del vettore "c") , ma è il nuovo valore calcolato nella prima espressione. Questa non è NECESSARIAMENTE una cosa negativa se voluta. Il problema è che ho come l'impressione che questo non sia il caso. Non so se la spiegazione è chiara Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2005
Città: Montecatini terme
Messaggi: 309
|
la funzione serve a :
prendo g[] lo modifico restituisco g[]. solo che ho chiamato f[] = g[] ; se , per ex: g(3,9,1) f0=3+0.5(9-3-1)= -> f(0)=5.5 f1=3+0.5(9-3+1)= -> f(1)=6.5 f2=g2 -> f2=1; quindi se faccio g(3,9,1) xl(g) g(5.5,6.5,1) è questo quello che voglio fare!Quindi, presumo di farla in maniera errata.
__________________
Asus M2N-SLI DELUXE - Athlon 64 X2 4600+ - 2x1GB Corsair XMS2 PC6400 - ATI HD3650 - 2x250GB SATA2 RAID-0 |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: May 2005
Città: Montecatini terme
Messaggi: 309
|
Quote:
long double xl (long double a, long double b, long double set); long double xr (long double a, long double b, long double set); long double xl (long double a, long double b, long double set) { long double xl; xl = a + 0.5 (b - a - set); return xl; } long double xr (long double a, long double b, long double set) { long double xl; xr = a + 0.5 (b - a + set); return xr; }
__________________
Asus M2N-SLI DELUXE - Athlon 64 X2 4600+ - 2x1GB Corsair XMS2 PC6400 - ATI HD3650 - 2x250GB SATA2 RAID-0 |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Codice:
#include<stdio.h>
void xl (long double g[], long double f[]);
void xl (long double g[], long double f[]) {
f[0] = (g[0] + 0.5 * (g[1] - g[0] - g[2]));
f[1] = (g[0] + 0.5 * (g[1] - g[0] + g[2]));
f[2] = g[2];
return;
}
int main () {
long double c[3] = {3,9,1};
long double d[3] = {0.0, 0.0, 0.0};
int i;
xl(c,d);
for(i=0;i<3;++i)
printf("%Lf ",d[i]);
return(0);
}
__________________
GPU Compiler Engineer |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:54.



















