簡體   English   中英

初始化包含數組的結構

[英]Initializing struct containing arrays

我在 C 中有一個結構,其中成員是浮點數組。 我想在編譯時像這樣初始化它:

typedef struct curve {                                                                                         
    float *xs;                                                                                             
    float *ys;                                                                                             
    int    n;                                                                                              
} curve;                                                                                                       

curve mycurve1 = {                                                                                             
    {1, 2, 3},                                                                                                     
    {4, 2, 9},                                                                                                     
    3                                                                                                              
};

curve mycurve2 = {
    {1, 2, 3, 4},
    {0, 0.3, 0.9, 1.5},
    4
};                                                                                                              

但我收到編譯錯誤。

一種可能的解決方案可能是在結構中使用數組而不是指針。 這是這里一個非常相似的問題的公認答案: https : //stackoverflow.com/a/17250527/1291302 ,但這種方法的問題是我不知道 typedef 時的數組大小。 不僅如此,我可能還想初始化另一個更大的曲線。

另一種方法可能是使用 malloc,但我發現這有點矯枉過正,因為我在編譯時知道數組大小,而且我不需要在運行時更改它。

我不知道其他可能有用的方法。 也許將數組轉換為指針? - 我真的不知道我會如何處理。

您不能像使用包含多個初始值設定項的花括號列表的指針一樣初始化標量對象。

但是您可以使用復合文字。

這是一個演示程序。

#include <stdio.h>

typedef struct curve {                                                                                         
    float *xs;                                                                                             
    float *ys;                                                                                             
    int    n;                                                                                              
} curve;                                                                                                       

int main(void) 
{
    curve mycurve1 = 
    {                                                                                             
        ( float[] ){ 1,  2, 3 },                                                                                                     
        ( float[] ){ 4,  2, 9 },                                                                                                     
        3
    };

    curve mycurve2 = 
    {
        ( float[] ){ 1, 2, 3, 4 },
        ( float[] ){ 0, 0.3, 0.9, 1.5 },
        4
    };

    for ( int i = 0; i < mycurve1.n; i++ )
    {
        printf( "%.1f ", mycurve1.xs[i] );
    }
    putchar( '\n' );

    for ( int i = 0; i < mycurve2.n; i++ )
    {
        printf( "%.1f ", mycurve2.ys[i] );
    }
    putchar( '\n' );

    return 0;
}

它的輸出是

1.0 2.0 3.0 
0.0 0.3 0.9 1.5 

來自莫斯科的@Vlad的建議是一個很好的答案。

const時使用const

因為我在編譯時知道數組大小,並且我不需要在運行時更改它。

考慮const curve mycurve1 = ... 這允許選擇優化,識別誤用並允許將&mycurve1傳遞給bar(const curve *) 還使用const float [...允許將mycurve1.xs傳遞給foo(const float *)

避免幻數

#define CURVE1_N 3
const curve mycurve1 = {
  ( const float[CURVE1_N] ){ 1,  2, 3 },
  ( const float[CURVE1_N] ){ 4,  2, 9 },  
  CURVE1_N
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM