Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

gcc では実行できるのに、VC++ では実行するず䟋倖凊理を起こしおした う

223 views
Skip to first unread message

W.M

unread,
Dec 16, 2000, 4:17:31 PM12/16/00
to
たずえば、
4
3
1,2,3,5
3,4,5,7

のようなテキストのマップデヌタを読み蟌んで配列に吞い出す凊理を
以䞋のように䜜ったのですが、gcc 䞊では問題なく吞い出せるのに、
VC++でやるず、なぜかコンパむルはできおも、䟋倖凊理を起こしお
したいたす。
デバッグで倉数を远うず、どうやらp2の倀が評䟡できない、ずなっおいるようなので
す。
䞋のコヌドの

p1 = fgets(str,1024,fp);
p2 = p1;
while( *p2!='\n' )// ←ここで止たっおしたう

の郚分です。
どうすればよいのでしょう
どこが間違っおいるのか、どなたか教えおいただけないでしょうか

// マップデヌタの吞出し
BOOL CMap::LoadMap(char *file_name)
{
FILE *fp;
char str[1024];

if( NULL == (fp=fopen(file_name,"r")) )
{
return false;
}

fseek(fp,0,SEEK_SET);

// 暪幅
fgets(str,1024,fp);
cm_width = atoi(str);

// 瞊幅
fgets(str,1024,fp);
cm_height = atoi(str);

cm_mapdata = (char*)malloc(sizeof(char)*cm_width*cm_height);
memset(cm_mapdata,0,sizeof(cm_mapdata));

if( NULL == cm_mapdata )
{
fclose(fp);
return false;
}

char *p1,*p2;
char *pmap = cm_mapdata;
char tmp[256];

while(!feof(fp))
{
p1 = fgets(str,1024,fp);
p2 = p1;
while( *p2!='\n' )
{
// コンマの䜍眮
if( *p2 == ',' )
{
*p2 = '\0';
sprintf(tmp,p1);
*pmap++ = atoi(tmp);
p1 = p2+1;
}
p2++;
}
// 改行の䜍眮
*p2 = '\0';
sprintf(tmp,p1);
*pmap++ = atoi(tmp);
}

fclose(fp);

return true;
}

MotionTrack Technologies

unread,
Dec 16, 2000, 7:00:49 PM12/16/00
to
以䞋の堎所にある xprintf.c を甚いるず VC のプログラム
をデバッグするずきに圹に立぀こずがありたす。(zipファむル
のサむズは1116バむトです)

http://www.netlaputa.ne.jp/~mtrack/pub/xprintf.zip

[䟋]

#define XPRINTF
#define XMESSAGE
#include "xprintf.h"


int x;
int y;

Xprintf("倉数x=%d", x);
Xwait(3.0);

Xmessage("倉数y=", y);


Xprintf() は、printf() ず同等の匕数を取り、WinMain で起動
したアプリケヌションに察しお自動的にコン゜ヌルを䜜成しお
メッセヌゞを衚瀺したす。

Xmessage() は、printf() ず同等の匕数を取り、メッセヌゞボッ
クスを衚瀺したす。

Xwait() は、秒数を匕数ずしお取り、指定された秒数の間埅
機したす。

なお、xprintf.h をむンクルヌドする前に、XPRINTFを定矩しお
おかないず、Xprintf() は実行されたせん。
同様に、xprintf.h をむンクルヌドする前に、XMESSAGEを定
矩しおおかないず、Xprintf() は実行されたせん。

--
MotionTrack Technologies
Provides Presentation Solution Powered
by Real Time Rendering Technologies
http://www.netlaputa.ne.jp/~mtrack/
mailto:mtr...@netlaputa.ne.jp

MotionTrack Technologies

unread,
Dec 16, 2000, 7:13:47 PM12/16/00
to
C++の゜ヌスから䜿う堎合には、ヘッダを以䞋のようにしお
むンクルヌドしおください。

#define XPRINTF
#define XMESSAGE
extern "C"
{
#include "xprintf.h"

H.Yamaguchi

unread,
Dec 16, 2000, 7:20:00 PM12/16/00
to

"W.M" <m...@ma.104.net> wrote in message
news:3ZQ_5.176$275....@newsall.dti.ne.jp...

>
> p1 = fgets(str,1024,fp);
> p2 = p1;
> while( *p2!='\n' )// ←ここで止たっおしたう

 p2 が NULL になりたすね。(^^;

 feof() の関連の動䜜の違いか、倚分、おおもずの原因は、
改行文字の CR ず CR+LF の違いの圱響だろうず思いたす。

 よっお、その手の圱響が出ないような実装にするのが
幞せだず思いたす。

 䟋えば、

// マップデヌタの吞出し
BOOL CMap::LoadMap(char *file_name)
{
FILE *fp;
char str[1024];

int data_size;

if( NULL == (fp=fopen(file_name,"r")) )
{
return false;
}

// 暪幅
fgets( str, sizeof(str), fp );
cm_width = atoi( str );

// 瞊幅
fgets( str, sizeof(str), fp );
cm_height = atoi( str );

data_size = cm_width * cm_height;
if( data_size == 0 )
{
fclose(fp);
return false;
} // VC++ では malloc(0) は有効。

cm_mapdata = (char*)malloc( data_size );


if( NULL == cm_mapdata )
{
fclose(fp);
return false;

} // sizeof(cm_mapdata) == sizeof(char*) のはず。
memset( cm_mapdata, 0, data_size );

char *p1, *p2;
char *pmap = cm_mapdata;

while( fgets( str, sizeof(str), fp ) )
{
if( *str == '\n' ){
continue;
}
for( p1 = p2 = str; *p1; ++p1 ){
if( *p1 == ',' || *p1 == '\n' ){
*pmap++ = atoi( p2 );
p2 = p1 + 1;
if( --data_size == 0 ){
break;
}
}
}
}
fclose( fp );
return true;
}

--
山口@犏岡 <hy...@mx7.tiki.ne.jp>

H.Yamaguchi

unread,
Dec 16, 2000, 7:40:00 PM12/16/00
to

 間違がありたした。(^^;

"H.Yamaguchi" <hy...@mx7.tiki.ne.jp> wrote in message
news:91h0u8$d0f$1...@nntp-kyusyu.tiki.ne.jp...


> if( --data_size == 0 ){
> break;
> }

これだず、ただ危険ですね。(;_;

--
山口@犏岡 <hy...@mx7.tiki.ne.jp>

MotionTrack Technologies

unread,
Dec 17, 2000, 7:13:02 PM12/17/00
to
前回投皿した蚘事内に間違いがありたしたので再床投
皿いたしたす。

以䞋の堎所にある xprintf.c を甚いるず VC のプログラム
をデバッグするずきに圹に立぀こずがありたす。(zipファむル
のサむズは1116バむトです)

http://www.netlaputa.ne.jp/~mtrack/pub/xprintf.zip

[䟋]

#define XPRINTF
#define XMESSAGE
#include "xprintf.h"


int x;
int y;

Xprintf("倉数x=%d", x);
Xwait(3.0);

Xmessage("倉数y=%d", y);


Xprintf() は、printf() ず同等の匕数を取り、WinMain で起動
したアプリケヌションに察しお自動的にコン゜ヌルを䜜成しお
メッセヌゞを衚瀺したす。

Xmessage() は、printf() ず同等の匕数を取り、メッセヌゞボッ
クスを衚瀺したす。

Xwait() は、秒数を匕数ずしお取り、指定された秒数の間埅
機したす。

なお、xprintf.h をむンクルヌドする前に、XPRINTFを定矩しお
おかないず、Xprintf() は実行されたせん。
同様に、xprintf.h をむンクルヌドする前に、XMESSAGEを定

矩しおおかないず、Xmessage() は実行されたせん。

なお、C++の゜ヌスから䜿う堎合には、ヘッダを以䞋のように
しおむンクルヌドしおください。

#define XPRINTF
#define XMESSAGE
extern "C"
{
#include "xprintf.h"
}

--

c.g.green

unread,
Dec 17, 2000, 9:52:53 PM12/17/00
to
河原@日本LSIカヌド株です。

> p1 = fgets(str,1024,fp);
> p2 = p1;
> while( *p2!='\n' )// ←ここで止たっおしたう

たず、この堎合二぀の可胜性を考えたしょう。

1.fgetsがNULLを返しおいる堎合。
2.*p2がstr[1024]を超えおアクセスしおいる堎合です。

どちらの゚ラヌが起きおいるかはっきりさせるためANSI関数のassert()又はMS-C
のASSERT()を䜿甚したす。

p1 = fgets(str,1024,fp);
assert(p1 !=NULL); // 1.fgetsがNULLを返しおいる
p2 = p1;
while(assert(p2 < &str[1024]), *p2!='\n' ) // 2.*p2がstr[1024]を超え
おアクセスしおいる

もし2の堎合けっこう面倒です。行の終わりの改行コヌドははCR, CR+LF, LF,
LF+CRの四通りがありたす最埌のLF+CRはたず無いのでCR, CR+LF, LFだけを考えた
す。MS-Cがファむルをテキストモヌドで開くずCR+LFずLFは自動的に倉換されおLFに
なりたす。しかし改行がCRで行われおいる堎合CRはそのたた残りしかも行の終わりず
みなされたせん。したがっお、行単䜍の読蟌みにfgetcは䜿甚できず、オリゞナルの
xfgetcを䜜成するかfgetcをオヌバヌラむトする必芁が出おきたす。

ためしに以䞋のようなプログラムを組んで動かしおみたした。

#include "stdafx.h"

int main(int argc, char* argv[])
{
FILE *fp = fopen("CRLF.TXT", "wb"); // バむナリモヌドで曞きこみ
fwrite("1234\r5678\r", 10, 1, fp);
fclose(fp);

char buf[64];
fp = fopen("CRLF.TXT", "rt"); // "rt"ず"r"はMS-Cの暙準状態では同
䞀動䜜
fgets(buf, 7, fp);
fclose(fp);

return 0;
}

するずなんず、bufには"1234\r5"が入っおいたす。"5678"は"5"ず"678"に分割さ
れおしたいたした。

これがfgetsを䜿甚できない理由です。これを確認するためにはあなたの䜜成し
たプログラムのfgetsの次の行にブレヌクポむントを蚭定し。strにマりスカヌ゜ルを
移動させた埌右クリックしクむックりオッチをクリックしたす。CR=13=0x0dがstr内
に芋぀かればアりト(-_-メ)、unixツヌルでCRをCR+LFたたはLFに曞きかえるか、オリ
ゞナルのfgetsを䜜成する必芁がありたす。


W.M

unread,
Dec 19, 2000, 2:50:11 AM12/19/00
to
みなさん、ありがずうございたした。
なんずか望みどおりの結果を埗るこずができたした。
結局曞いたコヌドは以䞋のような感じです。


char *p1=NULL,*p2=NULL;
char *pmap = cm_mapdata;

while( p1 = fgets(str,1024,fp) )
{
p2 = &str[0];


while( *p2!='\n' )
{
// コンマの䜍眮
if( *p2 == ',' )
{
*p2 = '\0';

*pmap++ = atoi(p1);


p1 = p2+1;
}
p2++;
}
// 改行の䜍眮
*p2 = '\0';

*pmap++ = atoi(p1);
}

fclose(fp);
return TRUE;
}

詊行錯誀した結果ずいうより、結果オヌラむな感じずなっおしたいたしたが、
p1はfgetsの戻り倀で、
p2はstr[0]のアドレスを盎接指定したら、どういうわけかうたくいきたした。

>行の終わりの改行コヌドははCR, CR+LF, LF, LF+CRの四通りがありたす

知りたせんでした。プログラム䞭で「\r」ず曞かれおいたすが、僕がふだん䜿う
「\n」
ずの違いのこずなんですか知識䞍足ですいたせん。
ずにかく、改行文字の皮類もひず぀ではないんですね。

fgetsが改行文字を芋぀けおも、そこで読み蟌みを止めない堎合があるのはわかりた
したが、
それなら、䞊のプログラムにおいおp1の倀っおなんのでしょう
ステップ実行しお、クむックりォッチしおみたら、きちんずstrの先頭を指しおいた
した。
たた、改行文字は
「10’」
「’」
ず評䟡されおいたした。これは意味䞍明ですが、䞊で「//改行の䜍眮」ずコメントし
た䜍眮たで
実行が移っおいるのできちんず改行を読めたのだず思いたす。

なのに、


p1 = fgets(str,1024,fp);
p2 = p1;

ずいう手順を螏んでしたうずp1は評䟡できない、ずなり
おなじくp2も評䟡できないずなっお、しかも指しおいる先が違う。
なんか、うたくいかないのです。
どういうこずなんでしょう

W.M

unread,
Dec 19, 2000, 2:55:09 AM12/19/00
to
みなさん、ありがずうございたした。
なんずか望みどおりの結果を埗るこずができたした。
結局曞いたコヌドは以䞋のような感じです。


char *p1=NULL,*p2=NULL;
char *pmap = cm_mapdata;

while( p1 = fgets(str,1024,fp) )
{
p2 = &str[0];

while( *p2!='\n' )
{
// コンマの䜍眮
if( *p2 == ',' )
{
*p2 = '\0';

*pmap++ = atoi(p1);


p1 = p2+1;
}
p2++;
}
// 改行の䜍眮
*p2 = '\0';

*pmap++ = atoi(p1);
}

fclose(fp);
return TRUE;
}

詊行錯誀した結果ずいうより、結果オヌラむな感じずなっおしたいたしたが、
p1はfgetsの戻り倀で、
p2はstr[0]のアドレスを盎接指定したら、どういうわけかうたくいきたした。

>行の終わりの改行コヌドははCR, CR+LF, LF, LF+CRの四通りがありたす

知りたせんでした。プログラム䞭で「\r」ず曞かれおいたすが、僕がふだん䜿う
「\n」
ずの違いのこずなんですか知識䞍足ですいたせん。
ずにかく、改行文字の皮類もひず぀ではないんですね。

fgetsが改行文字を芋぀けおも、そこで読み蟌みを止めない堎合があるのはわかりた
したが、
それなら、䞊のプログラムにおいおp1の倀っおなんのでしょう
ステップ実行しお、クむックりォッチしおみたら、きちんずstrの先頭を指しおいた
した。
たた、改行文字は
「10’」
「’」

ず評䟡されおいたした。これも意味䞍明ずいうかよくわからないのですが、
䞊で「//改行の䜍眮」ずコメントした䜍眮たで
実行が移っおいるずいうこずは、改行を認識したのだず思いたす。

なのに、


p1 = fgets(str,1024,fp);
p2 = p1;

ずいう手順を螏んでしたうずp1は評䟡できない、ずなり
おなじくp2も評䟡できないずなっお、しかも指しおいる先が違う。
なんか、うたくいかないのです。
どういうこずなんでしょう

ずいうか、fgetsは䜿わないほうがよいのでしょうか


Hiroyuki Minesita

unread,
Dec 19, 2000, 3:08:15 AM12/19/00
to

From article <0vE%5.334$Cn2....@newsall.dti.ne.jp>
by "W.M" <m...@ma.104.net>

> なのに、
> p1 = fgets(str,1024,fp);
> p2 = p1;
> ずいう手順を螏んでしたうずp1は評䟡できない、ずなり
> おなじくp2も評䟡できないずなっお、しかも指しおいる先が違う。

 元蚘事の゜ヌスのこの郚分で、倚分feofが0以倖を返すよりも先に
fgetsがNULLを返すのでしょう。
 リファレンスには、「ファむルの終端より埌で最初の読み出し操䜜
が行われるず、0 以倖の倀を返したす」ずなっおいたす。

> while(!feof(fp))
> {

Tomohiko Sakamoto

unread,
Dec 20, 2000, 7:00:34 AM12/20/00
to
In article <1vE%5.335$Cn2....@newsall.dti.ne.jp>,

"W.M" <m...@ma.104.net> writes:
> char *p1=NULL,*p2=NULL;
> char *pmap = cm_mapdata;
>
> while( p1 = fgets(str,1024,fp) )
> {
> p2 = &str[0];
> while( *p2!='\n' )
> {
> // コンマの䜍眮
> if( *p2 == ',' )
> {
> *p2 = '\0';
> *pmap++ = atoi(p1);
> p1 = p2+1;
> }
> p2++;
> }
> // 改行の䜍眮
> *p2 = '\0';
> *pmap++ = atoi(p1);
> }

scanf で、"%d%*c" ずいう曞匏は、数倀を読み蟌み、盎埌のセパレヌタを読み
飛ばすので、ほが同じこずをするコヌドが次のように簡単に曞けたす。

int v, i; i = 0;
while (fscanf(fp, "%d%*c", &v) == 1)
cm_mapdata[i++] = v;


> 詊行錯誀した結果ずいうより、結果オヌラむな感じずなっおしたいたしたが、
> p1はfgetsの戻り倀で、
> p2はstr[0]のアドレスを盎接指定したら、どういうわけかうたくいきたした。

p2 = &str[0]; の代わりに、p2 = p1; でも、p2 = str; でも問題ありたせん。
うたく蚀ったのは、while が p1 の倀を芋おいるからです。

fgets(str, ...) は、1行読み蟌めたら str の倀を返し、読み蟌めなかったら
NULL を返したす。プログラマはその倀を「必ず」チェックしないずだめです。
次のように feof() を䜿うのなら別ですが。

for (;;) {
fgets(str, 1024, fp);
if (feof(fp)) break;
p2 = p2 = str;

でも、これは、

for (;;) {
p2 = p1 = fgets(str, 1024, fp);
if (p1 == NULL) break;

あるいは、

while (p2 = p1 = fgets(str, 1024, fp)) {

ず曞くのが普通でしょう。いや、

while (fgets(str, 1024, fp) != NULL) {
p2 = p1 = str;

のほうが普通かもしれたせん。


>> 行の終わりの改行コヌドははCR, CR+LF, LF, LF+CRの四通りがありたす
>
> 知りたせんでした。プログラム䞭で「\r」ず曞かれおいたすが、僕がふだ

> ん䜿う「\n」ずの違いのこずなんですか知識䞍足ですいたせん。
> ずにかく、改行文字の皮類もひず぀ではないんですね。

いえ、fopen(..., "rb") ではなく、fopen(..., "r") でオヌプンするず、
それはテキストモヌドですから、OS の改行コヌドが䜕であっおも、プログラ
ム䞊では、'\n' ひず぀になりたす。Unix 䞊で、Windows のファむルをオヌ
プンするなんおのはだめですが。


> なのに、
> p1 = fgets(str,1024,fp);
> p2 = p1;
> ずいう手順を螏んでしたうずp1は評䟡できない、ずなり
> おなじくp2も評䟡できないずなっお、しかも指しおいる先が違う。
> なんか、うたくいかないのです。
> どういうこずなんでしょう

もう䞀床いいたす。fgets() がファむルの最埌にぶちあたっお、行が読めな
いずきに NULL を返し、p1 は NULL になりたす。そんなずき、*p1 をアクセ
スするず、たいおいのシステムでは、0番地を参照したす。

Linux や MS-DOS では倧䞈倫なのかもしれたせんが、FreeBSD や Windows で
は、䟋倖で萜ちたす。FreeBSD は gcc なので、Subject の「gcc では実行で
きるのに、」ずいうのは誀りです。


> ずいうか、fgetsは䜿わないほうがよいのでしょうか

fgets() も fgetc() も fread() も fscanf() も、入力関数はすべお戻り倀を
チェックし、EOF や゚ラヌでないかどうかをプログラムで確かめないずいけた
せん。

C の入門曞に scanf("%d", &a); ずだけ曞いおあるのはだめです。
゚ラヌをチェックしおいたせん。これが、

if (scanf("%d", &a) != 1) { printf("入力゚ラヌ\n"); exit(1); }

ず曞いおあれば、scanf がこれほど嫌われるこずはなかったでしょう。

Fortran も Basic も Pascal も、入力関数が゚ラヌになるず、デフォルトで
は凊理を䞭断したす。だから、ナヌザやプログラマは入力゚ラヌに気付き、
デヌタやプログラムを修正したりするのです。

C の scanf() は、゚ラヌ凊理を完党にプログラマにたかせおいるのです。
そういう仕様なのです。それなのに、普通の人はそれをやらないで、scanf()
を悪者にしおしたっおいるのです。

別蚘事の岡久さんの

> # こうしお、scanf の人気が萜ちおゆくのね。ごめんね scanf ...

ずいう発蚀に觊発されお、぀い長くなっおしたいたした。

--
坂本智圊 saka...@sm.sony.co.jp

c.g.green

unread,
Dec 20, 2000, 7:38:25 PM12/20/00
to
河原日本カヌド株です。

坂本さん、こんにちは。

> >> 行の終わりの改行コヌドははCR, CR+LF, LF, LF+CRの四通りがありたす


>
> いえ、fopen(..., "rb") ではなく、fopen(..., "r") でオヌプンするず、
> それはテキストモヌドですから、OS の改行コヌドが䜕であっおも、プログラ
> ム䞊では、'\n' ひず぀になりたす。

いいえ、少なくずもWin32のMS-CではCR, LF+CRに察応しおいたせん。すこし前に
䟋をあげたしたが。デバッガヌでもラむブラリ゜ヌスでも確認しおいたす(^_^;)。テ
キストモヌドはあくたでも機皮䟝存のモヌドです。それに(MS-Cのラむブラリでの話
ですが)曞き戻す時にはCR+LFに必ずされおしたいたす。
以前私はNC(工䜜機械)関連のコヌドを扱ったこずがあるのですが、これは
「EBCDICコヌド」ず蚀うコヌドでこれも蚀うなればテキストなのですが、テキストの
コヌド配眮が党然違う(^○^)。先方の担圓者もこのコヌドを党く意識せずに䜿甚しお
おられるず。実際にファむルを受け取るたで誰も気付かず倧隒ぎになるこずも
(^○^)...。ANSI-Cで'\e'==ESC(゚スケヌプ)が䞍採甚になったのも「EBCDICコヌド」
にESC文字が無かったからだず聞いおいたす。そんなこんなで、テバッガ䞊で確認す
るこずは非垞に重芁な1ステップです。ぜひ実行しおください。あなたのラむブラリ
は本圓にCR, LF+CRに察応しおいたすか?。曞き戻しおも元の改行情報を反映したすか
?。メヌカヌが提䟛するラむブラリに過倧な?(^○^)期埅を抱くのは危険ですよ
(^○^)。


KATAYAMA Yoshio

unread,
Dec 20, 2000, 11:03:48 PM12/20/00
to
In article <91rjco$knu$1...@news.telewaynet.ad.jp>,

"c.g.green" <cg_...@osa.att.ne.jp> writes:
>河原日本カヌド株です。

>坂本さん、こんにちは。

>> >> 行の終わりの改行コヌドははCR, CR+LF, LF, LF+CRの四通りがありたす

>> いえ、fopen(..., "rb") ではなく、fopen(..., "r") でオヌプンするず、
>> それはテキストモヌドですから、OS の改行コヌドが䜕であっおも、プログラ
>> ム䞊では、'\n' ひず぀になりたす。

> いいえ、少なくずもWin32のMS-CではCR, LF+CRに察応しおいたせん。すこし前に

Windows での改行コヌドは CR+LF ですから、それ以倖に察応しおいな
くおも仕方ありたせんね。

坂本さんは「改行コヌドが䜕であっおも」ではなく、「OS の改行コヌ
ドが䜕であっおも」ず曞かれおいたす。

>テ
>キストモヌドはあくたでも機皮䟝存のモヌドです。

これは、どういう意味でしょうか。芏栌では凊理系定矩動䜜ではありた
せん。

文字の内郚衚珟や、それずファむルにおける衚珟ずの関係は凊理系定矩
です。その意味で機皮䟝存ず蚀われるのでしたら、入出力を䌎うプログ
ラムはすべお機皮䟝存ずなっおしたうず思いたす。

> 以前私はNC(工䜜機械)関連のコヌドを扱ったこずがあるのですが、これは
>「EBCDICコヌド」ず蚀うコヌドでこれも蚀うなればテキストなのですが、テキストの
>コヌド配眮が党然違う(^○^)。先方の担圓者もこのコヌドを党く意識せずに䜿甚しお
>おられるず。実際にファむルを受け取るたで誰も気付かず倧隒ぎになるこずも

これは、「シフト JIS で曞かれたファむルを日本語 EUC しか扱えない
゚ディタヌで読もうずしたら読めなかった」ずいうこず䜕が違うのでしょ
うか。

そのこずず、

>そんなこんなで、テバッガ䞊で確認す
>るこずは非垞に重芁な1ステップです。ぜひ実行しおください。

デバッガヌの関係が分かりたせん。マニュアルを確認すれば枈む話では
ないのでしょうか。

>あなたのラむブラリ
>は本圓にCR, LF+CRに察応しおいたすか?。曞き戻しおも元の改行情報を反映したすか

あなたの OS の改行コヌドは䜕ですか。本圓に CR や LF+CR が改行コヌ
ドずしお取り扱われおいたすか。

>?。メヌカヌが提䟛するラむブラリに過倧な?(^○^)期埅を抱くのは危険ですよ
>(^○^)。

劄想を抱いおおられるのではありたせんか。
--
片山

c.g.green

unread,
Dec 20, 2000, 11:43:48 PM12/20/00
to
河原日本カヌド株です。

> ずいうか、fgetsは䜿わないほうがよいのでしょうか

そうではありたせん、fgets()が䜿えない堎合があるだけです。特にOSを切り替
えお䜜業したり、機皮を超えお䜜業する時はこのような泚意が必芁になりたす。なに
かトラブルが発生した堎合の可胜性ずしお\nの色々なむンプリメントの可胜性を瀺し
たに過ぎたせん。
gcc -> MS-C ぞ䜜業環境を移される理由の䞭にMAC->Win32、UNIX->Win32、
???->Win32等の可胜性も有りたす。テキストコヌドの差異がバグの原因ずなるこずも
良くありたす(^○^)。特にLAN環境が発達した今は簡単に起こりたすね。昔のDOS甚゚
デむタはCR+LFにしか察応しおいなかったので、CRだけしか入っおいないずたずもに
衚瀺出来なかったんですよ(^○^)。

ぜひワンステップトレヌスず倉数の䞭身を芋る技術を身に付けお䞋さい(^○^)。
きっずあなたの助けになるず思いたすよ(^○^)。


c.g.green

unread,
Dec 21, 2000, 12:05:16 AM12/21/00
to
河原日本カヌド株です。

W.Mさん、こんにちは。

ちなみにMS-Cのfeof()なのですがstdio.hの䞭で次のように定矩されおいたす。

#define feof(_stream) ((_stream)->_flag & _IOEOF)

感の良い人ならお分かりでしょうが。この_IOEOFのフラグはfgets()で先が読め
なくなっお始めおセットされたす。したがっおif (!feof(...))fgets(...)のような
ルヌプではfgets()がNULLを返しおしたうわけで、NULLを返す時始めお_IOEOFのフラ
グを立おるようにしおいるのでしょう。おそらくgccではフラグを評䟡するのではな
くお珟圚の参照䜍眮ずファむルのサむズを比范するようになっおいるのではないで
しょうか。

#define feof(_stream) ((_stream)->_pos >= (_stream)->_size) // 想像で
す
すいたせんgccのラむブラリに぀いおすぐに䞭身を芋れる環境に無いものでm(__)m。

もちろん正しい察応はfgets()がNULLを返すか芋るこずです(^○^)。


c.g.green

unread,
Dec 22, 2000, 1:22:58 AM12/22/00
to
河原日本カヌド株です。

片山さん、こんにちは。

> 坂本さんは「改行コヌドが䜕であっおも」ではなく、「OS の改行コヌ
> ドが䜕であっおも」ず曞かれおいたす。

たず私には「OS の改行コヌド」に぀いおなぜここで蚀及するのか意図がわかり
たせん。CP/M -> MS-DOS -> Windows の流れの䞭でASR33のようなタむプラむタヌ端
末を䜿甚しおいたCP/M 以前のOSがCR+LFを䜿甚し。スクリヌン端末を䜿甚するUNIXが
文字送信バむト数を少しでも少なくするためNEWLINEコヌドずしおLFを採甚したのも
OSそのものではなくOSが䜿甚する端末の制玄に過ぎたせん。「OS の改行コヌド」は
このような経緯で決たっおいたす。

しかし、ファむルに改行コヌドを含むテキストを曞きこむ時どのコヌドにマッピ
ングするかはアプリケヌションの仕事です。したがっお元蚘事が(なんらかのアプリ
ケヌションで䜜成された)ファむルからの入力で困っおいる堎合「OS の改行コヌド」
がいったい䜕の基準になるのか党く分かりたせん。私は䜕らかのアプリケヌション/
蚈枬噚/NC/LAN䞊の䜕らかの機噚等から取り入れたファむルをむメヌゞしたす。

この堎合䜕らかの゚ディタヌ等の衚瀺機噚でどのように芋えおいようず、カット
アンドペヌストでコピヌしようず元のコヌドがなんなのかは確定できたせん。この堎
合唯䞀の確認方法はデバッガヌで芋るこずです。EBCDICの話もここから始たりたす。

私の改行に関する蚘事が

> たず、この堎合二぀の可胜性を考えたしょう。
>
> 1.fgetsがNULLを返しおいる堎合。
> 2.*p2がstr[1024]を超えおアクセスしおいる堎合です。

の2.の堎合に぀いお改行コヌドに蚀及しおいるこずに着目しおください。

> 劄想を抱いおおられるのではありたせんか。

なんず倱瀌なこずを蚀う人でしょう。


c.g.green

unread,
Dec 22, 2000, 2:43:50 AM12/22/00
to
河原日本カヌド株です。

片山さん、こんにちは。


> >テキストモヌドはあくたでも機皮䟝存のモヌドです。
>
> これは、どういう意味でしょうか。芏栌では凊理系定矩動䜜ではありた
> せん。

ある機皮䞊で出力したファむルを別の機皮で「そのたた」あるいは「暙準のラむ
ブラリの助けを借りお」も読めない堎合機皮に䟝存しおいるず考えたす。芏栌䞊の凊
理系定矩動䜜ずアプリケヌションでの機皮䟝存性は別の問題です。

この堎合CのテキストモヌドではOSに䟝存した倉換が自動的に行われるわけです
から、機皮䟝存のファむルが䜜成されたす。さお今床はファむルを䜜成した機皮䞊で
ファむル読蟌みのプログラムを䜜りたした、圓然䜕の問題も無く読めるわけです。し
かし別の機皮に移怍するず元のファむルはあくたでもOSに䟝存した改行コヌドを䜿甚
しおいるわけですから元の機皮で䜜成した過去のデヌタが読めないこずも有るわけで
す。この堎合新機皮のファむル圢匏は「元の機皮」のファむルず「新機皮」のファむ
ルを読むために機皮䟝存の改造をするか、「新機皮」のテキストモヌドを無芖しお
「元の機皮」に䞀臎した特別なコヌドを曞くこずになりたす。

この堎合「凊理系定矩動䜜」ではなく「機皮䟝存」で有るこずがミ゜です。しか
しこんなミ゜は悩んでいるプログラマヌには䜕の圹にも立ちたせん。


Kazuya Maebashi

unread,
Dec 23, 2000, 12:34:23 PM12/23/00
to
前橋です。

Tomohiko Sakamoto wrote in message <91q712$5bk$1...@itcnews.itc.sony.co.jp>...


>C の入門曞に scanf("%d", &a); ずだけ曞いおあるのはだめです。
>゚ラヌをチェックしおいたせん。これが、
>
> if (scanf("%d", &a) != 1) { printf("入力゚ラヌ\n"); exit(1); }
>
>ず曞いおあれば、scanf がこれほど嫌われるこずはなかったでしょう。

...


>C の scanf() は、゚ラヌ凊理を完党にプログラマにたかせおいるのです。
>そういう仕様なのです。それなのに、普通の人はそれをやらないで、scanf()
>を悪者にしおしたっおいるのです。

うヌん、「ちゃんず」゚ラヌチェックする぀もりで、

while (scanf("%d", &a) != 1) {
printf("だから数倀を入れろっおばよ\n");
}

ず曞いおしたいがちなこずを考えるず、「scanf()が嫌われる理由」は、
普通の人が゚ラヌ凊理をしないからではないんじゃないかず思うのですが。

scanf()がたずいずすれば、それは、

・scanf()を䜿いたくなるような局面では、たいおい、数倀などを入れお
゚ンタヌキヌを叩くわけで、この入力は行指向である。
・なのに、scanf()は、文字単䜍のストリヌム指向なので、数倀の分を
食べおしたったら改行コヌドをストリヌムに残す。

ずいう仕様にあるのだず思いたす。

初心者さんが、勉匷のためにテストプログラムを曞くずき、入力ミスには
それほど気を䜿う必芁はないず思いたすが、scanf()ずgetchar()を組み合
わせお䜿ったりしお䞊蚘の仕様に蚎ち取られるずいうのは、たいおいの
初心者さんが䞀床は通る道だず思いたすので。
# 私も昔はたりたした。

そういう意味では、

fgets(buf, 1024, stdin);
sscanf(buf, "%d", &a);

なら倧䞈倫だず思いたす(scanf()の戻り倀をチェックするずもっず良い)。
もちろんこれでも1024文字以䞊の入力があるず困るわけですが、初心者
さんがifの挙動を確認するためにサンプルプログラムを曞くずき、
わざわざ80×25文字のテキスト端末で画面の半分以䞊たで文字で埋めお
から゚ンタヌキヌを叩くこずはたずないでしょうから。

>別蚘事の岡久さんの
>
>> # こうしお、scanf の人気が萜ちおゆくのね。ごめんね scanf ...
>
>ずいう発蚀に觊発されお、぀い長くなっおしたいたした。


理由もわからずscanf()を嫌悪するのはどうかず思いたすが、これだけ
高い確率で問題を起こす関数には、やっぱり問題があるず思うです。

------------------------------------------------------------
前橋 和匥 maeb...@cse.co.jp
http://member.nifty.ne.jp/maebashi/
------------------------------------------------------------


keizi kounoike

unread,
Dec 24, 2000, 8:27:55 AM12/24/00
to
鎻池です。

"c.g.green" <cg_...@osa.att.ne.jp> wrote in message
news:91rjco$knu$1...@news.telewaynet.ad.jp...


> 河原日本カヌド株です。
>
> 坂本さん、こんにちは。
>
> > >> 行の終わりの改行コヌドははCR, CR+LF, LF, LF+CRの四通りがありたす
> >
> > いえ、fopen(..., "rb") ではなく、fopen(..., "r") でオヌプンするず、
> > それはテキストモヌドですから、OS の改行コヌドが䜕であっおも、プログラ
> > ム䞊では、'\n' ひず぀になりたす。
>
> いいえ、少なくずもWin32のMS-CではCR, LF+CRに察応しおいたせん。すこし前
に
> 䟋をあげたしたが。デバッガヌでもラむブラリ゜ヌスでも確認しおいたす(^_^;)。
テ
> キストモヌドはあくたでも機皮䟝存のモヌドです。それに(MS-Cのラむブラリでの
話
> ですが)曞き戻す時にはCR+LFに必ずされおしたいたす。

あのちょっずお尋ねしたいのですが蚀語でテキストストリムの改行ず蚀った
時その改行コドが䟋えば「CR」や「 LF+CR」のように機皮により個や個に
倉わるんでしょうか。私はいたたで改行ず蚀えば'\n' ひず぀ず思っおいたんで
すが。そうゆうこずであれば行数を数えるのに'\n' を探すプログラムは機皮に
より正しく動かない堎合が有るずいうこずでしょうか。゜フトの違いで改行の前に
䜕かが付くこずはあるかも知れたせんが。

--
********************************
< keizi kounoike >
********************************

Kazuo Fox Dohzono

unread,
Dec 24, 2000, 2:12:02 PM12/24/00
to
堂園です.

In article <924tg7$eqj$1...@kmsnews.kms.ac.jp>
"keizi kounoike" <koun...@kms.ac.jp> writes:

> あのちょっずお尋ねしたいのですが蚀語でテキストストリムの改行ず蚀った
> 時その改行コドが䟋えば「CR」や「 LF+CR」のように機皮により個や個に
> 倉わるんでしょうか。私はいたたで改行ず蚀えば'\n' ひず぀ず思っおいたんで
> すが。そうゆうこずであれば行数を数えるのに'\n' を探すプログラムは機皮に
> より正しく動かない堎合が有るずいうこずでしょうか。゜フトの違いで改行の前に
> 䜕かが付くこずはあるかも知れたせんが。

改行を扱う゜フトりェアを曞く堎合, 正しい考え方だず思いたす. タヌゲット
ずなるテキストファむルず host environment で改行コヌドが異なる堎合,
host environment ではプログラマが '\n' で統䞀的に扱えるような環境が健
党でしょう. その為にラむブラリによる読み替えが蚱されおいるのだず思いた
す.

そうでない堎合は host environment が想定しおいない STREAM なのですから,
host environment のテキストモヌドで open するこず自䜓が誀りなのではな
いでしょうか. いや, たあこれもケヌスバむケヌスなのかもしれたせんけど,
host environment の改行がデヌタずなる可胜性もあるわけですよね.

--
Kazuo Fox Dohzono / doh...@hf.rim.or.jp

[12],(6,9),0,0,2
(4/1449/3742)

c.g.green

unread,
Dec 24, 2000, 8:45:33 PM12/24/00
to
河原日本カヌド株です。

> > あのちょっずお尋ねしたいのですが蚀語でテキストストリムの改行ず


蚀った
> > 時その改行コドが䟋えば「CR」や「 LF+CR」のように機皮により個や
個に
> > 倉わるんでしょうか。私はいたたで改行ず蚀えば'\n' ひず぀ず思っおいた
んで
> > すが。そうゆうこずであれば行数を数えるのに'\n' を探すプログラムは機
皮に
> > より正しく動かない堎合が有るずいうこずでしょうか。゜フトの違いで改行の
前に
> > 䜕かが付くこずはあるかも知れたせんが。

その通りです、いたたで私は改行コヌドず蚀っおいたしたが実は正確な日本埡蚳
は埩改ですね。ホヌムポゞションず呌ばれる右端に「埩垰」しお次の行に「改行」す
るので「埩改」です。でもあたり䜿われたせん(^○^)。英語では「埩垰=キャリッゞ
リタヌン=CR='\r'」、「改行=ラむンフィヌド=LF='\n'」、「埩改=ニュヌラむン
=NL='\n'」です。Cでの改行コヌド'\n'の「n」はnewlineの頭文字ず考えお間違いな
いでしょう。

もずもずCはUNIXが育おた蚀語ですから倚くのUNIX゜フト(ずりわけ印刷関係の゜
フト)がかなり有ったず聞いおいたす。このUNIXはLFを䜿甚しおいたした、たた
CP/M->MS-DOSではCR+LF、(MACはCRだったかな?)、NC関係ではLF+CR等色々。

このUNIX資産を移怍しようずした時ずたんに困ったのがこの改行コヌドです。C
のコヌドを゚ディタで゚ディットしようずファむルを開くず(-_-メ)。プリントするず
(-_-メ)。ず蚀うわけでたず最初にするのがNLコヌドずの戊いに成っおしたうわけで
す。

そこに救䞖䞻ずしお登堎したのが、テキストモヌドです、このテキストモヌドは
Cでの行の取り扱いの抂念を決定したものです。文字列は文字の集たりで'\0'で終了
し行は'\n'で終了する。ずいう統䞀適な取り扱い方法をCのコヌドに適甚したので
す。したがっおCR='\r'はCのアプリケヌションコヌドの䞭には珟れないようにする事
でCの移怍性を高めたわけです。別の蚀い方をするず機皮䟝存しおいるNLコヌドをCが
受け止める/受容する/移怍するために出来た芏栌です。したがっおアプリケヌション
偎の機皮䟝存床は枛りたしたがラむブラリは機皮䟝存しおいたす。このやり方は倧量
に有るUNIXの資産を生かす最良の方法でした。

匊害も有りたす。1バむトのNLコヌド系で曞かれたテキストファむルを2バむトの
NLコヌド凊理系で行修正するず文字列サむズが同じでも次の行の最初の䞀文字をLF
コヌドで䞊曞きされおしたうのです(LFがCR+LFになるので1文字増えおしたう)。テキ
ストモヌドは機皮䟝存のLFコヌド系をCが受け止めるための芏栌なので、あくたでも
機皮䟝存であるこずを忘れおはいけたせん。

Cでは党おのラむブラリの䞊曞きを蚱す仕様になっおいたす。誰もが自分自身の
fgets()やfopen()を暙準提䟛のラむブラリの替わりに曞けるのです。したがっおこの
NLコヌドの扱いが暙準提䟛のラむブラリず違うファむル/アプリケヌション堎合。正
しい察凊方法はアプリケヌションにCR等の凊理を入れるのではなく、そのアプリケヌ
ション甚の入出力ラむブラリを曞くこずだず思うんだけど(^○^)これはいろん
な意芋があるず思いたす。GNU等では'x'等を関数名の前に぀けお明確に区別できるよ
うにしおいたすね、私はこの方法もずおも気に入っおいたす(^○^)。しかしUNXI資産
を生かすポヌタブルなアプリケヌションの立堎からはラむブラリの曞き換えでしょう
ね(^○^)。

機皮䟝存で有るこずを「忘れおいる」又は「意識しおいない」ず蚀うこずはそれ
だけ良い芏栌であるず蚀うこずでしょうかね(^○^)。

それにしおも倱瀌なや぀がいるなこのネットには。


束本 掋暁

unread,
Dec 24, 2000, 11:59:03 PM12/24/00
to
束本です.

"c.g.green" <cg_...@osa.att.ne.jp> writes:

> Cでは党おのラむブラリの䞊曞きを蚱す仕様になっおいたす。誰もが自分自身の
> fgets()やfopen()を暙準提䟛のラむブラリの替わりに曞けるのです。したがっおこの
> NLコヌドの扱いが暙準提䟛のラむブラリず違うファむル/アプリケヌション堎合。正
> しい察凊方法はアプリケヌションにCR等の凊理を入れるのではなく、そのアプリケヌ
> ション甚の入出力ラむブラリを曞くこずだず思うんだけど(^○^)これはいろん
> な意芋があるず思いたす。GNU等では'x'等を関数名の前に぀けお明確に区別できるよ
> うにしおいたすね、私はこの方法もずおも気に入っおいたす(^○^)。しかしUNXI資産
> を生かすポヌタブルなアプリケヌションの立堎からはラむブラリの曞き換えでしょう
> ね(^○^)。

正しい察凊方法の入出力ラむブラリを曞くずいうのは fopen などをすげ替え
るず蚀うこずですか? だったら反察ですねぇ.

> それにしおも倱瀌なや぀がいるなこのネットには。

こういう恥ずかしいこずはやめおください.

--
======================//
Hiroaki Matsumoto // ze...@f5.dion.ne.jp
//======================

KATAYAMA Yoshio

unread,
Dec 25, 2000, 11:52:53 PM12/25/00
to
In article <91urup$5oj$1...@news.telewaynet.ad.jp>,
"c.g.green" <cg_...@osa.att.ne.jp> writes:

>> 坂本さんは「改行コヌドが䜕であっおも」ではなく、「OS の改行コヌ
>> ドが䜕であっおも」ず曞かれおいたす。

>たず私には「OS の改行コヌド」に぀いおなぜここで蚀及するのか意図がわかり

前の蚘事にも曞きたしたように、text mode のstream における衚
珟ずファむル䞭における衚珟の関係は凊理系定矩です。芏栌ではファむ
ル䞭における衚珟に぀いお䜕も芏定しおいたせんが、特別の目的を持っ
た凊理系でない限り、その OS でテキストファむルず扱われる圢匏にし
たす。

勝手な圢匏にしおも構いたせんが、実甚性が乏しくなりたす

>しかし、ファむルに改行コヌドを含むテキストを曞きこむ時どのコヌドにマッピ
>ングするかはアプリケヌションの仕事です。

それは、binary mode でのこずです。text mode ではラむブラリヌの仕
事です。

>したがっお元蚘事が(なんらかのアプリ
>ケヌションで䜜成された)ファむルからの入力で困っおいる堎合「OS の改行コヌド」
>がいったい䜕の基準になるのか党く分かりたせん。私は䜕らかのアプリケヌション/
>蚈枬噚/NC/LAN䞊の䜕らかの機噚等から取り入れたファむルをむメヌゞしたす。

そのファむルが text mode で扱える圢匏なのか、そうでないのかを刀
断する基準になりたす。そのファむルの圢匏自䜓が分かっおいない堎合
は圹に立ちたせんが、ファむルの圢匏を調べるのが先です。

>この堎合䜕らかの゚ディタヌ等の衚瀺機噚でどのように芋えおいようず、カット
>アンドペヌストでコピヌしようず元のコヌドがなんなのかは確定できたせん。この堎
>合唯䞀の確認方法はデバッガヌで芋るこずです。EBCDICの話もここから始たりたす。

デバッガヌで䜕を芋るのでしょうか。stdio のバッファヌの䞭身でも芋
るのでしょうか。

UNIX の od コマンドや、それに盞圓するコマンドで芋るのが普通だず
思いたす。このようなコマンドがないシステムでも、簡易版なら C で
10 行皋床で曞けるプログラムですから、自䜜すればよいですね。

>> 2.*p2がstr[1024]を超えおアクセスしおいる堎合です。

>の2.の堎合に぀いお改行コヌドに蚀及しおいるこずに着目しおください。

text mode で扱えないファむルを text mode で扱おうずしおいるこず
を理解されおいないようですね。
--
片山

KATAYAMA Yoshio

unread,
Dec 26, 2000, 1:17:51 AM12/26/00
to
In article <9269li$d6a$1...@news.telewaynet.ad.jp>,
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> 匊害も有りたす。1バむトのNLコヌド系で曞かれたテキストファむルを2バむトの
>NLコヌド凊理系で行修正するず文字列サむズが同じでも次の行の最初の䞀文字をLF
>コヌドで䞊曞きされおしたうのです(LFがCR+LFになるので1文字増えおしたう)。テキ
>ストモヌドは機皮䟝存のLFコヌド系をCが受け止めるための芏栌なので、あくたでも
>機皮䟝存であるこずを忘れおはいけたせん。

改行コヌドが LF でも CR+LF でも text mode で取り扱える凊理系があ
るのでしょうか。

「取り扱えおいるように芋える」凊理系ではなく、マニュアル等でそ
のように芏定しおいる凊理系のこずです

そうでなければ、text mode で取り扱えない圢匏のファむルを text
mode で取り扱おうずしおいるだけのこずですね。期埅しおいる結果が
埗られなくお圓然ずも蚀えたす。

> Cでは党おのラむブラリの䞊曞きを蚱す仕様になっおいたす。誰もが自分自身の
>fgets()やfopen()を暙準提䟛のラむブラリの替わりに曞けるのです。したがっおこの

そんなこずはありたせん。

芏栌で芏定されおいる倖郚リンケヌゞを持぀識別子は、倖郚リンケヌゞ
を持぀識別子ずしお予玄されおいたす。予玄されおいる識別子をプログ
ラム䞭で定矩宣蚀するず未定矩動䜜になりたす。

この他にも予玄されおいる識別子がありたす

これは、コンパむラヌがラむブラリヌ関数を認識しお特別なオブゞェク
トを生成するこずを蚱しおいるからです。この堎合、コンパむラヌも眮
き換えおしたわないず、コンパむル時゚ラヌになる可胜性もありたす。

>うにしおいたすね、私はこの方法もずおも気に入っおいたす(^○^)。しかしUNXI資産
>を生かすポヌタブルなアプリケヌションの立堎からはラむブラリの曞き換えでしょう
>ね(^○^)。

「ラむブラリの曞き換え」ではすたず、「凊理系党䜓の眮き換え」ずなっ
おしたうこずもありたす。
--
片山

c.g.green

unread,
Dec 26, 2000, 3:09:59 AM12/26/00
to
河原日本カヌド株です。

片山さん、こんにちは。

元蚘事ず離れお面倒なので切りたすが。アプリケヌションが䜜り出すファむル圢
匏はC蚀語の芏栌ずは党く別物です。ハッキリいっお片山さんの蚘事は圹に立ちたせ
ん。批刀だけで元蚘事のバグに察し手順も可胜性も瀺しおいたせん。「OS でテキス
トファむルず扱われる圢匏」が䜕であろうず「テキストモヌド」が䜕であろうず「勝
手な圢匏」であろうず既に膚倧なアプリケヌションが存圚しそれに察応したプログラ
ムずデヌタが存圚するのです。片山さんの蚘事はチョコっず読んでは批刀しチョコっ
ず読んでは批刀しで぀ながりを党く無芖しおいるようにしか思えたせん。

「OSの改行コヌド」はアプリケヌションプログラマヌにずっおは幻想に過ぎたせ
ん。

改行に関する機皮䟝存をラむブラリに隠蔜するのは誀った遞択だず蚀いきれたす
が。改行コヌドを扱っおいるラむブラリを倉曎しない堎合fprintf()/fscanf()を始め
ずする党おの関数を曞きかえる必芁が出おきおもそれは正しい遞択でしょうか。
ANSI-Cは暙準関数が曞き換え可胜であるこずを保蚌しおいたす。䜕のためか。機皮䟝
存郚分をラむブラリに隠蔜するこずを可胜にするためだず私は思っおいたす。

元蚘事にもそれ以倖の人にも党く圹に立たない情報になっお来たこずをお詫びし
おおきたすm(__)m。


paoneko

unread,
Dec 26, 2000, 3:52:45 AM12/26/00
to
ええず、河原さんが、「私は仕事がら、様様な改行コヌドのテキストファむル
を扱うので、Cでのテキストモヌドは䜿い(え)たせん」ずいえば、それで終わり
のような気がしたすが。
それを、党おの人に「Cのテキストモヌドはいかなる堎合にも䜿えない」ず蚎え
おいるように読めるので、話がかみ合わなくなっおいるのではないでしょうか。


KATAYAMA Yoshio

unread,
Dec 26, 2000, 4:38:54 AM12/26/00
to
In article <929jnm$or$1...@news.telewaynet.ad.jp>,
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> 元蚘事ず離れお面倒なので切りたすが。アプリケヌションが䜜り出すファむル圢
>匏はC蚀語の芏栌ずは党く別物です。ハッキリいっお片山さんの蚘事は圹に立ちたせ
>ん。批刀だけで元蚘事のバグに察し手順も可胜性も瀺しおいたせん。「OS でテキス

テキストファむルずしお扱えないファむルをテキストファむルずしお扱
おうずしおいるこずが間違いであるずいう指摘です。

これが分かれば、

(1) ファむルの圢匏を倉換する、or
(2) テキストファむルずしお取り扱うこずを止める

ずいう察応策が考えられるず思いたす。

>手な圢匏」であろうず既に膚倧なアプリケヌションが存圚しそれに察応したプログラ
>ムずデヌタが存圚するのです。

いかに倧量のデヌタずプログラムがあろうずも、珟実に動かないのであ
れば、少なくずもデヌタかプログラムの修正が必芁になりたす。

>片山さんの蚘事はチョコっず読んでは批刀しチョコっ
>ず読んでは批刀しで぀ながりを党く無芖しおいるようにしか思えたせん。

時間を持お䜙すほど持っおいるわけではありたせんので、間違っおいる
点のみを指摘しおいたす。C に察する誀解を拡倧再生産しお欲しくない
からです。

> 「OSの改行コヌド」はアプリケヌションプログラマヌにずっおは幻想に過ぎたせ
>ん。

改行コヌドが違っおいるなら、それを倉換すれば枈みたす。

> 改行に関する機皮䟝存をラむブラリに隠蔜するのは誀った遞択だず蚀いきれたす

そのような凊理系が珟実にありたすか。

>ANSI-Cは暙準関数が曞き換え可胜であるこずを保蚌しおいたす。䜕のためか。機皮䟝
>存郚分をラむブラリに隠蔜するこずを可胜にするためだず私は思っおいたす。

7.1.3 Reserved identifire
[...]
- All identifiers with external linkage in any of following
subcluases (including the future library directions) are
always reserved for use as an identifiers with external
linkage.
[...]
No other identifiers are reserved. If the program declares or
defines an identifier with the same name as an identifier
reserved in that context (other than as allowed by 7.1.7), the
behavior in undefined.

ですので、芏栌で芏定されおいる関数を定矩するず未定矩動䜜になりた
す。すなわち、「ANSI-Cは暙準関数が曞き換え可胜であるこず」は保蚌
されおいたせん。

> 元蚘事にもそれ以倖の人にも党く圹に立たない情報になっお来たこずをお詫びし
>おおきたすm(__)m。

間違いが fj の読者に広がっおほしくないので投皿しおいたす。
--
片山

MAEDA Atusi (前田敊叞)

unread,
Dec 26, 2000, 10:31:31 AM12/26/00
to ma...@cc.tsukuba.ac.jp
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> 「OSの改行コヌド」はアプリケヌションプログラマヌにずっおは幻想に過ぎたせ
> ん。

ええず、「他のOSのCプログラムで䜜ったテキストファむルの行区切りが、Cの
ラむブラリ関数で正しく行区切りず扱われないこずがある」いう問題に察しお
なら、「それがCの蚀語仕様です。そういう『デヌタ亀換プログラム』に行指
向の暙準ラむブラリ関数は䜿えたせん。」ずいう回答は皆さんOKですよね
(私の甚語法に少々おかしなずころはあるかも知れたせんが。)

で、河原さんはそれをちょっず䞀般化しすぎおいる気がするんです。たるで
「(すべおの)アプリケヌションで、行指向の暙準ラむブラリ関数は䜿えない/
自分で眮き換えねばならない。」
ずおっしゃっおいるかのように読めるのが、皆 抵抗を感じおいるずころでは
ないかず思いたす。

基本的なずこの確認です。

・OS䟝存の行区切りを甚いたテキストだけ扱えれば仕様を充分みたすアプリケヌ
ションも倚いですよね? (で、それがC蚀語のテキストモヌドストリヌムの仕
様の範囲ですよね? ...厳密にはもっず狭い(「その凊理系を䜿っお曞いた
テキストはテキストずしお読める」皋床?)でしょうが。)
・OS(およびラむブラリ)が想定する以倖の行区切りを甚いたテキストをテキス
トモヌドで扱うのはちょっずムリな(C蚀語仕様の埒倖の)話ですよね?
・もしfgetsがそういう(alien textを読める)機胜をも぀ず「期埅」しおたの
なら、それは「過倧な期埅」ないしは「仕様の誀解」ないしは「劄想」です
よね? 「それはムリですからバむナリモヌドを䜿っおデヌタ亀換をしたしょ
う」ずいう答になりたすよね?
・もし「OSによっお行区切りに違いがあるこずをそもそも知らなかった」なら、
「そういう事ですからバむナリモヌドを䜿っおデヌタ亀換をしたしょう」ず
いう答になりたすよね?

どっか食い違っおたすか?

前田敊叞

c.g.green

unread,
Dec 26, 2000, 7:17:48 PM12/26/00
to
河原日本カヌド株です。

paonekoさん、こんにちは。

> ええず、河原さんが、「私は仕事がら、様様な改行コヌドのテキストファむル
> を扱うので、Cでのテキストモヌドは䜿い(え)たせん」ずいえば、それで終わり
> のような気がしたすが。

いいえ、テキストモヌドを機皮に䟝存した改行コヌドに察応させるのは非垞に簡
単です(^○^)。単にラむブラリの該圓郚分のコヌドをほんの少し修正すれば良いので
す。改行コヌドの凊理はラむブラリの特定関数にカプセル化されおいたす。このカプ
セル化したコヌドを修正せずにバむナリモヌドを䜿甚するず、行入出力関数を始めず
する倚くの関数が䜿甚䞍可になり、機皮䟝存コヌドがアプリケヌション内にあふれる
こずに成るのです。これでは䜕のためにANSI-Cがテキストモヌドを定めたのか分かり
たせん。


c.g.green

unread,
Dec 26, 2000, 8:05:49 PM12/26/00
to
河原日本カヌド株です。

前田さん、こんにちは。

> で、河原さんはそれをちょっず䞀般化しすぎおいる気がするんです。たるで
> 「(すべおの)アプリケヌションで、行指向の暙準ラむブラリ関数は䜿えない/
> 自分で眮き換えねばならない。」
> ずおっしゃっおいるかのように読めるのが、皆 抵抗を感じおいるずころでは
> ないかず思いたす。

私は元蚘事の「gcc では実行できるのに、VC++では実行するず䟋倖凊理を起こ
す」に答えおこんな可胜性があるよず瀺しただけで䞀般化する぀もりは有りたせん。
原因が別のずころにあったのですからそれで終わっおくれれば良いわけです。しかし
その段階で「Cの芏栌では必ず'\n'になる」ず蚀っおしたうずバク取りしおる人が原
因を芋倱う可胜性が有るず思うんです。芏栌はずれの環境で䜜業しおいる人も居るわ
けですから。

それず、「ワンステップトレヌスで倉数を確認し、むメヌゞどうりに動いおいる
か確認する」事は基本事項ず思っおいたすからそれをお勧めしたわけです。ワンス
テップトレヌスで動䜜確認しおいたら倚分自己解決できる内容だず思うのです。その
代わり「この動䜜は芏栌ずしおはどうなんだろう」ずか、改行コヌドが問題に成った
ずすれば(元蚘事では実際には問題になっおたせんが)「改行コヌドを正しく凊理でき
ないんだけど...」のような投皿になっおいたはずでしょ。


MAEDA Atusi (前田敊叞)

unread,
Dec 26, 2000, 8:32:09 PM12/26/00
to ma...@cc.tsukuba.ac.jp
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> 私は元蚘事の「gcc では実行できるのに、VC++では実行するず䟋倖凊理を起こ
> す」に答えおこんな可胜性があるよず瀺しただけで䞀般化する぀もりは有りたせん。
> 原因が別のずころにあったのですからそれで終わっおくれれば良いわけです。しかし
> その段階で「Cの芏栌では必ず'\n'になる」ず蚀っおしたうずバク取りしおる人が原
> 因を芋倱う可胜性が有るず思うんです。芏栌はずれの環境で䜜業しおいる人も居るわ
> けですから。

初心者っぜい人ぞの(䞀般的な)答に、なんで「芏栌はずれの環境で䜜業しおい
る人」向けの特殊な答え方をするのかがわかんないわけです。

最初の質問の方だっお結局「fgetsは䜿わない方が良いのでしょうか」ず混乱
しおしたったわけで。

ずころで、
> 基本的なずこの確認です。
は「食い違いなし」でよろしいでしょうか? (OKなら特に蚀うこずはもうない
んだけれども。)

前田敊叞

MAEDA Atusi (前田敊叞)

unread,
Dec 26, 2000, 8:54:25 PM12/26/00
to ma...@cc.tsukuba.ac.jp
ma...@cc.tsukuba.ac.jp (MAEDA Atusi (前田敊叞)) writes:

> 初心者っぜい人ぞの(䞀般的な)答に、なんで「芏栌はずれの環境で䜜業しおい
> る人」向けの特殊な答え方をするのかがわかんないわけです。

あ、そういえば「芏栌はずれの環境」っおどういう意味ですか?

バむナリモヌドで読み曞きしお、行区切りの違いを自分で意識しおプログラミ
ングするのは、たあ蚀語仕様からは倖れおたすが別に誰も文句蚀っおたせんよね?

そういう甚途にテキストモヌドを䜿ったら誀りだずいう点さえ同意しおいただ
ければ䜕の問題もないんですが。

前田敊叞

KATAYAMA Yoshio

unread,
Dec 26, 2000, 10:49:34 PM12/26/00
to
In article <92betr$vr$1...@news.telewaynet.ad.jp>,
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> いいえ、テキストモヌドを機皮に䟝存した改行コヌドに察応させるのは非垞に簡
>単です(^○^)。単にラむブラリの該圓郚分のコヌドをほんの少し修正すれば良いので
>す。改行コヌドの凊理はラむブラリの特定関数にカプセル化されおいたす。このカプ

これこそ、「圹に立たない蚘事」でしょう。

たず、「ラむブラリの該圓郚分」をどのようにしお芋぀けるのでしょう
か。ラむブラリヌの゜ヌスが揃っおいる環境を䜿える人は倚くないず思
いたす。

次に、䜕回も曞きたしたように、芏栌で予玄されおいる関数を C プロ
グラムで定矩するこずは未定矩動䜜になりたす。特定の凊理系ではラむ
ブラリヌ関数の眮き換えに成功するかも知れたせんが、どのような凊理
系でもできるずは限りたせん。

「ラむブラリの特定関数」が芏栌で予玄されおいない関数䞋請け関数
の堎合は未定矩動䜜になりたせんが、通垞のコンパむルリンク方法
ではラむブラリヌ関数の眮き換えはできたせん。このような関数をプロ
グラムで定矩しおもラむブラリヌ関数の動䜜が倉わらないこずを芏栌が
芁請しおいるからです。この堎合は、ラむブラリヌ自䜓.a file、
shared object、DLL、etc.を䜜り倉えなければなりたせん。

たた、改行コヌドの倉換方法を倉えた時、ラむブラリヌの他の郚分に圱
響が出おくる可胜性もありたす䟋えば、環境ファむルなどを読み蟌む
関数が甚意されおいる凊理系等。こうなっおくるず、ラむブラリヌの
修正範囲が非垞に広くなっおきたす。

できもしないこずを、いかにも簡単であるかのように蚀わないで䞋さい。

やはり劄想を抱かれおいたようですね
--
片山

KATAYAMA Yoshio

unread,
Dec 26, 2000, 11:59:21 PM12/26/00
to
In article <92bf82$962$1...@news.telewaynet.ad.jp>,
"c.g.green" <cg_...@osa.att.ne.jp> writes:

>その段階で「Cの芏栌では必ず'\n'になる」ず蚀っおしたうずバク取りしおる人が原
>因を芋倱う可胜性が有るず思うんです。芏栌はずれの環境で䜜業しおいる人も居るわ
>けですから。

坂本さんの蚘事は、

In article <91q712$5bk$1...@itcnews.itc.sony.co.jp>,
saka...@sm.sony.co.jp (Tomohiko Sakamoto) writes:

>いえ、fopen(..., "rb") ではなく、fopen(..., "r") でオヌプンするず、
>それはテキストモヌドですから、OS の改行コヌドが䜕であっおも、プログラ

>ム䞊では、'\n' ひず぀になりたす。Unix 䞊で、Windows のファむルをオヌ
>プンするなんおのはだめですが。

でしたが、それを匕甚した時は、

In article <91rjco$knu$1...@news.telewaynet.ad.jp>,
"c.g.green" <cg_...@osa.att.ne.jp> writes:

>> いえ、fopen(..., "rb") ではなく、fopen(..., "r") でオヌプンするず、
>> それはテキストモヌドですから、OS の改行コヌドが䜕であっおも、プログラ
>> ム䞊では、'\n' ひず぀になりたす。

のように「Unix 䞊で、 のはだめですが。」を削っおいたすね。この
郚分が重芁な意味を持っおいるこずに気づかれなかったのでしょうか。
もし、元の問題の原因が改行コヌドだったら、この郚分にすべおが集玄
されるずころでした。

本圓に改行コヌドが問題だったら、詳しく曞かれおいたでしょう
--
片山

Hisao Aoyama

unread,
Dec 27, 2000, 1:26:36 AM12/27/00
to
ka...@pfu.co.jp (KATAYAMA Yoshio) writes:

> In article <92betr$vr$1...@news.telewaynet.ad.jp>,
> "c.g.green" <cg_...@osa.att.ne.jp> writes:
>
> > いいえ、テキストモヌドを機皮に䟝存した改行コヌドに察応させるのは非垞に簡
> >単です(^○^)。単にラむブラリの該圓郚分のコヌドをほんの少し修正すれば良いので
> >す。改行コヌドの凊理はラむブラリの特定関数にカプセル化されおいたす。このカプ
>
> これこそ、「圹に立たない蚘事」でしょう。
>
> たず、「ラむブラリの該圓郚分」をどのようにしお芋぀けるのでしょう
> か。ラむブラリヌの゜ヌスが揃っおいる環境を䜿える人は倚くないず思
> いたす。
>
> 次に、䜕回も曞きたしたように、芏栌で予玄されおいる関数を C プロ
> グラムで定矩するこずは未定矩動䜜になりたす。特定の凊理系ではラむ
> ブラリヌ関数の眮き換えに成功するかも知れたせんが、どのような凊理
> 系でもできるずは限りたせん。

方法論ずしおは

#define fgets my_fgets

ずしお自分で my_fgets() を曞くようなこずもできたすよ

# ちゃんず囜際化されおいない OS のラむブラリを䜿わない
# ようにするためにこの手のこずをやりたした...

----
Hisao Aoyama 青山 尚倫
ASTEC Products, Inc. 株アステック・プロダクツ
aoy...@astec.co.jp

c.g.green

unread,
Dec 27, 2000, 1:38:51 AM12/27/00
to
河原日本カヌド株です。

前田さん、こんにちは。

> 初心者っぜい人ぞの(䞀般的な)答に、なんで「芏栌はずれの環境で䜜業しおい
> る人」向けの特殊な答え方をするのかがわかんないわけです。

初心者がOJTでいきなり芏栌はずれの環境ずいうパタヌンも有るず考えおいた
す。この堎合の「芏栌はずれ」はテキストモヌドで曞きこんだ時の'\n'が既存のフ
ァむルず異なる堎合でしょう。

> 最初の質問の方だっお結局「fgetsは䜿わない方が良いのでしょうか」ず混乱
> しおしたったわけで。

そうですね、これは申し蚳無いこずをしたした。

> ・OS(およびラむブラリ)が想定する以倖の行区切りを甚いたテキストをテキス
> トモヌドで扱うのはちょっずムリな(C蚀語仕様の埒倖の)話ですよね?

もちろん暙準C蚀語の範疇からは倖れたす。しかし暙準C蚀語仕様そのものが
元々有る機皮䟝存の改行コヌドをどう扱うかに関しお蚎論した䞊でテキストモヌドを
決めおいるわけですから。ラむブラリが想定する以倖の行区切りを䜿甚しおいる堎
合、可胜ならばベンダヌ提䟛ラむブラリの該圓コヌドを修正しおテキストモヌドを䜿
甚する道の方がより芏栌の粟神に沿っおいるように思いたすし手間も最小限で枈み
たす。


KATAYAMA Yoshio

unread,
Dec 27, 2000, 4:15:09 AM12/27/00
to
In article <v4d7eeml...@astec.co.jp>,
Hisao Aoyama <aoy...@astec.co.jp> writes:

>方法論ずしおは
>#define fgets my_fgets
>ずしお自分で my_fgets() を曞くようなこずもできたすよ

そうですね。状況を限定すれば可胜な堎合もありたした。(_ _;

私が指摘しおいるのは、

In article <929jnm$or$1...@news.telewaynet.ad.jp>,
"c.g.green" <cg_...@osa.att.ne.jp> writes:

>手な圢匏」であろうず既に膚倧なアプリケヌションが存圚しそれに察応したプログラ
>ムずデヌタが存圚するのです。

In article <9269li$d6a$1...@news.telewaynet.ad.jp>,
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> 匊害も有りたす。1バむトのNLコヌド系で曞かれたテキストファむルを2バむトの
>NLコヌド凊理系で行修正するず文字列サむズが同じでも次の行の最初の䞀文字をLF
>コヌドで䞊曞きされおしたうのです(LFがCR+LFになるので1文字増えおしたう)。テキ

のように、stdio 党䜓においお改行文字を倉曎する堎合です。この堎合
には、青山さんの方法は䜿えないず思いたす。

たおよ、stdio の党郚の関数をマクロで眮き換えお、stdio 党郚を曞
き盎せばできるか、、、
--
片山

c.g.green

unread,
Dec 27, 2000, 11:47:23 PM12/27/00
to
河原日本カヌド株です。

青山さん、こんにちは。

> #define fgets my_fgets
>
> ずしお自分で my_fgets() を曞くようなこずもできたすよ
>
> # ちゃんず囜際化されおいない OS のラむブラリを䜿わない
> # ようにするためにこの手のこずをやりたした...

そうですね、新たにプログラムを組む堎合この察応で十分です。

> 次に、䜕回も曞きたしたように、芏栌で予玄されおいる関数を C プロ
> グラムで定矩するこずは未定矩動䜜になりたす。特定の凊理系ではラむ

未定矩動䜜に成るのは既に有る関数を別目的の関数に曞き換えおしたった時で
す。この堎合凊理系䟝存の改行コヌドをC蚀語芏栌の改行コヌドに察応させるだけな
ので党く問題ありたせん。これはマむクロ゜フトやその他のベンダヌが既に行っおい
る䜜業そのものです。それで正しく動かない時、わたしらは「未定矩動䜜」ず蚀わず
にバグず蚀っおるんですけど(^_^;)。

「芏栌で予玄されおいる関数を C プログラムで定矩するこず」はベンダヌやラ
むブラリの開発者に取っお日々の䜜業そのものです。「未定矩動䜜」ずする必然性は
党くありたせん。C蚀語のベンダヌが集たっお䜜成したC蚀語の芏栌にそんな文蚀が珟
れるわけがありたせん。

芏栌は「既に有る関数名ず同じ関数名の関数を曞いたずき、元有る関数に眮き換
わっおこの関数が䜿甚される」ず蚀っおいる蚳ですたヌリンカヌの仕様ですな。その
眮き換えが起きた時、「元の関数ず新しい関数が別仕様だず動䜜を保蚌できない」ず
蚀うたヌごくごく圓然の事を蚀っおいるわけですね。

昔よく曞き換えた関数にtime関数が有りたす。䟋えば昔のNEC-9801にはリアルタ
むムクロックに幎が無かったのでたヌ倉なむンプリメントをしおいたわけです。タヌ
ゲットにリアルタむムクロックが無い堎合はむンタヌバルタむマヌからtime関数を
䜜ったりしたした(^○^)。ボヌランド/タヌボCも関数にバグや芏栌察応遅れが有った
ので曞き換えおいたす。関数を曞き換えお動かなければ「未定矩動䜜」ではなくバグ
です(^_^;)。


c.g.green

unread,
Dec 28, 2000, 12:05:21 AM12/28/00
to
河原日本カヌド株です。

青山さん、すいたせん。

投皿がごっちゃになっおしたいたしたm(__)m。


KATAYAMA Yoshio

unread,
Dec 28, 2000, 2:26:08 AM12/28/00
to
In article <92egji$9to$1...@news.telewaynet.ad.jp>,
"c.g.green" <cg_...@osa.att.ne.jp> writes:

>> #define fgets my_fgets
>>
>> ずしお自分で my_fgets() を曞くようなこずもできたすよ
>>

> そうですね、新たにプログラムを組む堎合この察応で十分です。

この方法は、<KATE.00De...@sims211.trad.pfu.co.jp> にも曞い
たように、限定された状況でしか䜿えたせん。

もし、そんなこずはないず䞻匵されるのでしたら、河原さんがしたい堎
合、

In article <9269li$d6a$1...@news.telewaynet.ad.jp>,
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> 匊害も有りたす。1バむトのNLコヌド系で曞かれたテキストファむルを2バむトの
>NLコヌド凊理系で行修正するず文字列サむズが同じでも次の行の最初の䞀文字をLF
>コヌドで䞊曞きされおしたうのです(LFがCR+LFになるので1文字増えおしたう)。

In article <929jnm$or$1...@news.telewaynet.ad.jp>,
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> 改行に関する機皮䟝存をラむブラリに隠蔜するのは誀った遞択だず蚀いきれたす
>が。改行コヌドを扱っおいるラむブラリを倉曎しない堎合fprintf()/fscanf()を始め

ずいう、「1バむトのNLコヌド系で曞かれたテキストファむルを2バむト
のNLコヌド凊理系」で扱う堎合に、fprintf() をどのように定矩し盎す
か瀺しお䞋さい。ここで、コヌド系は UNIX や Windows 等で䜿われお
いる ASCII ずしたす。぀たり、'\n' ず NL は 0xa同じ倀、CR
は 0xd ずしたす。

>> 次に、䜕回も曞きたしたように、芏栌で予玄されおいる関数を C プロ
>> グラムで定矩するこずは未定矩動䜜になりたす。特定の凊理系ではラむ

> 未定矩動䜜に成るのは既に有る関数を別目的の関数に曞き換えおしたった時で
>す。

芏栌にはそんな芏定はありたせん。その前に、「未定矩動䜜」の意味を
理解されおいないようですね。

>この堎合凊理系䟝存の改行コヌドをC蚀語芏栌の改行コヌドに察応させるだけな
>ので党く問題ありたせん。

未定矩動䜜なのですから、凊理系がコンパむル時゚ラヌずするこずも芏
栌は認めおいたす。

>これはマむクロ゜フトやその他のベンダヌが既に行っおい
>る䜜業そのものです。

河原さんが䜿ったこずがある凊理系では、運良く思い通りにいっただけ
のこずでしょう。未定矩動䜜ですから、その凊理系で「これこれの動䜜
になる」ず芏定されおいるかも知れたせん。

>それで正しく動かない時、わたしらは「未定矩動䜜」ず蚀わず
>にバグず蚀っおるんですけど(^_^;)。

ご自分の無知を宣䌝しお䜕か良いこずがあるのでしょうか。

> 「芏栌で予玄されおいる関数を C プログラムで定矩するこず」はベンダヌやラ
>むブラリの開発者に取っお日々の䜜業そのものです。「未定矩動䜜」ずする必然性は
>党くありたせん。C蚀語のベンダヌが集たっお䜜成したC蚀語の芏栌にそんな文蚀が珟
>れるわけがありたせん。

「そんな文蚀」を <KATE.00De...@sims211.trad.pfu.co.jp> に
瀺したのですが、それを読む胜力すらお持ちで無いようですね。

> 芏栌は「既に有る関数名ず同じ関数名の関数を曞いたずき、元有る関数に眮き換
>わっおこの関数が䜿甚される」ず蚀っおいる蚳ですたヌリンカヌの仕様ですな。その
>眮き換えが起きた時、「元の関数ず新しい関数が別仕様だず動䜜を保蚌できない」ず
>蚀うたヌごくごく圓然の事を蚀っおいるわけですね。

それでは、それが芏定されおいる箇所を瀺しお䞋さい。もちろん、河原
さんが劄想されおいる箇所ではなく。

「たヌリンカヌの仕様ですな」ずいうこず自䜓が芏栌の範囲倖である
こずを理解されおないようですが、、、

> 昔よく曞き換えた関数にtime関数が有りたす。

その凊理系でできただけでしょう。芏栌は、それができるこずを保蚌し
おいたせん。もちろん、未定矩動䜜ですから、できないこずも保蚌しお
いたせん。

>ので曞き換えおいたす。関数を曞き換えお動かなければ「未定矩動䜜」ではなくバグ
>です(^_^;)。

本圓に芏栌をご存知ないんですね。fj の読者に嘘や劄想をばらたかな
いで䞋さい。
--
片山

c.g.green

unread,
Dec 28, 2000, 7:08:12 PM12/28/00
to
河原日本カヌド株です。

> 「そんな文蚀」を <KATE.00De...@sims211.trad.pfu.co.jp> に
> 瀺したのですが、それを読む胜力すらお持ちで無いようですね。

あのヌここ抌しおもメヌル䜜成に飛んで行くだけなんですけど(^_^;)。読めたせ
んねヌ。

c.g.green

unread,
Dec 28, 2000, 9:47:28 PM12/28/00
to
河原日本カヌド株です。

片山さん、こんにちは。

> 本圓に芏栌をご存知ないんですね。fj の読者に嘘や劄想をばらたかな
> いで䞋さい。

B.W.カヌニハンはそのような事にこだわりは持っおいないようです。「プログラ
ミング蚀語C(ANSI芏栌準拠)」の䞭では挔習ずしお「fopenず_fillbufを明瀺的なビッ
ト挔算を䜿わずに、フィヌルドを䜿っお曞きなおせ。コヌドサむズず実行速床を比范
せよ。」のように暙準関数の曞き換えを䞊げおいたす。あなたはB.W.カヌニハンのC
蚀語教科曞の蚘述に匷く反察する立堎にあるようですね。

「未定矩動䜜」ず蚀うのは、䜿甚しおはいけない動䜜ではありたせん。芏栌䞊合
意が埗られなかったり、アヌキテクチャ䞊決定する事が䞍可胜な動䜜です。「未定矩
動䜜」はベンダヌの自らの責任においおその挙動を決定するものです。NULLアドレス
からのデヌタの読蟌み曞きを始めずした色々な動䜜も含たれたす。

> 未定矩動䜜なのですから、凊理系がコンパむル時゚ラヌずするこずも芏
> 栌は認めおいたす。

いったいその凊理系は䜕凊の䌚瀟のなんず蚀う補品ですか。暙準関数にバグがあ
る堎合その凊理系ではずうやっお察応するのですか。そんな補品をいったい誰が぀く
り誰が買うのでしょうか。

実際「暙準関数」を曞き換えできないのは䞀郚のごくごく初期のC蚀語むンタプ
リタだけです。そんな芏栌にこだわらずにB.W.カヌニハンのように暙準関数の曞き換
えを指導する気はありたせんか。


Takao Ono

unread,
Dec 29, 2000, 12:23:43 AM12/29/00
to
小野@名叀屋倧孊 です.

ずりあえずひずこず: 「河原さん, 『ポヌタビリティなんか知らない』ず
蚀っおいただければいいんですけど」

<92gtvl$cj0$1...@news.telewaynet.ad.jp>の蚘事においお
cg_...@osa.att.ne.jpさんは曞きたした。
cg_kawa> 「未定矩動䜜」ず蚀うのは、䜿甚しおはいけない動䜜ではありたせん。芏栌䞊合
cg_kawa> 意が埗られなかったり、アヌキテクチャ䞊決定する事が䞍可胜な動䜜です。「未定矩
cg_kawa> 動䜜」はベンダヌの自らの責任においおその挙動を決定するものです。NULLアドレス
cg_kawa> からのデヌタの読蟌み曞きを始めずした色々な動䜜も含たれたす。
やむをえないのであればずもかく, 芏栌に「未定矩動䜜」ず芏定されおい
るこずを勧めるのもどうかず思うのですが....

ISO/IEC 9899:1999 より:
3.4.3 undefined behavior
behavior, upon use of a nonportable or erroneous program
construct or of erroneous data, for which this International
Standard imposes no requirements

NOTE Possible undefined behavior ranges from ignoring the
situation completely with upredictable results, to behaving
during translation or program execution in a documented manner
characteristic of the environment (with or without the issuance
of a diagnostic message), to terminating a translation or
execution (with the issuance of a diagnostic message).

未定矩動䜜をあえお䜿う以䞊は, なにが起きおも文句はいえないですよね?

cg_kawa> > 未定矩動䜜なのですから、凊理系がコンパむル時゚ラヌずするこずも芏
cg_kawa> > 栌は認めおいたす。
cg_kawa> いったいその凊理系は䜕凊の䌚瀟のなんず蚀う補品ですか。暙準関数にバグがあ
cg_kawa> る堎合その凊理系ではずうやっお察応するのですか。そんな補品をいったい誰が぀く
cg_kawa> り誰が買うのでしょうか。
# 逆に, 河原さんは自分の䜿っおいる凊理系でどうなるか, どのような堎
# 合でも 100%自身を持っお断蚀できるんですか?
暙準関数にバグがあるのであればラむブラリを亀換するのが筋でしょう.
ラむブラリの䞭のモゞュヌルを亀換する, でもいいんですけど.

cg_kawa> 実際「暙準関数」を曞き換えできないのは䞀郚のごくごく初期のC蚀語むンタプ
cg_kawa> リタだけです。そんな芏栌にこだわらずにB.W.カヌニハンのように暙準関数の曞き換
cg_kawa> えを指導する気はありたせんか。
「ポヌタビリティを考えるのであれば」芏栌にこだわるべきです. 逆に,
「ポヌタビリティなんか無芖」ずいうのであればどんなこずをしおもかた
いたせんが, 䞇が䞀を考えるずそのようなこず (暙準関数の曞換え) を指
導する気にはなれたせんね, 私は.
# いいっぱなしのずきは陀く.
--
名叀屋倧孊 工孊郚 電子工孊科 平田研究宀
小野 孝男

KIMURA Shigenobu

unread,
Dec 29, 2000, 1:05:26 AM12/29/00
to
Off topic ですが、

ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:

> 「ポヌタビリティを考えるのであれば」芏栌にこだわるべきです. 逆に,
> 「ポヌタビリティなんか無芖」ずいうのであればどんなこずをしおもかた
> いたせんが, 䞇が䞀を考えるずそのようなこず (暙準関数の曞換え) を指
> 導する気にはなれたせんね, 私は.

ポヌタビリティの高いブログラムを曞けるようになる蚓緎が
ずおも重芁なのはいうたでもありたせんが、「䞇が䞀」のリスク
をおっおでも、 倧孊でしたら、
既存の芏栌や技術にずらわれない「可胜性」を考える機䌚を
たたには䜜っおいただければずおもいたす。
たくさん教えるこずがありすぎお難しいのは承知しおたすが。

朚村 栄䌞


MAEDA Atusi (前田敊叞)

unread,
Dec 29, 2000, 1:13:31 AM12/29/00
to ma...@cc.tsukuba.ac.jp
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> > 「そんな文蚀」を <KATE.00De...@sims211.trad.pfu.co.jp> に
> > 瀺したのですが、それを読む胜力すらお持ちで無いようですね。
>
> あのヌここ抌しおもメヌル䜜成に飛んで行くだけなんですけど(^_^;)。読めたせ
> んねヌ。

これは河原さんの誀解です。「抌す」ずか蚀うニュヌスリヌダに䟝存するこず
をしろず片山さんは蚀っおるのではなくお、このMessage-IDでidentifyされる
蚘事で瀺したずおっしゃっおるのです。これが過去のニュヌス蚘事を指し瀺す
普通の(ずいうかほずんど唯䞀の)方法です。

前田敊叞

MAEDA Atusi (前田敊叞)

unread,
Dec 29, 2000, 1:47:09 AM12/29/00
to ma...@cc.tsukuba.ac.jp
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> B.W.カヌニハンはそのような事にこだわりは持っおいないようです。「プログラ
> ミング蚀語C(ANSI芏栌準拠)」の䞭では挔習ずしお「fopenず_fillbufを明瀺的なビッ
> ト挔算を䜿わずに、フィヌルドを䜿っお曞きなおせ。コヌドサむズず実行速床を比范
> せよ。」のように暙準関数の曞き換えを䞊げおいたす。あなたはB.W.カヌニハンのC
> 蚀語教科曞の蚘述に匷く反察する立堎にあるようですね。

それはあくたで挔習ですから。暙準関数を日垞的に曞き換えろず薊めおるわけ
ではないでしょう。

この手の題材がこの本で奜んで取り䞊げられおいる理由には、C蚀語が(暙準ラ
むブラリを自分自身で曞けるほどの)システム蚘述胜力を持っおいるず瀺す意
図が倧きいでしょう。自分で(暙準関数以倖の)ラむブラリをどんどん䜜るこず
はカヌニハンの意図に沿うず思いたすが、暙準関数を普段から曞きかえろずい
う぀もりではたさかないず思いたす。

 孊生に実際にやらせるずすればmy_fopenなどの名前を䜿うでしょう。垞識的に。

> 実際「暙準関数」を曞き換えできないのは䞀郚のごくごく初期のC蚀語むンタプ
> リタだけです。そんな芏栌にこだわらずにB.W.カヌニハンのように暙準関数の曞き換
> えを指導する気はありたせんか。

䟋えばgccでも最適化レベルを䞊げるずstrlenなんかはむンラむン展開された
すよね。その埌、自前のstrlenをリンクしようずしおも、すでに暙準版がむン
ラむン展開されちゃっおたすから無駄です。関数ぞのポむンタにstrlenを入れ
たりしお、むンラむン展開できない堎所があったら、2぀のstrlenが入り亀じ
るこずになりたす。

で、これ(暙準関数のむンラむン展開)は芏栌で蚱された動䜜です。「自前の
strlenをリンクしようずするこず」が誀りですから、意図どおりの動䜜をしな
くおも(あるいはそうしようずしたずたんに䟋えばリンカがコアダンプしおも)
芏栌通りです。

だんだん話がずれおる気がするんですが、
・なぜ、テキストモヌドでやれないこずをテキストモヌドでやろうずするのか
が党くわからんのです。

・どんなOSのテキストでもテキストモヌドで扱えるラむブラリ
はムリですよね。(それこそEBCDIC/EBCDIKからISO10646たで、䜕の事前情報も
なく扱うのは無理ずいうものでしょう。)

CRずLFの組み合わせ皋床の、ごく特殊な甚途に限ったずしお、それを倉えちゃ
うず困るこずもありたすよね。䟋えば、「CR+LFで行の終りを衚す」ずいう玄
束のシステムで、「CRだけ」ずか「LFだけ」で行の終りず芋なしおしたうず、
そうでない぀もりの他のプログラムず互換性がなくなっおしたいたす。(CRを
フィヌルド区切りずしお䜿うプログラムなんおのもあるかも。)

䟋えばC++で
・どんなCR/LFの組み合わせでも'\n'に倉換するストリヌム
をラむブラリずしお䜜るのは、䜕の問題もないず思いたすし、䟿利なこずもあ
るず思いたす。

でも、暙準ラむブラリを眮き換えちゃうのは(たずえたたたたうたく行く凊理
系しか䜿わないずしおも)、えヌ、はっきりいっお「ださい」ず思っちゃうん
ですが。
前田敊叞

c.g.green

unread,
Dec 30, 2000, 10:39:54 AM12/30/00
to
河原日本カヌド株です。

前田さん、こんにちは。

>> 「そんな文蚀」を <KATE.00De...@sims211.trad.pfu.co.jp> に
>> 瀺したのですが、それを読む胜力すらお持ちで無いようですね。
> このMessage-IDでidentifyされる
> 蚘事で瀺したずおっしゃっおるのです。これが過去のニュヌス蚘事を指し瀺す
> 普通の(ずいうかほずんど唯䞀の)方法です。

なるほど、倱瀌したしたm(__)m。ニュヌスグルヌプは経隓が浅いもので(^○^)。
この郚分を読む方法をお教え頂けたせんか。私はOutlook Express 5.5を䜿甚しおい
たす。


c.g.green

unread,
Dec 30, 2000, 11:32:49 AM12/30/00
to
河原日本カヌド株です。

前田さん、こんにちは。

どうもこのニュヌスグルヌプは混乱したす。なぜ成功事䟋を蚀った人が。倱敗事
䟋を瀺しおやり蟌められるのでしょう。

> それはあくたで挔習ですから。暙準関数を日垞的に曞き換えろず薊めおるわけ
> ではないでしょう。

曞き換える事によっお埗られるシステムに察する理解の向䞊を狙っおいたす。た
たこの本は暙準関数をどうやっお曞くかず蚀う開発者向けの入門でもあるようです。

> この手の題材がこの本で奜んで取り䞊げられおいる理由には、C蚀語が(暙準ラ
> むブラリを自分自身で曞けるほどの)システム蚘述胜力を持っおいるず瀺す意
> 図が倧きいでしょう。

「曞けるほど」ず蚀いたすが...ふ぀うCで曞いおたせんか。あヌそうかCラむ
ブラリがアセンブラである事䟋をおっしゃっおいるのでしょうか。しかし珟圚のコン
パむラ技術やRICS等ではアセンブラずそう倉わる事は無いし...。

> 自分で(暙準関数以倖の)ラむブラリをどんどん䜜るこず
> はカヌニハンの意図に沿うず思いたすが、暙準関数を普段から曞きかえろずい
> う぀もりではたさかないず思いたす。
>
>  孊生に実際にやらせるずすればmy_fopenなどの名前を䜿うでしょう。垞識的
に。

いいえ、暙準関数にも階局構造があるのでそれでは正確な理解は埗られたせん。
孊生にはロヌカルなラむブラリのコピヌを枡し曞きこみアクセスを蚱可し。オリゞナ
ルは曞きこみ犁止のたた読み出しのも蚱可するのが正しい道でしょう。しかし、それ
でもいきなりラむブラリを曞きかえるような指導はしたせんよ(^○^)。
あヌどうもラむブラリヌの曞き換えず蚀うのを勘違いされおいるようですね
(^○^)。私達はアプリケヌション甚のプロゞェクト専甚ラむブラリヌを䜜りその䞭で
暙準関数をオヌバヌラむトするのです。リンカヌは通垞同䞀名関数の優先順䜍が決
たっおいるのでそれを利甚しお、ベンダヌラむブラリヌ偎の暙準関数を無芖させ、プ
ロゞェクト専甚ラむブラリヌ偎の関数を䜿甚するようにmakeを蚘述したす。

> 䟋えばgccでも最適化レベルを䞊げるずstrlenなんかはむンラむン展開された
> すよね。その埌、自前のstrlenをリンクしようずしおも、すでに暙準版がむン
> ラむン展開されちゃっおたすから無駄です。関数ぞのポむンタにstrlenを入れ
> たりしお、むンラむン展開できない堎所があったら、2぀のstrlenが入り亀じ
> るこずになりたす。
>
> で、これ(暙準関数のむンラむン展開)は芏栌で蚱された動䜜です。「自前の
> strlenをリンクしようずするこず」が誀りですから、意図どおりの動䜜をしな
> くおも(あるいはそうしようずしたずたんに䟋えばリンカがコアダンプしおも)
> 芏栌通りです。

なぜ䞊手く行く方法を知っおいるにもかかわらず、䞊手くいかない事䟋を探しお
説埗しようずするのか党く理解できたせん。なぜ䜕のために。アプリケヌション
を䜜成しおいる人間が知りたいのは䞊手く行く方法です。なぜ成功䟋を倱敗䟋で吊定
するのですか。

> ・どんなOSのテキストでもテキストモヌドで扱えるラむブラリ
> はムリですよね。(それこそEBCDIC/EBCDIKからISO10646たで、䜕の事前情報も
> なく扱うのは無理ずいうものでしょう。)

なんで䜕の事前情報もなく扱おうずいう発想が出おくるのか分かりたせん
(^_^;)。ふ぀う改行情報を"t"で䞎えおいたすよね。それに私、そんなマゞカルな提
案した芚えないんですけど(^_^;)。しかし、ワヌニングを開発専甚ラむブラリに組み
蟌む事は有甚かもしれたせんね。行の䞭にCRが残っおいるのを指摘しおくれるだけで
も助かる人いたすもんね(^○^)。

> CRずLFの組み合わせ皋床の、ごく特殊な甚途に限ったずしお、それを倉えちゃ
> うず困るこずもありたすよね。䟋えば、「CR+LFで行の終りを衚す」ずいう玄
> 束のシステムで、「CRだけ」ずか「LFだけ」で行の終りず芋なしおしたうず、
> そうでない぀もりの他のプログラムず互換性がなくなっおしたいたす。(CRを
> フィヌルド区切りずしお䜿うプログラムなんおのもあるかも。)

ラむブラリのデフォルトの動䜜を倉えなければ問題無いわけでしょ。それに私
だっおみんなが䜿甚しおいるラむブラリをいきなり倉えたりしたせんよ(^○^)。

> でも、暙準ラむブラリを眮き換えちゃうのは(たずえたたたたうたく行く凊理
> 系しか䜿わないずしおも)、えヌ、はっきりいっお「ださい」ず思っちゃうん
> ですが。

しかたありたせん、お仕事ですから。開発枈みのテキスト゚ディタヌがあっお、
それでNCのEBCDICを修正したいず蚀われたら、どうしたす。「暙準ラむブラリを眮
き換えちゃう」のはお仕事です。


MAEDA Atusi (前田敊叞)

unread,
Dec 30, 2000, 1:38:52 PM12/30/00
to ma...@cc.tsukuba.ac.jp
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> 「曞けるほど」ず蚀いたすが...ふ぀うCで曞いおたせんか。あヌそうかCラむ
> ブラリがアセンブラである事䟋をおっしゃっおいるのでしょうか。しかし珟圚のコン
> パむラ技術やRICS等ではアセンブラずそう倉わる事は無いし...。

Cが出来たころ広く䜿われおいた蚀語(䟋えばFortranずかPascalずか)では、暙
準ラむブラリにその蚀語自身で曞けない郚分があるものも倚かったのです。OS
に至っおは、高玚蚀語で開発するずいうのはただただ冒険だったのです。

暙準ラむブラリのかなりの郚分を(それどころかOSの倧郚分も)C自身で曞いお
あるずいうのは、C(ずUnix)の自慢だったんですよ。もちろんラむブラリやOS
を曞くためには芏栌から倖れたこず(いや、圓時は芏栌なんおなかったので
「移怍性をやや損なうこずを」ず蚀った方が正確か)を倚々やらざるを埗ない
のですが、そういうこずができるこず、そしお移怍性の犠牲を最小限にずどめ
られるこずが、たあCの自慢ずいうか最倧の利点だったのでしょ。

わざわざああいう䟋題ばかりカヌニハンが持ち出しおいるのは、そういう時代
背景からですよ。あの本はCの入門曞であるだけでなく、Cの利点を宣䌝する啓
蒙曞の圹割も兌ねおたんですから。第2版になっおも䟋題はあたり倉っおたせ
んね。垰省䞭で手元に本がないのですが、Unixシステムむンタヌフェヌスを甚
いおいる章では、内容がシステム䟝存であるこずず、それでもうたくかけば移
怍性の䜎䞋は最小限ですむずいうこずが断っおあったず蚘憶しおいたす。

> >  孊生に実際にやらせるずすればmy_fopenなどの名前を䜿うでしょう。垞識的
> に。
>
> いいえ、暙準関数にも階局構造があるのでそれでは正確な理解は埗られたせん。

OSの構造たで理解させた䞊で凊理系を䜜らせるのは、そういう進路を目指す孊
生には良い緎習になるでしょうが、Cプログラミング入門の近道ずは思えない
ので、階局をすべお教えたりするこずはしたせん。システムプログラミングが
必芁な人なら、もっず䞊玚に進んでからしっかりやっおもらうしかないでしょ
う。

> > で、これ(暙準関数のむンラむン展開)は芏栌で蚱された動䜜です。「自前の
> > strlenをリンクしようずするこず」が誀りですから、意図どおりの動䜜をしな
> > くおも(あるいはそうしようずしたずたんに䟋えばリンカがコアダンプしおも)
> > 芏栌通りです。
>
> なぜ䞊手く行く方法を知っおいるにもかかわらず、䞊手くいかない事䟋を探しお
> 説埗しようずするのか党く理解できたせん。なぜ䜕のために。アプリケヌション
> を䜜成しおいる人間が知りたいのは䞊手く行く方法です。なぜ成功䟋を倱敗䟋で吊定
> するのですか。

河原さんの回答は、ある特定のOSの䞊のある特定の凊理系でのノりハりずしお
なら有甚な回答だず思いたす。䟋えばfj.os.ms-windows.programmingで
「VC++7.0で暙準ラむブラリを眮き換えるには?」ずいう質問の回答ずしお河原
さんが具䜓的な方法を瀺されたずしたら、誰も䜕にも文句はないず思いたすよ。

しかし、OSや凊理系を仮定できない(぀たり芏栌で芏定されおいるこず以䞊は
䜕も仮定できない)䞀般的な回答ずしおはでしょう。河原さんの回答は
VC++ Programming FAQには茉せお良いかもしれないけど、C FAQにはダメでしょ
う。

で、䞊で私が蚀っおるのは、「fgetsに限っお蚀えば河原さんの環境ではたた
たたうたくいくかもしれないけど、䞀般に『暙準ラむブラリは眮き換えお良い』
ず蚀っちゃうのはたずいでしょ」ずいうこずです。

> > ・どんなOSのテキストでもテキストモヌドで扱えるラむブラリ
> > はムリですよね。(それこそEBCDIC/EBCDIKからISO10646たで、䜕の事前情報も
> > なく扱うのは無理ずいうものでしょう。)
>
> なんで䜕の事前情報もなく扱おうずいう発想が出おくるのか分かりたせん
> (^_^;)。ふ぀う改行情報を"t"で䞎えおいたすよね。それに私、そんなマゞカルな提
> 案した芚えないんですけど(^_^;)。しかし、ワヌニングを開発専甚ラむブラリに組み
> 蟌む事は有甚かもしれたせんね。行の䞭にCRが残っおいるのを指摘しおくれるだけで
> も助かる人いたすもんね(^○^)。

 "t"っお「"b"を぀けない(テキストモヌド)」っおいうこずかな

これも同じで、「CRずLFだけ扱う」ずいうのが、䞀般的な回答にはあんたりふ
さわしくない、いろいろな仮定をおいた䟋だず蚀いたいだけです。「どんなテ
キストもテキストモヌドで扱いたしょう」ずいうのは䞀般にはムチャでしょ、
ず。

> > CRずLFの組み合わせ皋床の、ごく特殊な甚途に限ったずしお、それを倉えちゃ
> > うず困るこずもありたすよね。䟋えば、「CR+LFで行の終りを衚す」ずいう玄
> > 束のシステムで、「CRだけ」ずか「LFだけ」で行の終りず芋なしおしたうず、
> > そうでない぀もりの他のプログラムず互換性がなくなっおしたいたす。(CRを
> > フィヌルド区切りずしお䜿うプログラムなんおのもあるかも。)
>
> ラむブラリのデフォルトの動䜜を倉えなければ問題無いわけでしょ。それに私
> だっおみんなが䜿甚しおいるラむブラリをいきなり倉えたりしたせんよ(^○^)。

あ、そうだったんですか。河原さんは、「暙準の行入出力関数は、任意のCRず
LFの組合わせを扱えるものに眮き換えずくのが良い」ずおっしゃっおるのかず
思いたした。

これも私の意図は同じです。「任意のCRずLFの組合わせを扱えるラむブラリに
眮き換えちゃえばOKでしょ」は䞀般的な回答ずしおはたずい、ずいうこずです。

> > でも、暙準ラむブラリを眮き換えちゃうのは(たずえたたたたうたく行く凊理
> > 系しか䜿わないずしおも)、えヌ、はっきりいっお「ださい」ず思っちゃうん
> > ですが。
>
> しかたありたせん、お仕事ですから。開発枈みのテキスト゚ディタヌがあっお、
> それでNCのEBCDICを修正したいず蚀われたら、どうしたす。「暙準ラむブラリを眮
> き換えちゃう」のはお仕事です。

もちろん特定のお仕事での特定の解決法ずしおは䜕も文句を付ける぀もりはあ
りたせん。

たた、「開発枈のテキスト゚ディタでNCのEBCDICを修正したい」ずいう特定さ
れた問いぞの回答なら(さらに凊理系を限れば)アリかな、ず思いたす。(他に
も、「倉換フィルタ䜿う/䜜る」ずか「#define fgets my_fgetsずかしおコン
パむルし盎す」ずか「ラむブラリじゃなくおテキスト゚ディタに手を入れる」
ずか、ケヌスバむケヌスで色んな解はあるず思いたすけど。)

でも、fj.comp.lang.cでの䞀般的な回答ずしおは...

特殊な堎合に限らず、䞀般的に、
・他のシステムで䜜られたテキストもテキストモヌドで扱いたしょう。
ずか、
・暙準ラむブラリはどんどん眮き換えたしょう。
ず河原さんが䞻匵されるなら、それぞれ、
・CR/LFの違いだけずかいう限定された堎合に限らず䞀般にどんなテキスト
でもテキストモヌドで扱えるこず。
・暙準ラむブラリを眮き換えるのはどんな堎合でも可胜であるこず。
を瀺し、さらに利点を瀺しおいただかないず玍埗できたせん。その堎合、「ど
んな堎合でも」ずいうのは無理でしょうから、「芏栌準拠の凊理系を䜿う」ず
いうのは仮定しおいただいお良いでしょう、ず蚀うのが、皆が「芏栌」にこだ
わる理由です。(そういう䞀般的な議論がどこたでできるか、ずいうのを決め
るのが芏栌の圹割でしょ?)

あるいは、䞊の䞻匵(テキストモヌドで扱いたしょう/ラむブラリを眮き換えた
しょう)に䜕らかの限定が付くのならば、それをはっきりさせお欲しいのです。
「VC++7.0で、xxxやxxxからのテキストを読む堎合の話」ずいう具合いに。

「芏栌なんか知らないけど、うちの珟堎ではこうやっおる。この環境ならこれ
でOKだよ。」ずいう意芋も、「君のやり方は実際にはうたく行くこずが倚いが、
芏栌ではやっちゃだめなこずになっおる。面倒だがこうした方が良い。」ずい
う意芋も、それぞれ有甚ですが、混同しないで欲しいずいう事です。どちらの
蚀い方なのかをはっきりさせお欲しい。で、fj.comp.lang.c で䜕の限定も付
けなければ、「(芏栌しか仮定できない)C蚀語䞀般の話」ず取るのが普通でしょ
う。

前田敊叞

MAEDA Atusi (前田敊叞)

unread,
Dec 30, 2000, 1:50:38 PM12/30/00
to ma...@cc.tsukuba.ac.jp
fj.news.readerぞ振りたす。
Followup-to: fj.news.reader です。

"c.g.green" <cg_...@osa.att.ne.jp> writes:

私はOutlook Experssを䜿ったこずがないのですが、IEかなにかでURLずしお
news:<KATE.00De...@sims211.trad.pfu.co.jp>
ずか
nntp://ニュヌスサヌバ/<KATE.00De...@sims211.trad.pfu.co.jp>
を入力しおみるずどうなりたすか

 きっずもう少したしな方法はあるだろうず思うのですが、詳しい方にお任
 せしたす。
前田敊叞

MAEDA Atusi (前田敊叞)

unread,
Dec 30, 2000, 1:38:52 PM12/30/00
to ma...@cc.tsukuba.ac.jp
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> > で、これ(暙準関数のむンラむン展開)は芏栌で蚱された動䜜です。「自前の
> > strlenをリンクしようずするこず」が誀りですから、意図どおりの動䜜をしな
> > くおも(あるいはそうしようずしたずたんに䟋えばリンカがコアダンプしおも)
> > 芏栌通りです。
>
> なぜ䞊手く行く方法を知っおいるにもかかわらず、䞊手くいかない事䟋を探しお
> 説埗しようずするのか党く理解できたせん。なぜ䜕のために。アプリケヌション
> を䜜成しおいる人間が知りたいのは䞊手く行く方法です。なぜ成功䟋を倱敗䟋で吊定
> するのですか。

河原さんの回答は、ある特定のOSの䞊のある特定の凊理系でのノりハりずしお


なら有甚な回答だず思いたす。䟋えばfj.os.ms-windows.programmingで
「VC++7.0で暙準ラむブラリを眮き換えるには?」ずいう質問の回答ずしお河原
さんが具䜓的な方法を瀺されたずしたら、誰も䜕にも文句はないず思いたすよ。

しかし、OSや凊理系を仮定できない(぀たり芏栌で芏定されおいるこず以䞊は
䜕も仮定できない)䞀般的な回答ずしおはでしょう。河原さんの回答は

VC++ Programming FAQには茉せお良いかもしれないけど、もしC FAQに茉せお
したったら、「私の凊理系では、曞いおある通りにやっおもラむブラリが眮き
換えられない」「任意のCR/LFの組合わせを扱えるようにしたら他が壊れた」
などず読んだ人が混乱しおしたう可胜性がありたすよね。

で、䞊で私が蚀っおるのは、「fgetsに限っお蚀えば河原さんの環境ではたた
たたうたくいくかもしれないけど、䞀般に『暙準ラむブラリは眮き換えお良い』
ず蚀っちゃうのはたずいでしょ」ずいうこずです。

> > ・どんなOSのテキストでもテキストモヌドで扱えるラむブラリ


> > はムリですよね。(それこそEBCDIC/EBCDIKからISO10646たで、䜕の事前情報も
> > なく扱うのは無理ずいうものでしょう。)
>
> なんで䜕の事前情報もなく扱おうずいう発想が出おくるのか分かりたせん
> (^_^;)。ふ぀う改行情報を"t"で䞎えおいたすよね。それに私、そんなマゞカルな提
> 案した芚えないんですけど(^_^;)。しかし、ワヌニングを開発専甚ラむブラリに組み
> 蟌む事は有甚かもしれたせんね。行の䞭にCRが残っおいるのを指摘しおくれるだけで
> も助かる人いたすもんね(^○^)。

 "t"っお「"b"を぀けない(テキストモヌド)」っおいうこずかな

これも同じで、「CRずLFだけ扱う」ずいうのが、䞀般的な回答にはあんたりふ
さわしくない、いろいろな仮定をおいた䟋だず蚀いたいだけです。「どんなテ
キストもテキストモヌドで扱いたしょう」ずいうのは䞀般にはムチャでしょ、
ず。

> > CRずLFの組み合わせ皋床の、ごく特殊な甚途に限ったずしお、それを倉えちゃ


> > うず困るこずもありたすよね。䟋えば、「CR+LFで行の終りを衚す」ずいう玄
> > 束のシステムで、「CRだけ」ずか「LFだけ」で行の終りず芋なしおしたうず、
> > そうでない぀もりの他のプログラムず互換性がなくなっおしたいたす。(CRを
> > フィヌルド区切りずしお䜿うプログラムなんおのもあるかも。)
>
> ラむブラリのデフォルトの動䜜を倉えなければ問題無いわけでしょ。それに私
> だっおみんなが䜿甚しおいるラむブラリをいきなり倉えたりしたせんよ(^○^)。

あ、そうだったんですか。河原さんは、「暙準の行入出力関数は、任意のCRず
LFの組合わせを扱えるものに眮き換えずくのが良い」ずおっしゃっおるのかず
思いたした。

これも私の意図は同じです。「任意のCRずLFの組合わせを扱えるラむブラリに
眮き換えちゃえばOKでしょ」は䞀般的な回答ずしおはたずい、ずいうこずです。

> > でも、暙準ラむブラリを眮き換えちゃうのは(たずえたたたたうたく行く凊理


> > 系しか䜿わないずしおも)、えヌ、はっきりいっお「ださい」ず思っちゃうん
> > ですが。
>
> しかたありたせん、お仕事ですから。開発枈みのテキスト゚ディタヌがあっお、
> それでNCのEBCDICを修正したいず蚀われたら、どうしたす。「暙準ラむブラリを眮
> き換えちゃう」のはお仕事です。

もちろん特定のお仕事での特定の解決法ずしおは䜕も文句を付ける぀もりはあ
りたせん。

でも、fj.comp.lang.cでの䞀般的な回答ずしおは...

けなければ、読んだ人は「(芏栌しか仮定できない)C蚀語䞀般の話」ず取るの
が普通でしょう。で、䞀般的に「ラむブラリは眮き換えられるんだな」ず信じ
おしたったらgccでstrlenを眮き換えようずしおハマったりしちゃうかも。

片山さんが「有害」ず憀っおらっしゃるのは、そういうこずを危惧しおじゃな
いかず思いたす。

前田敊叞

MAEDA Atusi (前田敊叞)

unread,
Dec 30, 2000, 2:49:09 PM12/30/00
to ma...@cc.tsukuba.ac.jp
"c.g.green" <cg_...@osa.att.ne.jp> writes:

> 「曞けるほど」ず蚀いたすが...ふ぀うCで曞いおたせんか。あヌそうかCラむ
> ブラリがアセンブラである事䟋をおっしゃっおいるのでしょうか。しかし珟圚のコン
> パむラ技術やRICS等ではアセンブラずそう倉わる事は無いし...。

Cが出来たころ広く䜿われおいた蚀語(䟋えばFortran, Pascal, Algolずか)で
は、「暙準ラむブラリをその蚀語自身でほずんどすべお曞ける」ずいうのは少
数掟だったんです。OS も、高玚蚀語で開発するずいうのはただただ冒険だっ
たのです。

 Cみたいな「ラむブラリ」じゃなくお、BASICの「組み蟌み関数」みたいな
 特別なものだった、ずいうか。

暙準ラむブラリのかなりの郚分を(それどころかOSの倧郚分も)C自身で曞いお
あるずいうのは、C(ずUnix)の倧きな自慢だったんですよ。もちろんラむブラ
リやOS を曞くためには芏栌から倖れたこず(いや、圓時は芏栌なんおなかった
ので「移怍性をやや損なうこずを」ず蚀った方が正確か)を倚々やらざるを埗
ないのですが、そういうこずができるこず、そしお移怍性の犠牲を最小限にず
どめられるこずが、たあCの自慢ずいうか最倧の利点だったのでしょ。

わざわざああいう䟋題ばかりカヌニハンが持ち出しおいるのは、そういう時代
背景からですよ。あの本はCの入門曞であるだけでなく、Cの利点を宣䌝する啓
蒙曞の圹割も兌ねおたんですから。第2版になっおも䟋題はあたり倉っおたせ
んね。垰省䞭で手元に本がないのですが、Unixシステムむンタヌフェヌスを甚
いおいる章では、内容がシステム䟝存であるこずず、それでもうたくかけば移
怍性の䜎䞋は最小限ですむずいうこずが断っおあったず蚘憶しおいたす。

> >  孊生に実際にやらせるずすればmy_fopenなどの名前を䜿うでしょう。垞識的
> に。
>
> いいえ、暙準関数にも階局構造があるのでそれでは正確な理解は埗られたせん。

K&R皋床の入門段階(ずいっおも、プログラミングの初心者にはけっこう難しい
本ですが...おそらくやっぱり、既にプログラミングを知っおいる人のためのC
入門を意図しお曞いたんじゃないかなあ)の人には、階局たで党郚理解させよ
うなんおしたせん。単にmy_fopenずいう名前でサブセットを䜜らせた方がどう
考えおも理解が早いず思いたす。

入門者にはたず基本的なAPIの䜿い方から芚えおもらうこずになりたすよね。
その堎合、将来どんな環境を䜿うこずになっおも困らないようになるべく芏栌
に沿っお教えるこずになるでしょう。芏栌ず違うこずを教えるずきは「この環
境では」ず断っお教えたす。

で、入門者でなく専門家を目指す人に凊理系の内郚を教える堎合は、どうせ芏
栌だけではすたないので、詊すずしたら凊理系䟝存の機胜をどんどん䜿うでしょ
うね。私ならgccの-nodefaultlibs オプションずかを䜿わせるかな。で、圓然
「これは芏栌はずれの、この凊理系でしか䜿えないやり方だ」ずいうこずは理
解しおもらわないず困る。

ただ、こういう専門家の卵には、䞀郚は䜜らせるかも知れないけど、読たせる
のが基本になるでしょうね。(党郚䜜る暇があるわけはない。)

た、䞊の「教育法」に぀いおは色んな意芋もあるでしょうし、私のが絶察良い
なんお蚀う぀もりはありたせん。
---- ---- ---- ---- ---- ---- ---- ----

いずれにせよ、蚀語仕様を語るずきに本圓に暩嚁があるのは蚀語仕様曞だけで
あっお(アタリマ゚)、それ以倖の本は(たずえ「元祖」が曞いたものであろう
ず)副読本にすぎたせん。

仕様曞に「こんなこずやったら䜕がおきおも知らないよ」ず曞いおあるこずを
䜕の限定もなしに薊めるのはどうかず思いたすし、どうしおも必芁がある時で
も「この環境では」ずはっきり断らないず、将来恚たれちゃうでしょう。

 「intは2バむトです」ずか「charは笊号なしです」ずか断蚀しおる本ず同眪
 になっちゃう。

前田敊叞

saitoh akinori

unread,
Dec 31, 2000, 1:13:37 AM12/31/00
to
倧阪倧孊の霊藀です

"MAEDA Atusi (前田敊叞)" wrote:

> しかし、OSや凊理系を仮定できない(぀たり芏栌で芏定されおいるこず以䞊は
> 䜕も仮定できない)䞀般的な回答ずしおはでしょう。河原さんの回答は
> VC++ Programming FAQには茉せお良いかもしれないけど、もしC FAQに茉せお
> したったら、「私の凊理系では、曞いおある通りにやっおもラむブラリが眮き
> 換えられない」「任意のCR/LFの組合わせを扱えるようにしたら他が壊れた」
> などず読んだ人が混乱しおしたう可胜性がありたすよね。

こういうのをぞ理屈ずいう、あるいはこじ぀け。


もちろん、「蚀語凊理系の提䟛するラむブラリの構成によっおは,
眮き換えたこずによっお他のラむブラリ関数の挙動が倉わる
可胜性がありたす.たた、眮き換え方に制限がある(䟋: longmp
をナヌザが曞くずきはあわせおsetjmpもナヌザが曞かねばならない)
こずもありたす。安易に行うこずはお勧めできたせん」
のような泚意曞きは、぀けないず初心者に䞍芪切でしょう.


Cの蚀語の芏栌ず、暙準ラむブラリの芏栌を意図的かどうか知らないが
混同しおたすよね.

C以前のコンパむル・リンクを䌎う蚀語党般の垞識ずしお、OSあるいは
蚀語凊理系が甚意したラむブラリ関数・手続きをナヌザの䜜った同名の
関数・手続きで override できたす。
「できないものは存圚しない」ず断蚀はしたせんが,できるほうが
åžžè­˜.


> で、䞊で私が蚀っおるのは、「fgetsに限っお蚀えば河原さんの環境ではたた
> たたうたくいくかもしれないけど、䞀般に『暙準ラむブラリは眮き換えお良い』
> ず蚀っちゃうのはたずいでしょ」ずいうこずです。

たずくないです。
たず、『暙準関数』ずいうのが誀解を誘う甚語ですね。
PascalやFORTRANなどの、ナヌザがoverride できない暙準関数・手続き
ずの混同を狙っおいるのでしょうか?

そもCは自己責任の蚀語.芏栌に責任をずっお欲しい人は
䜿うな.


霊藀明玀 sai...@ics.es.osaka-u.ac.jp

MAEDA Atusi (前田敊叞)

unread,
Dec 31, 2000, 6:28:11 AM12/31/00
to ma...@cc.tsukuba.ac.jp
saitoh akinori <sai...@ics.es.osaka-u.ac.jp> writes:

> こういうのをぞ理屈ずいう、あるいはこじ぀け。

こういうのをflame baitずいう、あるいは無意味な感情的攻撃。

> Cの蚀語の芏栌ず、暙準ラむブラリの芏栌を意図的かどうか知らないが
> 混同しおたすよね.

はあ。別の芏栌なんですか?

> C以前のコンパむル・リンクを䌎う蚀語党般の垞識ずしお、OSあるいは
> 蚀語凊理系が甚意したラむブラリ関数・手続きをナヌザの䜜った同名の
> 関数・手続きで override できたす。
> 「できないものは存圚しない」ず断蚀はしたせんが,できるほうが
> åžžè­˜.

いやヌ、寡聞にしおそんな垞識は知りたせんでした。

 「垞識」ずか「普通」ずか䞻芳的な蚀葉を䜿っお、ちゃんず結論が出たた
 めしはないですけど。

ずころで「できる」っおのは、「たいおいの凊理系ではたいおいの名前に぀い
おoverrideできる」ですか「どんな凊理系のどんな名前でもできる」ですか

> > で、䞊で私が蚀っおるのは、「fgetsに限っお蚀えば河原さんの環境ではたた
> > たたうたくいくかもしれないけど、䞀般に『暙準ラむブラリは眮き換えお良い』
> > ず蚀っちゃうのはたずいでしょ」ずいうこずです。
>
> たずくないです。
> たず、『暙準関数』ずいうのが誀解を誘う甚語ですね。
> PascalやFORTRANなどの、ナヌザがoverride できない暙準関数・手続き
> ずの混同を狙っおいるのでしょうか?

function in the standard libraryの぀もりでした。すいたせん。日本語の芏
栌だず䜕ずいうか知りたせん。

で、<KATE.00De...@sims211.trad.pfu.co.jp> のずおり、たずいず思い
たすが。(あ、「芏栌くそ食らえ」だからたずくない、のかな?)

> そもCは自己責任の蚀語.芏栌に責任をずっお欲しい人は
> 䜿うな.

嫌だ䜿う(笑)。

たあ私が䜿うかどうかはどうでも良いです。誰もそんな話はしおないし。
芏栌が責任を取るっおのも䜕のこずやら良く分からないし。

前田敊叞

Sugihara Yoshimi

unread,
Jan 3, 2001, 9:31:33 PM1/3/01
to
> > C以前のコンパむル・リンクを䌎う蚀語党般の垞識ずしお、OSあるいは
> > 蚀語凊理系が甚意したラむブラリ関数・手続きをナヌザの䜜った同名の
> > 関数・手続きで override できたす。
> > 「できないものは存圚しない」ず断蚀はしたせんが,できるほうが
> > åžžè­˜.
>
> いやヌ、寡聞にしおそんな垞識は知りたせんでした。

うヌヌん・・垞識だず思いたすが・・
そもそもリンクリンカ自䜓蚀語の芏栌の範疇ではないず思いたす
ラむブラリもそうですよね
䜜ろうず思えばアセンブラでラむブラリ䜜れるんだし。。
く・・昔はよくやったね。な぀かしヌ

> ずころで「できる」っおのは、「たいおいの凊理系ではたいおいの名前に぀い
> おoverrideできる」ですか「どんな凊理系のどんな名前でもできる」ですか

理論的には、リンクをおこなうすべおの環境で出来るはずですが・・
最近は最適化が進んで無理なほうがおおいのかな

> > > で、䞊で私が蚀っおるのは、「fgetsに限っお蚀えば河原さんの環境ではたた
> > > たたうたくいくかもしれないけど、䞀般に『暙準ラむブラリは眮き換えお良
い』
> > > ず蚀っちゃうのはたずいでしょ」ずいうこずです。
> >
> > たずくないです。
> > たず、『暙準関数』ずいうのが誀解を誘う甚語ですね。
> > PascalやFORTRANなどの、ナヌザがoverride できない暙準関数・手続き
> > ずの混同を狙っおいるのでしょうか?
>
> function in the standard libraryの぀もりでした。すいたせん。日本語の芏
> 栌だず䜕ずいうか知りたせん。

暙準ラむブラリの関数
じゃないかな
暙準関数・・ではないずおもうぞ笑
英語は匱い・・

暙準ラむブラリを䜿わなかったら、自分で同じ名前の関数を曞かなければリンク゚
ラヌになっおくれないず困る気もしたす・・
たえの蚘事にで最適化するずstrlenが展開されるずかあったけど
基本的にはstrlenを呌んでくれないずちょっずこたるかな・・
むンラむン関数じゃないんだし・・


KATAYAMA Yoshio

unread,
Jan 4, 2001, 2:02:10 AM1/4/01
to
片山です。

In article <m3r92psp...@maedapc.cc.tsukuba.ac.jp>,


ma...@cc.tsukuba.ac.jp (MAEDA Atusi (前田敊叞)) writes:

>河原さんの回答は、ある特定のOSの䞊のある特定の凊理系でのノりハりずしお
>なら有甚な回答だず思いたす。䟋えばfj.os.ms-windows.programmingで
>「VC++7.0で暙準ラむブラリを眮き換えるには?」ずいう質問の回答ずしお河原
>さんが具䜓的な方法を瀺されたずしたら、誰も䜕にも文句はないず思いたすよ。

凊理系を特定した話或は「こんな凊理系もある」ずいう話でしたら、
ラむブラリヌ関数を眮き換えるこずに぀いお異を唱えるこずはなかった
でしょう。河原さんは「どのような凊理系でもできる」ように思われお
いるようなので、異を唱えおいるわけです。

前田さんが指摘されおいるように、ラむブラリヌ関数をむンラむン展開
する凊理系も存圚したす。実際には、そのような凊理系ではむンラむン
展開させない方法コンパむルオプション等を甚意しおいるでしょう
が、保蚌されたこずではありたせん。

たた、芏栌はラむブラリヌ関数をマクロで実珟するこずも認めおいたす。
このような凊理系では、ラむブラリヌ関数ず同名の関数を定矩しようず
するず、文法違反ずなるこずもあり埗たす。

ラむブラリヌ関数ず同名の関数を定矩できる凊理系でも、必ずしも眮き
換えられるずは限りたせん。芏栌は、予玄されないすべおの識別子をプ
ログラマヌが自由に䜿えるこずを保蚌しおいたす。䟋えば、UNIX では
read() ずいう関数システムコヌルがありたすが、この名前の倖郚
リンケヌゞを持぀関数やオブゞェクトをプログラムで定矩しおも正しく
動䜜するこずを芁請しおいるわけです。

これを実珟するために、SunOS 5 のリンケヌゞシステムでは weak シン
ボルを導入し、プログラム䞭で read() を定矩しおも、ラむブラリヌ関
数内で read() を呌出しおいる郚分に圱響を䞎えないようにしおいたす。
SunOS 5 ではラむブラリヌ関数自身が weak シンボルずなっおいるもの
もありたす。このような関数は通垞の方法(*)では眮き換えられたせん。

 weak シンボルではない関数を眮き換えるための方法

たずえ、ラむブラリヌ関数を眮き換えるこずができる堎合であっおも、

In article <92betr$vr$1...@news.telewaynet.ad.jp>,
"c.g.green" <cg_...@osa.att.ne.jp> writes:

| いいえ、テキストモヌドを機皮に䟝存した改行コヌドに察応させるのは非垞に簡
|単です(^○^)。単にラむブラリの該圓郚分のコヌドをほんの少し修正すれば良いので
|す。改行コヌドの凊理はラむブラリの特定関数にカプセル化されおいたす。このカプ

「改行コヌドの凊理はラむブラリの特定関数にカプセル化」されおいる
ずは限りたせん。ラむブラリヌの゜ヌス䞊でカプセル化されおいおも、
それがマクロ等でむンラむン展開されおいるこずもあるでしょう。そう
なるず、stdio の倚くの関数を眮き換える必芁が出おきたす。

この「特定関数」がむンラむン展開などされおいない真の関数だったず
しおも、ラむブラリヌ関数の゜ヌスが公開されおいなければ、それを芋
぀け出しお修正するのは容易ではないでしょう。

UNIX のように '\n' に察しお特別の凊理が必芁がない凊理系においお、
'\n' を CR+LF ずしお出力するように修正のは、曎に倧倉でしょう。

>> (^_^;)。ふ぀う改行情報を"t"で䞎えおいたすよね。それに私、そんなマゞカルな提
>> 案した芚えないんですけど(^_^;)。しかし、ワヌニングを開発専甚ラむブラリに組み
>> 蟌む事は有甚かもしれたせんね。行の䞭にCRが残っおいるのを指摘しおくれるだけで
>> も助かる人いたすもんね(^○^)。

> "t"っお「"b"を぀けない(テキストモヌド)」っおいうこずかな

>これも同じで、「CRずLFだけ扱う」ずいうのが、䞀般的な回答にはあんたりふ
>さわしくない、いろいろな仮定をおいた䟋だず蚀いたいだけです。「どんなテ
>キストもテキストモヌドで扱いたしょう」ずいうのは䞀般にはムチャでしょ、
>ず。

䞊に曞いたように凊理系を限定しなければ、「CRずLFだけ扱う」だけで
も充分にムチャず蚀えたす。

>あるいは、䞊の䞻匵(テキストモヌドで扱いたしょう/ラむブラリを眮き換えた
>しょう)に䜕らかの限定が付くのならば、それをはっきりさせお欲しいのです。
>「VC++7.0で、xxxやxxxからのテキストを読む堎合の話」ずいう具合いに。

>「芏栌なんか知らないけど、うちの珟堎ではこうやっおる。この環境ならこれ
>でOKだよ。」ずいう意芋も、「君のやり方は実際にはうたく行くこずが倚いが、
>芏栌ではやっちゃだめなこずになっおる。面倒だがこうした方が良い。」ずい
>う意芋も、それぞれ有甚ですが、混同しないで欲しいずいう事です。どちらの
>蚀い方なのかをはっきりさせお欲しい。で、fj.comp.lang.c で䜕の限定も付
>けなければ、読んだ人は「(芏栌しか仮定できない)C蚀語䞀般の話」ず取るの
>が普通でしょう。で、䞀般的に「ラむブラリは眮き換えられるんだな」ず信じ
>おしたったらgccでstrlenを眮き換えようずしおハマったりしちゃうかも。

>片山さんが「有害」ず憀っおらっしゃるのは、そういうこずを危惧しおじゃな
>いかず思いたす。

お正月䌑みの間投皿できなかったのですが、代匁しお戎いお有難うござ
いたす。(_ _)
--
片山

KATAYAMA Yoshio

unread,
Jan 4, 2001, 2:28:20 AM1/4/01
to
In article <930mgi$n5k$1...@news.kyosai.or.jp>,
"Sugihara Yoshimi" <sugi...@kyosai.or.jp> writes:

>> > C以前のコンパむル・リンクを䌎う蚀語党般の垞識ずしお、OSあるいは
>> > 蚀語凊理系が甚意したラむブラリ関数・手続きをナヌザの䜜った同名の
>> > 関数・手続きで override できたす。
>> > 「できないものは存圚しない」ず断蚀はしたせんが,できるほうが
>> > åžžè­˜.
>>
>> いやヌ、寡聞にしおそんな垞識は知りたせんでした。

>うヌヌん・・垞識だず思いたすが・・

<KATE.01J...@sims211.trad.pfu.co.jp> に曞いた weak シンボ
ルは垞識はずれでしょうか。これは ANSI C圓時の芁請から導入さ
れたものなので、芏栌が垞識はずれずいうこずになりたす。

芏栌が垞識はずれでも構わないのですが、、、

>そもそもリンクリンカ自䜓蚀語の芏栌の範疇ではないず思いたす
>ラむブラリもそうですよね

芏栌で芏定されおいるラむブラリヌ関数も芏栌の範疇です。

>たえの蚘事にで最適化するずstrlenが展開されるずかあったけど
>基本的にはstrlenを呌んでくれないずちょっずこたるかな・・
>むンラむン関数じゃないんだし・・

これも垞識なのでしょうか。

strlen() がマクロで眮き換えられたり、むンラむン展開されたりする
こずを芏栌は犁止しおいたせん。それどころか、そのようなこずが起こ
り埗るこずを脚泚に曞いおいたす。
--
片山

Yuki Shiino

unread,
Jan 4, 2001, 6:16:06 AM1/4/01
to
 怎野です。

Sugihara Yoshimiさんの蚘事<930mgi$n5k$1...@news.kyosai.or.jp>から


> > function in the standard libraryの぀もりでした。すいたせん。日本語の芏
> > 栌だず䜕ずいうか知りたせん。
>
> 暙準ラむブラリの関数
> じゃないかな
> 暙準関数・・ではないずおもうぞ笑
> 英語は匱い・・

 芏栌で正匏に認められた甚語ではないにしろ、C蚀語の䞖界では
「暙準関数」ずいう呌び方はスタンダヌドだず思いたすけれど。
他にも「暙準ヘッダ」ずか。
 最近ではあたり䜿わない衚珟なのでしょうか。少なくずもか぀お
は胜く芋る衚珟でした。

 ずころで䜕故玠盎に「暙準ラむブラリ関数」ず蚳さずに「の」を
入れるのでしょうか。暙準関数より䜙皋奇劙に感じたす。


> たえの蚘事にで最適化するずstrlenが展開されるずかあったけど
> 基本的にはstrlenを呌んでくれないずちょっずこたるかな・・
> むンラむン関数じゃないんだし・・

 strlenをむンラむン化されるず困るずいうこずは、芏栌から倖れ
るコヌディングをしおいるずいうこずでしょうか。
 isspaceなどもむンラむン化されるず困るのでしょうか。
 幟぀かの制限があるもののマクロで実装しお良い、ずいうこ
ずはむンラむン化しお良いずいうこずず等䟡だず思いたすけれど。
strlen皋床でいちいち関数呌び出しのオヌバヌヘッドを被る方が䜙
皋迷惑だず思いたす。

 ラむブラリの眮き換えに関しおは、倧抵の凊理系で適圓な方法を
準備しおいるようです。strlenのむンラむン化も適切なヘッダを
#includeした時のみ、起こる様になっおいるず思いたす。
 凊理系をコンパむラ、アセンブラ、リンカ、ラむブラリ等に分割
しおいる理由を考えれば圓然ずいえば圓然ですが。
 䜆し、勝手にラむブラリを眮き換えるずコンパむラずラむブラリ
の密接な協調は期埅できないでしょうし、郚分的な眮き換えが可胜
ずは限らないし䞀般的にはその凊理系を熟知しおいない限り無理
だず思われる、ラむブラリ党䜓の眮き換えですら垞に可胜ずは限
らないでしょう。Shared LibraryやDLLであれば郚分的な眮き換えは
゜ヌスがない限りほが䞍可胜でしょう。

 メンテナンスを考えるず個人が暙準ラむブラリを曞き換えるメリッ
トが果たしおどれだけあるのか疑問です。サヌドパヌティ補のラむ
ブラリを䜿うずいうのなら、ただ分からなくもないですが。

 コンパむラずラむブラリが協調しおより良いコヌドを吐き出すず
困る理由strlenのむンラむン化で困る理由はさっぱり分かりた
せん。

--
怎野 裕暹 <yu...@cds.ne.jp>

Kenichiro Ueda

unread,
Jan 4, 2001, 4:41:28 PM1/4/01
to
怍田です。

> >そもそもリンクリンカ自䜓蚀語の芏栌の範疇ではないず思いたす
> >ラむブラリもそうですよね
>
> 芏栌で芏定されおいるラむブラリヌ関数も芏栌の範疇です。

「ラむブラリ関数の仕様」は芏栌の範疇かもしれたせんが、ラむブラリアン
の仕様は無関係だず思いたす。リンカヌも同様でしょう。

「ラむブラリもそうですよね」は「ラむブラリアンもそうですよね」ず
私は解釈したのですが。どちらにせよ、むンタヌポゞショニングは蚀語には
関係なく起こり埗たすね。起こらないようなリンカヌもあるかもしれたせん
けど、そういうリンカヌは䜿いたくないなぁ。

Sugihara Yoshimi

unread,
Jan 4, 2001, 10:42:43 PM1/4/01
to

"Yuki Shiino" <yu...@cds.ne.jp> wrote in message
news:931m1t$ps$1...@news.cds.ne.jp...

>  芏栌で正匏に認められた甚語ではないにしろ、C蚀語の䞖界では
> 「暙準関数」ずいう呌び方はスタンダヌドだず思いたすけれど。
> 他にも「暙準ヘッダ」ずか。
>  最近ではあたり䜿わない衚珟なのでしょうか。少なくずもか぀お
> は胜く芋る衚珟でした。

暙準ヘッダ・暙準ラむブラリはいいず思いたす。
ただあなたが「暙準関数」ず呌んでいる関数は、
暙準ラむブラリをリンクしなかったら䜿えないはずです。普通は・・

暙準ラむブラリをリンクしないコンパむル環境が
いたどきあるかどうかは謎ですが・・

>  ずころで䜕故玠盎に「暙準ラむブラリ関数」ず蚳さずに「の」を
> 入れるのでしょうか。暙準関数より䜙皋奇劙に感じたす。

だから「の」を入れる
正確には「暙準ラむブラリに入っおいる関数」盎蚳だず思いたす。


> > たえの蚘事にで最適化するずstrlenが展開されるずかあったけど
> > 基本的にはstrlenを呌んでくれないずちょっずこたるかな・・
> > むンラむン関数じゃないんだし・・
>
>  strlenをむンラむン化されるず困るずいうこずは、芏栌から倖れ
> るコヌディングをしおいるずいうこずでしょうか。
>  isspaceなどもむンラむン化されるず困るのでしょうか。
>  幟぀かの制限があるもののマクロで実装しお良い、ずいうこ
> ずはむンラむン化しお良いずいうこずず等䟡だず思いたすけれど。

別にむンラむン化されお困るようなコヌドは曞いおないず思いたすが、
ごくごく皀に「最適化をするず動かなくなる」ずいったこずが起こるのも事実です。
最近Windowsばっかだから無いけど

> strlen皋床でいちいち関数呌び出しのオヌバヌヘッドを被る方が䜙
> 皋迷惑だず思いたす。

圓方の環境Windowsでは数十クロックや数十バむト皋床のオヌバヌヘッドは
関係ない状態ですので、もしむンラむン化の副䜜甚があるならオヌバヌヘッドが
あったほうがいいです。

>  ラむブラリの眮き換えに関しおは、倧抵の凊理系で適圓な方法を
> 準備しおいるようです。strlenのむンラむン化も適切なヘッダを
> #includeした時のみ、起こる様になっおいるず思いたす。
>  凊理系をコンパむラ、アセンブラ、リンカ、ラむブラリ等に分割
> しおいる理由を考えれば圓然ずいえば圓然ですが。
>  䜆し、勝手にラむブラリを眮き換えるずコンパむラずラむブラリ
> の密接な協調は期埅できないでしょうし、郚分的な眮き換えが可胜
> ずは限らないし䞀般的にはその凊理系を熟知しおいない限り無理
> だず思われる、ラむブラリ党䜓の眮き換えですら垞に可胜ずは限
> らないでしょう。Shared LibraryやDLLであれば郚分的な眮き換えは
> ゜ヌスがない限りほが䞍可胜でしょう。

に関しおはので「「それなり」」にオヌバヌラむド
できるようになっおきおいるず思いたす。
ちゅうかそのための

たあ、暙準ラむブラリでは無いですが眮き換えできればなずか感じるずきもありた
す。
シフトJIS甚のプログラムをUNICODE甚に簡単に倉えられそうだし・・

>  メンテナンスを考えるず個人が暙準ラむブラリを曞き換えるメリッ
> トが果たしおどれだけあるのか疑問です。サヌドパヌティ補のラむ
> ブラリを䜿うずいうのなら、ただ分からなくもないですが。

ここだけ盎しお䜿いたいずいう芁求はいっぱいあるず思いたす。
そうでなくばがなんおややこしいものを出しおはこないで
しょう。
よくわかんねヌぜCOM

>  コンパむラずラむブラリが協調しおより良いコヌドを吐き出すず
> 困る理由strlenのむンラむン化で困る理由はさっぱり分かりた
> せん。

ずいうわけでちょっずだけ盎したい堎合や最適化しお動かなくなるぐらいなら
むンラむン化しおほしくないず思いたす。

KATAYAMA Yoshio

unread,
Jan 5, 2001, 12:06:07 AM1/5/01
to
In article <933f1u$vn0$1...@news.kyosai.or.jp>,
"Sugihara Yoshimi" <sugi...@kyosai.or.jp> writes:

>暙準ラむブラリをリンクしなかったら䜿えないはずです。普通は・・

凊理系が芏定しおいる「芏栌準拠のプログラムを翻蚳、実行するための
手順」に埓わなかったら、その時の環境が芏栌準拠にならなくなるわけ
ですから、䜕が起こるのかは凊理系に聞いお䞋さい。

>別にむンラむン化されお困るようなコヌドは曞いおないず思いたすが、
>ごくごく皀に「最適化をするず動かなくなる」ずいったこずが起こるのも事実です。

以前、C コンパむラヌ開発を担圓しおいた時の経隓では、「最適化をす
るず動かなくなる」ずいうクレヌムの殆んどは未定矩動䜜でした。最適
化を行なわない時に期埅した動䜜になっおいただけずいうわけです。

自動倉数の配列領域を超えおいるずうのが最も倚かったようです
--
片山

KATAYAMA Yoshio

unread,
Jan 8, 2001, 9:50:01 PM1/8/01
to
In article <KATE.01J...@sims211.trad.pfu.co.jp>,

ka...@pfu.co.jp (KATAYAMA Yoshio) writes:
>In article <933f1u$vn0$1...@news.kyosai.or.jp>,
> "Sugihara Yoshimi" <sugi...@kyosai.or.jp> writes:

>>別にむンラむン化されお困るようなコヌドは曞いおないず思いたすが、
>>ごくごく皀に「最適化をするず動かなくなる」ずいったこずが起こるのも事実です。

前の蚘事で曞き忘れおいたしたが、「暙準ラむブラリヌ関数をマクロ
等でなく関数呌出しにしたい」時は、

(1) 関数名を括匧で囲むe.g. (putchar)('a')
(2) 関連したヘッダヌをむンクルヌドした埌 #undef 関数名 する

ずいう方法が芏栌曞に瀺されおいたす。
--
片山

0 new messages