Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] - Puntatore a puntatore a carattere

    Ciao a tutti volevo chiedervi una mano su come sostituire un pezzo di codice di una funzione che ho fatto e che funziona ma non è come mi è stata richiesta. Probabilmente le modifiche da fare saranno poche solo che mi sto incasinando non poco con questi puntatori!

    Ho una struttura dati di questo tipo:

    codice:
    struct struttura2
    {
    char buf_rx[LENBUF1];
    int conta_rx;
    int flag_rx;
    };
    struct struttura2 srx1,srx2;
    buf_rx è un buffer di ricezione dove vengono salvati i caratteri ricevuti dalla Rs232
    conta_rx è il numero di caratteri ricevuti
    flag_rx è una variabile di flag che mi serve per varie operazioni

    e due variabili
    codice:
    char *punta;
    int lunghezza;
    In interrupt (sto usando un PIC18F452 col C18) ricevo i caratteri e li salvo uno ad uno nel buffer attivo (sono due i buffer che si alternano). Con la funzione Get_Ricevistringa devo "rendere disponibile" questo contenuto ad altre funzioni.

    La funzione che ho implementato è la seguente:

    codice:
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //Funzione per l'acquisizione della stringa ricevuta
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    int Get_Ricevistringa (void)
    {
    	int esito=0;
    
    	switch	(buf_write)							//se l'ultimo buffer scritto è il primo
    	{
    		case 1:
    			if((srx1.flag_rx & 0b00000010)==0b00000010)		// se il flag di contenuto ok del buffer 1 è settato
    			{
    				punta=&srx1.buf_rx[0];			//associo al puntatore il puntatore al buffer 1
    				lunghezza=srx1.conta_rx;			//con la relativa lunghezza della stringa
    				buf_read=1;					//segnalo che l'ultima stringa letta è sul buffer 1
    				esito=1;					//e ritorno con 1
    			}
    			break;
    
    		case 2:
    			if((srx2.flag_rx & 0b00000010)==0b00000010)		// se il flag di contenuto ok del buffer 2 è settato
    			{
    				punta=&srx2.buf_rx[0];			//associo al puntatore il puntatore al buffer 2
    				lunghezza=srx2.conta_rx;			//con la relativa lunghezza della stringa
    				buf_read=2;					//segnalo che l'ultima stringa letta è sul buffer 2
    				esito=1;					//e ritorno con 1
    			}
    			break;
    	}
    	
    	return esito;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Questo funziona bene ma il problema è che la funzione che mi veniva richiesta doveva essere:

    int Get_Ricevistringa(char **punt, int * lung)

    Non capisco cosa e come dovrei modificare il codice. Come dovrei effettuare poi la chiamata a funzione?

    Grazie mille in anticipo!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Dovresti anche dire perché ti erano stati richiesti quei due argomenti e a cosa si riferiscono.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Quello che ho fatto nella mia funzione è:

    una volta che ho scritto in uno dei due buffer (ed ho premuto invio, fatto da una funzione diversa ma non ci interessa) copio il contenuto del buffer in un terzo array di caratteri globale e copio in una variabile intera la lunghezza della stringa ricevuta.

    Quello che dovrebbe fare la funzione invece è salvare in un puntatore a puntatore a carattere l'indirizzo del puntatore che punta al buffer di ricezione e salvare in un puntatore ad intero l'indirizzo della variabile conta_rx della struttura srx1 / srx2.

    In questo modo ogni volta che ricevo una stringa sul buffer 1 mentre con i due puntatori gestisco il primo buffer (ed uso la stringa ricevuta) posso mettere nel buffer 2 un'altra stringa. Al prossimo giro i puntatori faranno riferimento al buffer 2 e il buffer 1 sarà pronto per un'altra scrittura.

    Solo che non so come fare nè nel codice della funzione nè nella sua chiamata.

  4. #4
    In ogni caso, al di là delle varie funzionalità, quello che chiedo è semplice in linea teorica ma non capisco bene come tradurlo in codice.

    Supponiamo che io abbia:


    codice:
    srx1.buf_rx="Ciao□"; //con □ = INVIO
    srx1.conta_rx=5;

    le mie due variabili sono:

    codice:
    char **punta;
    int *lunghezza;
    La funzione dovrebbe essere chiamata così:

    codice:
    Get_Ricevistringa(punta,lunghezza)
    e quello che deve fare è:

    codice:
    srx1.buf_rx
    è un vettore di caratteri quindi
    codice:
    srx1.buf_rx[]
    o equivalentemente
    codice:
    &srx1.buf_rx[0]
    sono l'indirizzo di memoria del primo elemento del vettore di caratteri (ossia della stringa), cioè sono il puntatore che punta proprio al primo elemento della stringa. Quello che faccio io è esportare questo puntatore ed usarlo in altre funzioni.

    Per qualche ragione però non è quello che la consegna mi richiede. La consegna vuole che io esporti punta che è un puntatore a puntatore. Quello che devo fare è associare a punta l'indirizzo del puntatore al puntatore alla stringa (ossia punta deve contenere l'ndirizzo a cui si trova il puntatore il cui contenuto è &srx1.buf_rx[0])

    Per lunghezza invece di fare
    codice:
    lunghezza=srx1.conta_rx
    credo che forse basti fare
    codice:
    *lunghezza=&srx1.conta_rx
    in modo da esportare il puntatore all'intero conta_rx della struttura srx1 ma anche qui ho alcuni dubbi se sto utilizzando correttamente l'operatore di deferenziazione *.

  5. #5
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    codice:
    *lunghezza=&srx1.conta_rx
    lunghezza è un puntatore ad intero, deferenziandolo stai cambiando il suo valore.
    conta_rx è un intero, applicando l' operatore & ottieni un puntatore ad intero.
    Se vuoi far puntare lunghezza all' intero non devi deferenziarlo:

    codice:
    lunghezza=&srx1.conta_rx
    Ora ogni volta che leggi *lunghezza stai leggendo lo stesso valore di srx1.conta_rx.

  6. #6
    Grazie mille. Per quanto riguarda l'altra parte della domanda invece?

  7. #7
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Per il "non so come fare" non saprei come aiutarti, puoi fare una domanda specifica?

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 © 2025 vBulletin Solutions, Inc. All rights reserved.