1

大きな(20kb)静的htmlページを提供する必要があるwifiマイクロコントローラーを使用しています。マイクロコントローラーの個々のバッファーは 1.4kb しか保持できないため、html をチャンクに分割し、一度に 1 つずつ送信する必要があります。

私が今持っているのは、次のような約100の文字列割り当てです。

char HTML_ID_96[] = "\
<p><a href=\"#t\">Return to top</a></p>\
<a id=\"id9\"/>\
<span class=\"s\">Firmware Version/Information</span>\
<span class=\"c i\" id=\"id9-h\" onclick=\"h(\'id9\');\">hide</span>&nbsp;\
<span class=\'c\' id=\"id9-s\" onclick=\"s(\'id9\');\">show</span>\
<table class=\"t i\" id=\"id9-table\"><tbody>\
";

文字列を配列に貼り付けて、すべての文字列に反復可能なシーケンスを課す方法が欲しいのですが、それらをパッケージ化する方法がわかりません。

私が試してみました:

char** all = [HTML_ID_1, ..., HTML_ID_99];
char* all[] = [HTML_ID_1, ..., HTML_ID_99];
char all[][] = [HTML_ID_1, ..., HTML_ID_99];

しかし、どれもコンパイルされません。C が配列を処理する方法への参照はおまけです。

拡大:

char const* HTML_ID_100 = "\
</form>\
</body>\
</html>\
";

char const* all[] = {HTML_ID_100};

コンパイルしていません。gcc 3.4.4 を使用しています。「初期化要素が定数ではありません」と「('all[0]' の初期化に近い)」という 2 つのエラーが報告されます。どちらも表示されている最後の行で発生します。

4

3 に答える 3

4

文字列へのポインタの配列:

char* all[] = {HTML_ID_1, ..., HTML_ID_99};

配列を反復処理する方法によっては、配列を NULL ポインターで終了したい場合があることに注意してください。

char* all[] = {HTML_ID_1, ..., HTML_ID_99,NULL};

また、文字列が変更されない場合は、リテラルによって初期化される char の配列ではなく、リテラル文字列への単純なポインターとして宣言することで、データ領域を節約できます。

char const* HTML_ID_96 = "\
<p><a href=\"#t\">Return to top</a></p>\
<a id=\"id9\"/>\
<span class=\"s\">Firmware Version/Information</span>\
<span class=\"c i\" id=\"id9-h\" onclick=\"h(\'id9\');\">hide</span>&nbsp;\
<span class=\'c\' id=\"id9-s\" onclick=\"s(\'id9\');\">show</span>\
<table class=\"t i\" id=\"id9-table\"><tbody>\
";
于 2013-05-23T15:06:28.833 に答える
2

あなたは正しい軌道に乗っていますが、静的配列宣言には中括弧を使用する必要があります。これはうまくいくはずです:

char* all[] = {HTML_ID_1, ..., HTML_ID_99};

私はあなたが何をしているのか、そしてそれを行うためのより良い方法があるかどうかを考えます. たとえば、それがマイクロの場合、プログラム メモリ (つまり NVRAM) に大きな配列を作成し、そこからシリアルに読み取ることができますか?

于 2013-05-23T15:04:55.430 に答える