|
こんにちは、今c言語ポインタ完全制覇という本で勉強しているのです
が、read_line.c(P228〜P231)のプログラムがコンパイル・実行できないので
すが、何故でしょう?よろしくお願いします。
コンパイラはgccでOSはWindowsXP Home Editionを使っています。
c言語ポインタ完全制覇のホームページからソースをダウンロードしたとこ
ろ本のソースと違っていたのが気になりますが、今回は本の通りにソースを
書きました。
http://kmaebashi.com/seiha/index.html
<メッセージ1>
最初read_line.hとread_line.cを同じフォルダに入れてコンパイルしたら以
下のようなメッセージが出ました。
$gcc read_line.c
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libcygwin.a(libcmain.o):(.text+0xab):
undefined reference to `_WinMain@16'
collected returned 1 exit status
<メッセージ2>
c\cygwin\usr\includeのフォルダにread_line.hをコピーしてコンパイルし
てみましたところ、同じエラーが出ました。
ソースここから↓
<read_line.h>
#ifndef READ_LINE_H_INCLUDE
#define READ_LINE_H_INCLUDE
#include<stdio.h>
typedef enum{
READ_LINE_SUCCESS, /*正常に1行読み込んだ*/
READ_LINE_EOF, /*ファイルの終端まで読み込んだ*/
READ_LINE_OUT_OF_MEMORY /*メモリが足りなくなって失敗した*/
}ReadLineStatus;
ReadLineStatus read_Line(FILE *fp,char **line);
void free_buffer(void);
#endif /*READ_LINE_H_INCLUDE*/
<read_line.c>ソース
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include "read_line.h"
#define ALLOC_SIZE (256)
/*
*行を読み込むバッファ.必要に応じて拡張される.縮むことはない.
*free_buffer()の呼び出しで解放される.
*/
static char *st_line_buffer=NULL;
/*
*st_line_bufferの先に割り当てられている領域のサイズ.
*/
static int st_current_buffer_size=0;
/*
*st_line_bufferの中で,現在文字が格納されている部分のサイズ.
*/
static int st_current_used_size=0;
/*
*st_line_bufferの末尾に1文字追加する.
*必要とあれば,st_line_bufferの先の領域を拡張する.
*/
static ReadLineStatus
add_character(int ch)
{
/*
*st_current_used_sizeは必ず1つずつ増えるので,
*いきなり抜かれていることはないはず.
*/
assert(st_current_buffer_size>=st_current_used_size);
/*
*st_current_used_sizeがst_current_buffer_sizeに追い付いたら,
*バッファを拡張する.
*/
if(st_current_buffer_size==st_current_used_size){
char *temp;
temp=realloc(st_line_buffer,
(st_current_buffer_size+ALLOC_SIZE)
*sizeof(char));
if(temp==NULL){
return READ_LINE_OUT_OF_MEMORY;
}
st_line_buffer=temp;
st_current_buffer_size+=ALLOC_SIZE;
}
/*バッファの末尾に1文字追加*/
st_line_buffer[st_current_used_size]=ch;
st_current_used_size++;
return READ_LINE_SUCCESS;
}
/*
*バッファを解放する.別に呼ばなくてもさしつかえはないけれど,
*「プログラム終了時には,malloc()した領域は全部free()しておきたい」
*という人は,最後にこれを呼べばよい.
*/
void free_buffer(void)
{
free(st_line_buffer);
st_line_buffer=NULL;
st_current_buffer_size=0;
st_current_used_size=0;
}
/*
*fpから1行読み込む.
*/
ReadLineStatus read_line(FILE *fp,char **line)
{
int ch;
ReadLineStatus status=READ_LINE_SUCCESS;
st_current_used_size=0;
while((ch=getc(fp))!=EOF){
if(ch=='\n'){
status=add_character('\0');
if(status!=READ_LINE_SUCCESS)
goto FUNC_END;
break;
}
status=add_character(ch);
if(status!=READ_LINE_SUCCESS)
goto FUNC_END;
}
if(ch==EOF){
if(st_current_used_size>0){
/*最後の行の後に改行がなかった場合*/
status=add_character('\0');
if(status!=READ_LINE_SUCCESS)
goto FUNC_END;
}else{
status=READ_LINE_EOF;
goto FUNC_END;
}
}
*line=malloc(sizeof(char)*st_current_used_size);
if(*line==NULL){
status=READ_LINE_OUT_OF_MEMORY;
goto FUNC_END;
}
strcpy(*line,st_line_buffer);
FUNC_END:
if(status!=READ_LINE_SUCCESS&&status!=READ_LINE_EOF){
free_buffer();
}
return status;
}
|