新手C / C ++结构数组指向其他结构数组元素

时间:2017-07-28 14:56:52

标签: c++ struct arduino arduino-esp8266

我偶然发现了一个巧妙的技巧,我已经开始使用某个人发布到esp8266论坛之一的库,将二进制文件写入arduino / esp8266上的(flash)内存。我一直在尝试多种方式来扩展它。最近,我一直在缩小和压缩我的网页内容文件,并在我的ESP上用草图编辑它们。 他首先发布的脚本使用unix命令xxd -i的输出将二进制文件写入十六进制数组。第二部分使用结构将文件详细信息与指向数组的指针相结合,只要服务器获得与数组中的条目匹配的uri请求,就可以从代码中引用该数组。

我想要做的是使用'默认'创建第二组这些内容。已经预先压缩的工具,所以每次创建新的服务器草图时,我都不必每次都经历它和/或修改构建头文件的脚本。基本上是压缩和xxd之类的东西,比如jquery.js,bootstrap.css和bootstrap.js(或更常见的是它们的小型对应物,如backbone或barekit)

目前,一旦将文件转储为十六进制,例如:

FLASH_ARRAY(uint8_t, __js__simple_js,
  0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x4b, 0x2b,
  0xcd, 0x4b, 0x2e, 0xc9, 0xcc, 0xcf, 0x53, 0xc8, 0xad, 0xf4, 0xcf, 0xf3,
  0xc9, 0x4f, 0x4c, 0xd1, 0xd0, 0xac, 0x4e, 0xcc, 0x49, 0x2d, 0x2a, 0xd1,
  0x50, 0x0a, 0xc9, 0xc8, 0x2c, 0x56, 0x00, 0xa2, 0xc4, 0x3c, 0x85, 0xfc,
  0xbc, 0x1c, 0xa0, 0x94, 0x42, 0x6e, 0x6a, 0x71, 0x71, 0x62, 0x7a, 0xaa,
  0x92, 0xa6, 0x75, 0x51, 0x6a, 0x49, 0x69, 0x51, 0x9e, 0x42, 0x49, 0x51,
  0x69, 0x6a, 0x2d, 0x00, 0x16, 0xa6, 0x25, 0xe5, 0x43, 0x00, 0x00, 0x00);

现有代码将结果与结构定义一起添加:

struct t_websitefiles {
  const char* path;
  const char* mime;
  const unsigned int len;
  const char* enc;
  const _FLASH_ARRAY<uint8_t>* content;
} files[] = {
{
    .path = "/js/simple.js",
    .mime = "application/javascript",
    .len = 84,
    .enc = "gzip",
    .content = &__js__simple_js,
  },
  {
 /* details for file2 ...*/
  },
  {
 /* details for file3 ...*/
  }
};

构建表示各种文件的结构数组。

我的问题相当于关于语言语法的noob问题。我可以假设我可以在大括号内部使用相同的填充结构吗?例如,如果我有一个第二个头文件和我经常使用的库,并且jquery被压缩在一个名为&#39; default_files&#39;的数组中。在第3位,我可以在{/ *定义东西* /}的位置使用&amp; default_files [3]之类的东西。如:

struct t_websitefiles {
  const char* path;
  const char* mime;
  const unsigned int len;
  const char* enc;
  const _FLASH_ARRAY<uint8_t>* content;
} files[] = {
{
    .path = "/js/simple.js",
    .mime = "application/javascript",
    .len = 84,
    .enc = "gzip",
    .content = &__js__simple_js,
  },
  &default_files[1],
  &default_files[3],
{
    .path = "/text/readme.txt",
    .mime = "text/text",
    .len = 112,
    .enc = "",
    .content = &__text__readme_txt,
  }
};

(我根据我迄今为止所学到的东西猜测它需要&amp;在它面前吗?)

我还假设不是两次重写结构定义,我可以将它作为typedef来做,然后只做:

t_websitefiles files[] = { {/*definitions*/},{ /*stuffs*/ } };

这是对的吗?任何帮助表示赞赏。有时很难在基础知识文档中找到特定用例语法的详细信息。 (我只是尝试一下,但我现在不方便在编译器前面,也不能直接访问我的代码库,但是当我可能无法直接访问网络时希望以后再使用它)

1 个答案:

答案 0 :(得分:2)

根据我的理解,您需要创建一个结构数组,其中包含复合文字和来自另一个数组的项,所有这些都在标题信息中定义。 我不认为这是可能的 - 或者至少不是你提出的确切方式。我试着提供另一种选择。

  

我可以假设我可以在花括号内部使用相同的填充结构吗?

不 - 你正在混合你的类型。 &#39;文件&#39;被定义为&#39; struct t_website&#39;的数组。 代码

struct t_websitefiles files[] = {
    ...
    &default_files[1],
    ...
}
当你混合你的类型时,

不会编译。 文件被定义为 struct t_websitefile 的数组,但&amp; default_files [1] 是一个指针。 C区分了指针和非指针。它们是单独的类型。

我可以看到做你想做的显而易见的选择是使用指针。这将允许您在标题信息中定义所有内容。

struct t_websitefiles default_files[] = {
   ....
}
struct t_websitefiles files[] = {
   ....
}

// An array of pointers
struct t_websitefiles *files_combined[] = {
    &files[0],
    &files[1],
    &default_files[0],
    // Or whatever values you want here
    ...
}

// Example main, just iterates through the combined list
//  of files
int main(int argc, char* argv[]) {
    int i;
    int files_combined_len = sizeof(files_combined)/sizeof(struct t_websitefiles);

    for (i=0; i<files_combined_len; i++) {
        printf("File %s\r\n", files_combined[i]->path);
    }

    return 0;
}

希望这有帮助。