• ベストアンサー

構造体メンバの個数

jactaの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.7

この類の不具合は、コンパイルできて、かつ不具合が再現するソースを補足してもらわない限り原因が究明できる可能性は低いと思ってください。 また、どんな処理系を使っているのかも必須の情報です。 一度、char name[20]のところを、char name[256]ぐらいにして現象を確認してみてください。そして、その結果を教えてください。 その場合、nameのナル文字より後がどうなるかも教えてください。 (破壊がどこまで及んでいるかを知るためです)

sikimori
質問者

お礼

こんなことろに書いてすいません。補足にて足りないことがあったので。 開発環境は、 エディタ : bcpad コンパイラ : borland C++ Compiler 5.5 (OS : Windows XP Professional) name[20]をname[256]に変えたところ、文字化けはしなくなりました。 しかし、name[20]に戻しても文字化けしなくなりました(汗) また、メモリ破壊が起きていると指摘されたので、初期化した後にメモリ番地を表示させてみたところ、 printf("%p %p %p %p\n",dt[0].name,dt[0].HP,dt[0].MP,dt[0].st_ab[0]); printf("%p %p %p %p\n",dt[1].name,dt[1].HP,dt[1].MP,dt[1].st_ab[0]); printf("%p %p %p %p\n",dt[2].name,dt[2].HP,dt[2].MP,dt[2].st_ab[0]); printf("%p %p %p %p\n",dt[3].name,dt[3].HP,dt[3].MP,dt[3].st_ab[0]); printf("%p %p %p %p\n",dt[4].name,dt[4].HP,dt[4].MP,dt[4].st_ab[0]); 結果: 0013F9F8 00001770 00000064 00000000 0013FB14 00000FA0 0000012C 00000000 0013FC30 00000FA0 000000FA 00000000 0013FD4C 00001964 000000C8 00000000 0013FE68 000186A0 0000270F 00000000 一応必要であれば。

sikimori
質問者

補足

補足要求の皆さん、遅れてすいませんでしたm(_ _)m 言ってしまえば、作っているのは簡単な戦闘シュミレーションのプログラムです。攻撃して敵のHPを減らす。魔法を使えば自分のMPが減る。敵から攻撃を喰らえばHPが減り、状態異常を起こす。これを味方、敵(敵、味方)の順に交互に繰り返し、HPがなくなったら終了。至って普通だと思います。 前のから、多少変更がありますがご了承下さい。 /*------myhead.h------*/ typedef srtuct Status{   char name[256];   int hp,mp,st[4];  //st[4]は、状態異常を判定する配列 }status; void human(status *p); void chaA(status *p); void chaB(status *p); void chaC(status *p); void chaD(status *p); /*------main.c------*/ status dt[5] = {{"人物A",5000,200,{0,0,0,0},{"人物B",3000,300,{0,0,0,0}},~{"human",9999,999,{0,0,0,0}}}; int i,j; for(i=0;i<5;i++){   printf("%-10s %d %d",dt[i].name,dt[i].hp,dt[i].mp);   for(j=0;j<4;j++)    printf("%d ",dt[i].st[j]);   printf("\n"); } human(dt);    //敵の攻撃関数 chaA(dt);    //味方、人物Aの攻撃 chaB(dt);    //味方、人物Bの攻撃 chaC(dt);    //味方、人物Cの攻撃 chaD(dt);    //味方、人物Dの攻撃 for(i=0;i<5;i++){   printf("%-10s %d %d",dt[i].name,dt[i].hp,dt[i].mp);   for(j=0;j<4;j++)     printf("%d ",dt[i].st[j]);   printf("\n"); } //この表示するときに、値がでたらめになっていることがある /*------human.c------*/ void human(status *p){   int i,j,n1;   int s1,s2,s3,s4;   srand((unsigned)time(NULL));   printf("敵の攻撃\n");   n1 = (rand() % 1000) + 1000;  //ダメージ量   s1 = (rand() % 100) + 1;    //状態異常を発生させる為の準備   s2 = (rand() % 100) + 1;   s3 = (rand() % 100) + 1;   s4 = (rand() % 100) + 1;   for(i=0;i<4;i++){     (p+i)->hp -= n2;     (p+i)->st_ab[0] = s1 % 2; //出来た乱数を2で割った余りを代入     ~~~~~~;     (p+i)->st_ab[3] = s4 % 2;   } /*------chaA(status *p)(chaB(status *p))------*/ /*人物A,Bは同じことをやっている*/   int n1;   srand((unsigned)time(NULL));   n1 = (rand() % 1000) + 1000;   (p+4)->hp -= n1; /*------chaC(status *p)------*/ /*人物C,Dは同じことをやっている*/   int n1,ans;   srand((unsigned)time(NULL));   onemore:   printf("1.魔法1 2.魔法2--->");   scanf("%d",&ans);   if(ans == 1){     n1 = (rand() % 1000) + 1000;     if((p+2)->mp < 20){      //chaDなら(p+3)になる       printf("mpが足りません\n");       goto onemore;     }     (p+2)->mp -= 20;     (p+4)->hp -= n1;   }else if(ans == 2){     n1 = (rand() % 50) + 50;     (p+2)->mp += n1;     (p+4)->mp -= n1;   } 長くなってしまって本当に申し訳ありません。状態異常のときにどうなるとかはまだ作っていませんが、ここまでで、おかしくなるのは (1)dtを初期化しているのに、魔法を使おうとすると、mpが足りないと出る (2)お互いにダメージを与えているのに敵だけhpが減らない 以上、補足とさせていただきます。

関連するQ&A

  • 構造体メンバ及び、strncpy()について

    /* 構造体のメンバを char name[30]; にした時は実行できますが、char *name; としたときはプログラムを実行できません。 コンパイルエラーはともに出ないのですが、strncpy();の使い方が間違っているのか、先に構造体側でメモリサイズを確保しないと、使えないのか? メンバをポインタで持たせた構造体を初期化する関数の作り方を教えてください。 よろしくお願いします。 */ #include <stdio.h> #include <string.h> typedef struct{ char *name; int no; }ST; void set_name(ST *st, char *name, int no); int main(void) { ST st; set_name(&st, "テスト", 1); printf("%s No%d\n", st.name, st.no); return 0; } void set_name(ST *st, char *name, int no) { strncpy(st->name, name, 30); st->no=no; }

  • 構造体で・・・・

    構造体は配列を使用せずメモリ領域を獲得する関数を使用すること、 *構造体内部のメンバ名には配列を用いて良い。  という、条件があるのですが場合はどのようにすればよろしいでしょうか? どなたか教えてください。 構造体は以下のようになってます。 /*構造体の定義*/ struct seiseki{   char name[20];   int eig;   int suu;   int kok;   char rank[3]; };

  • 構造体について

    凄く初歩的な質問で申し訳ありませんが… 入門書の構造体のところで 以下のようなプログラムの例がありました。 #include <stdio.h> struct seiseki { /* 構造体の宣言 */ int no; char name[20]; double average; }; int main(void) { int i; struct seiseki seito1, seito2[20]; /* 構造体変数と構造体配列の宣言 */ >char name[20] というのは、NAMEの領域を20文字 確保すると言うことですよね? >struct seiseki seito1, seito2[20] ここの箇所が分からないのですが seito2[20]の20というのは どうして20なのですか? NAMEだけではないので もっと大きな数字になるような気がするのですが… またseito1の方は どうして数字が何もないんですか? 考え違いをしているところを ご指摘して頂ければ幸いです。

  • 異なる構造体のデータのコピー

    (1)で受け取った構造体のメンバのデータを (2)の構造体のメンバにコピーしたいと考えています。 (1) typedef struct _recvData{ int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; char array01[16]; char array02[16]; } recvData; (2) typedef struct _sendData{ int header; int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; int array01[4]; int array02[4]; } sendData; そこで2点ほどおしえていただきたく、お願い致します。 (1)構造体が微妙に異なるため、各メンバ変数に値をそれぞれ代入していくしか方法がないのでしょうか? (2)array01, array02はデータの型が異なる場合、データのコピーはどのようにしたらよいでしょうか?

  • 文字列配列をメンバにもつ構造体の,メモリ動的確保

    下に同様の質問があるのですが,やはり理解できません. 文字列配列をメンバにもつ構造体の,メモリを動的に確保をしたいのですが,うまくいきません. 具体的には以下のようです. 正しくはどのようにすればよいでしょうか.よろしくお願いします. typedef struct { char **boy; char **girl; } Name_class; int init_name_class(Name_class name_class, int n_boy, int n_girl) { int i; name_class.boy = (char**) malloc( n_boy * sizeof(char**) ); for(i=0; i<n_boy; i++) name_class.boy[i] = (char*) malloc( 32 * sizeof(char*) ); name_class.girl = (char**) malloc( n_girl * sizeof(char**) ); for(i=0; i<n_girl; i++) name_class.girl[i] = (char*) malloc( 32 * sizeof(char*) ); } main(int argc, char *argv[]) { int i, j, n_boy=3, n_girl=2; Name_class name_class; init_name_class(name_class, n_boy, n_girl); name_class.boy[0] = "yukio"; name_class.boy[1] = "hideaki"; name_class.boy[2] = "mitsuru"; name_class.girl[0] = "youko"; name_class.girl[1] = "chiharu"; printf("%s, %s, %s, %s, %s\n", name_class.boy[0], name_class.boy[1], name_class.boy[2], name_class.girl[0], name_class.girl[1]); }

  • C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して

    C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成しています。 一応目的の動作はするのですが、プログラミングとして正しいか教えて頂ければと 思います。 <test.c> int main() { /* ---------------------------------------- */ /* 構造体のメンバ(NULL保障無し)がNULLか */ /* 比較するサンプル */ /* ---------------------------------------- */ char buf[50]; /* サンプル構造体 */ struct ST_test { int cd; char name[10]; int no; }; struct ST_test st_test; /* 構造体定義 */ memset(&st_test,0x00,sizeof(st_test)); /* 構造体初期化 */ memset(&buf[0],0x00,sizeof(buf)); /* 構造体初期化 */ /* 構造体に値セット */ st_test.cd = 12; memcpy(&st_test.name[0],"aabbccddee",sizeof(st_test.name)); st_test.no = 999; /* NULL判定 */ if(*st_test.name == 0x00) { printf("NULLです\n"); } else { printf("NULLではないです\n"); } return (0); }

  • [C] 構造体メンバーのカンマ区切り出力

    構造体メンバーのカンマ区切り出力をしたいと思っています。 たとえば struct XXX { char name[20]; char address[40]; char tel[12]; ... 100メンバーくらいある } のような構造体があったとします。 printf("%s,%s,%s\n", s_ptr->name, s_ptr->address, s_ptr->tel); などのようにメンバー名(変数名)を参照せずに、構造体のメンバーへのポインタを順次取得しループして出力するなどして、実現することは可能でしょうか?

  • 構造体のメンバへのアクセスについて

    お世話になります。 構造体testがあり そのメンバにchar a1[10],a2[20]・・・a100[20]まであるとします。 (配列サイズは不定) このときtest.an (nは任意の数値)にアクセスしたいのですが どう記述したらいいでしょうか? どなたかご指南お願いします。

  • ファイルから読みこんで構造体に格納する、

    shohinというファイルに RX-100 odango_tsumeawase 3000という のが 五行ならんでいるのですが、 これを読み込んで struct shohin{ char code[10]: char name[40]; int price; } にファイルから読みこんで構造体配列に 格納したいのですが、構造体配列に格納する やりかたがわかりません。 構造体配列は struct shohin list[];というのを宣言しています。 ファイルから一行読み込んで fprintf()を使おうと思うのですが、 それはできますか? メンバ毎に格納したいのですが、 それがわかりません お願いします。

  • C言語の文字列を含んだ構造体

    下記のサイトに構造体のことが書かれています。 http://www.isl.ne.jp/pcsp/beginC/C_Language_14.html その中の (3)構造体の初期化 の記述で  //構造体の型宣言  struct student{   int no; // 学籍番号   char name[256]; // 氏名   int year; // 学年   char student_class[256]; // クラス  }; と書かれています。 次の(4)構造体のデータ参照では、  //構造体の型宣言  struct OLD{   int no; //番号   char *name; //名前   int s_year; //年   char s_class; //クラス  }; と書かれています。 ここで質問です。 前者の名前は char name[256] ですが、 後者の名前は char *name になっています。 name[256] と *name では何が違うのでしょうか? どういうときに使い分けるのでしょうか?