Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何预定义结构数组_C - Fatal编程技术网

C 如何预定义结构数组

C 如何预定义结构数组,c,C,我的c是非常脆弱的,我甚至不是100%如何问这个问题,所以请容忍我 基本上,我试图做的是创建一个notes结构的查找表 我知道我想要的结构,我有我想要输入的所有数据 那么,我怎样才能: A创建一个notes\u type\t数组,并用我的所有数据填充它 --或-- B定义一个包含所有数据的宏 --或-- 一个更好的方法 typedef struct { float freq; int midi; char[2] note; }notes_type_t { 16.4

我的c是非常脆弱的,我甚至不是100%如何问这个问题,所以请容忍我

基本上,我试图做的是创建一个notes结构的查找表

我知道我想要的结构,我有我想要输入的所有数据

那么,我怎样才能:

A创建一个notes\u type\t数组,并用我的所有数据填充它

--或--

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

--或--

一个更好的方法

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#
}

可能是下面这样。假设它在notes中。h:

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

#define DEFINE_NOTES
#include "notes.h"

请注意,note元素需要有3个字符才能为空终止符留出空间。

可能类似于以下内容。假设它在notes中。h:

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#"},
};
然后在一个源文件中,包含notes.h和define,如图所示,以实际定义数组。其他源文件只需要包含并获取数组的extern声明

#define DEFINE_NOTES
#include "notes.h"
请注意,note元素需要有3个字符才能为空终止符留出空间

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#"},
};
请注意,您的备注字段太小。C字符总是\0结尾,因此总是比您看到的大一个。此外,您的note字段似乎应该具有可变长度,因此您可能希望使用const char*

同样值得考虑的是,你的例子不被认为是大的数据字段对可执行的大小等的影响。我宁愿从一个文件中读取这个信息,这是你必须在程序一开始就要做的事情。

请注意,您的备注字段太小。C字符总是\0结尾,因此总是比您看到的大一个。此外,您的note字段似乎应该具有可变长度,因此您可能希望使用const char*


同样值得考虑的是,你的例子不被认为是大的数据字段对可执行的大小等的影响。我宁愿从文件中读取这些信息,这是你的程序一开始就必须要做的事情。

你的代码有很多问题。下面是一些编译和打印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长才能保存空终止字符,尽管我不确定。

您的代码有很多地方出错。下面是一些编译和打印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长才能保存空终止字符,尽管我不确定。

你希望它在哪方面比方法C更好?@DavidGrayson,我的印象是OP想要一个更好的方法,而不是他需要语法更正。你希望它在哪方面比方法C更好?@DavidGrayson,我的印象是OP想要一个更好的方法,而不是他需要修改语法。谢谢。正是我需要的。你知道如何将它定义为宏,这样我就可以把它放在notes.h文件中。我不完全确定你要找的是哪种类型的宏。但是您可以将结构定义和数组声明放在notes.h中。但是您需要确保只定义一次数组。我将编辑答案以显示一种方法,这太棒了。非常感谢。正是我需要的。你知道如何将它定义为宏,这样我就可以把它放在notes.h文件中。我不完全确定你要找的是哪种类型的宏。但是您可以将结构定义和数组声明放在notes.h中。但是您需要确保只定义一次数组。我将编辑答案以显示一种方法,这太棒了。非常感谢