Pointer Definition auf Array



  • Hallo

    Ich frage mich gerade, warum das nicht funktioniert.
    Ich habe das jetzt doch schon einige Mal so gemacht... 😕
    Was ich möchte ist ein Array erstellen, welches ich direkt einer Funktion für die i2C-Schnittstelle benötige.

    Fehlermeldung:

    *** Using Compiler 'V5.06 update 4 (build 422)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
    Build target 'HA40_SC'
    compiling epc.c...
    ../Inc/epc_regdef.h(48): error: #144: a value of type "const uint8_t *" cannot be used to initialize an entity of type "uint8_t *"
    uint8_t *FORCE_ANA_CTRL_SIGS_POINTER = FORCE_ANA_CTRL_SIGS_ARRAY;
    ..\Src\epc.c: 0 warnings, 1 error
    "HA40_SC\HA40_SC.axf" - 1 Error(s), 0 Warning(s).
    Target not created.
    Build Time Elapsed: 00:00:05

    #ifndef __EPC_REGDEF_H__
    #define __EPC_REGDEF_H__
    
    #include "stm32l4xx_hal.h"
    
    /*
        ####### EPC901 Registeradressen - fix definiert lt. Datenblatt#####
      ==============================================================================   
    */
    
    // configuration
    static uint8_t ACQ_TX_CONF_I2C       =                  0x00;
    static uint8_t BW_VIDEO_CONF_IC2     =                  0x01;
    static uint8_t MISC_CONF             =                  0x02;
    static uint8_t ACQ_TX_CONF_EFF       =                  0x03;
    static uint8_t BW_VIDEO_CONF_EFF     =                  0x04; 
    // Trimming
    static uint8_t OSC_TRIM_REG          =                  0x90; 
    static uint8_t VIDEO_GBW_SEL_REG     =                  0x94; 
    // Temp. Sensors
    static uint8_t TEMP_SENS_L_LSB       =                  0xA0; 
    static uint8_t TEMP_SENS_L_MSB       =                  0xA1; 
    static uint8_t TEMP_SENS_R_LSB       =                  0xA2; 
    static uint8_t TEMP_SENS_R_MSB       =                  0xA3; 
    static uint8_t TEMP_SENS_CONF        =                  0xA4;
    // Error indicators
    static uint8_t I2C_ERROR_IND         =                  0xB0;
    // Analog test mode registers
    static uint8_t ANA_TEST_MODE_EN_0    =                  0xD0;
    static uint8_t ANA_TEST_MODE_EN_1    =                  0xD1;
    static uint8_t ANA_TEST_CTRL         =                  0xD2;
    static uint8_t ANA_TEST_CONF         =                  0xD3;
    static uint8_t ANA_TEST_MUX_0_SEL    =                  0xD4;
    static uint8_t ANA_TEST_MUX_1_SEL    =                  0xD5;
    static const uint8_t FORCE_ANA_CTRL_SIGS   =                  0xD6;
    static uint8_t OSC_TRIM_RANGE_REG    =                  0xD7;
    // Debug read-only registers
    static uint8_t CHIP_REV_NO_REG       =                  0xFF;
    
    /*
        ####### EPC Register Adressen kombiniert mit einmaligen Schreibdaten #####
            Es werden folgend Arrays definiert, die die Schreibdaten darstellen
              Schreibdaten sind je nach gewünschter Konfiguration anzupassen
      ==============================================================================   
    */
    const uint8_t FORCE_ANA_CTRL_SIGS_DATA  =        0x04;                   // nur differential mode ist eingeschaltet, alles andere auf 0 (low)
    static uint8_t FORCE_ANA_CTRL_SIGS_ARRAY[]     = {FORCE_ANA_CTRL_SIGS, FORCE_ANA_CTRL_SIGS_DATA};
    uint8_t *FORCE_ANA_CTRL_SIGS_POINTER = FORCE_ANA_CTRL_SIGS_ARRAY;
    #endif
    


  • Wenn ich das richtig verstehe meckert der Compiler, dass du einer nicht konstanten Variable einen konstanten Wert zuweist. Wenn das vorher immer funktionierte, hat der Hersteller das wohl geändert.



  • danke für den Input

    ich habe das Programm mal geschlossen und wieder geöffnet.
    jetzt meckert er nicht mehr und die Zuweisung ganz unten stimmt in diesem Fall.. 😋

    und ich hab mir schon sorgen gemacht, dass ich wieder mal nichts kapiert hab..


  • Mod

    Und die Abhilfe ist, const-Korrektheit einzuhalten (hier also const uint8_t *... ). Wenn der Hersteller das neu eingeführt hat, wirst du vermutlich viel ändern müssen, denn so ein const ist ansteckend. Hat man eines korrekt gesetzt, muss man oft auch alle anderen setzen, wo sie nötig sind. (Und das ist eine gute Sache!)

    In Zeile 48 ist übrigens kein Array. Ein Zeiger ist kein Array, ein Array ist kein Zeiger.



  • SeppJ schrieb:

    In Zeile 48 ist übrigens kein Array. Ein Zeiger ist kein Array, ein Array ist kein Zeiger.

    Hallo SeppJ
    Könntest du das mal etwas vereinfachter ausführen?
    Ich verstehe grad nicht, was du meinst. Ich habe doch ein Array definiert in 47 und in 48 habe ich den Pointer auf die Arrayadresse zeigen lassen..

    Das stimmt doch so soweit, oder? 😕


  • Mod

    buell schrieb:

    Das stimmt doch so soweit, oder? 😕

    Ja. Deine erste Beschreibung klang aber so, als ob du eventuell etwas anderes wolltest. Wenn dies das ist, was du möchtest, dann stimmt es.


Anmelden zum Antworten