我在linux下使用gcc(gnu99)。 假设我有一个简单的函数来计算(比如打印)一些值。 为了在不诉诸阶乘的情况下解决问题,让我提出这个小玩具功能:
void rec(int val, int nd)
{
val *= 10; nd++;
for (int u=0; u<=9; u++, val++)
if (val && 0==(val%(nd*nd)))
{
printf("%d\n",val);
rec(val,nd);
}
}
称为rec(0,0),将打印86个正数,其长度k的每个前缀都可以被k ^ 2整除(最大值为6480005)。
问:有没有一种标准方法可以将它变成一个可以重复调用的例程,每次都返回一个新值,直到它以某种方式发出没有更多值的信号?在实践中,我需要一种方法来调用rec(),获取一个值,然后能够从原来的位置恢复执行,以获得下一个值等等。
我考虑过使用setjmp(),longjmp(),setcontext()等组合,但这些主题的例子让我感到困惑。 感谢。
答案 0 :(得分:0)
如果不诉诸setjmp()
及其喜欢的话,我会想到实现目标的两种可能性。
您可以定义包含您感兴趣的州的结构:
struct S {
int * numbers;
size_t length;
size_t current;
}
以及一组对其进行操作的函数:
// Basically your rec(val,nd) function
int initialize(int val, int nd, S* s);
// Get the next value
int getNextValue(const S* s);
...
// Free memory
void Sfree(S* s);
在这种情况下,您将持久状态(使用一些static
变量)直接嵌入到函数rec()
中。持久化此状态将在对函数的不同调用中保留,并允许您跟踪函数被调用的次数以及您可能需要的任何其他信息。请注意,如果在多线程环境中使用此解决方案,则需要特别小心。
答案 1 :(得分:0)
在C ++中,这是通过一个包含state
(变量)的类来完成的。
在C中,首选的操作方法是将此state
或context
传递给函数。
不使用全局状态,因为您会发现它会导致太多问题。
示例:
int foo(struct fooContext* c, int arg1, int arg2) {
}