掲示板ランキング  その他  シングル用  セミダブル用  ダブル用  ワイドダブル用  クィーン用  キング用


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7531

コンパイル・実行
投稿者---sin(2007/06/15 18:50:00)


こんにちは、今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;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:コンパイル・実行 7532 Hermit 2007/06/15 21:17:27
<子記事> Re:コンパイル・実行 7533 kolona 2007/06/15 23:51:21
<子記事> Re:コンパイル・実行 7534 rvr_driver 2007/06/16 00:18:17


No.7532

Re:コンパイル・実行
投稿者---Hermit(2007/06/15 21:17:27)


main()関数か、WinMain() 関数がありませんが、
それで実行出来る様に本に書いてありますか?


この投稿にコメントする

削除パスワード

No.7533

Re:コンパイル・実行
投稿者---kolona(2007/06/15 23:51:21)


><pre>こんにちは、今c言語ポインタ完全制覇という本で勉強しているのです
が、read_line.c(P228〜P231)のプログラムがコンパイル・実行できないので
すが、何故でしょう?

そりゃそうですよ。p228のread_line関数は、p216で作ったread_slogan()関数の、改訂版のread_line()関数(p218)の、
さらに改訂版(ダブルポインタを用いて関数側でメモリを確保するように改良)ですから。
だから、p216のmain()関数のような呼び出し元がないとだめです。


この投稿にコメントする

削除パスワード

No.7534

Re:コンパイル・実行
投稿者---rvr_driver(2007/06/16 00:18:17)


C言語ポインタ完全制覇の著者前橋氏のホームページで
直接本人に質問してみるのもいいかもしれないですね。

K.Maebashi's home page


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ