2016-04-26 8 views
1

私は、私のCプログラム内の関数から返す、playerInformationという構造体を持っています。以下の関数は、私が書いた関数です。Cの関数からポインタを返すには?

これは適切な構造体を検出し、printfを使用して関数内の詳細を出力できます。しかし、私は主関数内の情報を印刷できるようにポインタを返すことができないようです。私はこの警告を取得し、このコードで

MainTest.c: In function ‘main’: 
MainTest.c:34: warning: assignment makes pointer from integer without a cast 

MainTest.c(ライン33および34)

struct playerInformation *test; 
test = findPlayerInformation(head, 2); 

StructFucntions.c

struct playerInformation *findPlayerInformation(struct playerInformation *head, int playerIndex) { 
    struct playerInformation *ptr; 
     for(ptr = head; ptr != NULL; ptr = ptr->next) { 
      if(ptr->playerIndex == playerIndex) { 
       return ptr; 
      } 
     } 
    return NULL; 
} 
+0

findPlayerInformation'は(main'定義 '前maintest.cに含まれ、ヘッダファイルに入れて)宣言'のですか? – purplepsycho

+1

プロトタイプを使用前に入れてください。 – BLUEPIXY

+0

実際には、これは "ちょうど"の警告です。findPlayerInformationはメイン関数の下にありますか、または関数プロトタイプを前に定義しましたか? – jboockmann

答えて

-4

あなたはstruct playerInformation *ptr;を宣言しています、このポインタはローカル変数findPlayerInformation()の中にあります...だから、abovのスコープeポインタはfindPlayerInformation()機能内でのみ使用可能になります。

if(ptr->playerIndex == playerIndex) 
    return ptr; 

したがって、このステートメントの後、コントロールはmain関数に移動します。あなたはfindPlayerInformation()関数内のローカル変数としてptrを宣言しているので、あなたは、main関数に期待したものptrを..得ることはありません

解決策:この問題を回避したい場合

、などPTRを宣言

static struct playerInformation *ptr; 

ファイル全体で変数のスコープを維持するために使用される静的なキーワード...

+3

私はあなたがパラメータとして渡されたポインタを変更するためにこれを混乱させていると思います。投稿されたコードは正常であり、静的な必要はありません。また、これは与えられたコンパイラの警告を説明しないでしょう。 – Lundin

+0

申し訳ありません。今すぐ私は、関数呼び出しと関数の定義が異なるソースファイルにあることを見てきました。findPlayerInformation()関数に構造体ポインタのアドレスを渡すことができます。この関数内では、このアドレスを埋めることができます。 – sivakarthik

+0

"あなたはstruct pointerのアドレスを別のパラメータとして渡すことができます "これは彼がやっていることです。関数呼び出しと関数定義がどのファイルに置かれているかは関係ありません。 – Lundin

1

Put prototype before use. — 0以下のような静的変数

SOのマニュアルの「別のCファイルから関数を呼び出す」という話題がありました。これに関連して

、あなたがタイプstruct playerInformationを定義するヘッダを必要とする:

playerinfo.h

#ifndef PLAYERINFO_H_INCLUDED 
#define PLAYERINFO_H_INCLUDED 

struct playerInformation 
{ 
    ... 
}; 

extern struct playerInformation *findPlayerInformation(struct playerInformation *head, int playerIndex); 

#endif 

コードstructFunctions.cにヘッダーを含めるべきでは:

#include "playerinfo.h" 

... 

struct playerInformation *findPlayerInformation(struct playerInformation *head, int playerIndex) { 
    struct playerInformation *ptr; 
     for(ptr = head; ptr != NULL; ptr = ptr->next) { 
      if(ptr->playerIndex == playerIndex) { 
       return ptr; 
      } 
     } 
    return NULL; 
} 

メインプログラムにはヘッダーも含まれます:

MainTest.c

#include "playerinfo.h" 

... 

int main(void) 
{ 
    struct playerInformation *head = ...; 
    ... 
    struct playerInformation *test; 
    test = findPlayerInformation(head, 2); 
    ... 
    return 0; 
} 
関連する問題