• 締切済み

pointer

動的なメモリの確保を行うprogramです。 #include <stdio.h> #include <string.h> #include <stdlib.h> static int _getMaxValueNum(void); static float *_allocMemory(int max_num); static float *_getIntegerValues(float *values, float *num, int max_num); static void _printIntegerValue(float *values, float num); static float _getIndex(float num); static int _getYesNo(void); int main() { float *values; int max_num; float num; max_num = _getMaxValueNum(); values = _allocMemory(max_num); values = _getIntegerValues(values, &num, max_num); _printIntegerValue(values, num); free(values); return 1; } static int _getMaxValueNum(void) { char buffer[100]; int max_num; for(;;){ printf("Seisuchi no saidaikosu -> "); scanf("%s",buffer); if(sscanf(buffer,"%d",&max_num) != 1) printf("%s : ha futona nyuryoku desu.\n",buffer); else break; } return max_num; } static float *_allocMemory(int max_num) { float *pointer; float max_ber; max_ber = max_num; pointer = (float *)malloc(sizeof(float)*max_ber); if(pointer == NULL){ printf("Memory no dotekikakuho ni shippai shimashita.\n"); exit(1); } return pointer; } static float *_getIntegerValues(float *values, float *num, int max_num) { char buffer[10]; *num = 0.0; int number float max_ber; printf("Suchi wo nyuryoku shitekudasai.\n"); printf("Syuryo suru baai niha \'q\' wo oshitekudasai.\n"); for(;;){ scanf("%s",buffer); if(sscanf(buffer,"%f",values+(*num)) != 1.0){ if(!strcmp(buffer,"q")){ break; } else{ printf("Nyuryoku ga tadashiku arimasen.\n"); continue; } } } (*num)+1.0; max_ber = max_num; if(*num >= max_ber){ values=(float*)realloc(values,sizeof(float)*((*num)+max_ber)); if(values == NULL){ printf("Memory no dotekikakuho ni shippai shimashita.\n"); exit(1); } } return values; } static void _printIntegerValue(float *values, float num){ int id; do{ id = _getIndex(num); printf("Shitei sareta index no suchi ha %f desu.\n",*(values+id)); }while(_getYesNo()); } static float _getIndex(float num) { char buffer[10]; float id; int ex; for(;;){ printf("Index wo nyuryoku shitekudasai.[0-%.0f]",num-1.0); scanf("%s",buffer); if(sscanf(buffer,"%d",&ex) != 1 || id >= num) printf("%s : ha futona nyuryoku desu.\n",buffer); else break; } id = ex; return id; } static int _getYesNo(void) { char buffer[10]; for(;;){ printf("Tsuzuke masuka?[Yes/No]"); scanf("%s",buffer); if(!strcasecmp(buffer,"YES") || !strcasecmp(buffer,"Y")) return 1; else if(!strcasecmp(buffer,"NO") || !strcasecmp(buffer,"N")) return 0; printf("%s : ha futona nyuryoku desu.\n",buffer); } } 実行したら Seisuchi no saidaikosu -> 5 Suchi wo nyuryoku shitekudasai. Syuryo suru baai niha 'q' wo oshitekudasai. 2.3 Segmentation fault (core dumped) となり #0 0x280f2dbe in __svfscanf () from /lib/libc.so.6 #1 0x280e7d24 in sscanf () from /lib/libc.so.6 #2 0x080487ff in _getIntegerValues (values=0x804a040, num=0xbfbfe7bc, max_num=5) at pointer8.c:84 #3 0x0804869f in main () at pointer8.c:31 となりました. *_getIntegerValuesの if(sscanf(buffer,"%f",values+(*num)) != 1.0){ がerror... どこがいけないのかな... 教えてください。

noname#77913
noname#77913

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

getIntegerValues という関数名なんですが Integer って整数です。 関数名からは整数値を得る関数と思われますが内容は実数を得る処理をしたいように感じられます。 やりたいことはどちらでしょうか。 小数を得たいなら関数名を変えましょう。(getFloatValuesとか) それにsizeof(float)*max_berのような整数でやる処理をわざわざfloat型にする意味はありません。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ああ, 頭痛が.... どうして _getIntegerValues の引数 num を float * にしているのか. 「float にしなければならない」理由はなんですか? ついでに言うと sscanf の返り値をなぜ double の 1.0 と比較するのか....

関連するQ&A

  • 数当てゲームについて

    #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void) { int num; int no; int max=11; int limit=0; srand(time(NULL)); /*乱数の値を初期化*/ no = rand() %1000; do{ printf("あと入力回数は%d回です。数字を入力してください。\n",max-limit); scanf("%d",&num); limit++; if(num>=1000 || num<=-1000) { printf("-999以上999以下の整数を入力してください。\n"); return -1; } if(num>no) { printf("\a大きいです。\n"); } else if(num<no) { printf("\a小さいです。\n"); } }while(no!=num && limit<max); if(no==num) { printf("正解です。\n"); printf("%d回で当たりました。\n",limit); } else { printf("残念です。当たりませんでした。\n"); printf("正解は%dでした。\n",no); } return 0; } これは、0以上999以下の整数を入力させて11回以内にランダムで 入力した値を当てさせるゲームです。 質問内容としては 「0以上999以下」→「-999以上999以下」に変更するにはどうすれば よいかです。 一部、「-999以上999以下」の値を入力してくださいとなっていますが 結局わからずにそのままになっているためです。 よろしくお願いいたします。

  • C言語 構造体でつまずいています

    以下、番号と点数を入力して構造体配列に入力し、番号に0が入力されたら、入力処理をやめ、平均点を表示するプログラムです。  今のコードでは、最初から番号に0を入力すると、0除算になりエラーになります。どうすれば良いのでしょうか? #include <stdio.h> #define MAX 50 //配列の要素数を定義 int count=0; //グローバル変数 struct data { //構造体の定義 int num; //メンバの宣言 int ten; }; void nyuryoku(struct data *); //プロトタイプ宣言 float heikin(struct data *); //プロトタイプ宣言 void main() { struct data score[MAX]; //構造体の宣言 printf("**学生番号/点数入力**\n"); printf("\n"); nyuryoku(score); //nyuryoku関数呼び出し printf("\n**以上%d名の平均点:%0.1f点**\n",count,heikin(score)); //heikin関数の戻り値表示 } //nyuryoku関数 //機能:構造体配列にデータを入力する void nyuryoku(struct data *pd) //仮引数pdに構造体ポインタが渡る { int i; for(i=0;i<MAX;i++){ printf("学生番号>>"); scanf("%d",&pd->num); if(pd->num==0){ //学生番号に0を入力するとループを抜ける break; } printf("点  数>>"); scanf("%d",&pd->ten); count++; //人数のカウント pd++; //構造体配列を一つずらす } } //heikin関数 //機能:構造体配列の点数の平均を計算、戻り値として返す float heikin(struct data *pd) //仮引数pdに構造体ポインタが渡る { int i; int sum=0; float ave=0; for(i=0;i<MAX;i++){ if(pd->num==0){ break; } else{ sum+=pd->ten; //点数を加算 pd++; } } ave=(float)sum/count; //平均値を求める return(ave); //平均値を戻り値として返す }

  • 関数について

    いつも、お世話になっています。 また、教えてもらえないでしょうか? printf("count%d\n", count);では、カウントしているのですが、 mainに戻ったときに、 printf("登録件数%d\n", max_syain); では 0 でかえってきます。 何故なんでしょうか? 教えてください。 int SYAINTOUROKU(syain data[], int syain_num) { int count = syain_num; int touroku_repeat; while (1){ if(count > MAX_NUMBER){ return 0; } syaintouroku(data, count); count++; sortID(data, count); write_syainfile(data, count); scanf("%d", &touroku_repeat); printf("count%d\n", count); if(touroku_repeat == 0) break; } return (count); } int main(void) { syain meibo[MAX_NUMBER] = {{0x00} ,{0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00} ,{0x00}, {0x00}}; int max_syain = 0; SYAINTOUROKU(meibo, max_syain); printf("登録件数%d\n", max_syain); return 0; }

  • ポインタ渡しについて

    関数の引数をint型のポインタで出力し、その関数を呼び出し側で値を取得するにはどうしたらいいのでしょうか? 一応ソースを作成しました(下記参照)が、ほしい値が出てきません。 よろしくお願い致します。 ----------------------------------------------- #include <stdio.h> int check(int *num){ int n=10; num = &n; return 0; } int main() { int m_num; check(&m_num); printf("%d\n",m_num); return 0; } ----------------------------------------- m_numに、10が格納されません。 check()でアドレス渡しをしたのですが・・・。 どうすれば、main関数で、数値を扱うことが出来ますか? よろしくお願い致します。

  • このプログラム見てください

    これで動いたと書いてあるのに動きません。 どこを直せば良いのか教えてください。 #include <stdio.h> int combination(int n,int r){ if ( r==0 ){ return 1; }else if( r==n ){ return 1; }else{ return (combination(n-1,r-1)+combination(n-1,r)); } } int main(){ int num_n=0; int num_r=0; int answer=0; printf("組み合わせの計算をします。数値を入力してください。N=?。\n"); printf("[n]:"); scanf("%d",&num_n); rewind(stdin); printf("[r]:"); scanf("%d",&num_r); rewind(stdin); answer=combination(num_n,num_r); printf("%dC%d=%d\n" , num_n, num_r, answer); return 0; }

  • ブラックジャック

    朝からブラックジャックに似たゲームでプログラムを作っています。 朝もこのページの方々にお世話になりました。 ありがとうございます。 そして終盤のにちかづき、〔プレーヤー〕が1と0以外の数字を 入力したときに、〔もう一度入力してください。〕と表示し、また 入力画面が表示されるようにしましたが、コンパイルのときに エラーがでます。 こちらがソースです。 本当に困っています。助けてください。 お願いします!! #include <stdio.h> #include <stdlib.h> int dice(void); int dice2(void); int dice3(void); int dice4(void); int dice5(void); main() { do{ int x=0,y=0,z=0,v=0,point=0,nyuryoku1,w=0,point2=0,point3=0,nyuryoku2=0; printf("ゲームを開始します。\n"); printf("\n"); printf("カードを配ります。\n"); /*関数代入*/ srand(time(NULL)); x=dice(); y=dice2(); z=dice3(); w=dice4(); srand(time(NULL)); v=dice5(); point=y+z; printf("デイーラー>カードは%d と??です。\n",x); printf("プレーヤー>カードは%d と%d です。ポイントは%dです。\n",y, z,point); printf("\n"); printf("プレーヤーの番です。\n"); /*プレーヤー*/ while(point<=21){ srand(time(NULL)); printf("ヒットorスタンド??[ヒット=1;スタンド=0]\n"); scanf("%d",&nyuryoku1); v=dice5(); point=point+v; if(nyuryoku1==1){printf("カードは%d ポイントは%d\n",v,point);} if(nyuryoku1==0){break;} else{ while(nyuryoku1!=90){ printf("入力が正しくありません。もう一度入力してください。\n"); printf("ヒットorスタンド??[ヒット=1;スタンド=0]\n"); scanf("%d",&nyuryoku1); v=dice5(); point=point+v; if(nyuryoku1==1){printf("カードは%d ポイントは%d\n",v,point); break;} if(nyuryoku1==0)break; }} if(point>21){ printf("プレーヤーのポイントは%d\n",point); printf("プレーヤーの負けです。\n"); printf("終了します。\n"); } /*デイーラー*/ printf("デイーラーの番です。\n"); point2=x+w; printf("デイーラー> カードは%d と%d です。ポイントは%dです。\n",x, w,point2); while(point2<17){ point2=point2+v; printf("デイーラー>カードは%d ポイントは%d\n",v,point2); } printf("プレーヤーのポイントは%d、デイーラーのポイントは%d。\n", point,point2); /*結果判定*/ if(point>point2){ printf("プレーヤーの勝ちです。\n"); } if(point<point2){ printf("デイーラーの勝ちです。\n"); } if(point==point2){ printf("引き分けです。\n"); } /*ゲームを続けるか?*/ printf("ゲームを続けますか?[続行=1:終了=0]\n"); scanf("%d",&nyuryoku2); if(nyuryoku2==0){printf("ゲームを終了しました。\n"); break;} }while(nyuryoku2==1); return 0; } /*関数定義*/ int dice(void){ return 1+(rand() % 10); } int dice2(void){ return 1+(rand() % 10); } int dice3(void){ return 1+(rand() % 10); } int dice4(void){ return 1+(rand() % 10); } int dice5(void){ return 1+(rand() % 10); }

  • 数字を当てさせるゲームについて

    #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void) { int limit=0; int no; /*当てさせる値*/ int num; /*入力する値*/ int max=9; srand(time(NULL)); no=rand()%1000; do{ printf("あと%d回入力できます。数字を入力してください。\n",max-limit); scanf("%d",&num); limit++; if(num>no) { printf("大きいです。\n"); } else if(num<no) { printf("小さいです。\n"); } }while(num!=no || limit<max) if(num==no) { printf("正解です。"); printf("%d回で当たりました。",limit); } else { printf("残念ながら不正解です。") } return 0; } これは、0以上999以下の整数を入力させて9回以内にランダムで 入力した値を当てさせるゲームです。 質問内容としては 当てさせる数字を「0以上999以下の数字」→「0以上999以下の3の倍数」に変更するにはどうすればよいかです。 よろしくお願いいたします。

  • ポインタのポインタ

    こんにちは。 C言語の「ポインタのポインタ」の学習中なのですが、以下のプラグラムがエラーが出てしまします。 if文が間違っていると思うのですが、具体的に何がどう間違っているのがわかりません。 ご教示お願いいたします! #include<stdio.h> int main(void) { int date = 300; int *pdate = NULL; int **ppdate = NULL; printf("dateの値は%d<\n", date); pdate = &date; printf("*pdateの値は%d<\n", *pdate); if(**ppdate = NULL){ printf("**ppdateには何も与えられていません。\n"); } else{ return 0; } ppdate = &pdate; if(**ppdate == 300){ printf("**ppdateの値は%dになりました。正常です。\n", **ppdate); } /*強制終了を避けるためのプログラム*/ int i; scanf("%d", &i); return 0; }

  • Cのポインタについて(関数への値渡し)

    C言語のポインタに関する質問です。関数に引数を渡す方法として以下の誤ったswap関数でなぜだめなのかいまいち得心できません。わかりやすくかみくだいて説明していただけると有り難いです。 できましたら、トレースともうしますか、変数の値の動きを詳細に段階的にプログラムの流れに沿って追っていって、だからこうなんだよ、みたいな解説がいただけたら有り難いです。わがままいってすみません。 /* 誤ったswap関数の宣言 */ void swap(int x, int y); int main(void) { int num1 = 5; int num2 = 10; printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); printf("変数num1とnum2の値を交換します。¥n", num1); swap(num1, num2); printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); return 0; } /* 誤ったswap関数の定義 */ void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } ---------- /* swap関数の宣言 */ void swap(int *pX, int *pY); int main(void) { int num1 = 5; int num2 = 10; printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); printf("変数num1とnum2の値を交換します。¥n", num1); swap(&num1, &num2); printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); return 0; } /* swap関数の定義 */ void swap(int *pX, int *pY) { int tmp; tmp = *pX; *pX = *pY; *pY = tmp; }

  • モジュール分割とユーザ関数

    c言語初心者です。 ユーザー関数を作って、下記のプログラムをどのようにモジュール分割すればいいと思いますか。教えてください。 //n進数の四則演算 #include <stdio.h> void main() { int ch; /* 入力文字ワーク */ int ntype = 0; /* n進数 */ int num1 = 0; /* 数値1 */ int op; /* 演算子 */ int num2 = 0; /* 数値2 */ int ans; /* 演算結果 */ printf("\nInput n(numeral type 2-16)\n"); while ((ch = getchar()) != '\n') { if (ch >= '0' && ch <= '9') { ntype = ntype * 10 + ch - '0'; } else { printf("Numeral type incorrect! 01\n"); return; } } if (ntype < 2 || ntype > 16) { printf("Numeral type incorrect! 02\n"); return; } printf("\nInput numeral1\n"); if ((ch = getchar()) == '\n') { printf("Numeral1 incorrect!\n"); return; } while (ch != '\n') { if (ntype <= 10) { if (ch >= '0' && ch <= '9' - (10 - ntype)) { num1 = num1 * ntype + ch - '0'; } else { printf("Numeral1 incorrect! 03\n"); return; } } else { if (ch >= '0' && ch <= '9') { num1 = num1 * ntype + ch - '0'; } else { if (ch >= 'a' && ch <= 'f' - (16 - ntype)) { num1 = num1 * ntype + ch - 'a' + 10; } else { printf("Numeral1 incorrect 04!\n"); return; } } } ch = getchar(); } printf("\nInput operator\n"); op = getchar(); if (op != '+' && op != '-' && op != '*' && op !='/') { printf("Operator incorrect! 05\n"); return; } if (getchar() != '\n') { printf("Operator incorrect! 06\n"); return; } printf("\nInput numeral2\n"); if ((ch = getchar()) == '\n') { printf("Numeral2 incorrect! 07\n"); return; } while (ch != '\n') { if (ntype <= 10) { if (ch >= '0' && ch <= '9' - (10 - ntype)) { num2 = num2 * ntype + ch - '0'; } else { printf("Numeral2 incorrect! 08\n"); return; } } else { if (ch >= '0' && ch <= '9') { num2 = num2 * ntype + ch - '0'; } else { if (ch >= 'a' && ch <= 'f' - (16 - ntype)) { num2 = num2 * ntype + ch - 'a' + 10; } else { printf("Numeral2 incorrect! 09\n"); return; } } } ch = getchar(); } switch (op) { case '+': ans = num1 + num2; break; case '-': ans = num1 - num2; break; case '*': ans = num1 * num2; break; case '/': if (num2 == 0) { printf("\nCan't divide by 0\n"); return; } ans = num1 / num2; } printf("\nThe answer is %d\n", ans); }