5

我正在尝试初始化一个结构数组。结构中有函数指针,并且定义如下:

typedef struct{
      char str[512];
      char *fptr;
} infosection;

然后我尝试制作一个数组:

infosection section[] = {
      ("Software", *SoftwarePtr),
      ("Hardware", *HardwarePtr),
 }

我使用一个简单的教程定义了函数指针。函数软件返回一个 int

int (*SoftwarePtr)()=NULL;
SoftwarePtr = &Software;

我的问题是关于我在编译时收到的警告。

初始化从没有强制转换的指针生成整数

警告引用节数组中的行。

所以我有两个疑问:

  1. 我是否误用了 */&/nother 作为指针?我已经尝试过每种方法的组合,但我似乎仍然得到相同的警告。我知道每种方法的含义,只是不确定它们在这个特定实例中的应用方式。
  2. 我可以infosection struct像在这里一样在数组中声明 的实例吗?我见过很多人们array of struct在 a中声明的例子for loop,但是我的最终产品需要包含在该数组中的一长串结构列表。我想让我的代码portable使得人们可以add structs(与要指向的函数相对应的字符串)以一种简单的类似列表的方式进行,如所见。这是声明数组实例的唯一方法吗

      infosection section[];
      section[0].str="software";
      section[0].fptr=SoftwarePtr;
    

structs澄清一下,我已经对、array of structs和进行了相当多的研究function pointers。似乎这三者的组合正在造成麻烦。

4

3 回答 3

7

我发现一个错误,在函数指针的结构声明中不正确:

typedef struct{
      char str[512];
      int (*fptr)();  // not char* fptr
} infosection;

宣言:

infosection section[] = {
      ("Software", *SoftwarePtr),
      ("Hardware", *HardwarePtr),
 }

应该:

infosection section[] = {
      {"Software", SoftwarePtr},
      {"Hardware", HardwarePtr}
 }

删除*. 并将内部替换( ){ }.

infosection section[];
section[0].str="software"; // compiler error
section[0].fptr=SoftwarePtr;

错了,您不能以这种方式分配字符串。您需要strcpy()按如下方式使用;

strcpy(section[0].str, "software");
于 2013-07-26T17:58:34.887 回答
2

struct 成员当前是 char*,请更改为函数签名的正确指针类型。

typedef struct{
  char str[512];
  int (*fptr)();
} infosection;

* 取消引用指针,将 *foo 读作“foo 指向的内容”。您想将 struct 成员设置为实际指针,也使用大括号而不是括号。

infosection section[] = {
  {"Software", SoftwarePtr},
  {"Hardware", HardwarePtr}
}
于 2013-07-26T18:00:01.140 回答
1

自从我玩指针以来已经有一段时间了,但也许构造函数会有所帮助?

struct infosection{
      char str[512];
      char *fptr;
      infosection(char* strN, char* fptrN): str(strN), fptr(fptrN) {}
};

infosection[] isxn = { new infosection(&str1,fptr1), 
               new infosection(&str2,fptr2)},
               ... };

我很抱歉......我的脑海中已经模糊了c停止和c++开始的地方,我看到了一个看起来像这样的c的解决方法(但不完全是,我确定一些指针的东西混在一起了,但这就是想法)

struct infosection{
  char str[512];
  char *fptr;
};

infosection* myIS (char *strN, char *fptrN) {
  infosection i = new infosection();
  i.str = &strN;
  i.fptr = fptrN;
  return *i;
}

//infosection* newInfoSection = myIS(myStrPtr,myFptr);
于 2013-07-26T18:26:13.260 回答