1

ファイルからデータを読み取り、そのデータを複数の構造体に格納するio.hからmain.cの関数を呼び出そうとしています。その後、どういうわけか、mainの後の関数で引数としてさまざまな構造体を渡すことができます。これらの後の関数は、alg.hなどの他のファイルで定義されます。

どうすればこれを行うことができますか?externを使用して構造体をグローバルにし、別のファイルに配置しますか?alg.hの関数に構造体の1つの戻り型を持たせることは可能ですか?インクルードの順序に依存しますか?

以下に貼り付けたコードは準拠して機能しますが、いずれかの構造体を移動しようとすると、プログラムがコンパイルされません。

また、たとえば、alg.hで宣言された構造体を持ち、その構造体を後でalg.hで宣言されたパラメーターとして持つ関数を持つことは可能ですか。次に、main.cで、構造体を初期化してio.hで宣言された関数に渡し、構造体にいくつかの値を指定して、main.cに戻し、それをalg.hで宣言された関数に渡しますか?それはクラスのように聞こえますが、Cソリューションが必要であり、構造体のインスタンスが1つだけ必要です。

ありがとう。

io.h

struct s1 {
    int num1;
    double num2;
};

struct s2 {
    int num3;
    double num4;
};

void io_init(struct s1*, struct s2*);

io.c

#include <stdio.h>
#include <stdlib.h>

#include "io.h"

void io_init(struct s1* s1i, struct s2* s2i)
{
    s1i->num1 = 5;
    s1i->num2 = 2.4;

    FILE *fp;
    char line[80];

    fp = fopen("input.txt","rt");

    fgets(line, 80, fp);
    sscanf(line,"%i",&s2i->num3);
    fgets(line, 80, fp);
    sscanf(line,"%i",&s2i->num4);

    fclose(fp);
}

alg.h

void ga_init(struct s1);

alg.c

#include <stdio.h>

#include "io.h"
#include "ga.h"

void ga_init(struct s1 s1i)
{
    printf("%i", s1i.val1);
}

main.c:

#include <stdio.h>

#include "io.h"
#include "ga.h"

int main() {
    struct s1 s1i;
    struct s2 s2i;

    io_init(&s1i, &s2i);
    ga_init(s1i);

    return 0;
}
4

2 に答える 2

3

タイプの宣言を必要とする(つまり、それらを使用したい)すべてのファイルには、ヘッダーファイルが含まれている必要があります(つまり、前方宣言とポインターは機能しますが、定義なしでは逆参照できません。とにかく、ここでは実際には適用できません。 。)

したがって、詳しく説明すると、ファイルXを使用する必要がある場合struct Yは、宣言を含むヘッダーファイルをインクルードする必要があります。それだけです。

/* X.c */
#include "Y.h"  /* <-- that's it! */

void foo(Y *obj) {
    /* ... */
}
于 2012-11-05T21:17:44.230 に答える
2

ここにいくつかのアドバイスがあります。

  • あなたの.hファイルは構造体オブジェクトを定義していません。タイプを定義しているだけです。このままでいいです。これらのタイプの構造体に触れるすべての人は、このファイルを含める必要があります。

  • への呼び出しで行っているように、構造体を値で渡す必要があることは非常にまれですga_init。で行ったように、基本的には常に参照によって呼び出したいと思うでしょうio_init

  • はい、構造体を返すことができますが、ほとんどの場合、構造体への参照を返す方が良いでしょう。

  • グローバルに定義された構造体は確かに共有できexternます。リンカーがひどいものでない限り、共有する必要はありません。しかし、割り当てられた構造体への参照を共有することは、main()ほぼ同じことになります。

于 2012-11-05T21:23:10.123 に答える