5

構造体の配列を初期化しようとしています。構造体には関数ポインターがあり、そのように定義されています。

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

次に、配列を作成しようとします。

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

簡単なチュートリアルを使用して関数ポインターを定義しました。関数ソフトウェアは int を返します

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

私の質問は、コンパイル時に表示される警告についてです。

初期化により、キャストなしでポインターから整数が作成されます

警告は、セクション配列内の行を参照しています。

だから私は2つの疑問があります:

  1. ポインターに */&/neither を誤用していませんか?それぞれの組み合わせを試しましたが、それでも同じ警告が表示されるようです。
  2. infosection structここで行うように、配列内ののインスタンスを宣言できますか?人々が 内で宣言する多くの例を見てきarray of structましたがfor loop、最終製品では、構造体の長いリストをその配列に含める必要があります。見られるように、簡単なリストのような方法portableで人々ができるようなコード(ポイントする機能に対応する文字列)。add structsこれが配列のインスタンスを宣言する唯一の方法ですか

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

明確にするために、私はstructsarray of structs、およびについてかなりの調査を行いましfunction pointersた。3つの組み合わせが問題を引き起こしているようです。

4

3 に答える 3

7

1

関数ポインターの構造体宣言で見つけた間違いの 1 つが正しくありません。

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

宣言:

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

次のようにする必要があります。

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

削除し*ます。( )インナーを に置き換え{ }ます。

3 :

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

この方法で文字列を割り当てることができないのは間違っています。次のように使用する必要がありstrcpy()ます。

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