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...
どこがいけないのかな... 教えてください。
お礼
回答頂きありがとうございました。返事が遅くなりましてすみません。 実は、回答頂いた内容で > (b)関数が返す値を成功か失敗か(或いはエラーの種類) > だけにする。 > データを返すためのポインタを引数として渡してもらい、例えば > int dequeue(BYTE *x) > として、*x = UartSendBuf[Head]; でデータを返します。 この内容に関する意味を理解することができずにいまして、 特にポインタを使っていることで、自分のポインタの知識が乏しいことに気づき”http://dell-support.okwave.jp/qa5507699.html”でこの部分に関して別個に質問させて頂いておりました。 そこで、ポインタについてググッていたら http://www9.plala.or.jp/sgwr-t/c/sec10.html というページを見つけ、やっと理解することができるようになった気がします。 引数には、”*x = UartSendBuf[Head];”このプログラムで取得したデータを代入したい引数のアドレスを設定していたんですね!! それで、dequeue関数の戻り値は、このキューのステート状態を取得できるし、また同時にデータも取得するためにポインタを使っているんですね。これは便利ですね。 もう少し、ポインタに関する知識をつけたいと思います。