Vielleicht können Sie den generierten Code bearbeiten, so dass diese:
int mem_size0;
int mem_size1;
int mem_size2;
...
...
int mem_sizen;
wird:
union {
struct {
int mem_size0;
int mem_size1;
int mem_size2;
...
...
int mem_sizen;
} s;
int mem_array[mem_size_entries];
} u;
Jetzt können Sie über die Elemente von u.mem_array
iterieren.
Dies kann ziemlich einfach mit einem Shell-Skript (oder perl
Skript) getan werden; Der schwierige Teil ist zu erkennen, wenn Sie mem_sizen
oder die Zeile danach erreicht haben. Dies scheint für mich zu arbeiten:
#!/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 $_;
}
Bei Eingabe:
int mem_size0;
int mem_size1;
int mem_size2;
int mem_sizen;
mit einer Leerzeile (oder einer anderen Linie nicht enthalten mem_size
) nach diesen Erklärungen.
Das Skript erzeugt die Ausgabe:
struct { union {
int mem_size0;
int mem_size1;
int mem_size2;
int mem_sizen;
} s; int mem_array[mem_size_entries]; } u;
Sie können das lag mehr artig ohne große Schwierigkeiten aus. Sie können dann über das Array iterieren in u
:
for (int i = 0; i < mem_size_entries; i++)
printf("%d: %d\n", i, u.mem_array[i]);
Die Kehrseite der Medaille ist, dass die Initialisierungen nicht im ursprünglichen Code dargestellt werden; Mit Perl können Sie jedoch leicht erkennen, wie viele es gibt und die Initialisierungen finden und sie entsprechend diesem Schema bearbeiten. Im Grunde behandelt dies die generierte Ausgabe des Programms als Quellcode in einer höheren Sprache und kompiliert sie dann in C-Code, den Sie kompilieren können.
Ist 'mem_size_entries' eine Kompilierzeitkonstante? – huon
Ja, es ist eine Kompilierzeitkonstante, die ebenfalls vom Tool generiert wird. –
Wenden Sie sich an [Boost :: Preprocessor] (http://www.boost.org/libs/preprocessor/), das Schleifenkonstrukte enthält. –