Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Struct C , cosa possono e cosa non posso fare.

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Struct C , cosa possono e cosa non posso fare.

Messaggioda Foto UtenteMarcRider » 11 set 2013, 19:20

Codice: Seleziona tutto
struct StrutturaPorte PorteInUso ;
   PorteInUso =  Port_mapping(PORTBbits.RB7,PORTBbits.RB6,PORTBbits.RB5,PORTBbits.RB4,PORTBbits.RB3,PORTBbits.RB2,PORTBbits.RB1,PORTBbits.RB0,PORTCbits.RC7,PORTCbits.RC6,PORTCbits.RC5);



dove..

Codice: Seleziona tutto
struct StrutturaPorte
{
    unsigned char Porta7;
    unsigned char Porta6;
    unsigned char Porta5;
    unsigned char Porta4;
    unsigned char Porta3;
    unsigned char Porta2;
    unsigned char Porta1;
    unsigned char Porta0;
    unsigned char PortaEn;
    unsigned char PortaRS;
    unsigned char PortaRW;
};




struct StrutturaPorte Port_mapping(unsigned char p7,unsigned char p6, unsigned char p5, unsigned char p4, unsigned char p3, unsigned char p2, unsigned char p1, unsigned char p0, unsigned char pEn, unsigned char pRS, unsigned char pRW)
{
    struct StrutturaPorte strutturaporte;

    strutturaporte.Porta0 = p0;
    strutturaporte.Porta1 = p1;
    strutturaporte.Porta2 = p2;
    strutturaporte.Porta3 = p3;
    strutturaporte.Porta4 = p4;
    strutturaporte.Porta5 = p5;
    strutturaporte.Porta6 = p6;
    strutturaporte.Porta7 = p7;
    strutturaporte.PortaEn = pEn;
    strutturaporte.PortaRS = pRS;
    strutturaporte.PortaRW = pRW;
   
    return strutturaporte;

}


Mi dice errore : make: *** [.build-impl] Error 2
C:\Users\Max\Documents\PIC_FIRMWARES\MplabXTest\LCD_ST7066U_TESTING.X\Main.c:20:Error: syntax error
make[2]: Leaving directory `C:/Users/Max/Documents/PIC_FIRMWARES/MplabXTest/LCD_ST7066U_TESTING.X'
make[1]: Leaving directory `C:/Users/Max/Documents/PIC_FIRMWARES/MplabXTest/LCD_ST7066U_TESTING.X'


Non capisco come recuperare il vettore StrutturaPorte dalla funzione.
Sbaglio sintassi o concetto?
Ammetto che di C, non sono super afferrato, ma ho provato a realizzare due vettori uguali, inizializzarne uno, e copiarlo dentro ad un altro. ha funzionato... quindi perché non posso copiare il risultato della funzione dentro al mio vettore che ha lo stesso padre?
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37

3
voti

[2] Re: Struct C , cosa possono e cosa non posso fare.

Messaggioda Foto UtenteDirtyDeeds » 11 set 2013, 19:33

Xamar ha scritto:C:\Users\Max\Documents\PIC_FIRMWARES\MplabXTest\LCD_ST7066U_TESTING.X\Main.c:20:Error: syntax error


Non sapendo noi dov'è la tua riga 20 è un po' difficile fare una diagnosi. Comunque la tua funzione Port_mapping mi sembra veramente inutile, usa un inizializzatore. Se poi il tuo compilatore supporta almeno lo standard C99, puoi usare i designated initializer:

Codice: Seleziona tutto
struct StrutturaPorte PorteInUso = {
    .Porta7 = PORTBbits.RB7,
    .Porta6 = PORTBbits.RB6,
    .Porta5 = PORTBbits.RB5,

    // Eccetera...

};
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[3] Re: Struct C , cosa possono e cosa non posso fare.

Messaggioda Foto UtenteMarcRider » 11 set 2013, 19:59

Il codice che mi hai riportato non è altro che una struttura normale.

Ho un problema in corso, ed ho già aperto un altro post.
Ho realizzato una libreria, ed ho definito alcune porte opzionali.
Il mio problema è che quando vado a ridefinire queste porte del PIC, tutte le funzioni della libreria continuano ad usare la porta opzionale come se non vedessero la nuova definizione.

Per chiarirci meglio, sulla libreria ho per esempio:

#ifndef Porta
#define Porta_HL PORTBbits.RB0
...
#endif

...
Ora andando ad usare la lib. metti che non voglio Porta_HL come rb0 ma come RB7.
Creo un file header, o anche sul main ridefinisco #define Porta_HL ...RB7

Se ho capito bene, questi preprocessi vengono controllati dal compilatore, che per ogni ifndef controlla se c'è già una dichiarazione, in caso contrario usa la definizione dichiarata.
Bene, tutte le funzioni che usano Porta_HL continuano ad usare la definizione standard, mentre se io uso la definizione nel codice sorgente del progetto in uso, o su un header del progetto in uso, mi vede il dato effettivamente modificato.
Ho reputato che la libreria una volta compilata... c'è poco da fare
Per rendere la cosa più dinamica ho pensato di fare una prova con le strutture.
Creo un vettore di porte, che opzionalmente può essere più o meno usato.
Ho una funzione iniziale che se non trova una struttura modificata da me, carica una di default.
E tutte le altre funzioni andavano a pescare i pin direttamente da questa struttura. Però se non posso recuperare la struttura dalla funzione è un po brutto.
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37

1
voti

[4] Re: Struct C , cosa possono e cosa non posso fare.

Messaggioda Foto UtenteDirtyDeeds » 11 set 2013, 20:22

Xamar ha scritto:Il codice che mi hai riportato non è altro che una struttura normale.


Il codice che ti ho riportato fa esattamente quello che fa la tua funzione Port_mapping.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti