Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Strutture e puntatori

    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:

    codice:
    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:

    codice:
    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
    codice:
    q=&dat->p[0]
    ma ho ottengo il classico segmentation fault.

    Potete aiutarmi??

    Grazie a tutti

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466

    Re: Strutture e puntatori

    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:
    codice:
    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, nel cuale, se fai ben attenzione, c'è anche la risposta alla tua domanda.
    Buona lettura.

  3. #3

    Re: Strutture e puntatori

    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:

    codice:
    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:

    codice:
    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
    codice:
    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()

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466

    Re: Re: Strutture e puntatori

    Originariamente inviato da lolide
    o.O certo che si può

  5. #5

    Re: Re: Strutture e puntatori

    Originariamente inviato da simo_85
    Non puoi dichiarare un puntatore in una struttura, questo vale sia per int, char etc..

    Cioè?!



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



    codice:
    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ù...



    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  6. #6
    si scusa avevo dimenticato di inserirlo...
    dat lo definisco in questo modo nel main.c,

    codice:
    data *dat; 
    dat=(data *)malloc(sizeof(data));
    Ma è giusto farlo puntare a:
    codice:
    q=&dat->p[0]
    Ovvero al primo elemento di 0 e non
    codice:
    q=&dat->p
    ?

  7. #7
    Sono la stessa cosa:

    codice:
    double *q1 = &dat->p[0];
    double *q2 = dat->p;
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  8. #8
    ciao scusami ma ho due domande sul tuo post

    1) cosa è
    codice:
    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!!

  9. #9
    Originariamente inviato da kapopadu
    ciao scusami ma ho due domande sul tuo post

    1) cosa è
    codice:
    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
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  10. #10
    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?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.