我有一个变量列表(不存在于数组中),其值必须通过迭代打印。这些变量具有相同的名称,除了最后附带的数字
以下是变量名称;
int mem_size0;
int mem_size1;
int mem_size2;
...
...
int mem_sizen;
此类变量的总数由另一个变量mem_size_entries
给出。这些变量是由不同的工具为我生成的,我必须通过某种迭代打印这些变量的值。这是否可以使用一些宏?
答案 0 :(得分:2)
使用vim。
例如,您想要为所有变量重复下一行:
something mem_sizen0 something;
只需移动该行的开头并按:
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)
30@a (repeat this 30 times, if this is the amount you need)
答案 1 :(得分:1)
如果这些变量都是按顺序声明的,那么它们似乎(尽管不能保证)会占用内存中的连续位置。这可能不适用于所有(或任何!)编译器,但至少值得一试:
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);
}
答案 2 :(得分:1)
也许您可以编辑生成的代码,以便:
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
。
这可以通过shell脚本(或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代码。