【问题标题】:VxWorks Interpreter - Creating structsVxWorks 解释器 - 创建结构
【发布时间】:2013-06-14 21:43:18
【问题描述】:

我是 VxWorks 开发新手(使用 6.8),我遇到了需要将结构的地址传递给函数的情况。是否可以从解释器外壳创建结构?我有一份基于 v5.5 的 VxWorks 程序员指南的硬拷贝,它明确指出不能从解释器 shell 形成/创建结构。这在 VxWorks 的更高版本中是否发生了变化,如果是,我将如何从命令行创建一个结构。

作为一个 VxWorks 新手,我希望运行命令

myStruct = {msg1 ="hi", msg2 = "hello" }

然后在另一个语句中使用该结构,例如

printf("%s\n", myStruct.msg1)

如果无法在上述解释器中创建结构,我可以采用哪些选项来通过访问结构中的成员来让 printf 语句打印“hi”或“hello”?

【问题讨论】:

    标签: c struct interpreter vxworks


    【解决方案1】:

    不,从 6.9 开始,vxWorks C shell 不支持结构。请参阅Wind River Workbench Host Shell 用户指南C 解释器限制部分。 shell 使用了一个不跟踪其符号类型的符号表,你不能在命令行中定义类型。

    要获得相同的行为,您可以为结构分配内存,然后按地址填充它。您分配的大小不必精确,但您的内存偏移量可以。您的示例很简单,因为您只有 2 个指针,并且您的结构不会有任何填充。如果您使用的是 32 位处理器,则指针的大小为 4 个字节。所以第一个指针位于偏移量 0、1、2 和 3,然后第二个指针从偏移量 4 开始。

    例如,

    -> mystruct = malloc(50);
    New symbol "mystruct" added to kernel symbol table.
    mystruct = 0x3a320a0: value = 63949520 = 0x3cfcad0
    -> mystruct[0] = "hi";
    0x3cfcad0: value = 61030776 = 0x3a364a0
    -> mystruct[4] = "hello";
    0x3cfcae0: value 61040928 = 0x3a36920 = ' '
    -> printf("%s\n", mystruct[4]);
    hello
    value = 6 = 0x6
    

    随着你的结构变大,如果有填充,事情会变得棘手。例如,struct { char, int } 的大小可能为 6 或 8,具体取决于处理器的对齐要求,因此在尝试获取 int 的偏移量时必须注意这一点。如果它太复杂,你可以在你的代码中编译辅助函数,可能看起来像这样的伪代码:

    struct st { char a; int b; char *c; };
    struct st *make_me_a_struct(char a, int b, char *c)
    {
        struct st *newstruct = malloc(sizeof(st));
        newstruct->a = a;
        newstruct->b = b;
        newstruct->c = c;
        return newstruct;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多