Arraydefinition funktioniert nicht



  • Hallo zusammen

    Ich frage mich gerade warum der ewig lange Code funktioniert der optimierte aber nicht 😕 Könnte mich jemand mal aufklären?

    Beim Mikrocontroller stm32l431rci6 sehe ich mit dem langen Code die generierten Pulse, mit dem gekürzten Code aber nicht.
    langer Code:

    // TypeDef TIMER
    typedef struct TIMxPIN{
    	GPIO_TypeDef* port;
    	uint16_t pin;
    } TIMxPIN_t;
    
    // ADC definitions
    #define ADC1_PIN_IN1                        (TIMxPIN_t){GPIOC, GPIO_PIN_0}
    #define ADC1_PIN_IN2                        (TIMxPIN_t){GPIOC, GPIO_PIN_1}
    #define ADC1_PIN_IN3                        (TIMxPIN_t){GPIOC, GPIO_PIN_2}
    #define ADC1_PIN_IN4                        (TIMxPIN_t){GPIOC, GPIO_PIN_3}
    #define ADC1_PIN_IN7                        (TIMxPIN_t){GPIOA, GPIO_PIN_2}
    #define ADC1_PIN_IN8                        (TIMxPIN_t){GPIOA, GPIO_PIN_3}
    #define ADC1_PIN_IN9                        (TIMxPIN_t){GPIOA, GPIO_PIN_4}
    #define ADC1_PIN_IN10                       (TIMxPIN_t){GPIOA, GPIO_PIN_5}
    #define ADC1_PIN_IN11                       (TIMxPIN_t){GPIOA, GPIO_PIN_6}
    #define ADC1_PIN_IN12                       (TIMxPIN_t){GPIOA, GPIO_PIN_7}
    #define ADC1_PIN_IN16                       (TIMxPIN_t){GPIOB, GPIO_PIN_1}
    
        /**ADC1 GPIO Configuration  */
        GPIO_InitStruct.Pin = ADC1_PIN_IN1.pin;
        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(ADC1_PIN_IN1.port, &GPIO_InitStruct);
    
        GPIO_InitStruct.Pin = ADC1_PIN_IN2.pin;
        HAL_GPIO_Init(ADC1_PIN_IN2.port, &GPIO_InitStruct);
    
        GPIO_InitStruct.Pin = ADC1_PIN_IN3.pin;
        HAL_GPIO_Init(ADC1_PIN_IN3.port, &GPIO_InitStruct);
    
        GPIO_InitStruct.Pin = ADC1_PIN_IN4.pin;
        HAL_GPIO_Init(ADC1_PIN_IN4.port, &GPIO_InitStruct);
    
        GPIO_InitStruct.Pin = ADC1_PIN_IN7.pin;
        HAL_GPIO_Init(ADC1_PIN_IN7.port, &GPIO_InitStruct);                                   // Read out of the dma_buffer via button won't work if this is active
    
        GPIO_InitStruct.Pin = ADC1_PIN_IN8.pin;
        HAL_GPIO_Init(ADC1_PIN_IN8.port, &GPIO_InitStruct);
    
        GPIO_InitStruct.Pin = ADC1_PIN_IN9.pin;
        HAL_GPIO_Init(ADC1_PIN_IN9.port, &GPIO_InitStruct);
    
        GPIO_InitStruct.Pin = ADC1_PIN_IN10.pin;
        HAL_GPIO_Init(ADC1_PIN_IN10.port, &GPIO_InitStruct);
    
        GPIO_InitStruct.Pin = ADC1_PIN_IN11.pin;
        HAL_GPIO_Init(ADC1_PIN_IN11.port, &GPIO_InitStruct);
    
        GPIO_InitStruct.Pin = ADC1_PIN_IN12.pin;
        HAL_GPIO_Init(ADC1_PIN_IN12.port, &GPIO_InitStruct);
    
        GPIO_InitStruct.Pin = ADC1_PIN_IN16.pin;
        HAL_GPIO_Init(ADC1_PIN_IN16.port, &GPIO_InitStruct);
    

    kurzer Code (funktioniert nicht)

    TIMxPIN_t ADC_PINx[]= {ADC1_PIN_IN1, ADC1_PIN_IN2, ADC1_PIN_IN3, ADC1_PIN_IN4,
                             ADC1_PIN_IN7, ADC1_PIN_IN8, ADC1_PIN_IN9, ADC1_PIN_IN10, 
                             ADC1_PIN_IN11, ADC1_PIN_IN12, ADC1_PIN_IN16}; 
      uint8_t size2 = sizeof( ADC_PINx ); 
    
      for(uint8_t currentChannel = 0; currentChannel < size2; currentChannel++)
      {
         /**ADC1 GPIO Configuration  */
         GPIO_InitStruct.Pin = ADC_PINx[currentChannel].pin;
         GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL;
         GPIO_InitStruct.Pull = GPIO_NOPULL;
         HAL_GPIO_Init(ADC_PINx[currentChannel].port, &GPIO_InitStruct);          
      }
    


  • Deine Größe (size2) paßt nicht:
    [code"c"]
    uint8_t size2 = sizeof( ADC_PINx ) / sizeof(ADC_PINx[0]);
    [/code]
    Du möchtest ja die Anzahl der Elemente, nicht die Größe in Bytes.



  • Achso, ich bekomme also nicht die Länge, sondern die Grösse in Bytes!
    👍 👍
    Danke, jetzt funktionierts auch. 😋

    Den Quatsch hab ich von hier 😮 :
    https://www.c-plusplus.net/forum/132379-full



  • In der 2. Antwort steht doch auch diese Lösung (nicht immer gleich die erste Antwort bei einem Beitrag nehmen - erst mal ein wenig weiterlesen).



  • Th69 schrieb:

    In der 2. Antwort steht doch auch diese Lösung (nicht immer gleich die erste Antwort bei einem Beitrag nehmen - erst mal ein wenig weiterlesen).

    Au Mann, hast Recht. :p
    Ich war leider etwas in Eile. 😃
    Aber vielen Dank für den Hinweis.


Anmelden zum Antworten