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
*************************************************/
|
|