PDA

Visualizza la versione completa : [C] Strutture e puntatori


kapopadu
16-01-2011, 00:05
Ciao Ragazzi,

sono alle prime armi in C e i puntatori sono la mia bestia nera..
questo il quesito.

Ho una struttura definita globale in un file.h e nel main la includo con "include file.h" ed di questo tipo:



typedef struct{
int nmax;
int nsp;
double *p;
}data



Ora nel file file.c definisco una funzione di inizializzazione della mia struttura, per allocare spazio per p che un vettore di nmax elementi:



void init_struc(data *dat)
{
int nmax=dat->nmax;
dat->p=malloc((nmax)*sizeof(double*))
for(i=0;i<nmax;i++)
dat->p[i]=0
}

Nel main main.c devo utilizzare questa struttura. E Ho un pointer *q che deve assumere il valore del pointer dat->p. Non voglio utilizzare nel main sempre dat->p percio voglio nominarlo con un puntatore *q (questo quello che vorrei fare).

La domanda questa..come faccio a far puntare a q lo stesso indirizzo di dat->p?

ho provato con


q=&dat->p[0]
ma ho ottengo il classico segmentation fault.

Potete aiutarmi??

Grazie a tutti

simo_85
16-01-2011, 02:20
Originariamente inviato da kapopadu
ma ho ottengo il classico segmentation fault.
Potete aiutarmi??
Grazie a tutti
Non puoi dichiarare un puntatore in una struttura, questo vale sia per int, char etc..
Puoi bens fare una cosa del genere:


struct str
{
int a;
...
char s[100]:
}

...

int main(void)
{
struct str *p_struct;
...
}

Ci sono comunque molte documentazioni in rete riguardo a tutto ci, ti posto un link (http://www.taranets.net/cgi/ts/1.37/ts.ws.pl?w=329;b=282), nel cuale, se fai ben attenzione, c' anche la risposta alla tua domanda.
Buona lettura.
:ciauz:

lolide
16-01-2011, 03:24
Originariamente inviato da simo_85
Non puoi dichiarare un puntatore in una struttura, questo vale sia per int, char etc..


o.O certo che si pu


Originariamente inviato da kapopadu
Ciao Ragazzi,

sono alle prime armi in C e i puntatori sono la mia bestia nera..


Lo sono sempre all'inizio :)


Originariamente inviato da kapopadu
Ho una struttura definita globale in un file.h e nel main la includo con "include file.h" ed di questo tipo:



typedef struct{
int nmax;
int nsp;
double *p;
}data


Ora nel file file.c definisco una funzione di inizializzazione della mia struttura, per allocare spazio per p che un vettore di nmax elementi:



void init_struc(data *dat)
{
int nmax=dat->nmax;
dat->p=malloc((nmax)*sizeof(double*))
for(i=0;i<nmax;i++)
dat->p[i]=0
}


La prima domanda : nel main hai inizializzato anche il puntatore dat che passi alla funzione ? perch se non fosse accedere ad nmax darebbe segment fault.

a malloc passagli sizeof(double) non double*

Per il resto mancano un po' di punti e virgola ma il codice apposto anche se invece di inizializzare tutto a 0 con un for avresti potuto sostituire malloc() con calloc().


Originariamente inviato da kapopadu
Nel main main.c devo utilizzare questa struttura. E Ho un pointer *q che deve assumere il valore del pointer dat->p. Non voglio utilizzare nel main sempre dat->p percio voglio nominarlo con un puntatore *q (questo quello che vorrei fare).

La domanda questa..come faccio a far puntare a q lo stesso indirizzo di dat->p?

ho provato con


q=&dat->p[0]
ma ho ottengo il classico segmentation fault.

Potete aiutarmi??

Grazie a tutti

Probabilmente ti da Segmentation Fault per la cosa che t'ho detto prima, quindi che dat non allocato. Per farlo o dichiari data dat; e passi la reference alla funzione, oppure dichiari data *dat; e la allochi con malloc()

simo_85
16-01-2011, 06:36
Originariamente inviato da lolide
o.O certo che si pu

:facepalm:

GliderKite
16-01-2011, 11:39
Originariamente inviato da simo_85
Non puoi dichiarare un puntatore in una struttura, questo vale sia per int, char etc..



Cio?! :confused:



Allora per inizializzare la struttura che rappresenta il tipo della tua struttura dati di solito si fa cosi:




typedef struct
{
int nmax;
int nsp;
double *p;

} data;



/* Non ho idea di cosa rappresentino i campi della struttura
quindi per quello te la dovrai modificare te come desideri */
data * init_struc(const size_t size, const int nmax, const int nsp)
{
data *dataPtr = NULL; // Puntatore alla struttura

/* Per prima cosa allochi memoria dinamicamente per la
struttura e ti assicuri che l'allocazione sia riuscita */
dataPtr = (data *) malloc( sizeof(data) );

if( dataPtr != NULL )
{
// Allochi il tuo array di double
dataPtr->p = (double *) malloc( size * sizeof(double) );

if( dataPtr->p != NULL )
{
// Inizializzi gli altri membri della struttura
dataPtr->nmax = nmax;
dataPtr->nsp = nsp;

// Inizializzi a 0 gli elementi del vettore in modo decente
memeset( dataPtr->p, 0, size * sizeof(double) );


// Torni il puntatore alla struttura
return dataPtr;
}
}


return NULL; // Torna NULL in caso di errore
}



// E si user in questo modo
int main()
{
data *mydataPtr = NULL;

// Parametri puramente casuali
mydataPtr = init_struc( 100, 100, 5 );


//....

return 0;
}





ps: ricordati che la memoria allocata va rilasciata non appena non serve pi...



:ciauz:

kapopadu
16-01-2011, 11:45
si scusa avevo dimenticato di inserirlo...
dat lo definisco in questo modo nel main.c,



data *dat;
dat=(data *)malloc(sizeof(data));


Ma giusto farlo puntare a:


q=&dat->p[0]

Ovvero al primo elemento di 0 e non


q=&dat->p

?

GliderKite
16-01-2011, 11:54
Sono la stessa cosa:



double *q1 = &dat->p[0];
double *q2 = dat->p;

kapopadu
16-01-2011, 11:59
ciao scusami ma ho due domande sul tuo post

1) cosa
memeset ? sto lavorando in C

2) una volta che hai inizializzato la struttura in quel modo, tornando alla mia domanda iniziale come faccio a ad assegnare al mio generico puntatore che ho nel main *q gli stessi valori di data->p?

Grazieee gentilissimi tutti!!

GliderKite
16-01-2011, 12:05
Originariamente inviato da kapopadu
ciao scusami ma ho due domande sul tuo post

1) cosa
memeset ? sto lavorando in C

2) una volta che hai inizializzato la struttura in quel modo, tornando alla mia domanda iniziale come faccio a ad assegnare al mio generico puntatore che ho nel main *q gli stessi valori di data->p?

Grazieee gentilissimi tutti!!


1) E' memset, scrivendo codice in un semplice editor di testo qualche errore di ortografia pu scappare...

2) Dipende da cosa intendi: Se q punta a data->p per te hanno gli stessi valori? Vuoi un vettore di double parallelo con gli stesso valori di data->p? E quindi ti serve allocare ulteriore memoria? Spiegati meglio

kapopadu
16-01-2011, 12:28
forse dovro studiare di piu il C non l'ho mai utilizzata questa funzione :)

si vorrei in pratica un puntatore defininto nel main double *q che abbia lo stesso valore di dat->p. In pratica non mi voglio portare a presso nel main dat->p ed per questo dato che *p un puntatore ad un vettore di nmax elementi nel main voglio far puntare a *q allo stesso vettore di nmax elementi. Si puo fare?

Loading