- 締切済み
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... どこがいけないのかな... 教えてください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- php504
- ベストアンサー率42% (926/2160)
getIntegerValues という関数名なんですが Integer って整数です。 関数名からは整数値を得る関数と思われますが内容は実数を得る処理をしたいように感じられます。 やりたいことはどちらでしょうか。 小数を得たいなら関数名を変えましょう。(getFloatValuesとか) それにsizeof(float)*max_berのような整数でやる処理をわざわざfloat型にする意味はありません。
- Tacosan
- ベストアンサー率23% (3656/15482)
ああ, 頭痛が.... どうして _getIntegerValues の引数 num を float * にしているのか. 「float にしなければならない」理由はなんですか? ついでに言うと sscanf の返り値をなぜ double の 1.0 と比較するのか....