problema c

pulp_fortune

Utente Attivo
60
0
:help:

Ho un problema con un programma C, praticamente non riesco a far ritornare un array da una funzione. In pratica devo fare una funzione che prenda un array 20 valori, che ho definito nel main attraverso randmax, li elabora attraverso un algoritmo e li mette in un nuovo array. Ecco! qui è il punto..come faccio a far ritornare questa funzione con questo array "finale"?

:help:
 

Mr Storm

Utente Attivo
77
19
CPU
Intel Core i5 750
Scheda Madre
Asus P7P55D Deluxe
HDD
500 GB
RAM
Corsair 8GB DDR3 1600 MHz
GPU
Sapphire HD5850
Monitor
Asus VK222H 22"
PSU
OCZ ModXstream Pro 700W
OS
Windows 7 Professional x64
Per far restituire un vettore ad una funzione, devi fare uso dell'allocazione dinamica della memoria, mediante le funzioni malloc e free; la prima serve per allocare nello heap uno spazio di memoria di dimensione pari a quello che passerai come parametro, la seconda serve per liberare questo spazio, una volta che non ne avrai più bisogno (se non lo fai, lo spazio rimane allocato per tutta l'esecuzione del programma).

Suppongo tu stia lavorando su interi; la tua funzione dovrà essere qualcosa del genere:

Codice:
int* funzione(int[] array) {
  /* Riserva in memoria lo spazio per un array di 20 interi */
  int* arrayHeap = (int*) malloc(sizeof(int) * 20);
  < fai fare alla funzione quello che deve fare >
  /* Ritorna l'array creato */
  return arrayHeap;
}

Lo stesso risultato NON avresti potuto ottenerlo in questo modo:

Codice:
int* funzione(int[] array) {
  int arrayDaRitornare[20];
  < fai fare alla funzione quello che deve fare >
  return arrayDaRitornare;
}

poiché arrayDaRitornare è una variabile locale e, in quanto tale, al termine dell'esecuzione della funzione, viene rimosso dalla memoria stack, assieme a tutte le altre variabili locali eventualmente dichiarate. L'ultima istruzione, infatti, ritorna un indirizzo alla prima posizione di un array non più esistente, con possibili errori in tempo di esecuzione se provassi a usare tale valore. Con la memoria heap, invece, il tempo di vita delle variabili è deciso dal programmatore.

Per maggiori informazioni, ti consiglio di cercare su un qualche motore di ricerca "allocazione dinamica della memoria". Ciao :)
 
  • Mi piace
Reazioni: pulp_fortune

pulp_fortune

Utente Attivo
60
0
altro problema!!! :D posso dare come argomento della funzione log(x) un vettore? ovvero

for(i=0;i<20;i++)
{ lgn= log(v+1);
}

mi dice, undefined reference to log
 

Mr Storm

Utente Attivo
77
19
CPU
Intel Core i5 750
Scheda Madre
Asus P7P55D Deluxe
HDD
500 GB
RAM
Corsair 8GB DDR3 1600 MHz
GPU
Sapphire HD5850
Monitor
Asus VK222H 22"
PSU
OCZ ModXstream Pro 700W
OS
Windows 7 Professional x64
Hai incluso la libreria math.h?
 

pulp_fortune

Utente Attivo
60
0
si anche dichiarato tutto

EDIT: il bello è che se metto nella funzione log un numero allora lo calcola, il problema è proprio passargli l'array
 

Mr Storm

Utente Attivo
77
19
CPU
Intel Core i5 750
Scheda Madre
Asus P7P55D Deluxe
HDD
500 GB
RAM
Corsair 8GB DDR3 1600 MHz
GPU
Sapphire HD5850
Monitor
Asus VK222H 22"
PSU
OCZ ModXstream Pro 700W
OS
Windows 7 Professional x64
Mmmmh, prova ad aggiungere l'opzione -lm quando compili; ad esempio, se usi gcc, in questo modo:

Codice:
  gcc -lm nomeFile.c
 

Mr Storm

Utente Attivo
77
19
CPU
Intel Core i5 750
Scheda Madre
Asus P7P55D Deluxe
HDD
500 GB
RAM
Corsair 8GB DDR3 1600 MHz
GPU
Sapphire HD5850
Monitor
Asus VK222H 22"
PSU
OCZ ModXstream Pro 700W
OS
Windows 7 Professional x64
Emacs è l'editor, io mi riferivo al compilatore; se lavori in Linux, quasi sicuramente stai usando gcc :)
 

pulp_fortune

Utente Attivo
60
0
niente come non detto...mi calcola male il logaritmo del vettore, ho fatto una prova con la calcolatrice ma niente. Ti scrivo qui cosa deve fare il programma e cosa ho fatto io..

La funzione ln(1+x) si può sviluppare in serie nell'intervallo aperto (-1 1), secondo la formula ln(1+x)=x-(x^2)/2+(x^3)/3-(x^4)/4+...
Il compito consiste nel calcolare il valore approssimato della funzione con i primi 4 termini della serie per valori di x generati casualmente e confrontarli con il valore esatto di ln(1+x).
più in dettaglio scrivere un programma che:
1) Stampi sullo schermo una breve descrizione di cosa farà il programma;
2) usi una funzione che accetta in ingresso il valore di x, applica la formula x-(x^2)/2+(x^3)/3-x^4/4 e restituisce il valore approssimato di ln(1+x)
3)chiami ripetutamente la funzione del punto 2 all'interno di un ciclo in cui viene estratto il valore di x compreso tra -1 e 1esclusi gli estremi;
4) in ogni iterazione, dopo aver chiamato la funzione , calcoli la differenza tra il lvalore esatto ln(1+x), usando la funzione matematica log, e il valore approssimato calcolato alla funzione e memorizzi la differenza calcolata in un array.
5) scriva l'array delle differenze in un file nome diff.dat. La scrittura deve avvenire chiamando una funzione di tipo void che accetta in ingresso l'array suddetto.


Ecco fatto, nel file come prova facevo stampare anche i numeri random, la funzione approssimata e il log.:)
 

Mr Storm

Utente Attivo
77
19
CPU
Intel Core i5 750
Scheda Madre
Asus P7P55D Deluxe
HDD
500 GB
RAM
Corsair 8GB DDR3 1600 MHz
GPU
Sapphire HD5850
Monitor
Asus VK222H 22"
PSU
OCZ ModXstream Pro 700W
OS
Windows 7 Professional x64
Uhm... che problema hai? Per quanto vedo io, la funzione log va bene, esegue correttamente il calcolo (chiaramente il valore approssimato, in certi casi, è abbastanza approssimato... ma non dipende da te) :)

Compila tutto correttamente da te? Io ho usato il comando
Codice:
gcc -lm -o esame1 esame1.c
da terminale, nella directory dove si trova il file (su s.o. linux)

PS: se la funzione ha tipo di ritorno void, non è necessario che metti il return come ultima istruzione ;)
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili