我怎样才能预先定义一个结构数组

时间:2012-02-24 17:03:14

标签: c

我的c非常好看,我甚至不是100%如何提出这个问题所以请耐心等待。

基本上我正在尝试做的是创建一个笔记结构的查找表。

我知道我想要的结构,并且我有我想要的所有数据。

那我怎么能:

A)创建一个notes_type_t数组并用我的所有数据填充它。

---或---

B)定义一个包含所有数据的宏

---或---

C)更好的方法

typedef struct 
{
   float freq;
   int   midi;
   char[2] note;


}notes_type_t


{
16.4, 12, C
17.3, 13, C#
18.4, 14, D
19.4, 15, D#
20.6, 16, E
21.8, 17, F
23.1, 18, F#
24.5, 19, G
26, 20, G#
27.5, 21, A
29.1, 22, A#
30.9, 23, B
32.7, 24, C
34.6, 25, C#
36.7, 26, D
38.9, 27, D#
41.2, 28, E
43.7, 29, F
46.2, 30, F#
49, 31, G
51.9, 32, G#
}

3 个答案:

答案 0 :(得分:6)

可能会出现以下情况。假设它在notes.h

typedef struct
{
   float freq;
   int   midi;
   char note[3];
}notes_type_t;

#if defined( DEFINE_NOTES )    
  notes_type_t notes[] = {
     {16.4, 12, "C"},
     {17.3, 13, "D#"},
     ...
     };
#else
  extern notes_type_t notes[];
#endif

然后在一个源文件中,包含带有#define的notes.h,如图所示,以实际定义数组。其他源文件只有#include并获得数组的extern声明。

#define DEFINE_NOTES
#include "notes.h"

请注意,note元素必须是3个字符(以便为空终止符留出空间)。

答案 1 :(得分:1)

notes_type_t arr[] = {
  {16.4, 12, "C"},
  {17.3, 13, "C#"},
  {18.4, 14, "D"},
  {19.4, 15, "D#"},
  {20.6, 16, "E"},
  {21.8, 17, "F"},
  {23.1, 18, "F#"},
  {24.5, 19, "G"},
  {26, 20, "G#"},
  {27.5, 21, "A"},
  {29.1, 22, "A#"},
  {30.9, 23, "B"},
  {32.7, 24, "C"},
  {34.6, 25, "C#"},
  {36.7, 26, "D"},
  {38.9, 27, "D#"},
  {41.2, 28, "E"},
  {43.7, 29, "F"},
  {46.2, 30, "F#"},
  {49, 31, "G"},
  {51.9, 32, "G#"},
};

请注意,您的note字段太小。 C字符总是\0 - 终止,所以总是比你能看到的大一个。此外,您的note字段似乎应具有可变长度,因此您可能希望使用const char*代替。

还值得考虑大数据字段(您的示例不被视为大)对可执行文件大小等的影响。我宁愿从文件中读取此信息,这就是您必须尽快完成的操作无论如何,你的计划都在不断发展。

答案 2 :(得分:0)

您的代码存在很多问题。这是一些编译和打印“C”和“C#”的工作代码。

typedef struct note
{
   float freq;
   int   midi;
   char  name[3];
} note;

note notes[] =
{
  {16.4, 12, "C"},
  {18.4, 14, "C#"},
  /** you can fill in the rest of the notes here **/
};

#include <stdio.h>
int main(int argc, char **argv)
{
  printf("%s\n", notes[0].name);
  printf("%s\n", notes[1].name);
  return 0;
}

我将char数组从“note”更改为“name”以避免混淆。此外,我认为你需要3长才能保持空终止字符,虽然我不确定。