相关疑难解决方法(0)

使用静态类型语言清理和类型安全的状态机实现?

我在Python中实现了一个简单的状态机:

import time

def a():
    print "a()"
    return b

def b():
    print "b()"
    return c

def c():
    print "c()"
    return a


if __name__ == "__main__":
    state = a
    while True:
        state = state()
        time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

我想把它移植到C,因为它不够快.但是C不允许我创建一个返回相同类型函数的函数.我试过制作这种类型的功能:typedef *fn(fn)()但它不起作用,所以我不得不使用一个结构.现在代码非常难看!

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

typedef struct fn {
    struct fn (*f)(void);
} fn_t;

fn_t a(void);
fn_t b(void);
fn_t c(void);

fn_t a(void)
{
    fn_t f = {b};

    (void)printf("a()\n");

    return f;
}

fn_t b(void)
{
    fn_t f = {c};

    (void)printf("b()\n");

    return f; …
Run Code Online (Sandbox Code Playgroud)

c python language-agnostic haskell typing

25
推荐指数
5
解决办法
2606
查看次数

我可以声明一个可以将指针作为参数的函数吗?

在stackoverflow中读取一个问题,我想知道是否可以声明一个带有指向自身的函数.即进行此类声明foo,以下内容是正确的:

foo(foo);
Run Code Online (Sandbox Code Playgroud)

最简单的想法是转换为另一个函数指针(不能转换为void*,因为它可能更小),所以函数声明如下所示:

void foo(void (*)());
Run Code Online (Sandbox Code Playgroud)

虽然这在C中是可以的(并且可以在C++中使用,但我想知道,是否可以在没有这种"重新解释"铸造或丢失类型信息的情况下完成.

换句话说,我想要以下声明:

void foo( void (*)( void (*)( void (*) ( ... ))));
Run Code Online (Sandbox Code Playgroud)

但是,当然,无限制的声明是不可能的.天真typedef也无济于事.

C++模板是受欢迎的,即使它们使调用代码(foo(foo))看起来不那么简洁,但仍然是有限的.

显示的C风格答案,如何在不进行投射的情况下丢弃类型信息,或者其他类型的技巧当然是有趣的,但不会被接受.

c c++ function-pointers

11
推荐指数
3
解决办法
3392
查看次数

我如何键入一个函数指针,该函数指针将自己类型的函数作为参数?

示例:一个函数,它接受一个函数(带有一个函数(那个......)和一个int)和一个int.

typedef void(*Func)(void (*)(void (*)(...), int), int);
Run Code Online (Sandbox Code Playgroud)

它以递归方式爆炸(...).是否存在无法完成的根本原因或是否存在其他语法?在我看来,没有演员阵容应该是可能的.我真的想传递一个调度表,但如果我可以通过这一种类型,我可以想出来.

c typedef function-pointers

10
推荐指数
2
解决办法
2239
查看次数

如何实现递归块?

我想声明一个块类型,它采用一个相同块类型的参数.它就是这样的:

typedef void (^BlockInBlock) (BlockInBlock block);
Run Code Online (Sandbox Code Playgroud)

我知道声明无效.但我想知道是否有任何可能的方法来实现递归块,它只采用一个相同块类型的参数.


我正在尝试使用块在Objective-C中找到一种实现面向方面编程(AOP)的方法.以下是关于如何实现这一点的问题.

进一步的问题1:

如何实现一个可变参数函数,它接受我上面描述的许多块并最终结束nil,并且我可以使用多个块调用该函数,直到遇到nil?它会是这样的:

@interface NSObject(AOP)
- (void) invokeBlockInBlock:(BlockInBlock) headBlock, ...{
    va_list blockList;
    va_start(blockList, headBlock);

    // Invoke recursive blocks here until the value of va_arg(blockList, BlockInBlock) is nil
    // it would be like: block1(self, block2(self, block3(self, block4(...))));

    va_end(blockList);
}
@end
Run Code Online (Sandbox Code Playgroud)

进一步的问题2:

如果递归块有返回值怎么办?


关于C语言的其他问题:

是否可以声明一个C函数,它接受一个C函数指针的参数,而C函数指针的函数也需要另一个C函数指针?

recursion aop block objective-c

8
推荐指数
1
解决办法
3825
查看次数

是否可以在C中进行递归类型定义

我想定义一个函数类型,它返回一个指向同一类型函数的指针.我试过这个:

typedef state* (*state)(lex*);
Run Code Online (Sandbox Code Playgroud)

但我得到的syntax error就像你猜的那样.

c syntax types

6
推荐指数
0
解决办法
423
查看次数

成员函数返回指向成员函数的指针

我想要一个带有返回成员函数指针的成员函数的类。

也就是说,类似:

class Foo {
// typedef ????(Foo::* func)????
public:
   Func s1();
   Func s2();
   Func s3();
}

Func Foo::s1() {
  // do stuff
  return &Foo::s2;
}

Func Foo::s2() {
  // do stuff
  return &Foo::s3;
}

Func Foo::s3() {
  // do stuff
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

基本上,我尝试做的是实现一个状态机,其中每个状态现在都是下一个状态,并通过函数指针返回它。

注意:我对实现状态机的其他方法不感兴趣。我真的很想知道它是否可以以上面这样的方式实现。

背景:我受到这个演讲的启发:http://www.youtube.com/watch?v =HxaD_trXwRE,并想知道是否可以在 C++ 中使用类似的模式。

c++ function-pointers

5
推荐指数
1
解决办法
431
查看次数