2012-04-12 12 views
0

Ich habe eine Liste von Variablen ( nicht vorhanden in einem Array), deren Werte durch Iteration gedruckt werden. Diese Variablen haben die gleichen Namen, mit Ausnahme der Nummern, die sie am Ende begleiten.iterieren Variablen, die in C nicht in einem Array sind

Sagen Sie Folgendes sind die Variablennamen;

int mem_size0; 
int mem_size1; 
int mem_size2; 
... 
... 
int mem_sizen; 

Die Gesamtzahl solcher Variablen durch eine andere variable mem_size_entries gegeben. Diese Variablen werden für mich von einem anderen Werkzeug erzeugt, und ich muss die Werte dieser Variablen mit einer Art Iteration drucken. Ist das möglich mit einigen Makros?

+2

Ist 'mem_size_entries' eine Kompilierzeitkonstante? – huon

+0

Ja, es ist eine Kompilierzeitkonstante, die ebenfalls vom Tool generiert wird. –

+0

Wenden Sie sich an [Boost :: Preprocessor] (http://www.boost.org/libs/preprocessor/), das Schleifenkonstrukte enthält. –

Antwort

2

Verwendung vim.

Zum Beispiel wollen Sie die nächste Zeile für alle Variablen wiederholen:

something mem_sizen0 something; 

Gerade bewegen sich über den Anfang der Zeile und drücken Sie:

qa (start recording macro) 
yy (copy line) 
p (paste line in new line) 
wwwhh (move to the 0) 
ctrl+a (increase 0 by 1) 
q (finish repeating macro) 
[email protected] (repeat this 30 times, if this is the amount you need) 
+2

+1 für kreative Interpretation des Begriffs "Makro". – zwol

1

Wenn diese Variablen in allen deklariert In der Reihenfolge scheint es wahrscheinlich (obwohl nicht garantiert), dass sie sequentielle Speicherorte belegen würden. Dies kann nicht auf alle arbeiten Compiler, aber es ist einen Versuch wert, zumindest (oder irgendein!):

int mem_size0; 
int mem_size1; 
int mem_size2; 
... 
... 
int mem_sizen; 

const int *const start = &mem_size0; 
const int *const end = &mem_size0 + (mem_size_entries); 

for (const int *p = start; p < end; p++) 
{ 
    /* Do stuff with p... */ 
    printf("%i\n", *p); 
} 
+0

Um zu vereinfachen, könnten Sie einfach '#define mem_size (i) (* (& mem_size0 + i))' Ich kann auch bestätigen, dass dies mit GCC auf Mac OS X Lion funktioniert. –

+0

Die sequentielle Belegung des Speicherplatzes ist nicht garantiert. Das ist also keine sichere Lösung. –

+0

@AnandhKumar wahr, sehr wahr. Ich bin mir jedoch nicht sicher, ob dies vollständig möglich ist. –

1

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.

Verwandte Themen