2011-11-21 9 views
7

における構造体の配列を渡す:私はその後、私はトラブル私がメインで、このような構造体を作成しましたC.</p> <p>内の関数に構造体の配列を渡すことだC

int main() 
{ 
    struct Items 
    { 
     char code[10]; 
     char description[30]; 
     int stock; 
    }; 

    struct Items MyItems[10]; 
} 

をそれが好きなアクセス:MyItems[0].stock = 10;など

を、私はそうのような関数に渡したい:

ReadFile(MyItems); 

関数は配列を読み込み、編集できるようにする必要があります。それで、私は他の関数から同じ配列にアクセスできるはずです。

私は宣言のヒープを試しましたが、どれも動作しません。例:

void ReadFile(struct Items[10]) 

私は他の質問のために周りを見て持っていたが、事は、彼らはすべてのtypedefとアスタリスクで、異なる行われています。私の先生はまだ私たちに指導を教えていないので、私が知っているところでそれをやりたいのです。

アイデア? :Sは

編集:私は私のプロトタイプを固定した後、サルヴァトーレの答えが働いている:

void ReadFile(struct Items[10]); 
+0

それは「実際のコード」です。私はVisual studio 2010でそれを使用しています。 :S – lelouch

+1

"Visual Studio"と "it works"は、丁寧な会話では1つのセンテンスでは使用できません。特定の非標準プラットフォームについて話しているなら、明示的に言わなければなりません。そうでなければ、人々はあなたが**標準**言語について話していると仮定します。 –

+1

私はそれを修正しました。 < – lelouch

答えて

7
struct Items 
{ 
    char code[10]; 
    char description[30]; 
    int stock; 
}; 

void ReadFile(struct Items items[10]) 
{ 
    ... 
} 

void xxx() 
{ 
    struct Items MyItems[10]; 
    ReadFile(MyItems); 
} 

これはうまく動作します。 どのコンパイラを使用していますか?どのようなエラーがありますか?

関数の前に構造体を宣言することを忘れないでください。そうしないと、機能しません。代わりにあなたの宣言の

+0

私のプロトタイプをReadFile(void Items [10])に固定した後、ありがとうございました。 – lelouch

0

は、なぜあなたがそれを必要とする方法と、配列へのポインタを渡す使用していけませんか?

同じ構造体配列が必要な場合は、配列へのポインタを使用し、配列を渡してコピーを作成する必要があります。

void ReadFile(struct Items * items);

、どこが...

+0

後者のコードを教えてもらえますか? – lelouch

+0

myItemsは配列の0番目の要素へのポインタを与えます。 –

+0

ここにはコピーはありません。配列は決してコピーされません。 –

0

あなたはかなりこのためにポインタを使用する必要がポインタに注意する必要が

struct Items myItems[10]; 
ReadFile(myItems); 

それを呼び出します。あなたはこのようになります機能:

void ReadFile(Items * myItems, int numberOfItems) { 
} 
0

あなたは、そのメンバー

のボイドのReadFile(項目*項目)にアクセスするために、その簡単なことの後に、配列へのポインタを使用する必要があります。

が有効です。

0

あなたがしたように構造体を渡すと、実際にはその関数のローカルコピーが作成されます。したがって、元の構造には影響しません。たとえ変更しても、ReadFileになります。

私は別のアプローチについてはわかりませんが、これはあなたの質問に答えられないかもしれませんが、私はあなたがポインタを試してみることをお勧めします。あなたは間違いなくC/C++でそれらをかなり使用しています。あなたがそれらを

+0

あなたはそれを試すことができます、Cは常にポインタによって配列を渡します、あなたはReadFileでそれを変更することができます、コピーはここに関与していません。 –

+0

@SalvatorePrevitiあなたは絶対に正しいです!奇妙な理由のために、私は彼が配列ではなく彼のメソッドで構造体を使いたいと思った。 -_- – Kaisar

1

機能がタイプすることを知ることができませんmain関数本体スコープ内でローカルに宣言した場合はstruct Itemsが存在します。ですから、外構造体を定義する必要があります。

struct Item { /* ... */ }; 

void ReadFile(struct Items[]); /* or "struct Item *", same difference */ 

int main(void) 
{ 
    struct Item my_items[10]; 
    ReadFile(my_items); 
} 

をこれはReadFileは、(配列は常に崩壊・ツー・ポインタで渡さある)配列がどのように大きなない考えを持っていないので、当然の危険です。だから、一般的にこの情報を追加します。私のコンパイラで

void ReadFile(struct Items * arr, size_t len); 

ReadFile(my_items, 10); 
+0

あなたのコードでは、下線付きのエラーは修正されていますが、まだビルドされていません - これは次のとおりです:http:// pastebin。com/HxPTcPmL – lelouch

+0

A)エラーはコードのこの部分とは関係ありません。B)今、私たちは言語について再び混乱しています。突然C++ですか? –

+0

笑、申し訳ありませんが、間違ったコードがありましたら、もう一度お試しください。それはあなたのコードを試してからです。 – lelouch

0

、そのように宣言:

typedef struct { 
     char code[10]; 
     char description[30]; 
     int stock; 
}Items; 

、そのような機能:あなたが使用する必要はありませんので、あなたは、新しい型を定義typedefので

void ReadFile(Items *items); 

を毎回 "struct"という言葉を使います。

3

メインの外にstruct Itemsを定義します。 Cの関数に配列を渡すときには、配列の長さを渡す必要があります。固定長であることが保証されている場合を除いて、その配列に含まれる要素の数を知る関数がないからです。

Salvatoreが述べたように、構造体や関数などを宣言(必ずしも定義する必要はありません)する必要があります。通常は、より大きなプロジェクトのヘッダーファイルに構造体と関数プロトタイプがあります。

下のあなたの例の作業変形例である:

#include <stdio.h> 

struct Items 
{ 
    char code[10]; 
    char description[30]; 
    int stock; 
}; 

void ReadFile(struct Items items[], size_t len) 
{ 
    /* Do the reading... eg. */ 
    items[0].stock = 10; 
} 

int main(void) 
{ 
    struct Items MyItems[10]; 

    ReadFile(MyItems, sizeof(MyItems)/sizeof(*MyItems)); 

    return 0; 
} 
関連する問題