トップページ > 過去ログ > 記事閲覧
ファイル分割時の関数
名前:肥満 日時: 2007/02/05 16:53

質問させてください。 1.関数の引数及び戻り値に構造体を使えますか? 使える場合はどういう風に宣言すればよいのでしょうか。 2.ソースを Mai.cpp と Sub.cpp に分けているとします。 ここで Main.cpp で宣言した構造体 Status の メンバ HP を Sub.cpp から操作することはできますか? 分かり難くて申し訳ありませんが、要するに Status.HP の値を Sub.cpp で書き換えたいということです。 どなたかお教えください。

Page: 1 |

Re: ファイル分割時の関数 ( No.1 )
名前:wiz 日時:2007/02/05 17:25

>1.関数の引数及び戻り値に構造体を使えますか? > 使える場合はどういう風に宣言すればよいのでしょうか。 引数や戻り値に構造体を使用する場合はポインタにします。 ただし、双方の関数から、構造体の定義が見えている必要があります。 >2.ソースを Mai.cpp と Sub.cpp に分けているとします。 > ここで Main.cpp で宣言した構造体 Status の > メンバ HP を Sub.cpp から操作することはできますか? > 分かり難くて申し訳ありませんが、要するに > Status.HP の値を Sub.cpp で書き換えたいということです。 ポインタ渡すことで可能となります。 これらはC言語の基礎ですしっかり覚えましょう。 以下参考にでも。 本コードはC言語で書いてます。 C++の場合はnewやdeleteを使ったり、 クラスを使うことが殆どです。 /************************************************* * * Sample Main.cpp * *************************************************/ #include <stdio.h> #include <string.h> #include "sub.h" int main( int argc, char* argv[] ) { char_t char1; char_t* char2; char1.hp=100; char1.mp=50; strcpy( char1.name, "AAAAA" ); printf("Name:%s HP:%3d MP:%2d\n", char1.name, char1.hp, char1.mp ); sub( &char1 ); printf("Name:%s HP:%3d MP:%2d\n", char1.name, char1.hp, char1.mp ); char2=NULL; char2 = make_char( "BBBBB", 150, 20 ); if( char2==NULL ){ return 1; } printf("Name:%s HP:%3d MP:%2d\n", char2->name, char2->hp, char2->mp ); sub( char2 ); printf("Name:%s HP:%3d MP:%2d\n", char2->name, char2->hp, char2->mp ); delete_char( char2 ); return 0; } /************************************************* * End of File Main.cpp *************************************************/ /************************************************* * * Sample Sub.h * *************************************************/ #ifndef _SUB_H #define _SUB_H typedef struct _char{ int hp, mp; char name[20]; }char_t; char_t* make_char( char* name, int hp, int mp ); void delete_char( char_t* c ); void sub( char_t* c ); #endif//_SUB_H /************************************************* * End of File Sub.h *************************************************/ /************************************************* * * Sample Sub.cpp * *************************************************/ #include <stdlib.h> #include <string.h> #include "sub.h" char_t* make_char( char* name, int hp, int mp ) { char_t* c; c = (char_t*)malloc(sizeof(char_t)); if( c==NULL ){ return NULL; } c->hp = hp; c->mp = mp; strcpy( c->name, name ); return c; } void delete_char( char_t* c ) { if( c ){ free( c ); } } void sub( char_t* c ) { c->hp -= 50; c->mp -= 20; } /************************************************* * End of File Sub.cpp *************************************************/
Re: ファイル分割時の関数 ( No.2 )
名前:肥満 日時:2007/02/05 17:38

す、すみませんがソースの解説が欲しいのですが…
Re: ファイル分割時の関数 ( No.3 )
名前:wiz 日時:2007/02/05 21:01

とりあえず、C言語の基礎をしっかりと。 ttp://www9.plala.or.jp/sgwr-t/ コメント版 /************************************************* * * Sample Main.cpp * *************************************************/ #include <stdio.h> /*printf用*/ #include <string.h> /*strcpy用*/ /* *キャラクタ構造体の宣言と *Sub.cppに定義される関数を使用するため *Sub.hの宣言をインクルードする */ #include "sub.h" /* C言語のエントリーポイント */ int main( int argc, char* argv[] ) { /* キャラクタ構造体の宣言 既にメモリ上に領域が確保された状態 */ char_t char1; /* キャラクタ構造体ポインタの宣言 未だメモリに領域が無い状態 */ char_t* char2; /* キャラクタ1にそれぞれ値を代入 */ char1.hp=100; char1.mp=50; strcpy( char1.name, "AAAAA" ); /* 代入の結果を表示 */ printf("Name:%s HP:%3d MP:%2d\n", char1.name, char1.hp, char1.mp ); /* キャラクタ1のポインタを渡し、HP/MPの値を変更 */ sub( &char1 ); /* 変更の結果を表示 */ printf("Name:%s HP:%3d MP:%2d\n", char1.name, char1.hp, char1.mp ); /* キャラクタ2の初期化 */ char2=NULL; /* キャラクタ2をメモリ上へ確保 */ char2 = make_char( "BBBBB", 150, 20 ); if( char2==NULL ){ printf("メモリの確保に失敗しました\n"); return 1; } /* 作成の結果を表示 */ printf("Name:%s HP:%3d MP:%2d\n", char2->name, char2->hp, char2->mp ); /* キャラクタ2は元々ポインタなのでそのまま渡し、HP/MPの値を変更 */ sub( char2 ); /* 変更の結果を表示 */ printf("Name:%s HP:%3d MP:%2d\n", char2->name, char2->hp, char2->mp ); /* 確保したキャラクタ2を開放 */ delete_char( char2 ); return 0; } /************************************************** * End Of File Main.cpp *************************************************/ /************************************************* * * Sample Sub.h * *************************************************/ #ifndef _SUB_H #define _SUB_H /*--- struct ------------------------------------*/ /* キャラクタ構造体定義 */ typedef struct _char{ int hp, mp; char name[20]; }char_t; /*--- function -----------------------------------*/ char_t* make_char( char* name, int hp, int mp ); void delete_char( char_t* c ); void sub( char_t* c ); #endif/*_SUB_H*/ /************************************************** * End Of File Sub.h *************************************************/ /************************************************* * * Sample Sub.cpp * *************************************************/ #include <stdlib.h> #include <string.h> #include "sub.h" /************************************************** * 関数名:make_char * 引 数:[i]name 作成するキャラの名前 * :[i]hp 作成するキャラのHP * :[i]mp 作成するキャラのMP * 戻り値:[成功]作成したキャラクタ構造体のポインタ * :[失敗]NULL * 情報 :キャラクタ構造体の領域をメモリ上に確保し * :引数に与えられた、メンバ情報を入れて返す * :(戻り値に構造体を指定する場合) *************************************************/ char_t* make_char( char* name, int hp, int mp ) { char_t* c; /* メモリ領域確保 */ c = (char_t*)malloc(sizeof(char_t)); if( c==NULL ){ /*確保失敗*/ return NULL; } /* メンバへ代入 */ c->hp = hp; c->mp = mp; strcpy( c->name, name ); /* 確保した領域を返す */ return c; } /************************************************** * 関数名:delete_char * 引 数:[i]c make_char関数で返された領域 * 戻り値:無し * 情報 :メモリ上に確保されたキャラクタ構造体の * :領域を開放する * :(引数に構造体を指定する場合) *************************************************/ void delete_char( char_t* c ) { /* cがNULL以外なら開放する */ if( c ){ free( c ); } } /************************************************** * 関数名:sub * 引 数:[i/o]c 関数内でメンバが変更される * : 構造体へのポインタ * 戻り値:無し * 情報 :渡された構造体のメンバHP/MPの中身を * :それぞれ変更する * :(引数に構造体を指定し中身を変更する場合) *************************************************/ void sub( char_t* c ) { /* 渡された構造体のポインタのメンバHP/MPを変更 */ c->hp -= 50; c->mp -= 20; } /************************************************** * End Of File Sub.cpp *************************************************/

Page: 1 |