おそらく、生成されたコードを次のように編集できます。
int mem_size0;
int mem_size1;
int mem_size2;
...
...
int mem_sizen;
になります:
union {
struct {
int mem_size0;
int mem_size1;
int mem_size2;
...
...
int mem_sizen;
} s;
int mem_array[mem_size_entries];
} u;
これで、 の要素を反復処理できますu.mem_array
。
perl
これは、シェル スクリプト (またはスクリプト)を使用してかなり簡単に実行できます。トリッキーな部分は、いつ到達したmem_sizen
か、またはその後の行を認識することです。これは私にとってはうまくいくようです:
#!/usr/bin/env perl
use strict;
use warnings;
my($seen, $done) = (0, 0);
while (<>)
{
if (/mem_size0/)
{
print "struct { union {\n";
$seen = 1;
}
if ($seen && !$done && !/mem_size/)
{
print "} s; int mem_array[mem_size_entries]; } u;\n";
$done = 1;
}
print $_;
}
与えられた入力:
int mem_size0;
int mem_size1;
int mem_size2;
int mem_sizen;
mem_size
これらの宣言の後に空白行 (または を含まないその他の行) を付けます。
スクリプトは次の出力を生成します。
struct { union {
int mem_size0;
int mem_size1;
int mem_size2;
int mem_sizen;
} s; int mem_array[mem_size_entries]; } u;
それほど難しくなく、よりきれいにレイアウトできます。次に、配列を反復処理できますu
。
for (int i = 0; i < mem_size_entries; i++)
printf("%d: %d\n", i, u.mem_array[i]);
これの欠点は、初期化子が元のコードに表示されないことです。ただし、Perl を使用すると、存在する数を認識し、初期化を見つけて、このスキームに適合するように編集することが容易にできます。基本的に、これはプログラムの生成された出力を「高水準言語」のソース コードとして扱い、それをコンパイル可能な C コードに「コンパイル」します。