PDA

View Full Version : [C] Reference di Puntatori?


DarkRevenge
09-05-2005, 23:56
Ciao a tutti!! Questo è il mio primo messaggio su questo forum.

Ho un piccolo problema in un mio listato in C. Cercherò di esporlo al meglio (anche se non è facilissimo per me :( ).

Allora... nella funzione main() ho dichiarato 2 puntatori a double:

double *punt1, *punt2;

questi puntatori dovranno puntare a due zone di memoria (array) allocate tramite malloc(). L'allocamento di entrambe le zone deve però avvenire in un'unica funzione esterna alla main, per questo entrambi i puntatori dovranno essere passati alla funzione come parametri. In seguito, nella funzione main dovrò poter accedere a queste zone di memoria tramite i due puntatori punt1 e punt2. Questa è quella che dovrebbe essere la struttura del mio problema:



void funz(... p1, ... p2);

int main()
{
double *punt1, *punt2;

/* operazioni del main */

funz(...punt1, ...punt2);

/* operazioni con i puntatori punt1, punt2 */

free(punt1);
free(punt2);

return 0;
}

void funz(... p1, ... p2)
{
p1 = malloc(...);
p2 = malloc(...);
/* altre operazioni che utilizzano p1 e p2 */
}



Il mio problema è: come devo passare i puntatori alla funzione e come devo usarli all'interno di essa, in modo che possano poi essere usati i puntatori dichiarati nel main per accedere alle stesse zone allocate nella funzione?

Spero di essere stato abbastanza chiaro... :muro: :muro:

cionci
10-05-2005, 00:34
Devi passare il puntatore al puntatore...

void funz(double **p1, double **p2)
{
*p1 = (double *)malloc(sizeof(double)*N1);
*p2 = (double *)malloc(sizeof(double)*N2);
}


Ti spiego meglio...


double *p; /*è il puntatore al vettore all'inizio del vettore*/
double **pp; /*contiene il puntatore alla variabile p*/

facendo un cambio di tipo:

typedef double * vettore;
vettore p;
vetore *p;

void funz(vettore *p1, vettore*p2)
{
*p1 = (vettore)malloc(sizeof(double)*N1);
/*Avendo passato i puntatori in questo modo andrò a cambiare il valore delle
variabili puntate da p1 con il valore ritornato da malloc*/
*p2 = (vettore)malloc(sizeof(double)*N2);
}

DarkRevenge
10-05-2005, 15:27
Grazie mille... sei stato chiarissimo ;)

DarkRevenge
10-05-2005, 18:14
Altro problemino :p

Strutturando il problema come tu hai suggerito, come posso, nella funzione funz, leggere i valori da porre nella zona di memoria utilizzando la scanf?

Ad esempio, ho questo codice:


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

typedef double* vettore;

void funz(vettore *p1);

int main()
{
vettore punt1;
funz(&punt1);
free(punt1);

return 0;
}

void funz(vettore *p1)
{
int i;

*p1 = (vettore)malloc(sizeof(double)*6);
for(i=0; i<5; i++)
// lettura dei valori mediante scanf
}


Potreste dirmi cosa mettere al posto del commento? :help: :help: :help: :help:

cionci
10-05-2005, 18:28
La typedef era solo epr farti capire meglio...in realtà non è necessaria...anzi personalmente mi sembrerebbe tutto più chiaro senza...

void funz(vettore *p1)
{
int i;

*p1 = (vettore)malloc(sizeof(double)*6);
for(i=0; i<5; i++)
scanf("%f", &(*p1[i])); /* oppure (*p1)+i */
}