Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - extern type
Forum - C/C++ - extern type - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 19:50
Venerdì, 18/12/2015
Testo quotato

Postato originariamente da Roby94:
I file C implementano semplicemente i prototipi del relativo header file e i prototipi contenuti nel header principale.
Le due cartelle costituiscono di per se due librerie indipendenti, quindi o si include ADXL345SPI.h o ADXL345I2C.h, mai entrambi, il tutto serve per garantire la completa compatibilità tra le due interfacce, cosi da non dover modificare righe di codice nel caso del cambiamento della stessa.
Il problema di questo è che i prototipi nel file ADXL345.h non hanno senso per il compilatore, in quanto ADXL345_t non è ancora stato dichiarato quando il compilatore interpreta il file, verrà dichiarato nel l'header specifico della libreria. La soluzione union non mi piace un granche, non vorrei avere a progetto finito alcuna traccia dell'altra libreria nell'header file per non creare confusione inutile. Ripeto, a me servirebbe un costrutto che dicesse al compilatore, il tipo richiesto lo troverai piu avanti(non in fase di linking ma proprio in quella di compilazione).


A parte ADXL345Init() nell'header sotto SPI, usi anche da qualche altra parte il campo port della struttura?
Le interfacce SPI e I2C (che non ho idea di che cosa siano) possono essere usate insieme, cambiate a runtime, oppure il programma viene compilato con il supporto per l'una o per l'altra?

Se l'informazione è conosciuta a compile time, ti basta includere solo uno dei due header.
Se invece ti serve a runtime, puoi usare l'union come dice nessuno. Altrimenti c'è un altra possibilità che è quella di allineare i campi simili delle strutture (ossia tutti tranne port), usare qualche pragma per impedire al compilatore di fare padding in mezzo ai campi e usare così uniformemente le due strutture (dopo un cast, e ti consiglio anche di chiamarle in modo diverso).

"un costrutto che dicesse al compilatore, il tipo richiesto lo troverai piu avanti(non in fase di linking ma proprio in quella di compilazione)"
> https://en.wikipedia.org/wiki/Opaque_pointer#C
Però come vedi non è quello che ti serve.

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 22:28
Venerdì, 18/12/2015
Grazie mille ad entrambi.
Sono interfacce HW seriali
https://it.wikipedia.org/wiki/I%C2%B2C
https://it.wikipedia.org/wiki/Serial_Peripheral_Interface
Non cambiano in runtime, vengono decise al momento della compilazione includendo solo una delle due librerie.
Solo qualche funzione differisce come protoripo.
Basandomi su quello che mi hai lincato ho provato cosi.
ADXL345.h
Codice sorgente - presumibilmente C++

  1. #pragma once
  2.  
  3. typedef enum { adxl345R2g, adxl345R4g, adxl345R8g, adxl345R16g } ADXL345Range_t;
  4. typedef enum { adxl345B0_05, adxl345B0_10, adxl345B0_20, adxl345B0_39, adxl345B0_78, adxl345B1_56, adxl345B3_13, adxl345B6_25, adxl345B12_5, adxl345B25, adxl345B50, adxl345B100, adxl345B200, adxl345B400, adxl345B800, adxl345B1600 } ADXL345Bandwidth_t;
  5.  
  6. typedef struct adxl345_t ADXL345_t;
  7.  
  8. void ADXL345SetPower(ADXL345_t*, ADXL345Bandwidth_t, uint8_t);
  9. void ADXL345SetRange(ADXL345_t*, ADXL345Range_t, uint8_t);
  10. void ADXL345SetOffset(ADXL345_t*, int8_t, int8_t, int8_t);
  11.  
  12. void ADXL345GetData(ADXL345_t*);
  13.  
  14. uint8_t ADXL345FindAddress(ADXL345_t*);


ADXL345I2C.h
Codice sorgente - presumibilmente C++

  1. #pragma once
  2.  
  3. #include <avr/io.h>
  4. #include "../ADXL345.h"
  5.  
  6. typedef enum { adxl345Address1D = 0x1D, adxl345Address53 = 0x53 } ADXL345Address_t;
  7.  
  8. typedef struct adxl345_t
  9. {
  10.         ADXL345Address_t address;
  11.        
  12.         int16_t x;
  13.         int16_t y;
  14.         int16_t z;
  15. } ADXL345_t;
  16.  
  17. void ADXL345Init(ADXL345_t*, ADXL345Address_t);


Sembrerebbe funzionare, o almeno compila.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo