2017-10-18 4 views
2

で初期化子で定義された関数と構造体を初期化します。私が持っているたとえばC

typedef struct { 
    uint32_t* param_ptr; 
    uint32_t (*check_value)(uint32_t); 
} Parameter; 

uint32_t a = 8; 
const Parameter work = { .param_ptr = &a, .check_value = (uint32_t value) {return value>10?value:10;} }; 

int main1(void) { 
    //check 
    *work.param_ptr = work.check_value(*work.param_ptr); 
} 

私は、構造体の初期化の内部で「ミニ」関数を宣言したいです。そこにはたくさんの 'パラメータ'があるので、私は別々の関数とその本体を宣言し、初期化にその名前を渡したくありません。とにかくそれをするには?


UPD1:コメントの

#define lambda(return_type, function_body) \ 
({ \ 
     return_type __fn__ function_body \ 
      __fn__; \ 
}) 

typedef struct { 
    uint32_t* param_ptr; 
    uint32_t (*check_value)(uint32_t); 
} Parameter; 

uint32_t a = 8; 

void main(void) { 
    Parameter work = { .param_ptr = &a, .check_value = lambda(uint32_t, (uint32_t value){return value > 10 ? value : 10;}) }; 
    *work.param_ptr = work.check_value(*work.param_ptr); 
} 

おかげで、私はキーワードでおなじみのQAを見つけました。これはうまく動作しますが、グローバル定数ではなく、RAMに保存されるのではなく、私のMCUのフラッシュではありません。 (ツールGNU C11)

+1

標準Cにはありません。 – StoryTeller

+0

Cには関数式(ラムダ関数とも呼ばれます)のようなものはありません。 –

+0

更新プログラムを回答として投稿する必要があります。ちなみに、gcc拡張機能を巧みに使います。 – melpomene

答えて

1

まず、静的な記憶期間を持つ変数を定数式以外のものに初期化することはできません。これはコンパイルされず、作成された "ラムダ"構文の有無に関係なくコンパイルされません。変数宣言をローカルスコープに配置する必要があります。

ローカルスコープになったら、イニシャライザリストに.check_value = value>10?value:10と入力するだけです。

+0

ローカルスタティックスコープで初期化を行い、このローカルスコープへのグローバルポインタを作成できますか? –

+0

@VasilySukhoparov「ローカルスタティックスコープ」とは何を意味するのか不明です。上記は、_static storage duration_を持つ変数に適用されます。つまり、ファイルスコープで宣言されたすべての変数( "グローバル")と、すべての変数がstaticとして宣言されています。プレーンなローカル変数(自動ストレージの持続時間)がある場合は、もちろん、他の場所からその変数を指し示すことはできますが、ローカル変数は最終的にスコープから外れてしまいます。その後、ポインタはゴミを指すことになります。 – Lundin

+0

@ VasilySukhoparovあなたが解決しようとしている実際の問題は何ですか?あなたの 'const'変数への入力が奇妙なフォーマットであるのはなぜですか?なぜそれを訂正できないのですか? – Lundin

関連する問題