C言語なら、俺に聞け! <8>

このエントリーをはてなブックマークに追加
1凡才ハカー
おれは21才、9年間プログラムを一生懸命作ってきた。
あちこちの言語に手を出したが結局極めたのはC言語だけだった。
大体のことなら分かるからオレに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

・前スレ C言語なら、オレに聞け! <7>
http://pc.2ch.net/test/read.cgi/tech/1003418249/l50
2デフォルトの名無しさん:01/11/15 17:05
2げっと
3デフォルトの名無しさん:01/11/15 17:09
>>盆栽ハカー
readlineの使い方を教えてください
>>3
Why don't you read readline's manpage?
5ケイ:01/11/15 17:44
C言語歴2ヶ月の超初心者です。
今は、ルートを使った計算を習っています。

main()
{
int i;
float a,b,c,d,e;
a=2.0;b=3.0;d=b-a;
e=1.0e-5;
i=1;
printf("%3d:%8.5f\n",i,a);
while(d>=e){
c=(a+b)/2;
if(c*c<6)
a=c;
else
b=c;
d=b-a;
printf("%3d:%8.5f\n",i,a);
}
while(d>=e){
c=(a+b)/2;
if(c*c<11)
a=c;
else
b=c;
d=b-a;
printf("%3d:%8.5f\n",i,a);
}
}
これと同じ条件で11の三乗根を求めたいのですが、教えて頂けないでしょうか?
テキスト等で調べてみたものの、初歩的な事は以外と載っていなくて苦労しています。
>>5
プログラムというより数学の問題じゃない?
>>5
google で 「ニュートン法 三乗根」を調べれ
>>3
前のスレからreadline, readlineとしつこいんだが…
manを読めという適切なアドバイスがあるのになぜ実行しないの?

読んだけど分からんと書いてたけど、あんなに簡単に使える関数なのに?
readline()に比べたらprinf()の方が数倍複雑な仕様なんだけど。
分からんじゃなくて読んでないんじゃないの?
ぎゃあ。もちろんprinf() -> printf()の間違い。
えらそーに書いてしまったので恥ずかし。
10ケイ:01/11/16 14:06
すいません、ご迷惑かけました。
ありがとうございます。
11デフォルトの名無しさん:01/11/16 16:28
#define SOME_SYMBOL_A 0x0000
#define SOME_SYMBOL_B 0x0001
#define SOME_SYMBOL_C 0x0002
#define SOME_SYMBOL_D 0x0003
...
みたいな定数が何百もあるとき、手作業だとかなり困ると
思うのですが、定数マクロで定数値が重複しないように
定数を自動生成してくれるツールはないでしょうか?
12デフォルトの名無しさん:01/11/16 16:49
>>11
何故enumを使いませんか?
>>11 enumじゃだめ?
「C language」と「C言語」の違いを教えて下さい。
別のスレで聞いたら自分の頭で考えろっていうだけで何も教えてくれません。
どうも「C言語」という言葉を使うのはよくないようなのですが
そこらへんはどうなのでしょう?
「milk」と「牛乳」とか、「baseball」と「野球」とか、
その程度の違いじゃないの?
16デフォルトの名無しさん:01/11/16 19:43
>14

ハゲシクワラタ。
17デフォルトの名無しさん:01/11/16 19:47
>>14
きみは「C言語」と言って下さい。
「C language」と言えるのは平井堅がギリです。
18デフォルトの名無しさん:01/11/16 19:48
特別にProgramming Language C って呼ぶことを許してやるよ。
(`∀′)
20デフォルトの名無しさん:01/11/16 20:01
ま、童貞の俺には関係のない話さ
21どうでもいいが:01/11/16 20:31
>>14

独習C
22デフォルトの名無しさん:01/11/16 21:30
>>11 のシンボル定義はどのように使おうとしているのだろうか。
使い道が思いつかん。
23デフォルトの名無しさん:01/11/16 21:41
baseballと野球はまったく違うものです。
24デフォルトの名無しさん:01/11/16 21:46
>>21

>独習C

オナーニみたいでやだよね。
25デフォルトの名無しさん:01/11/16 22:39
C言語でXMLやりたいんだけど
いい勉強サイトない?紹介して
27デフォルトの名無しさん:01/11/17 01:02
双方向リストのことで質問なんだけど。
 先頭と後ろに番兵を配置して番兵の中にもデータを格納するのが一般的なのでしょうか?
番兵にデータを入れると ノードを外ずしたり付け加えるときににチェックが大変
なのと チェックにかかるコストが大きいような気がするんですがどうでしょう?
28 :01/11/17 01:05
素直にはじっこのポインタはNULLにしちゃえばいいんじゃないの?
双方向リストはリングにしちゃえばケツを探すのが速くなって(゚д゚)ウマーなことも多いよね。
3027:01/11/17 02:07
>>29
リストをリングにするやりかたでのデータの終端のチェックは、
ノードが指す次のポインタが、一番最初に読み始めたノードのアドレスかどうか
を 実アドレス同士で比較するってことでしょうか?
リンク先をたどっていって、元のポインタに戻ったら終わりだヨ
>>30

struct ListElement {
 struct ListElement *prev, *next;
 struct data *body;
};

struct ListElement head = {&head, &head, NULL};

void insert(struct ListElement *e)
{
 e->prev = head;
 e->next = head.next;
 head.next->prev = e;
 head.next = e;
}

void remove(struct ListElement *e)
{
 e->prev->next = e->next;
 e->next->prev = e->prev;
}

int empty(void)
{
 return head.next == &head;
}

void search(struct data *x)
{
 struct ListElement *l = head.next;

 while (l != &head)
  if (l->body == x)
   return l;

 return NULL;
}
3327:01/11/17 02:34
>>32
ほんと助かりました。
一部理解できない部分があるけど 後は、どうにかやってみます。
ありがとうございました。
 
>>27
両端を扱うときに場合分けするのが面倒だから、ふつーは番兵にはデータを入れない。双方向連結
リストは良く使うデータ構造で、よくできた実装が既にあるから、自分で書かずに既存のライブラリを
利用するのも手だよ。

たとえば FreeBSD で使っているリスト構造だと、これ。
http://cvsweb.freebsd.org/src/sys/sys/queue.h?rev=HEAD&content-type=text/plain

>>29
リストの先頭と末尾を個別に保持する TAILQ ってのもアリですな。4.4BSD の <sys/queue.h> には
リング上のリスト構造 CIRCLEQ と TAILQ 両方あったけど、能力は同一、速度の面では (FreeBSD
の当時の実装では) 後者のほうが良かったという理由で CIRCLEQ 抹消されてます。
35デフォルトの名無しさん:01/11/17 03:51
システムコマンドを実行してその結果を得たいのですが
どうしたらよいのでしょうか?
例:dirとかの実行結果を表示したい
どなたかお願いします
>>35
一般的な話なら、ユニークなファイル名を作ってそこにリダイレクトし、
そのファイルを開く。
>>35
コンソールアプリなら system()

なんにせよ「プログラミング言語C」読みましょう。
3835:01/11/17 04:05
さっそくありがとうございます
>>36
テンポラリーなファイルに書き込ませるというのは
盲点でした
でもファイルに書き出すのはちょっと・・・
>>37
sytem("dir")
だと実行されたかどうかしか分からないのではないのでしょうか?
3935:01/11/17 04:06
sytem
systemの間違いです
鬱だ
>>38
普通は、system() 呼び出し時点での stdout, stderr, stdin 引き継ぐから、出力があれば
そのままコンソールに出てくるが。
4135:01/11/17 04:11
えっと,コンソールじゃなくて
文字配列として得たいのです
>>41
じゃあ
> 例:dirとかの実行結果を表示したい
と書いちゃダメでしょ。

標準 C ライブラリの範囲からは逸れますが popen() (処理系によっては _popen() の場合もある) が
目的に合うかと。
リダイレクトして呼び出せばいいじゃん
system("dir > dir.log");
open("dir.log");
4535:01/11/17 04:28
>>42
すんません
popen() で出来そうです
>>43
それも検討してみます

あとは頑張ってみます.こんな時間にありがとうございました
46へっぽこぷろぐらま:01/11/17 13:48
プロトタイプ宣言を関数スコープの内部に書くのは邪道ですか?

foo1.c:
int foo1() {
return 1;
}

foo2.c:
int foo2() {
int foo1();
return foo1();
}

この二つのファイルはコンパイルされ、リンクされるます。
( ´_ゝ`)そうかい
( ´Д`)y──┛~~
そいつはよかったな
49デフォルトの名無しさん :01/11/17 14:16
( ´_ゝ`)おめでてーな
( ● ´ ー ` ● )クソレス付けんなゴラ
つーか、ヘッダにプロトタイプ宣言書くの面倒だよね?
http://homepage2.nifty.com/nowsmart/opinion_needless_prototype.htm
>>51
一見凄そうだけど、よく読むとアレなページだ...
ってNASMんとこだね。
54デフォルトの名無しさん:01/11/17 15:56
gccのデフォルトlib検索パスを調べるにはどうすればいいのでしょうか?

/usr/lib/にはデファルトでパスが通っていますか?
gcc -L/usr/lib/ main.cとするとリンカがエラーを出して
gcc main.c /usr/lib/libpthread.a とすると大丈夫です。
>>54
% gcc main.c -lpthread

多分、正解はこれだと思うが。gcc のパス設定に関しては、gcc -v で表示される specs ファイルに書いて
ありますが、これはマクロなので読みにくいかも。実際に展開後の動作を見たいなら

% gcc -c -v main.c

で、どうでしょ。
>>55
レスありがとうございます。
とてもわかりやすいです。早速やってみます。
>>46
邪道。あとで int foo1() の定義を変更した場合にコンパイルエラーを検出できず、実行時に謎の
エラーが出ることになる(foo1 を呼び出すとスタックが壊れて、デバッグさえまともにできずに苦し
む、とか)。

C++ を使うなら、クラスのメソッドをヘッダに書いてしまうのはアリです。最近のテンプレートベー
スのクラスライブラリ (ATL, WTL とか) を使うと、そういうコードにせざるを得なかったり。
>>32はちょっとおかしくない?
headは構造体でeは構造体のポインタだよね?
59デフォルトの名無しさん:01/11/17 22:45
% gcc main.c -lpthread

の -lpthreadってなんにゃ?
pthreadってディレクトリはないにゃ。
-lXXX とやると、 -L で指定したディレクトリから
libXXX.a というライブラリを探してくれます。
libも.aも指定する必要はありません。(←分かりにくいよねえ、コレ)

実際にはもうちっと細かいけど基本はコレ。
ありがとにゃ
#include<stdio.h>

main()
{
int i,n;

printf("How many times?\n");
scanf("%d",&n);

for(i=1;i<=n;i++)
{
printf("チンコ!!\n");
}
}

/* バカプログラム */
#include<stdio.h>

int main(void)
{
int i,j=0,n ;

printf("How many times?");
scanf("%d",&n);

for(i=1;i<=n;i++)
{
printf("チンコ");
for(i=1;i<=j;i++)
{
printf("!");
}
printf("\n");
j++ ;
}
} /*バカプログラム改良版*/
64デフォルトの名無しさん:01/11/18 05:32
Cってソースが汚いよね。
そんなこと言うなよ!
俺はCしか知らん!(藁
scanf考えた奴クソ。
>>66何でだ!?
ところでscanfを考えたのはデニス・リッチーか?
gets考えた奴はもっとクソ。
mallocした領域はsizeof出来ないんでしょうか?
reallocする前にサイズが知りたいのです。。。
自分で変数とかに入れて管理しないとだめですか
初心者でごめんなさい。。。
70デフォルトの名無しさん:01/11/18 06:09
2つの整数の最大公約数をもとめる関数を作りたんだけど、
互除法以外に方法はないのかな?
誰かアイデアを出してみてくれ!
>>69
VC++固有だったら_msize()なんてのがあるな。
>>71
他に持っていったとたん、コンパイルできなくなる。諸刃の剣。
-4にサイズは格納されていないの?
出来ないんですね、、難しいです、溢れるからreallocするのにその前
に比べられないなんて
他にも返り値にAUTO変数のポインタ返してる関数が有るし、、、
これでよく動いてたもんだ(-▽-
PC初心者板に逝って来ます。。。。
75ビル・ジョブス:01/11/18 07:02
>>69
おいおい・・・
sizeofって演算子だよね。ってことは、演算の出来なければ、
コンパイルエラーだよね。

で、メモリーアロケーターっで関数だよね。(malloc()とかLocalAlloc())
コンパイラは関数の処理内容までは知らないよね。っていうか知る術が
ないよね。ということは、確保した領域のサイズはコンパイラには分かりません。

よって、「サイズの分からない領域へのsizeofは、式が評価できない」
という結論になります。

ファイルのサイズを、sizeof出来ないのと同じだよ。
>>75
sizeof(void *)は4か8になるCPUが多いと思われ。
コンパイルエラーにはならん。
free時サイズを指定しませんが、サイズを知る必要がないのですか?
mallocのソースでもみんと解らん。
freeはブロックごと放り投げるだけだからね、無責任主義
>>77
K&Rの8.7--記憶割当て見てみれ。単純なmallocの実装が載ってる。
80ビル・ジョブス:01/11/18 13:30
>>77
まず、LocalAlloc()・LocalFree()等のメモリ管理APIはサブシステム
として導入されてます。
しかし、簡単なメモリ管理の構造として、DOSはMCB(MemoryControlBlock)を
用いていて、構造体で管理しています。

typedef struct tagMCB {
char cCheck[2]; // ブレークチェックキャラ
unsigned nBytes; // 確保したバイト数
struct tagMCB *prev; // リストの先頭方向へのポインタ
struct tagMCB *next; // リストの後方方向へのポインタ
} MCB;

のような構造体を、確保したメモリーブロックの先頭に置いて管理
するのが最も基本的。自分自身へのポインタをメンバに含めるのが
ポイントかな。

図解しないと分からないかな?
81 :01/11/18 14:05
>>57
ご回答ありがとうございました。

Cで>>57さんのいう問題を回避しつつヘッダふぁいるを用いない方法はありますか?
(なぜこだわるのかはきかないで)
82デフォルトの名無しさん:01/11/18 14:20
なんでCの勉強がこんなに大変か説明しよう。
Cを作ったカーニハンとリッチーは、開発者としては優秀だったが、インストラクターとしては最低の部類だった。
彼らはいわゆるヲタで、コードは書けるがニンゲンにわかりやすく説明する能力は装備されていなかった。
Programmming language C を書いたが、これにはCのすべてはのっていなかった。
よくわからないところは、Unix のソースを読んでくれ、という雰囲気があった。
このため、さまざまなCの解釈が生まれ、ANSIで統一されるまで混乱が続いた。

開発者自身の手ではじめからわかりやすく統一された解説がなかったのが、混乱の理由だ。
83ビル・ジョブス:01/11/18 14:36
>>82
Cの勉強って大変?ならやめとけよ。おれは楽しいぜ。
とりあえず、言語の説明(言語仕様)というところは、
Programmming language C で十分じゃないか?
この本は、Cの使い方の説明書じゃないぞ。
>>82
低水準だからだろ・・・・
無知は黙ってなさぁぃ
大変だからやらない、というポリシーはすばらしい。
負け犬になりたいのなら、ぜひ採用したい。
86デフォルトの名無しさん:01/11/18 19:13
>>82
大昔の話をしてんじゃねーよ。age
>>82
だいたい、今ANSI C制定前の名残が原因で混乱するような事例あるか?
デフォルトでANSI準拠じゃないコンパイラ使ってるってか?
そんなもん10年も前に絶滅したと思ったが。
88デフォルトの名無しさん:01/11/18 19:27
「ANSI 完全準拠」
と書かれたコンパイラーを買って、実は全然準拠していないということがわかって愕然とすることはたまにある。
89デフォルトの名無しさん:01/11/18 20:29
while(1)とfor(;;)はどちらが正しいの??
どっちも駄目
通はgotoでループ、これ最狂(´^`;)
91win98 borland C++ compiler:01/11/18 20:33
「EOFには0か1のどちらかが入ってる。確認せえよ演習問題」

で、printfで確認したら-1と出ました。

なして?
>>90
それはコンパイラの最適化を阻害するから、論外。
93デフォルトの名無しさん:01/11/18 20:35
>>91
処理系依存。
ガッコのマシンでやったら違うかもよ。
>>91
-1はどのキャラクタコードにもマップされていない特殊なオードで便利だから
>>89
while(1)はコンパイラによってはwarningでるから、for(;;)がおすすめ。
96win98 borland C++ compiler:01/11/18 20:37
ようわかりました。
ありがとうございます。
EOFみたいな真偽値は「0か0じゃないか」で判定するので、-1でも1でも
なんでもいいちゅうこと。だからコンパイラによって違う。
馬鹿かお前
>>97
しかし、それじゃあgetcがEOFを返せなくなっちゃうよ。
>EOFみたいな真偽値
おい
EOFはcharで表せたらいけないんじゃなかったっけ?
>>97
EOF と feof() と勘違いしているに 1 ガノッサ。feof() も 0, 1 ではなく 0, 非0 だけどさ。
EOF みたいなのは ANSI C ではなんと言ってるんだろ。
シンボル値?
>>103
規格書は斜め読みしただけだが、単にマクロとしか書いてない気がする。ただし

 「EOF は整数定数に展開される。型は int で値は負」

と規定してあるから 0 or 1 ということは、ありえん。
105デフォルトの名無しさん:01/11/18 22:10
getchar != EOF

なら
()忘れた
このスレばかばっかりだぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ!
108プログラミンゲ:01/11/18 22:28
そんなあなたにK&Rからの問題!!!!!!!!!!!!!!!!

「getchar() != EOFという式の値が0か1であることを確認せよ」

ひげぶ&貧乏人 プログラミンゲ言語C より
>>108
比較演算式の結果は 0 と 非 0 になるが。
Kusakabe & real cyuubouに訊け
>>109
わかってねぇなあ。だから>>108をやってみろって。
>>111
特定の処理系でどうなるかを言っても意味がないって。こういうときには規格書持ってこないと。
113名無しさん++:01/11/18 23:26
>>109
111 じゃないけど、これですね。C99 の規格書から。

> 6.5.8 Relational operators
> 6 Each of the operators < (less than), > (greater than), <= (less than or equal to), and >=
> (greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false.89)
> The result has type int.
>
> 6.5.9 Equality operators
> 3 The == (equal to) and != (not equal to) operators are analogous to the relational
> operators except for their lower precedence. Each of the operators yields 1 if the
> specified relation is true and 0 if it is false. The result has type int. (後略)

<, >, <=, >=, ==, != の結果は 0 or 1 になることが要請されています。
114ビル・ジョブス:01/11/18 23:39
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

みなさん、レベルが低すぎます!
質問するのは自由だが・・・もう少し考えてからなら、やってよし!

☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
お題がC言語じゃレベルが高いも低いもないと思われ。
116デフォルトの名無しさん:01/11/18 23:42
しかしそうはならんぞと。
117デフォルトの名無しさん:01/11/19 00:18
int main(int argc, char *argv[])
{
 char *a[2];

 a[0] = strcat(argv[1], "age\0");

...


ってのはやばいですか?

argv[1]に入ってる文字列に "age\0" という文字列を追加したい。

仮にargv[1]にsageが入ってるとすれば、 "sage\0age\0"になるのかな?
とか思っちゃいます。
118デフォルトの名無しさん:01/11/19 00:43
>仮にargv[1]にsageが入ってるとすれば、 "sage\0age\0"になる

なるわけない。
sageage\0
になる。
*argv[]はポインタの配列.

以下の文と同じような理由で追加は無理.(**avにも*a[0]にも)
char *p = "test";

strcat(p, "ok"); /* 代入できない */
120デフォルトの名無しさん:01/11/19 00:57
curses を使ったプログラムを作りたいのですが、日本語の分かりやすい
チュートリアルないでしょうか。
121名無しさん++:01/11/19 01:00
>>119
それは間違いです。

> 5.1.2.2.1 Program startup
> The parameters argc and argv and the strings pointed to by the argv array shall
> be modifiable by the program (後略)

argv 配列が指している文字列は、変更可能です。ただし、各文字列用に何バイトの領域を確保して
いるかは不明なので、縮小したり上書きする分には構いませんが、strcat() なので追記するのはま
ずいでしょうね。
あぁ,嘘教えてしまった..すまない.
**avはallocateされてるのかな,そうすると.
たびたび教えて君ですみません。>>117です。

/* 256もあれば十分 */
char tmp_argv[256];

strcat(tmp_argv, argv[1]);
strcat(tmp_argv, "age\0");

でうまくいってるらしいです。
ワケワカラン・・・。
>>124
そういうプログラム作ってっとバッファオーバーフローであぼーんされちゃうぞ。
>>117
>>124desu

strcatの使いかたまちがってますね・・・。
欝で死にます。
>>124desu

atterunokana?
wakewakaran...
すいません、昨日のアホです
int main(void)
{
  struct {
    char *mem;
    unsigned int memSize;
  }st;
  
  st.mem = (char *)malloc(2);
  st.memSize = 2;
  memset((char *)st.mem,'\0',st.memSize);
  printf("Here is main \n");
  printf("st.mem -> %p st.memSize -> %d \n",st.mem,st.memSize);
  st.mem = reallocMemory(st.mem,&st.memSize);// ここで領域を拡大してるつもり・・・
  printf("Turn back from func\n");
  printf("st.mem -> %p st.memSize -> %d \n",st.mem,st.memSize);
  printf("st.mem -> %s \n",st.mem);
  return 0;
}
char *reallocMemory(char *target,unsigned int *size)
{
  char str[409600];
  memset((char *)str,'a',409600);
  str[409600] = '\0';
  
  if (*size < strlen(str)){
    target = realloc(target,strlen(str)+1);
    *size = strlen(str)+1;
  }
  strcpy (target,str);
  return target; //新しいポインタを返してるつもり・・・
}
このコードを書いてテストすると、思ったように動いたのですが、
時々返ってきたポインタが変な所を指している様です。
パラメータと返り値をどちらもポインタのポインタにしたら上手くいくのですが
何処かでローカル変数を指してますでしょうか。。。。
ああ、何か変な事言ってる気がする。
もっと考えて来ます。
>>128
何がしたいのかよくわからんが、malloc()、realloc()の返り値くらい
チェックしたらどうだ?
あと、
> char str[409600];
> memset((char *)str,'a',409600);
> str[409600] = '\0';
str[]でアクセスできるのはstr[0]〜str[409600 - 1]だぞ。
131デフォルトの名無しさん:01/11/19 22:07
>>128
せっかく構造体を宣言・定義したのですから、
  Result = reallocMemory(&st);
のようにされては如何?
132デフォルトの名無しさん:01/11/19 23:50
gccのエラーメッセージ一覧が載っているページというのは存在するのでしょうか?
>>132
gcc manual
ありがとぅ
135☆質問です☆:01/11/20 02:41
思い出せなくてどこにも乗ってなくて困っています(汗汗)

>a.out file.txt

としたときに、実行ファイル名のあとにあるファイル名(file.txt)を
実行ファイルから読み込む方法をどなたか教えていただけますでしょうか★
おねがいします!
>>135
argv[1]
K&Rの演習問題、模範解答なんぞは本に載ってましたかね?

最初の方の問題で、「ここはポインタとか使ったら簡単に済む鴨」てなことアドバイスされたのですが、
「やさしい入門」での問題だから上級手法はまだ説明されていない。

演習問題ってのは、「今まで出てきたものの応用だけで作ってみろ」ということだと思うんですが
それだとコードが長くなるんです。
それでもいいんでしょうか。
138>>136 san:01/11/20 03:29
>>136 さんへ
解決しました★すばやい回答ありがとうございました♪ _(._.)_
>>137
まずその時の自分の技量で自分で解く。
後で新しいことを覚えたらまたその時の技量で解く。
それで両者を比べてみる。
140Kusakabe Youichi:01/11/20 03:48
> 実行ファイル名のあとにあるファイル名(file.txt)を
> 実行ファイルから読み込む方法

第2章に出ていますよ。
141Kusakabe Youichi:01/11/20 03:51
> K&Rの演習問題、模範解答なんぞは本に載ってましたかね?

K&R 『THE C PROGRAMMING LANGUAGE』Prentice-Hall
の演習問題の模範解答が
『THE C ANSWER BOOK』』Prentice-Hall
です。

訳本も出ています。

2ndに対応したものも出ています。
2ndに対応したものも出ています。
『TWO Ch ANSWER BOOK』』Prentice-Hall
です。
>>140-141
ム板にも来たのか…

>>142
>2ndに対応したものも出ています。

「2chに〜」と書きたかったんだろうなぁ…
144128 :01/11/20 06:44
>>129さん>>130さん、ありがとう御座います。
どうも文字配列の扱いに四苦八苦しておりまして(´д`;)
呼び出した先で領域を広げようとしてたんですが、
構造体ポインタ、、上手く使えるかなぁ・・・・
でも、便利そうです。
頑張ります、有難う御座いました。
145デフォルトの名無しさん:01/11/20 07:16
>>144
JavaとかVC++とかのString型の考えを導入するといいかも。
あれって大きさは変えられんのだよね。
たとえば、文字列の連結なんかは
新たに確保した領域に文字列をコピーして
コピー元を開放する って発想。
あとから大きさを変えられると謳ってるクラスは
大抵、中でこんなことを泥臭く繰り返してる。
それか、最初に大雑把に領域を確保してて
足りなくなったら確保しなおしてコピーとか。
146無名λ式:01/11/20 16:31
>>145
通常、C++のbasic_stringでは、
大抵ropeとかいわれるデータ構造や類似のデータ構造が使われ、
あなたの言うような原始的な実装は行なっていません。

C++ではoperator[]がoverload出来るので、こういう事が出来るのです。
構文糖衣のおかげで、まずは原始的な実装から始められるのも嬉しいですね。
147デフォルトの名無しさん:01/11/20 16:59
>>145
大きさを変えられる構造って何ですか?

---------------------------
string1|string2|empty     |
---------------------------
こういう状態のときに、確保しなおすことをせずにstring1の大きさを変えてください。
>>146 JavaのStringが変更不可なのは手抜きじゃなくて
マルチスレッド対応のため。
Stringみたいに頻繁に使用されるオブジェクトで
排他同期が必要になると性能に影響が出る。
だから変更可能なStringBufferとreadOnlyなStringとに分けられた。
C++のライブラリはスレッドの事は関知してないんでそ?
149デフォルトの名無しさん:01/11/20 17:25
SDKってC言語なの?
C++じゃないの?
どのSDKを指してるか不明だが、WindowsのPlatformSDKならC。
SDKは言語に依存しませんが、何か?
152デフォルトの名無しさん:01/11/20 17:37
D言語はできないんですか?
153デフォルトの名無しさん:01/11/20 17:39
うo(^。^o) ん(o^-^)o こo(^O^o)♪
154デフォルトの名無しさん:01/11/20 17:48
>>148
>C++のライブラリはスレッドの事は関知してないんでそ?

Cのライブラリの間違い? というかCのライブラリですらWindows
なんかではスレッドセーフになっている場合がある。
Javaなんぞと違ってC/C++はスレッドについては実装によって異なるだけ
155デフォルトの名無しさん:01/11/20 21:58
>>148
> C++のライブラリはスレッドの事は関知してないんでそ?
ANSI C++ にはスレッドに関する規定がない、というのが正しいかな。

最近の処理系だと、ライブラリ側でスレッドセーフな関数を一部提供しているのが普通。今時の
ライブラリだと、operator new あたりはふつースレッドセーフ。
#include<stdio.h>
#include<stdlib.h>

int shortest(int, int) ;

int main(void)
{
int m, n, x ;

printf("Input m:") ;
scanf("%d",&m) ;

printf("Input n:") ;
scanf("%d",&n) ;

if( m<0 || n<0)
{
printf("error! m or n is less than 0.\n") ;
exit(1) ;
}

x = shortest(m, n) ;

printf("The number of shortest paths from (0, 0) to (%d, %d) = %d\n",m,n,x) ;
}


int shortest(int m, int n)
{
int s ;

printf("called ===> number of shortest paths(%d, %d)\n",m,n) ;

if(m==0 || n==0)
{
printf("return <=== number of shortest paths(%d, %d) = 1\n",m,n) ;
return 1 ;
}
else if(m>=0 && n>=0)
{
s = shortest(m-1,n) + shortest(m,n-1) ;
}

printf("return <=== number of shortest paths(%d, %d) = %d\n",m,n,s) ;
return s ;

}

あえて再帰処理で作りました。
158デフォルトの名無しさん:01/11/21 05:11
任意の待ち時間をつくりたのですが?
希望の時間が過ぎるまで clock で計測しながらループ待ち
>>159
お前みたいな奴がいるから困るんだ (涙
>>160
組み込みなら許すかも。

>>158
環境依存だから、環境を書くように。Win32 なら Sleep(), UNIX なら sleep(), usleep() あたりか。
162159:01/11/21 18:16
>>160
あはは (^▽^;
ひとつの案として言ってみただけです。
自分がプログラム作るときはちゃんと Sleep とか使いますから、ご安心召されよ〜。
>>162
ネタとしても面白くないな。逝って良し。
ntpで時間が戻って亜ボーン
って、大した誤差はでないだろうな藁
165デフォルトの名無しさん:01/11/22 05:15
closedir()に失敗して強制終了
closedir()をコメントアウトすると、無事に?終了します
166デフォルトの名無しさん:01/11/22 11:31
それは良かったね
167デフォルトの名無しさん:01/11/22 13:00
今日からC言語を始めてみようと思って、
LSIC86をダウンロードしたのはいいのですが、
テストのためにマニュアルにのっている
hello.c というプログラムをコンパイルしようとしたところ

hello.c 1: can't open: stdio.h: No such file or directory

とエラーが出てしまいます…。
マニュアルで綴りや設定の仕方など見直したのですがわかりません。
すごく初歩的な質問で申し訳ないのですが、
どなたかよろしくお願いします…。
>>167
INCLUDE環境変数をちゃんと設定した?
確か必要だったような気がする
169デフォルトの名無しさん:01/11/22 13:05
>>167
ここがLSIC86の初期設定を解説しているから読んでみそ。
http://www.sting.co.jp/mag/comp.htm
170デフォルトの名無しさん:01/11/22 13:18
>>167です。

>>168-169さん、ありがとうございます。
INCLUDE環境変数というものが何かよくわかっていないのですが
>>169さんの紹介してくださったページ通りに設定はしてみました。
やはり同じエラーが出てしまいました…。

関係ないかもしれませんが、Win98SEを使っています。
Win95/98対応と書いてあったのですが、
SEには対応していないのでしょうか…?
171あきじん ◆jx8Uh8fk :01/11/22 13:21
何故今頃LSIC-86なのか…。確かANSI-C準拠じゃないよね?

↓これとか使った方がいいよ。
http://www.borland.co.jp/cppbuilder/freecompiler/index.html
172横やり:01/11/22 13:31
>>170
>169のページ見たけど

> -XC:\LSIC86\BIN -LC:\LSIC86\LIB -IC:\LSIC86\INCLUDE -T -O
となります。

のあたりだろ
173デフォルトの名無しさん:01/11/22 13:37
>>170
Win98SEでも動作するよ。現にオレのWin98SEマシンでも動いた。
多分、ファイル_LCCの記述にタイプミスがあるんじゃないかな?
もう一度よく見直してみてくれ。

INCLUDE環境変数はCコンパイラがインクルードファイルを見つける
ときのパスを記述したもの。入門書を読めば大抵は前半部で
解説があると思う。


で、171氏が指摘しているようにLSIC86でなければいけない
特別な理由でもない限り、Borland C++を使った方がいいと
思うぞ。
174デフォルトの名無しさん:01/11/22 13:39
>>167です。

>>171さんのところのをよく読んでみているところですが、
>>172
> -XC:\LSIC86\BIN -LC:\LSIC86\LIB -IC:\LSIC86\INCLUDE -T -O
はちゃんと直したんですよ…。
うーん。

設定するときにC:\CONFIG.SYSとC:\AUTOEXEC.BATを
書き変えたのですが、元々文字が書いてあったのでそれに書き足しました。
マニュアルには「…と書いてください」とあったのですが
元々C:\CONFIG.SYSとC:\AUTOEXEC.BATは空ファイルなのでしょうか??
175167:01/11/22 13:45
>>173さん ありがとうございます。
もう一度_lccを見直してみることにします。
でも、別に特別な理由があるわけではなくて
LSIC86を最初に見つけたというだけなので
>>171さんのところのコンパイラをダウンロードしてみます。

どうもありがとうございました!
176あきじん ◆jx8Uh8fk :01/11/22 13:49
AUTOEXEC.BATが空なのは問題無いはず。
それよりもAUTOEXEC.BAT変更したら
再起動しなきゃ駄目だよ。SHIFT+再起動でも駄目。

じゃ頑張ってね。
177デフォルトの名無しさん:01/11/22 14:01
すんごいレベルの低いこと聞きます

register char *p;
として、このpは内容が0xffであるようなメモリのアドレスを格納したとします。
そして
if(*p == 0xff){
}
とこれを判定しようとしました。これって真にならないんですか?
>>177
if(p == (char*)0xff)
これだったら真になるよ。
179デフォルトの名無しさん:01/11/22 14:06
あ、メモリの内容が0xffなんです。そのアドレスは0xffではないです。
デバッグ中に変数の値見ても*p=0x000000ffって表示されます。(VC++)
180178:01/11/22 14:07
すまん。勘違いだ。178は取り消し。
>>179
符号拡張で、*p == -1 になってるんじゃない?

>>181
あ、きっとそれです!
0xffとではなく(char)0xffと比較しないとダメなんですね?(^^;
どうも有り難うございました。
183デフォルトの名無しさん:01/11/22 14:14
>>179
if (*p == (unsigned char)0xff)
こうすればどうよ?
184あきじん ◆jx8Uh8fk :01/11/22 14:22
>182
コンパイルの時にwarning出なかった?
いっぱい出るからって無視しちゃ駄目だよ(w
>>183
有り難うございます。今試したところ
if(*p == (char)0xff)が正解でした。
pがchar*なのでこれにあわせてcharでないとダメと言うことでしょう。

>>184
いっぱいでるから無視してました(w
たぶんでてるかも。
186183:01/11/22 14:30
char型変数との比較なのに符合無しにキャストしてしまうとは
激迂闊なオレ。回線切って、アキバに新設された公開首吊り場
に逝ってきます。
海よりも深く反省し、心から謝罪と賠償を(以下略)
187一部ですが:01/11/22 15:48
質問です。
コンパイルできないです。
スマソ
char *txt = "今日は大変良い天気です。1012abアイウaiu012";
char *p = txt;

if (isalpha(p)!=0) printf("%c===>半角英字\n",p);
else if (isdigit(p)!=0) printf("%d===>半角数字\n",p);
else if (IsKigouS(p)!=0) printf("%c===>半角記号\n",p);

alphabet.cpp(98) : error C2664: 'isalpha' : 1 番目の引数を 'char *' から 'int' に変換できません。 (新しい機能 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
188デフォルトの名無しさん:01/11/22 15:50
>>187
こう直してみてください。
isalpha(p) -> isalpha(*p)
>>187
何がしたいの?文字列の一番目の文字を判定したいのか?
文字と文字列の違いは分かってる?
190187:01/11/22 16:09
>>188-189
とりあえずコンパイルはできました。
ありがとう。
191デフォルトの名無しさん:01/11/22 16:14
マルチスレッドなプログラムでグローバル変数を読み書きしたいのですが、
どうやって排他処理をすればよろしいのでありましょうか?
>>191
セマフォ、クリティカルセクションなど。
193191:01/11/22 16:22
初耳の言葉だ・・・
調べてまいります。ありがとう。
194191:01/11/22 16:35
195デフォルトの名無しさん:01/11/22 21:27
いまどきCをはじめるのはやめたほうがいいぞ
196デフォルトの名無しさん:01/11/22 21:35
Rubyが入門には最適。
Rubyだけで十分。
Javaでもいいけどな。
198 ◆RubyOmS2 :01/11/22 22:41
>>196
RubyのライブラリをCで書く為にCを勉強し始めている俺は、
Ruby厨としては、失格なのか?
軽い気持ちでcrypt使ったら
undefined reference to `crypt' って (−_−)
プロの皆さんは何を使ってますか、高い強度は必要ではないです
>>195
自分はタコだけど、メモリにグッっと近づいた感じは触ってて気持ち良いよ
生産性を論じてるならアレだけど
VB、Java、Perl辺りをやっていた
200199 :01/11/23 03:04
すまそん、事故怪傑しました
UltraFastって言うのを頂きました (^^v
201デフォルトの名無しさん:01/11/23 15:41
CGIやりたいって言ったら
Perlの入門書を薦められ、
その前にCを触っておくべきだと
言われたのですが
どうでしょう?
202デフォルトの名無しさん:01/11/23 15:43
目的がCGIなら、いきなりPerlでもよかろ。
203デフォルトの名無しさん:01/11/23 15:45
>>199
C言語の存在ってPascalに近づいてきたかもね、
つまり、教育用言語。
204 :01/11/23 15:45
>>199

Windowsで実行してない?UNIX系じゃないと実装されてないよ。
C言語でCGIを作っていますが、何か?
というか、Perlがよく分からないのでCです。はい。
#define A "\0\0\0\0"

fn(char* a){

}

int main(){
 fn(A);
}

とした時
fn の a 指す値は
*a 〜 *(a+4) は全部 \0 になるの?
>>206
なる、と思う・・・
全部\0になるよ。

main内に
fn("\0\0\0\0");
と書いたのと同じだもん。
209 :01/11/23 15:57
>>205

文字列操作とか大変じゃないですか?
フォームから送られてくるデータの項目ごとの分割とか。
(Perlではハッシュでかんたん。)
何か美しい解決法があれば聞きたいです。
210login:Penguin:01/11/23 15:59
C言語の"C"の由来ってなんなんだろ?
>>209
そういうのは全部ライブラリでなんとかしたり、
データベースに突っ込んでなんとかしたりするから平気です。
"B"の次だから "C"

K&R読んだことないの?
213 :01/11/23 16:00
>>210

Bの次。が有力。
>208
ありがと
じゃあ、文字列の最後を \0 2個にしたいときは
#define A "abcde\0"
ってすればいいですよね
すればいいですよ
>>210
BCPLの頭文字とったのがB言語で、
ダブルにその次ってことでCらしい。よくわからんけど。
次はPか。ピー言語。なんか嫌っ('Д`;)
>215
ありがとございました
218 f:01/11/23 16:16
http://cm.bell-labs.com/cm/cs/who/dmr/bintro.html

興味があったのでB言語について。
文法的にはほぼCですな。
BとCって何が違うんですか?
ポインタがないとか?
>>218
ざっと読んでみた。
ポインタはあるみたい。というか、型は整数しかなくて、キャストしなくても
* 付ければポインタとして扱われているように見える。
char *ExtractFileNameM(const char *FullPath)
{
char *szFindPoint;
char *szFileName;

if(strlen(FullPath)>MAX_PATH)
return NULL;

else
{
szFindPoint=strchr(FullPath,'\');

while(szFindPoint){
szFileName=szFindPoint;
szFindPoint=strchr(szFindPoint,'\');
}
}
if(!szFileName)return FullPath;
else
return szFileName;

}
こいつを実装とやらをしたいんだけどスタックとかから教えてください
>>220
まずは日本語を勉強しましょう。「実装とやら」と言われても、何のことやら分かりません。
え?汎用関数つくることを実装というのではないのかや?
>>222
意味不明。
これじゃSJIS扱えないよ
if(mblen(szFindPoint-1,2)!=2)
szFileName=szFindPoint;
このようにさっき変えた。

そろそろスタックとかやりたいYO
\\も直したから安心してョ
こりゃまたすごい意味不明。
>>220さんはスタックってなにか知ってるのかな?
めもり確保して
めもりに一個ずついれてくんだろ?
ちなみにstackは積むとかそーゆー意味だと思うんだけどョ
230 :01/11/23 22:10
>>220
スタック、リスト、キュー、どれもメモリー確保して格納する作業ですが?
出直しておいで。
なぜ「実装とやら」をしたいのだ?
セインセイにいいつけられた?
さっきのマイプログラム、配列つくって
whileつかって、ひとつひとつ
if(FullPath[i]='\\'&&mblen(FullPath[i-1],2)!=2)
とかやったほうがいいとおもう?
いや、はじめてライブラリに挑戦する僕チンなんだ
(スタティック)どーせならひたすら低級路線
で行こうとおもっただけアル
要するに、
C言語の「標準ライブラリ」を極力使わずに、自作ライブラリを作りたい
ということだろ。
で、手始めにpath nameの分解をしたいと。
大方、mainのargvでわたされたファイルパス名を分解しようという動機だろう。

とりあえず、strlen使ってたら、<string.h>必要になるから、
そこも自作しなさい。
あとmblen() なんてだれもしらん。
>>234
strchr()もだめだね。
クララが・・クララが・・・

でさぁ、どっかのHPにstrchrの定義が
あって、char *strchr( ,int)だったんだけど
あれって実体を返すうーーー、いいのだ。
VCLにはExtractFileNameがあるけど、あれは実体を
返すの?それともポインタかなぁ。もうっかい見てみるからナ!
237いかりや長介:01/11/23 23:47
だめだこりゃ。
238デフォルトの名無しさん:01/11/24 00:19
mallocで64バイトとったらヌル文字は65バイト目ですか?
それとも64バイト目をヌル文字って考えながらプログラム
することがプログラマの使命なのですか?
>>238
掟です。
しょっちゅうアクセス違反してるお馬鹿な私は
char *ptr;
/* 処理 */
if(hoge != NULL && strlen(hoge))
と書いていますが、これは正しいでしょうか。もしNULLならstrlenは
判定されませんか。(僕の環境では大丈夫です)
また、時々重複freeしちゃうダメっぷりなので
if(hoge){
 free(hoge);
 hoge = NULL;
}
こんな感じであっちこっちに散りばめてるのですが、これはドキュソですか
変な事聞いてごめんなさい、、、、
241スシばっか食ってるNewBee:01/11/24 00:22
Bの次って
>>240
&&の処理順序は保証されているし、そのような書き方はよく見かける
後者のfreeについてはそういうマクロなり関数なりを用意しとけ
>>240

free() のことなんだけど、>>242 さんみたいにマクロ定義するのが一般的です

#define free_safety(v) if(v){ free(v); v=NULL; }

ただし注意して扱わないといけないんだけど、
こうやってるとハマるんだよなー。。。
  char *ptr = some_ptr;
  /* some long long loooong proc. */
  free_safety(ptr);
ptr には NULL が代入されるけど some_ptr には NULL が代入されないんで、
そこからどんなバグが生成されるやら(笑い
>>240
二重 free() するのは厳禁だが、条件反射的に

if (hoge) {
 free(hoge);
 hoge = NULL;
}

と書くと、今度は free したポインタを参照するバグに出くわすと思うぞ。これは検出しづらいから、
ムチャクチャにタチが悪いバグになる。

どこで、いつ malloc() して、どこで、いつ free() するのかを良く考えてプログラミングするのが先。
その上で防衛的に NULL 代入するようにするのはアリだと思う。(俺はやらないけど)
240です、ありがとうですぅ
安心しましたです、出来る方の言葉を聞きたくて(^-^*
でももっと本を読まないと
何故かCよりgdbばっかり触ってるような(鬱
早速マクロにしますです
>>244さん
なるほど!、次にはまるのはそれの様な気がします(^-^; コワ
やっぱり人間GCよろしく適当に散りばめるのはヤバイんですね
構造がつかめて無いのは仰るとおりです。
>>246
真面目な話、GC 使うという選択肢はアリだよ。

http://www.hpl.hp.com/personal/Hans_Boehm/gc/
getsの時に漢字で入力してprintfの時にひらがなで出力するには
どうすればいいの?誰かおしえて。
漢字をひらがなに変換するプログラムを組んで、それでひらがなになおしなさい。
ほんとにあったら欲しいな
出来たら英語に翻訳してくれると尚良し
>249
その変換するプログラムをおしえて欲しいのよ。
とりあえず、機械翻訳とデータベースについて勉強してからもう一度来なさい。
形態素解析、あたりで検索。
>>251
漢字と読み仮名の辞書を作れ。10年もあればできる。
>>254
単語に区切るのが難しい。
最長一致法と二文節最長一致法をさらっと流して、
最小コスト法まで話しをもっていくべきか?

IMEのやってることと比べるとUIがいらない点と、
学習する必要がない分、作り込みは簡単だと思うがどうよ?
KAKASI - 漢字→かな(ローマ字)変換プログラム
http://kakasi.namazu.org/

GPL だから、扱い注意な。自分のプログラムにコードを取り込んだ場合、自分のコードも自動的に
GPL になる。
>>256
248 のような質問をするやつが理解できるかどうか。
>>257
茶筅の方がライセンスゆるいよ。
http://chasen.aist-nara.ac.jp/index.html.ja
260デフォルトの名無しさん:01/11/24 09:11
Win2k上で2GB以上のバイナリファイルをアクセスしたいのですが、
fseek(FILE *fp,long pos,SEEK_SET)
を使うと、posが、long型なので2G以上は指定してみてもオバーフローして
ファイル先頭に戻ってしまいます。
どうすれば、2GB先にシークできるのでしょうか?
261shige:01/11/24 09:16
#include <stdio.h>
int fsetpos(FILE *stream, fpos_t *pos);
SEEK_CUR で 2GB ずつ何度も移動するとか
263デフォルトの名無しさん:01/11/24 12:21
Ruby!
264 :01/11/24 12:24
>>261

API使った方が良いのでは?
まぁ、内部ではAPI呼び出してるんだけど・・・。
Win9xがあぼ〜んされるまでは標準ライブラリでは32bitのファイルオフセットが
使われ続けるのだろうなあ。
266デフォルトの名無しさん:01/11/24 14:57
C言の本でなんかいいのないか?
K&R読み終わってから聞きに来い
268デフォルトの名無しさん:01/11/24 15:05
おうよ!
269 :01/11/24 15:13
>>265
NTカーネルでも、intが32ビットの間は、fseek()は、32ビット。
ISO/IEC 9899:1999調べてみた。fseekの2番目のパラメータはlongなのね。
ftell()もlongを返すからlongであらわせない位置にファイルポジションが
あるとエラーになるのか。
271デフォルトの名無しさん:01/11/24 16:27
K&R てのはね。
アセンブラを知ってて、FORTRANを知ってて、BASICを知ってて、COBOLを知ってて、LISPを知ってて、PASCALも知ってる、てゆー人向けに書かれた本だよ。
プログラミングの初心者は林春比古の本からはじめたほうがいいよ。
ついでにいうと、この板の住人は技術者であって、インストラクターではないから、そのへん注意したほうがいいよ。
教育心理学の本とか読んでる人少ないからね。ここは。
お前第一章読み飛ばしただろ(藁
林晴彦の本かうなら第一章読み直した方がまし。
K&R読む。わからなくてもとにかく読み進む。(わからないことはメモしておくとなお良し)
最初にわからなかったことに気をつけながらもう一度読む。
それでもわからないようなら、プログラマには向いてないのであきらめる。
>>273
同意
276デフォルトの名無しさん:01/11/24 19:05
char *ExtractFileNameM(const char* szFullPath,char* szFile)
ポインタと実態についてまた少し知識が確かになったので
このようにしてして無難にやった。
K&Rの訳者前書きは萎える。
こんな意識の低いやつが翻訳しているのかと思うと読む気にならん。
>>277 原書買え
              ∧            .∧
              / ・           / ';,
            . /  ';          ./  ';
            /   ;______/   ;
          /                  \
         /    /          \     \
        /´       |____|          |
        |  /////    |     |    /////    |
       |        .|     |           |
        |         |    |           |
        |        ';    /           /
         \        \/        .. /
           ヽ             ........:::::::<
 __________∧___________
/                                   \
|  英語読めないや...                   |
勉強しろ
281デフォルトの名無しさん:01/11/24 22:14
>>185
>pがchar*なのでこれにあわせてcharでないとダメと言うことでしょう。

違います。
282デフォルトの名無しさん:01/11/24 22:19
>>240
if(hoge){
 free(hoge);
 hoge = NULL;
}
は、
free(hoge);
hoge = NULL;
で十分。

ところで、>>244
>今度は free したポインタを参照するバグに出くわすと思うぞ
って、どういうこと?
>>282
ちょっと複雑なデータ構造(たとえばツリーとか)を解放するときに、

free_tree(struct tree* p)
{
  if (p->left != NULL)
    free_tree(p->left);
  if (p->right != NULL)
    free_tree(p->right);
}

みたいな関数を作るじゃない。単に free() を SAFE_FREE() みたいなマクロで置き換えた場合、
こういう状況では何の役にも立たなくて、やっぱり同じようなバグに出くわすって話じゃないの。
free_treeが一個抜けてる。
>>284
抜けてるのは free_tree() ではなく free() と思われ。
286美空ひばり:01/11/25 00:09
func()という関数があるときに、
funcっていう表現(カッコがない)はどういう意味になりますか?
>>286
関数のアドレス
288284:01/11/25 00:13
ガ━━(゜Д゜;)━━ン!
同レベルかよ
289デフォルトの名無しさん:01/11/25 00:59
http://www.bohyoh.com/CandCPP/C/Library/pow.html

定義城って・・・・
定義域の間違いだよね・・・・・

でもなんでコンピュータ上で間違うんだろう・・・・
>>289 OCRだろ
291 :01/11/25 07:52
あるプログラムのswitch文と同じ意味のif文ではどちらが速いでしょうか?
>>291
同じだろ。
>>291
場合による。
switch(i){
case 0:
case 1:
case 2:
case 3:
}
って感じだと、if より速くなるかもしれない。
コンパイラの最適化の話だから、確実とは言えないが、
if の羅列が switch より速くなることはないだろう。
294 :01/11/25 10:10
良スレさげ
295293:01/11/25 10:53
> if の羅列が switch より速くなることはないだろう。

と思ったけど

if(unsigned(i) < 20){
}else if(i < 40){

のように効率的に条件判断するのと比べるなら何ともいえないな。
単純に == で判断してるだけなら switch の方がいいのでは?という程度。
>>293
たとえばその例ではどういう最適化でifより速くなる可能性があるの?
ジャンプテーブルを生成したり。
配列みたいな感じで飛び先アドレスが格納されてて、
インデックスで飛び先アドレスを取ってきてジャンプ。
298 :01/11/25 11:50
間接参照アドレスから即ルーチン先へ飛んで、結局一回の判定で済むからじゃないのか。
ごめんなさい。
VC で試したら if の羅列でも同様に最適化されました。
最近のコンパイラは優秀なんで、どっちでも同じです。
bcc出も試してミロ
ウソ言いまくり。見間違いでした。激しく鬱、、、

if の羅列では最適化されません。
switch では最適化されます。

よって switch でどうぞ。
302デフォルトの名無しさん:01/11/25 12:27
テーブルジャンプで最適化されたswitchは確実にパイプラインが
ストールしますから、よく分岐する部分をifで抜き出して、それ
以外(インデックスが連続しなくなる場合はダミーをうめて)を
switchにしたほうがよいです。
303デフォルトの名無しさん:01/11/25 12:40
文字列から数値への変換は atoi, atol, atof などありますが
数値から文字列への変換はあるのでしょうか?
sprintf
305_:01/11/25 12:41
>>303

itoaとか。後は類推しましょう。
306_:01/11/25 12:42
>>304

うん。最強。
307デフォルトの名無しさん:01/11/25 13:41
>>305

そんな標準関数はないよ。VC++にはおまけで_itoa()なんてのがあるみたいだけど。
ちなみに>>304が正解。
単に数値を数字列に変換するだけでsprintf()なんて使っていられるか!!と言う人もいるみたいだけれど、いちいち自作するよりはましだと思うね。
308周富徳:01/11/25 13:43
mallocでメモリを確保する意味がわかりません。
いきなり
int a[1024]
とかで変数を宣言しただけでは、メモリは確保されないんでしょうか?

また、すべてのmallocはcallocで代用してもいいんでしょうか?
309デフォルトの名無しさん:01/11/25 13:43
ところで、printf系って標準関数の中でも一番すごい関数だと思わない?
310_:01/11/25 13:44
>>305
glibcにも搭載されてますけど標準関数じゃないんですねitoa。
勉強になりますわ。
311デフォルトの名無しさん:01/11/25 13:46
>>308

私の場合、関数内で一時的に文字列をコピーする時に役立つ。
どんな長さの文字列が来るか分からないから、引数の文字列の長さをstrlen()で測って、+1した分の領域を確保すると丁度よくなる。
恐怖のセグメンテーション違反も起きないし(笑)
312305:01/11/25 13:47
>>310

私も最初は標準関数だと思っていたよ。
でもgccでコンパイルできなかった時に初めて気づいたよ。
調べてみたらそんなものはないと・・・
そうだよ。
hello worldにも使われる関数をばかにしちゃあいかん。
>>308
たまたまデータの個数が1024個よりも多かったらどうします?
strdupはしないの?>>311
316デフォルトの名無しさん:01/11/25 13:49
>>315

うん。
317_:01/11/25 13:48
>>308

int a[1024]
でもメモリは確保できるけど1024個しか情報を登録できないソフトって使えないと思うよ。

Windowsのエクスプローラのツリービューとかってどうやって実現すれば良いんだろう?って話にもなってきます。
318デフォルトの名無しさん:01/11/25 13:50
MS-DOSのコマンドは最大1024文字みたいだけれど、あれはchar s[1025]とやっているのかな。
319あそぼ:01/11/25 13:53
>>318

VFATのネームスペースの関係だと。
固定長のブロック(char s[1025]とは言わないが)が続いているんでしょう。
320デフォルトの名無しさん:01/11/25 13:54
>>319

そうか。ありがとう。
一度1025文字以上入力してみようかな(笑)
>>308
mallocなんて、前世紀の遺物です。
使う必要はまったくありません。
コードが不必要に複雑になるだけです。
データの、想定される最大長の同じ長さの配列を使えば、
後は、OSが仮想記憶でうまくやってくれます。
322プヨプヨ:01/11/25 13:56
mallocは
データ数が保障されている場合は意味ないの?
>>322
データ数が1024が上限とか、そういう仕様だったら、
必要ないですね。
324あそぼ:01/11/25 13:59
>>322
リストとか木とか実現するときとか使わない?
まぁ、記憶領域をあらかじめ最大数確保してそのポインタを管理すれば良いんだろうけど。

スマートじゃない・・・。
325周富徳:01/11/25 13:59
こんな時間にこんなに早くレスがつくとは思いませんでした。
お仕事中ですか?
いや、自宅ですが、ヒマなもんで。
327あそぼ:01/11/25 14:04
>>321

WindowsにはVirtualAllocって関数がそういう使い方を想定してるみたいだね。
ってことは逆に普通のLocalAllocとかって何らかの弊害があるってことじゃないですかね?
>>327

どうでもいいが、せっかくならvallocという名前にしてほしかった(笑)
329白いパラソル:01/11/25 14:07
他人のコードを読むのが一番勉強になるとかいいますが、
公開されているソースとかで勉強した人とかいますか?

昔、INNをすすめられたんですが、
もちろん挫折しました。
>>329

標準関数のコードで勉強しようと思ったがどこにあるのか分からずに挫折。
331あそぼ:01/11/25 14:10
>>329

俺の場合はある程度書けるようになってから他人の技を盗むってかんじですね。
そのソフトの基礎(通信系ならSocketとか)はあらかじめ押さえておかないと読めないと思います。
友人は人のコードがないとプログラム書けなかったりしますが。
332平壌市民:01/11/25 14:49
私が引き継いだコードは
全部mallocした後に'\0'で初期化されているんですが、
これは糞コードの類に入るんでしょうか?

callocでやるべき?
333デフォルトの名無しさん:01/11/25 15:17
char型でカウントアップすることは出来ますか?
例)1 -> 2 -> 3
334_:01/11/25 15:20
>>333

char a;
a++;

無理だった?
VC6で確認。
335デフォルトの名無しさん:01/11/25 15:26
>>333

char型って1byteのunsigned intでしょう?
>>335
unsigned かどうかは処理系依存だが、いずれにしろ C では char が整数型であることは間違いない。
337_:01/11/25 15:32
>>333

これからはできますか?じゃなくてできないんですけど?になってから来なさいよ。
これくらい実験しないと一生プログラムなんて書けないよ。
>>333

よく文字定数を代入するときに、
char c;
c='A';

こういう風にするけれど、char=65;やchar=0x41としても全く問題ない(内部では等価だから)。
だから文字は数値として扱えるよ。
339デフォルトの名無しさん:01/11/25 15:40
>>336

訂正ありがとう。
処理系依存ということは、

int c;
while((c=getchar())!=EOF)
         ;

このおなじみのコードは処理系によってはcharでもうまくゆくんだね。
340デフォルトの名無しさん:01/11/25 15:52
戻り値がint型の関数でエラーと判断した場合、どんな値を返すのがよいと思いますか?
341340:01/11/25 15:55
ちなみに、正常の場合、負・0・正のいずれも返す可能性があります。

ポインターならナルポインタでも返してやるんですが・・・
342デフォルトの名無しさん:01/11/25 15:59
>>340
期待されるintの範囲による。
期待されるのが0以上ならば、負の数にするのが一般的。
-1,-2...にエラーコードを割り当てれば、エラーパターンを細分化できる。
343342:01/11/25 16:02
>>341
あら、そういうことだと・・・

戻り値として期待されない値にエラーを割りあてるわけだから、
正常時にあらゆるint値を返す場合は、そもそもこの方法でエラーを通知
することは不可能だよ。
344デフォルトの名無しさん:01/11/25 16:03
>>343

やっぱりそうですか。。。
それならもうこの関数を使う前に予め正常かどうか判断するしかないですね。

ありがとうございました。
345342:01/11/25 16:04
>>344
解決策としては、戻り値じゃなく、引数に出力用の変数を設ける方法があるよ。
346344:01/11/25 16:06
>>345

エラーコードを設定する変数を呼び出し元で用意するということですか?
347342:01/11/25 16:10
>>346

そう、それでもいい

int foo(int input, int *err)
と定義して、呼び出すときは。
int err,ret;
ret = foo(100,&err);
if(err == ERROR){}

とか、あるいは。
int foo(int output, int input)
として
int out,err;
err = foo(100,&out);
if(err == ERROR){}

でもいい。

後者のほうが使いやすいと思うけど、前者もあり。
348342:01/11/25 16:11
>>347
訂正
後者の定義は
int foo(int output, int *input)
ポインタで渡す。
349342:01/11/25 16:12
違う
int foo(int input, int *output)
だ。

鬱・・・
350344:01/11/25 16:15
>>347

なるほど。よく分かりました。実際に前者と後者を試してみて使いやすい方を使うことにします。

ありがとうございました。
351sage:01/11/25 16:27
さて、どれからつっこむべきか?
352_:01/11/25 16:35
>>351

やるならさっさとな。
>>351
全部やれ。
>>351

今やれ。すぐやれ。
355デフォルトの名無しさん:01/11/25 22:35
>>355
再帰
356ジョジョの奇妙なソースコード:01/11/25 22:48
再帰不能(リタイヤ)

K.O
357デフォルトの名無しさん:01/11/25 23:21
みなさんはmain関数(コマンドライン引数無し)をどう書いていますか?
main() ? void main(void) ? int main() ? その他もろもろ
int main()
359357:01/11/25 23:21
ちなみに私はmain()です。書かなければint型として見てくれるし。
int main(void)
361358:01/11/25 23:27
理由
int書かないとwarning出ることがあるから。
362デフォルトの名無しさん:01/11/25 23:29
>>361

そうなんだ。VC++,bcc32,gccのいずれも出ないからいいのかと思っていたけど。
bcc32でmain()の場合はreturnを書かないと警告が出るけどね。
363デフォルトの名無しさん:01/11/25 23:30
>>357
全部間違ってるのが悲しい。
364デフォルトの名無しさん:01/11/25 23:30
>>363

int main(void)が正しいということ?
>>363
意味不明。
366デフォルトの名無しさん:01/11/25 23:36
mainの第三引数(環境変数)はANSI非準拠なのに、getenv()がANSI Cの標準関数なのはおかしいと思いませんか?
367デフォルトの名無しさん:01/11/25 23:38
envp age。
int main( int argc, char *argv[ ], char *envp[ ] )
これ以外を使ってる奴は基地外
369デフォルトの名無しさん:01/11/25 23:39
>>368

変数名なんてどうでもいいじゃない。  
どちらかといえば、368の方がキティ
int main(int, char**)
char main[1] = { 0xC3 };
とかいうのがあったような・・・
373デフォルトの名無しさん:01/11/26 09:34
実数が等しいかどうかを下のようにイコールで
判定するのは「素人」って、この板で言ってた
人が居たんですけど、玄人はどうやって判定
するんですか?

double a,b;
...
if( a == b ) {
...
>>373

そう言った人が素人
>>373
それで構わないと思うけど、
計算結果を比較する場合は
丸め誤差でちょっとでもずれたりすると
イコールにならないから注意。
376デフォルトの名無しさん:01/11/26 09:54
どんな場合においても実行時にエラーが起きなければコンパイル時にWARNINGが出ても無視して大丈夫ですか?
大抵はコンパイラによってWARNINGが出たり出なかったりする程度のものなんですが。
377デフォルトの名無しさん:01/11/26 10:09
>>373
玄人はこのマクロ使う。
てか、資料無しで書いたんで、間違ってたらゴメソ

#define DOUBLE_EQ(x,v) (((v - DBL_EPSILON) < x) && (x <( v + DBL_EPSILON)))
378デフォルトの名無しさん:01/11/26 10:11
EPSILON・・・・ε←これ?
379デフォルトの名無しさん:01/11/26 10:13
>>376
警告の内容を理解して、無視して大丈夫かどうかそのつど、判断するしかないね。
警告の内容を理解しないで、闇雲にソースをいじって、無理に消しても
それが、バグの原因になったりするしね。
1+ε≠1 になる最小の値εって定義だったかと。
381仕様書無しさん:01/11/26 10:18
>>373
整数だろうが実数だろうが、等しいか否かの判定は == 演算子でできる。
問題なのは、実数型の計算の場合、丸め誤差などのせいで予想と違う結果が
出やすいってこと。
とりあえず、

for ( double i = 0; i < 1; i += 0.1 ) {
 cout << i << endl;
}

このコード実行してみな。

>>377
DBL_EPSILON はどこで定義してるんだよ。許容誤差がなきゃ始まらないだろ。
382デフォルトの名無しさん:01/11/26 10:20
>>381
DBL_EPSILONはfloat.hで定義されてるね…
383デフォルトの名無しさん:01/11/26 10:22
>>381

LIMITS.Hで定義されているらしい。
あくまでもMSDNライブラリに載っていただけだからANSI C準拠かどうかは分からないけど。
384383:01/11/26 10:23
違った。FLOAT.Hだ(鬱
同じページに書いてあったから・・・
385383:01/11/26 10:25
ちなみに、VC++では、
DBL_EPSILON = 2.2204460492503131e-016
と定義され、意味は、
1.0+DBL_EPSILON !=1.0 になるような最小の数
らしいです。
386仕様書無しさん:01/11/26 10:28
>>381
まともな結果になるんじゃないか?それ。
i < 10 にするなり、i += 0.01 にするなりしないと、誤差は表には現われないと思われ。
>>385
てことは、差をDBL_EPSILONと比較するのはあまり意味がないような。
やっぱ有効数字を設計時に決めておくのがいいと思われ。
388デフォルトの名無しさん:01/11/26 11:43
#define DOUBLE_EPSILON 0.001
とかって、やればいいのかな?
389デフォルトの名無しさん:01/11/26 13:30
今までmalloc関数で確保した領域は必ずその関数内でfree関数を使って解放しなければならないと思っていたのですが、
プログラミングC第二版の173ページのstrdup関数の例ではfree関数でを解放していないようです(そんなことをしたらどうなるかくらいは分かります)。

もしかして、場合によっては解放しなくてもよいのですか?
390389:01/11/26 13:31
× free関数でを
○ free関数で
>>389
>もしかして、場合によっては解放しなくてもよいのですか?

プログラム終了まで確保しっぱなしでも困らない場合は構わない。
でもおすすめできるようなことではない。
392デフォルトの名無しさん:01/11/26 13:45
>>391

分かりました。ありがとうございます。
393fjネタ:01/11/26 14:44
>>389
> もしかして、場合によっては解放しなくてもよいのですか?
まともなOSかつANSI準拠であれば、exitの直前のfreeはいりません。
394デフォルトの名無しさん:01/11/26 15:07
>>393

まともでなかったらプログラムが終了しても解放されないということですか?
で、メモリーリークの原因になると・・・・
絶対に関数内でfreeしなきゃならなかったら、困ると思うのだが。
>>394
DOS, Win16, Win32, Solaris, FreeBSD, NetBSD, OpenBSD, Linux あたりは、ぜんぶ問題ない。
っつーか問題がある環境が実例として挙げられた試しがない。(freestanding は除く)
C歴史と伝統と恒例の祭りが始まった!!!
伝統の一戦ですね
399デフォルトの名無しさん:01/11/26 17:52
>>396
つーことは、組み込み系の人だけ?
mallocを使うのかどうかという問題もあるが。
>>399
ANSI C の規格は二種類あって、組み込みのほうの処理系は普通 freestanding の方を採用
している。で freestanding の方では、そもそも malloc, free は標準関数ではないから、その
あたりは処理系によりけり。

そもそも、巨大な単一ヒープを前提にした malloc, free は、メモリ制約が厳しい環境では使い
モノにならんよね。
401399:01/11/26 18:15
「ANSI C の規格は二種類」「freestanding」、今初めて聞いた……
> 「ANSI C の規格は二種類」「freestanding」、今初めて聞いた……
なんか誤解してそうだな。
正確に書くと、「ISO/IEC 9899 (ANSI C)に準拠する実装としてはhostedと
freestandingの二種類ある。」てこと。
外部のバイナリファイルからデータを読み込んで、
色々と操作する関数を書いているのですが、
それをライブラリとして使うようにした場合に、
外部のデータもライブラリとしてまとめてられるのでしょうか?

できれば、winとlinuxの両方で、やり方が知りたいのですが…。
>>403

外部のデータが何を指しているのか分からない。
>>403
・・・はい?
外部のデータって、「外部のバイナリファイル」なんでわ?
ライブラリとしてまとめる???
サパーリ妖精が出そう。
406デフォルトの名無しさん:01/11/27 01:03
ぶっちゃけなんでポインタってあるの?
アセンブラでできることがCでできないと困るから。
>>406

配列を関数に渡せないから。(←初心者発言)
409デフォルトの名無しさん:01/11/27 01:19
>407
どゆこと?
>408
・・・・そうだね(冷笑)
そうなんだよね。配列をスタックに積んでくれないんだよね
なんか方法ある?
411C++忘れかけ:01/11/27 01:34
>408
ポインタで、関数配列とか…
412デフォルトの名無しさん:01/11/27 01:35
typedef で配列を宣言できないの?
添え字計算だと遅いから(←原始人
ポインタは熱いんだYO!
C言語マンセーーーー!!!!
参照なんて捨てちまえ!!!!
* このうめぼし見ただけで唾が出てくるぜ!
**(*(ptr[3])[3]);
うおーーーーーーー (オーバーラン)アヒャっ
>414
やはりポインタは危険だな。
>>410
構造体にする。
age
文字列が扱えなくなるから
>>416
確かに構造体にすれば配列でも渡せるけど、例えば1MBの配列をそうやって
渡すのはとんでもなく非効率的だし、下手するとスタックが足りなくなる
からねえ…。
>>406
C言語ってのはな、もっと殺伐としてるべきなんだよ。
メモリ操作で「どこが間違ってんだよぉ?」いつモニタに喧嘩を売り始めてもおかしくない、
アクセス違反が起きるか起きねーか、そんな雰囲気がいいんじゃねーか。
まあお前、>>406は、VBでも使ってなさいってこった。
>>419

ただ関数内で参照するだけなのに、データ自体をコピーするなんて非効率的だよね。
在処さえコピーすればいいんだから。そのためにはポインターは必須。
>>421 参照でもいいじゃん
>>422
そもそも「ポインタの存在意義は何か」って話に対して「配列を効率よく関数間で渡すこと」という
意見が間違ってると思われ。それなら >>422 が言うように参照でも良いし、参照回数計測 +
copy on write を言語の機能として実装してしまってもいい。

C でポインタがあるのは、言語仕様を小さく押さえつつ、高度なデータ構造、たとえばリストやツリー
などをプログラマが実装できるようにするためでしょ。
424デフォルトの名無しさん:01/11/27 22:04
どどど素人意見ですが。
>>423
VBでも実装できるんじゃぁないんすか?
リスト&ツリー

参照ではだめでポインタを使わねば!っていう
具体例を俺もしりたーい!
ビデオメモリの読み書き(DirectDrawとか)
参照といっても、Javaのクラス変数みたいに、
ポインタっぽく扱えるものであれば、それで済むのです。

C++の参照は、柔軟性に乏しく、用途が限定されてるので、
ポインタでないとダメなのです。

単にそれだけのことです。
>>414みたいな人は多くないかい (´д`;)
Cやってるといつも頭の中に2次元配列の2次元配列の2次元配列
みたいなのがグルグルしてくる。。。3次元ってのはおかしいよなあ・・・・
>>426
C++の参照とJavaの参照を比べないで欲しい。
Javaのは参照という名前のポインタ。
ポインタ=参照+イテレタ+キャストに係る邪悪なα
>>407 で答えが出てるだろうに..
参照とか文字列とかそんなものぜんぜん違う次元の話しだ。
>>430
システム記述言語として誕生した初期の C では正解だけど、現在の ANSI C の規格の背景は? って
ことになると、微妙に違う気がする。

ポインタに関して単に「メモリアドレス」と書かずに、あれだけ微妙な言い回しをしているのは、それなりの
意味があると思わん?
メモリアドレスという概念がOSごとに微妙に異なるから、
言語の定義としてポインタ=メモリアドレスと明示的に定義することを
避けたんだ。

アドレス=ポインタは、C++に派生してもその意義は失われていない。
その中でも唯一扱いが異なるのはNULLポインタだが、
そこまで言及する必要もないだろ。
もちろん、OSのないアーキテクチャ上でCのプログラムを動かすことだってできるし
そういうものも多いよね。
434組長:01/11/28 00:10
16進数がテキスト形式(“f4c6・・・・”みたいな感じ)
で書かれたファイルを読み込んで、
int変数まで持っていくプログラムを考えています。
atoi()とsscanf()を使えば簡単と思っていたんですがなかなかできません。
どなたか教えてくだし。
いやすげえ簡単だろ、それ
436デフォルトの名無しさん:01/11/28 00:18
数字なら0x30アルファベットなら
0x37をひけ。
>>436

アルファベットって二種類あるよ。
438デフォルトの名無しさん:01/11/28 00:22
バイトオーダーの問題?
並び順はテキスト作った人にしかわからん。
439デフォルトの名無しさん:01/11/28 00:27
>>434
strtol (stdlib.h)
>>434

char *hex;
int i;

sscanf(hex,"%x",&i);

こうしたらできたけど。
もちろん、hexは初期化してね。
441440:01/11/28 00:32
あ、テキストから読むのか。
442 :01/11/28 00:32
strtol()って16進数でもいいの?
>437
それぐらい判断してからひけ。それかマスクしろ。
>>442

10進数字列として数値にすると思うけど・・・
アルファベットの無い16進数字列は10進数字列と見分けがつかないし。
おっと、strtolは基数を指定するんだ(鬱
>>442,444
マニュアル見ろや。2進から36進まで可能。
>>446

すまない。名前しか知らない関数でatolと同じものだとばかり思っていた。
>>442
long int strtol(const char *nptr, char **endptr, int base);
449447:01/11/28 00:42
メール欄に444と入れてしまった(鬱
もう寝よう・・・
>>434

int i;
char hex;

if((( hex & 0xff ) > 0x30) && (( hex & 0xff ) < 0x7a)){
if(( hex & 0xdf ) < 0x41 )
i = hex-0x30;
else
i = hex-0x37;
}
451デフォルトの名無しさん:01/11/28 01:43
char *p="abcde\0";
p=realloc(p,64);
できる?
さいごにfree(p);
で問題ない?
>>451

reallocはmalloc,callocで確保した領域にしか使ってはならない。freeも同様。
453デフォルトの名無しさん:01/11/28 01:53
ちぇ!明日やろうと思ってたんだけど
今やったんだけどできなかった。
あーあ。
char *p=strdup("abcde\0"); なら可
¥0は要らないと思うけどーー
>>450
うちの会社のCコンパイラでは動かないんですけど
457デフォルトの名無しさん:01/11/28 02:07
うちの幼稚園のCコンパイラでも動かないんですけど
WindowsとUNIXで使ってる文字コードがすべてだと思ってるかわいそうな人なんだよ。
459デフォルトの名無しさん:01/11/28 02:25
>>456
コンパイラに何つかっているの?
それとOS。
hitac-cとかでは?
ふつー動かん。
462デフォルトの名無しさん:01/11/28 07:19
i_random(int n)っていう0-nの整数の乱数を取る関数があります。

for(i=0;i<N;i++){
a[i]=i_random(n);
}
ってやってa[i]に乱数をポコポコ入れていきたいんですが、
a[i]!=a[j](j<i)という条件をいれたいんです。
で、do-whileとかつかうのかなぁと考えたんですが、
どうすりゃいいのかさっぱりわかりません。どうすりゃいいですか?
重複を無くしたいの?
a[]に0〜Nまで入れて、
位置をランダムに変えればいいYO!
464Kusakabe Youichi:01/11/28 07:28
>>462 デフォルトの名無しさん wrote:
> で、do-whileとかつかうのかなぁと考えたんですが、

そんなダサいやつでいいのならば、
たとえば、
for (i
465デフォルトの名無しさん:01/11/28 07:30
いや、そうじゃないんすよ。
ええっと、N<nなわけで。
簡単に言うと、N=10でn=100で、

a[N]=[10,53,75,4,32,87,44,39,1,24]
みたいにしたいわけです。
でa[N]=[1,1,5,96,47,76・・]とか[5,4,47,87,35,32,47,・・]
とかはだめと。そんなかんじなんです。
466Kusakabe Youichi:01/11/28 07:36
In article <[email protected]>, デフォルトの名無しさん <2
[email protected]> wrote:
> いや、そうじゃないんすよ。

なんでだめなんだろう(^^; > do-whileで、すでに使ったのは使わないように
する泥臭い方法:)
467デフォルトの名無しさん:01/11/28 07:42
>466
いや、それでもかまわないす。
でも、それでどうかけばいいのか。

for(i=0;i<N;i++){

do{
a[i]=i_random(n);
}while()←ここになんと書けばよいのでしょう?
468デフォルトの名無しさん:01/11/28 07:44
0〜100までの値を重複無しで10個ランダムに作成したいって事?
469デフォルトの名無しさん:01/11/28 07:44
そういうことっす。
do-while使わなければいいじゃん。
forでやれ。
471デフォルトの名無しさん:01/11/28 07:49
そっか!!
int included_p(const int *ary, int num, int val)
{
  int i;
  for (i = 0; i < num; ++i) {
    if (val == ary[i]) return 1;
  }
  return 0;
}


for (i = 0; i < N; i++) {
  do {
    a[i] = i_random(n);
  } while (included_p(a, i, a[i]));
}

ただし、乱数に偏りがあると遅くなる危険性はある。

もしnがNに比べてそう大きくないなら、
>>463のやり方でn個の乱数列を作ってからN個取り出すとか。
473デフォルトの名無しさん:01/11/28 08:12
頑張って作ります。ありがとうございました
474Kusakabe Youichi:01/11/28 08:13
>>46 デフォルトの名無しさん wrote:
> でも、それでどうかけばいいのか。
> do{
> a[i]
UNIXで大きなテキストのお尻500行とか抜きたい時
真C屋さんな皆さんならどうしますか? 低レベルの方が速いですかね
tail読めって言うのは無しの方向でお願い出来ますでしょうか(^^;
476Kusakabe Youichi:01/11/28 08:30
>>475 デフォルトの名無しさん wrote:
> UNIXで大きなテキストのお尻500行とか抜きたい時
> 真C屋さんな皆さんならどうしますか? 低レベルの方が速いですかね
> tail読めって言うのは無しの方向でお願い出来ますでしょうか

tail読め。
やっぱり(^-^
こう言うのってレベル高い人には一番面白く無さそうですよね
低レベルでシコシコやってみるです。。。
関数も全部突っ込んで。。。main一個で
tail読めるかなあ。。。。
>>477
基本的には

1. fseek() 使ってファイルの最後に移動

2. getc() などで 1 バイト読み出す
3. fseek() 使って、ファイル位置を 1 バイト前に移動
4. goto 2

でぐるぐる回すだけじゃない。'\n' が出てきたら行の区切り目ということで。
>456
あんたの使ってる糞マシンの文字コードに合わせればいい。ただそれだけ。
>>472
そういうのって、毎回重複をチェックするんではなくて、
あらかじめ乱数を生成しといて、あとでシャフルするのが
定石だと思うけど。
481デフォルトの名無しさん:01/11/28 09:11
>>478
unixだったらそれでいいけど、移植性なくなるよね。
>>481
fseek() は ANSI C 標準関数だけど。(そういう話じゃなくて?)
483デフォルトの名無しさん:01/11/28 09:23
>>482
テキストモードだと、3.の動作が保証されないみたい。
http://www.bohyoh.com/CandCPP/C/Library/fseek.html

バイナリモードだと、dosやmacで、\nが使えないし。
>>483
あとマルチバイト文字の扱いを考え出すと、話が厄介になるね。
ファイルを頭から読んでいって、改行が見つかるたびにファイル位置を
記録していった方が楽じゃない? ファイルの最後に達したところで、
500行手前のファイル位置へseekしてそこから先を表示すればOK。

この場合、全ての行のファイル位置を記録する必要はなくて、戻りたい
行数分の位置を格納できるバッファだけを確保すればよい。
たしか、GNUのtailは、ファイルポインタを一気に
最後尾まで移動して、後ろから順番にみていってた
ような記憶がある。
一旦EOFにfseek()、ブロック単位で先頭に向かってfseek()&fread()、'\n'の
数を数えていく。
>>487
がいしゅつなんてもんじゃないな。>>483読め。
489475 :01/11/28 19:54
みなさんご回答有難う御座います。これはちょっと意地悪問題みたいなのでして
最低でもtail位の実行時間で、だそうです 鬱
readとlseekでやってみようと思います、後はなるべくインラインにして、、
普段ジャバ夫で、ざっくりしたのしか書かないので、こう言うの超苦手なんです
心がおもひ
失礼します
490487:01/11/28 23:47
>>488
DOSでも'\n'があれば改行とみなしてもいいんじゃないの。

'\r\n'ペアだけを改行とみなしたい場合も、ブロック境界に跨ったときの判断
が若干複雑になるだけで、バイナリでオープンすればとくに問題になるような
こともないし。

>>478との違いはブロック単位のI/Oで高速化を図るだけだが。
491あはは:01/11/29 22:03
誰か教えてください。以下の関数がよくわかりません。自分の買った本にも
載ってないので・・・
assert  <assert.h>
isprint <ctype.h>
malloc  <stdlib.h>
free   <stdlib.h>
多くてすいません。でもお願いします。
>>491 自分の買った本ってCの本ですか?ジャンプには載ってませんよ?
493あはは:01/11/29 22:17
>>492
ジャンプってマンガ雑誌の?なんでそんなものに・・・

当然C言語の本です!
>>491
☆assert
assert(i == 0);
などと書くと、i が 0 以外のときはプログラムがエラー終了します。

☆isprint
何か文字があったとき、それが表示できるものかどうか調べます。
例えば 'A' とか 'B' とかは表示できる文字で、'\0' とかは
表示できない文字です。

☆malloc
メモリを確保します。
malloc(100000) ってやると、メモリが 100000 バイト確保されます。

☆free
確保したメモリが要らなくなったら、free で解放します。

これでOK?
malloc/free すら載っていない C の本って…
497 :01/11/30 01:59
>>496
よく見たら”++”があって、new、deleteの解説にちっこく載ってたりして。
498デフォルトの名無しさん:01/11/30 02:08
ANSI C言語辞典(技術評論社)買え。
499デフォルトの名無しさん:01/11/30 07:34
その前にK&Rだろ。
その前に「はじめてのC」だろ。
その前に「はじめてのB」だろ。
その前に「はじめてのCASL」だろ。
503デフォルトの名無しさん:01/11/30 10:00
C言語でマイナス無限大からプラス無限大への積分はどうやったらいいのでしょうか? 無限という概念はなさそうなのでどうしたらいいのかわかりません。
わかる方いたら教えてください。
初心者ですみません汗
504Kusakabe Youichi:01/11/30 10:11
>>503 デフォルトの名無しさん wrote:
> C言語でマイナス無限大からプラス無限大への積分はどうやったらいいのでしょ
うか?

だいたい同じですよ > Fortranのときのやりかたと
505デフォルトの名無しさん:01/11/30 10:14
積分範囲が有限範囲に収まるように式を書き直してから計算したら?
積分を計算可能な式に解いてから計算すれ。
はじめて〜の〜チュウ
508あはは:01/11/30 21:50
>>495
よくわかりました。ありがとうございます。

>>496
明解C言語です。索引のところに載っていないので・・・

>>498.499.500
それらの本は自分には難しくて・・・
509デフォルトの名無しさん:01/11/30 22:03
新しく、2ch言語というのを作ろうと思うんだけど、皆どう思う?
510デフォルトの名無しさん:01/11/30 22:06
>>509

gotoの代わりに逝ってよし!とか?
これ以上 意味の無い言語を増やすな。
とりあえず、ギコBASIC完成させろ
513デフォルトの名無しさん:01/11/30 23:37
どうでもいい質問ですが、よろしければ教えてください

リスト構造で頭に新しいデータを入れるものですが
1と2のどちらの方がいいのでしょうか?
処理速度やメモリ使用量などが変わるのでしょうか?

struct LIST{
struct LIST *next_ptr;
int value;
};

main(){
struct LIST *top;
int i;

top=insert1(top, i); >1

insert2(&top, i); >2
}

struct LIST *insert1(struct LIST *ptr, int i){
struct *newcell;
newcell=(struct LIST *)malloc(sizeof(struct LIST));

newcell->next_ptr=ptr;
newcell->value=i;

return(newcell);
}

struct LIST insert2(struct LIST **ptr, int i){
struct LIST *newcell;

newcell=(struct LIST *)malloc(sizeof(struct LIST));

newcell->next_ptr=(*ptr);
newcell->value=i;

(*ptr)=newcell;
}
>>513
1 は使い方を間違う可能性がありそう。戻り値を入れ忘れるとか。
2 なら間違いは起きまい。おれ的には 2 を推奨。
headとtailのポインタもって、尻尾に追加していったほうが使いやすいと思う。
516デフォルトの名無しさん:01/11/30 23:58
キーボードバッファをクリアする為に

rewind(stdin);

とするのは良くないでしょうか?
rewind・・・?
またワケのわからんことを・・・

標準入力がコンソールの場合は知りませんが、
標準入力がファイルにリダイレクトされてたりすると、
クリアどころか先頭に戻って入力し直しになる気がする〜。
518デフォルトの名無しさん:01/12/01 00:27
UNIXでプログラムをつくっているのですが、
三次以上の配列をつくるとすぐに
Segmentation fault
とでてしまいます。
また、一次の配列でも千以上のものを2つとると同じような状況になります。
メモリ不足なのでしょうか?
これを解決しないと僕の卒研が進まないので
だれかわかる方、教えていただけないでしょうか?
その糞コードを晒してくれないと答えようもない。
>>518
かなり FAQ ですが、配列を自動変数で取ってますね? 自動変数は、一般には
スタックという比較的狭いメモリ領域に配置されるため、巨大な配列を取るとスタッ
クを使い切ってしまいます。

1. グローバル変数として宣言する
2. 関数内 static 変数として宣言する
3. malloc を使ってヒープ領域に確保する

いずれかの方法をとってください。
たぶんスタックの使いすぎ。
mallocを使ってミロ。
>>518
それにしても、一次元配列で「千以上のものを2つ」で、
落ちるってのは小さすぎるな。せいぜい数キロから数十キロだろ?
10年くらい前のパソコンでもそのくらい平気なはずだけど。
UNIXってスタックあふれるとsegmentation faultなん?
>>522
スタックサイズは環境による。

科学計算系のプログラムっぽいから
配列は一個だけじゃないんだろうよ。
525516(初心者):01/12/01 00:43
>>517
レスありがとうございます。

fflush(stdin)は良くないと聞いたので(C FAQ 12.26も見ました)、
何かいい方法は無いものかと調べたところ、MSDNライブラリに

> キーボード バッファをクリアするには、
> デフォルトでキーボードに結合している
> 標準入力ストリーム (stdin) に対して
> rewind 関数を使います。

と出ていたので、これなら大丈夫なのかと思ったのですが、
やっぱり問題があるみたいですね。。。
「標準入力がファイルにリダイレクトされている」というのが
どういう事なのかよく解りませんが、そこは勉強します。
526デフォルトの名無しさん:01/12/01 00:48
Windows NTで、

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
   FILE *fp;
   if((fp = fopen("C:/abc/test.txt", "r")) == NULL) { /* フルパス指定でファイルをオープン */
     puts("File not open !!");
     exit(1);
   }else{
     puts("File opened");
   }
   fclose(fp);
   return (0);
}
とすると、ファイルが開けなくて、"File not open !!"となってしまうのですが、
どうしてなのでしょうか?
Windows95だとちゃんと動くんだけど・・。

どうか、教えてください!
>"C:/abc/test.txt"
"C:\\abc\\test.txt"じゃない?
>>522
環境によるけど、OS の制限ではなくシェルで limit かけてる可能性もある。その
場合にはシェルのコマンド (ulimit とか) で、OS の制限まではスタックを増やせる
ね。

>>523
前に BSD 系のカーネル読んだけど、確か

- ユーザプロセスのスタックサイズは可変
- スタック用に確保してある仮想メモリの上限部分に「読み書き実行禁止」属性をしていた
 ページ (*1) を貼り付けておく。

となっていたと思う。(*1) にアクセスするとページフォルトが発生するので、それを OS が
検出して

1. 現在、スタックサイズは OS や (BSD 系だと setrlimit で指定した) プロセスの
 上限値にひっかかってないか?
2. 上限に達していなければ、スタック用に「読み書き実行可能」属性のページを
 割り当てる。
3. 上限に達していれば、プロセスにシグナル (SIGSEGV) を送る。

という感じで処理。今ソースが手元にないので、間違ってたらごめんな。
>>526
とりあえず、エラーは perror() で表示しよう。その方が詳しい原因が
分かるよ。
>>526

アクセス権の問題とか?
たぶんファイル名を区切る / がマズイんではないかと。
実は単にファイルが無いだけとか・・・
533デフォルトの名無しさん:01/12/01 03:11
超厨房です。スマソ
Cって変数をスコープの最初にまとめて宣言するじゃないですか。
あれって変数を使用する個所と宣言が離れてしまって気持ち悪いんで
たとえばifとかforなどでは、
for(;;) {
int a; /* a, b ともfor内だけのローカル変数 */
int b;
--- a, b を使用 ---
}

ってな具合にしたいんですが、これって
int a;
int b;
...
for(;;) {
--- a, b を使用 ---
}
って書いた場合よりパフォーマンスの面で問題あるんでしょうか。
それともコンパイラの最適化とかいうもののおかげで問題ないのでしょうか。
(過去ログもあんまり読んでません。再度スマソ)
>>533
なんだそのへりくだった態度は?

つーのはさておき
まじでなんでだろね。オレも疑問。
>>533
構文解析器が作りやすい。
NULLが臭くない?
537533:01/12/01 03:31
>>534
2chで初めてポストしたんでびびってました(ます)。
ってか厨房ってのはほんと。
で、もとの質問なんですが、ローカルに変数を宣言してもコンパイルは
通るんで、できればそうしたいんですが、普通そうしていないというのは
(少なくとも漏れが見たソースの範囲で)、
>>535
という理由だけでなくてパフォーマンス的に実際問題あるってことなんでしょうか。
そこがずばり疑問なわけです。
厨ですいませんが、
atoiの逆の関数ってないでしょうか。
数を文字列にしたいんです。
たとえば
int a = 123 を
char b[] = "123"
みたいに。
上の桁から数字を取り出して
b[i] = 数字 + '0'
b[おわり] = '\0'
とかやってみたんですが、
もっとスマートな方法でなんとかしたいんです。
>>という理由だけでなくてパフォーマンス的に実際問題あるってことなんでしょうか。
ない。
昔の言語は使う変数は最初に宣言するのが普通だった。
その名残なんじゃないの。
>>538
sprintf( b, "%d", a); とか。
バッファオーバーフローが怖いなら sn 系とか
バッファかました関数作るとかてきとーにやってくれい。
>>538
C FAQ 読みましょう。
http://www.faqs.org/faqs/C-faq/faq/

> 13.1: How can I convert numbers to strings (the opposite of atoi)?
> Is there an itoa() function?

URL 忘れたけど、どこかに日本語訳もあったはず。
542540:01/12/01 03:43
s/オーバーフロー/オーバーラン/
何だ???マジレスしちゃダメなのか(´д`;)??
>>533
俺も厨房だけど、スコープ絞りたいなら最適化されると困るんじゃないの?
ていうか初期値代入するのにまたカッコで括って、、、
余計ややこしそうな気がするけど
ifはともかくループの中でそんな事出来るんだろうか??
544デフォルトの名無しさん:01/12/01 03:46
>>540-541
ありがとございました。
545533:01/12/01 03:49
>>539
ありがとうございました。
といいたいところでしたが、
>>543
意味がよくわかりませんでした。やっぱ漏れって厨房だね。
>>543
ループスコープで宣言するのは可。
ふつースタックフレーム(古いね)に展開するから
宣言の手間は構文解析→変数配置の時点で終了しているはず。
ちゃうの?
>>533
Javaやればそんな事は忘れちまうぜ!

for( int i=0;i<10;i++){

}
>>547
スレ違い――と言おうかと思ったけど、せっかくだから聞いておこう。Java だと、
そうやって i を定義した場合、実行時効率に差が出る? バイトコードのレベル
と、最近の JVM で JIT かけた場合と、両方について簡単にコメントもらえると
嬉しいかな。
549546:01/12/01 04:07
眠くなってきたよ…おやすー
550533:01/12/01 04:08
>>546
ループスコープの中で宣言しても外で宣言しても、スタックフレームに
展開した時点で結果は同じになるのでしょうか?
551533:01/12/01 04:10
>>550
行き違いスマソ。おやすみなさい。またよろしく。
(当方アメリカ在住)
552あやふやな人:01/12/01 04:10
>>548
違わないんじゃないかなぁ。
変数はスタックに積まれるだけだし、
どのタイミングで積んでも実行効率変わらないんじゃない?
JITだろーとなんだろーと最適化しないし(現時点では)

ただ、しょっちゅうループ変数に i 使うなら
変数の寿命を延ばした方が (つまり先頭で宣言しとく)
実行速度は当然速くなるんじゃないかなぁ?
宣言する=(スタックに)領域確保する=処理発生 だしさ
ってこれは何の言語でもおなじだーね

どうだろ?
553デフォルトの名無しさん:01/12/01 04:14
>514
お答えありがとうございます
私も今まで2しか使っていなかったのですが
ふとWebで1をみましてどうなのかとおもいました
今後も2を使うことにします

>515
順不同で集合として保持したいだけなので
スタックっぽく使ってました

>533 >543
↓やってみました
ループ内ではやはり毎回宣言してしまいますね
ifなら使えますね

main(){
int i=0;
for(;;){
int a=0;
printf("i=%d a=%d\n",i,a);
a=a+1;
printf("i=%d a=%d\n",i,a);
i=i+1;
if(i==3)break;
}
printf("\n");
if(1){
int b=0;
printf("i=%d b=%d\n",i,b);
b=b+1;
printf("i=%d b=%d\n",i,b);
}
}

結果
i=0 a=0
i=0 a=1
i=1 a=0
i=1 a=1
i=2 a=0
i=2 a=1

i=3 b=0
i=3 b=1
554あやふやな人:01/12/01 04:15
int i,j;
for(i=0;i<1000;i++)for(j=0;j<1000;j++);
ってのと

for(int i=0;i<1000;i++)for(int j=0;j<1000;j++);
ってのは

やっぱ外側のループが大きくなればなるほど
速度に差がでるんじゃないかなぁ
555デフォルトの名無しさん:01/12/01 04:18
>553
はげしい間違いでした。逝ってきます
556デフォルトの名無しさん:01/12/01 04:25
>>533
漏れもわからんかったから期待してスレ見てたけど余計わからん。
だれかびしっと答えてくらさい。もう寝るけど。
557デフォルトの名無しさん:01/12/01 04:32
>>556

int a,b;
for(;;){



for(;;){ int a,b;

なら明らかに後者の方が遅くなりそう
最適化しなければ
Cじゃこれは出来ないからまあ置いといて

>>533の例だとパフォーマンスに差は出ようもないよ
558デフォルトの名無しさん:01/12/01 04:42
a, b が1度しか出てこないなら変わらない
何度も出てくるなら初めに宣言した方がいい
と言う事でよろしいでしょうか?

>あれって変数を使用する個所と宣言が離れてしまって気持ち悪いんで

色んな所に宣言がある方が気持ち悪いのは漏れだけでしょうか?
559Kusakabe Youichi:01/12/01 04:45
>>533 デフォルトの名無しさん wrote:

> 超厨房です。熟ソ
> Cって変数をスコープの最初にまとめて宣言するじゃないですか。

べつに途中でもOKですよ。

> あれって変数を使用する個所と宣言が離れてしまって気持ち悪いんで

それはそのコードが整理されてないからでしょう。

> たとえばifとかforなどでは、
> for(;;) {
> int a; /* a, b ともfor内だけのローカル変数 */
> int b;
> --- a, b を使用 ---
> }

すればいいじゃん。

> ってな具合にしたいんですが、これって
> int a;
> int b;
> ...
> for(;;) {
> --- a, b を使用 ---
> }
> って書いた場合よりパフォーマンスの面で問題あるんでしょうか。

ないでしょうね。

もしくはfor (int a = 0;;)みたいにするか。
560Kusakabe Youichi:01/12/01 04:46
>>538 デフォルトの名無しさん wrote:
> atoiの逆の関数ってないでしょうか。
> 数を文字列にしたいんです。

sprintfでは重すぎ?
561デフォルトの名無しさん:01/12/01 04:46
int main(){
..
 {
   int a,b;
  for(;;){}
 }



for(;;){
  int a,b;
}
だとどうでしょうか。
>>561>>557
563561:01/12/01 04:51
>>562
あ、スマソ。寝ぼけてきたみたい。回線きって逝きます。
564553:01/12/01 04:52
> なら明らかに後者の方が遅くなりそう
> 最適化しなければ
これは>>533で書いたのと同じなのではないですか?
こちらでは遅くなりそう、なのに
>>533の例だとパフォーマンスに差は出ようもないよ
では変わらないというのはどういうことでしょうか。
ところで、
> Cじゃこれは出来ないからまあ置いといて
コンパイルは通るんですが(gcc,VC共)、だめなんでしょうか?

コンパイラが最適化してくれるということも含めて、
1)
int a,b;
for(;;){ }

2)
for(;;){ int a,b; }
ではスタックフレームでの変数の配置のされかたという点で
違いはあるのでしょうか。
>>553 の結果ではもしかして変数は同じ個所に配置されていて
ループごとにa,bに0が代入されているのかもしれないと思ったり。

>>559
質問でスレ伸ばしてスマソ。
このあたりのことについての厨房向けの書籍などあったら教えてください。
修行して戻ってきます。
565Kusakabe Youichi:01/12/01 05:02
>>550 533 wrote:
> >>546
> ループスコープの中で宣言しても外で宣言しても、スタックフレームに
> 展開した時点で結果は同じになるのでしょうか?

コンパイラーにもよりますが、
その同じ変数名を中と外で使っているような場合でない限り、
同じコードがでてくるのがふつうでしょうね。
566Kusakabe Youichi:01/12/01 05:03
>>552 あやふやな人 wrote:
> ただ、しょっちゅうループ変数に i 使うなら
> 変数の寿命を延ばした方が (つまり先頭で宣言しとく)
> 実行速度は当然速くなるんじゃないかなぁ?
> 宣言する=(スタックに)領域確保する=処理発生 だしさ
> ってこれは何の言語でもおなじだーね

あのー、何か勘違いしていませんか?
567Kusakabe Youichi:01/12/01 05:04
>>557 デフォルトの名無しさん wrote:
> int a,b;
> for (;;) {
> と
> for (;;) { int a,b;
> なら明らかに後者の方が遅くなりそう
> 最適化しなければ

いったい、どこが「あきらか」なんだろう?

> Cじゃこれは出来ないからまあ置いといて

なんで「できない」とか勝手に思い込んでいるんだろう?
>>566
for文のなかで宣言するより外で宣言した方がそりゃはやいだろ
>>Kusakabe
根拠示せ
570Kusakabe Youichi:01/12/01 05:07
>>558 デフォルトの名無しさん wrote:
> a, b が1度しか出てこないなら変わらない
> 何度も出てくるなら初めに宣言した方がいい
> と言う事でよろしいでしょうか?

「何度も出てくる場合に各スコープで宣言していると遅くなる」は
デマですよ。(少なくともauto変数をスタックに確保する処理系では)
信用しないように。

しくみがどうのの解説をここでするのもいいのですが、

それ以前に、カーニハン氏の「効率を云々するならまず測定せよ」という
言葉をプリンターで印刷して画面の上に貼ってください。
>>Kusakabe
測定結果示せ
572553:01/12/01 05:08
>>565
ありがとうございます。納得しました。
漏れネット歴も浅いんで良く知らんのですが、なんかすごい人らしいですね。
573デフォルトの名無しさん:01/12/01 05:11
よくわからないけどcygwinのgccではできました
>553は
int a=0
にしてるから毎回0が入ってるだけかと
ループ内でも宣言は1度だけで値は保持してます

for{
int a;
a=a+1;


だとaは1ずつ増えていきます
574デフォルトの名無しさん:01/12/01 05:16
>570
てことは変わらないんですね
さすがに速くなるはないですよね?w
575Kusakabe Youichi:01/12/01 05:17
>>568 デフォルトの名無しさん wrote:
> >>566
> for文のなかで宣言するより外で宣言した方がそりゃはやいだろ

なんでそう思い込んでいるのですか?
>>568-569
Kusakabe は放置の方向でお願いします。

まともに技術的な話をしている分には相手にして構いませんが、思い込みでいい加減
な事を言い出したら、取り合わないで下さい。こちらから質問しても、はぐらかされた回
答がくるだけで、スレが荒れる原因になります。
>>573
それって問題コードだと思うよ・・・
初期値不定なところで、たまたまスタック上の同じ場所に
aが確保されてるだけだから。
578Kusakabe Youichi:01/12/01 05:22
>>569 デフォルトの名無しさん wrote:

> >>Kusakabe
> 根拠示せ

...

# 入門書から勉強しなおしたほうがいいぞ :)
579Kusakabe Youichi:01/12/01 05:24
>>574 デフォルトの名無しさん wrote:
> >570
> てことは変わらないんですね

でしょうねえ。変わるような実装はまずないでしょう。

> さすがに速くなるはないですよね?

遅くなる実装の存在する確率と同じぐらいでしょう > 速くなる
580Kusakabe Youichi:01/12/01 05:25
>>576 デフォルトの名無しさん wrote:
> >>568-569
> Kusakabe は放置の方向でお願いします。
>
> まともに技術的な話をしている分には相手にして構いませんが、思い込みでいい
加減
> な事を言い出したら、

っていうか「思い込みでいい加減なことを言って」が誰かを考えてみるといいです
:)
581デフォルトの名無しさん:01/12/01 05:27
>>575
ああっと!
今分かった。オレの勘違いだ。すまん。速度に差は出ないや。

だけど、変数が初期化されずに使われるワーニングを恐れて
int a=0,b=0;
for(;;)
ってのと
for(;;){int a=0,b=0;
ってのを比べたら確かに後者の方が遅い・・・のかな?
まー なんでコード書くのですか? って言われるだけか
582デフォルトの名無しさん:01/12/01 05:31
つーかさー毒舌もいいんだけどさー、
せっかく正解知ってるんだったらとっとと教えてくれよ
プログラマとしちゃ優秀かもしれんがヒトとしちゃなってないぜ?
583573:01/12/01 05:32
>577
aは初めにifで1回だけ0を入れてうまくいったんですが
たまたま同じ場所を確保したら値が残っててうまくいっただけなのですね
先頭以外で宣言したことないのでよくわかりません・・・
584Kusakabe Youichi:01/12/01 05:35
>>581
>> 581 デフォルトの名無しさん wrote:
> だけど、変数が初期化されずに使われるワーニングを恐れて

ウォーニングのことか? :)

> int a=0,b=0;
> for(;;)
> ってのと
> for(;;){int a=0,b=0;
> ってのを比べたら確かに後者の方が遅い・・・のかな?

そもそもその2つじゃあ違う処理になるじゃん。
何をマヌケなことを言ってるのやら。
(中に++a;でも書いてみればバカでもわかるでしょ?)
隔離スレから外に出るなよ。
>(中に++a;でも書いてみればバカでもわかるでしょ?)

バカでもわかる、ということにしたいのですね?
for 文の中で宣言しようが、外で宣言しようがアセンブリ言語の
レベルでは一緒ですよ。一度コンパイルしてアセンブリリストを眺めてみては?

#両者に違いがでる特殊な処理系があるのかもしれないけどね
588Kusakabe Youichi:01/12/01 05:40
>>582 デフォルトの名無しさん wrote:
> つーかさー毒舌もいいんだけどさー、

どこが毒舌なんだろうか? こんなんが毒舌だったら、
世間のマニュアルや書籍は超毒舌だぞ。

> せっかく正解知ってるんだったらとっとと教えてくれよ

っていうか、少しは頭使え。

正解は「速度に有意な差がでることはまずない」と書いてるだろうに
正解を「みえないふり」しているの?

> プログラマとしちゃ優秀かもしれんがヒトとしちゃなってない

「ということにしたい」だけですね?
>世間のマニュアルや書籍は超毒舌だぞ。

世間のマニュアルが超毒舌、ということにしたいのですね?
>正解を「みえないふり」しているの?

見えないふりしてる(ということにしたい)ですね。
ちっ
あんまりポイント稼げなかったな
最後の文はわりと高得点だったけど
592Kusakabe Youichi:01/12/01 05:43
>>586 デフォルトの名無しさん wrote:
> >(中に++a;でも書いてみればバカでもわかるでしょ?)
>
> バカでもわかる、ということにしたいのですね?

ということは、あなたは「それでもわからなかった」例外的な馬鹿なのですか?
いい大人がこんな時間に何やってるんだろうね。。
だから Kusakabe の煽りには反応するなって。技術的な話だけに絞って議論する
ならともかく、そうでない部分まで反応しだすと話が拡散してスレが荒れる。

どうでもいい話は放置してくれ。
>ということは、あなたは「それでもわからなかった」例外的な馬鹿なのですか?

「例外的な馬鹿」ということにしたいのですね?
596Kusakabe Youichi:01/12/01 05:51
>>589
>> 589 デフォルトの名無しさん wrote:
> >世間のマニュアルや書籍は超毒舌だぞ。
>
> 世間のマニュアルが超毒舌、ということにしたいのですね?

「〜ならば」の条件節を無視したいのかな:)
597Kusakabe Youichi:01/12/01 05:51
>>590 デフォルトの名無しさん wrote:
> > 正解を「みえないふり」しているの?
>
> 見えないふりしてる(ということにしたい)ですね。

いいえ。わたしが「そうしたい」のではなく、
「そうなのか?」と質問しているだけですが。
598Kusakabe Youichi:01/12/01 05:52
>>593
>> 593 デフォルトの名無しさん wrote:
> いい大人がこんな時間に何やってるんだろうね。。

2chでは?
599Kusakabe Youichi:01/12/01 05:52
>>594 デフォルトの名無しさん wrote:
> だから Kusakabe の煽りには反応するなって。

「反応」しているのは私のほうですね。(話が逆)
600Kusakabe Youichi:01/12/01 05:53
>>595 デフォルトの名無しさん <[email protected]> wrote:
> >ということは、あなたは「それでもわからなかった」例外的な馬鹿なのですか?

>
> 「例外的な馬鹿」ということにしたいのですね?

「なのですか?」と質問しているだけですよ。
(でも答えていない)
Kusakabe 氏は少々ぶっきらぼうだけど
間違ってないですね

C の auto 変数では宣言をループの外に移しても高速に
なることは(処理系の実装しだいだけど)まずない。
int a = 0; は初期化込みだから、宣言と全く同じではない。

ループの外に移すことで高速になるのは C++ で何らかの
処理を行うコンストラクタ付きのクラス変数を宣言したとき
でしょうか。でも、ここは C スレなので脱線しますが。
602Kusakabe Youichi:01/12/01 06:14
>>601 デフォルトの名無しさん wrote:
> Kusakabe氏は少々ぶっきらぼうだけど

え、ちっともぶっきらぼうじゃないですよ。
すごく丁寧で親切だといつも言われています。
603Kusakabe Youichi :01/12/01 06:17
ではまた明日。
>>601
本題と逸れるけど「宣言」と「定義」を混同してる。これは規格で明確に使い分け
られてる単語なんで、細かい話をするときには注意した方が良いです。
605601:01/12/01 06:24
>>602
そうですね。失礼しました。

ここは C 初心者も書き込みますので
そのあたり察してあげてくださいませ。 :)
>>602
いつも言われてます、か・・・
607601:01/12/01 06:27
>>604
あー混同してましたか。またしても失礼をば…。
C の本読みなおしてくる :)
ありがとう
608Kusakabe Youichi:01/12/01 06:30
>>606 デフォルトの名無しさん wrote:
> >>602
> いつも言われてます、か・・・

はい。
609Kusakabe Youichi:01/12/01 06:34
>>607 601 wrote:
> C の本読みなおしてくる

いったいどんな本を読んでいるのでしょうか?

興味があります。
>>609
>いったいどんな本を読んでいるのでしょうか?

そのツッコミワラタよ。
611Kusakabe Youichi:01/12/01 06:44
>>610 デフォルトの名無しさん wrote:
> >>609
> >いったいどんな本を読んでいるのでしょうか?
>
> そのツッコミワラタよ

ん? まじめに聞いているのですが。興味があるので。
612デフォルトの名無しさん:01/12/01 06:53
Cでは最初に変数の宣言が必要では?
613Kusakabe Youichi:01/12/01 07:02
>>612 デフォルトの名無しさん wrote:
> Cでは最初に変数の宣言が必要では?

べつに「最初」じゃなくても、使う前ならOKですね。
main()
{
 int a=0;
 {
  int a=1;
  {
   int a=2;
   {
    int a=3;
    printf("%d\n",a);
   }
   printf("%d\n",a);
  }
  printf("%d\n",a);
 }
 printf("%d\n",a);
}
615C勉強中 ◆RubyOmS2 :01/12/01 08:06
>>614
3
2
1
0
やっとわかったよ。ありがとう〜〜〜

>>613
K&Rの付録AのA9.3複文って所を見ると

compound-statement:
  { declaration-list statement-list }

#下付けoptは書けないので除いたYO!
ってあるんですけど、、、
どっちが正解なんですか?
616Kusakabe Youichi:01/12/01 08:13
>>615 C勉強中◆RubyOmS2 wrote:
> K&Rの付録AのA9.3複文って所を見ると
> compound-statement:
>   { declaration-list statement-list }
> ってあるんですけど、、、
> どっちが正解なんですか?

どっちが、って、どちらも同じでは?
617デフォルトの名無しさん:01/12/01 08:14
for( int i=0;i<100;i++){

これってCだとダメなのな。ちょっと残念。
618Kusakabe Youichi:01/12/01 08:17
>>617 デフォルトの名無しさん wrote:
> for (int i = 0; i < 100; i++) {
>
> これってCだとダメなのな。ちょっと残念。

Cでも使えますよ。
(古いコンパイラーでは通り魔園が)
619デフォルトの名無しさん:01/12/01 08:20
>>618
まじ?
手元で試したコンパイラのバージョンをみたらこんな感じ

$ gcc -v
Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
gcc version 2.95.3-5 (cygwin special)

どのバージョンのgccならコンパイルできる?
つーかgccじゃだめなの?
620617=619:01/12/01 08:23
どうも gcc 2.95.x だと全然だめっぽいな
gcc 3.0以降ならいいのかな?

>>617がOKなコンパイラをぜひ教えてください。
621Kusakabe Youichi:01/12/01 08:25
>>619
In article <[email protected]>, 619 デフォルトの名無しさ
ん <[email protected]> wrote:
> 手元で試したコンパイラのバージョンをみたらこんな感じ
> $ gcc -v
> Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
> gcc version 2.95.3-5 (cygwin special)

ああ、それだと通らないですね。

> どのバージョンのgccならコンパイルできる?

少なくとも-C99オプション通るやつじゃないと。
622デフォルトの名無しさん:01/12/01 08:28
>>620
http://gcc.gnu.org/gcc-3.0/c99status.html

この程度は通る>gcc3.0
623620:01/12/01 08:33
>>622
おお!サンクス!
624デフォルトの名無しさん:01/12/01 08:38
クサカベって、叩かれると急に真面目になるからなあ。
625C勉強中 ◆RubyOmS2 :01/12/01 08:38
>>616
え?
>べつに「最初」じゃなくても、使う前ならOKですね。
って言ってるようですけど、
K&Rの付録にはANSI Cでは宣言はブロックの「最初」になってませんか?
612が言っている「最初」というのはブロックの「最初」って言うことだと思ったんですが、、、

少なくとも>>613の言い方では、

int x;
x = 0;
int y;
y = 0;

としていいよと聞こえるんですが、、、
#僕はCについては初心者なので、、、
626Kusakabe Youichi:01/12/01 08:42
>>624 デフォルトの名無しさん wrote:

> クサカベって、叩かれると急に真面目になるからなあ。

はつみみです。「そういうことにしてしまいたい」のかな? :)

# そんなにこわがらなくていいのに。
627Kusakabe Youichi:01/12/01 08:44
>>625 C勉強中◆RubyOmS2 wrote:
> > べつに「最初」じゃなくても、使う前ならOKですね。
> って言ってるようですけど、
> K&Rの付録にはANSI Cでは宣言はブロックの「最初」になってませんか?

ああ、K&Rのは古いですね。
古いコンパイラーに合わせてかくときにはK&Rにしたがっておいたほうがいいです


> 少なくとも>>613の言い方では、
>
> int x;
> x = 0;
> int y;
> y = 0;
>
> としていいよと聞こえるんですが、、、

現在の標準規格ではOKですね。

> # 僕はCについては初心者なので、、、

入門書としてK&Rを選んだのは正解でしょうね。
(でも現在の標準規格については書いてないので...でもまあ些細な差ですが)
>>625
K&RはISO/IEC 9899:1990についての解説。これは古い規格で、ISO/IEC 9899:1999
によって置き換えられています。
629デフォルトの名無しさん:01/12/01 08:45
ところで-C99(もしくは同等の)オプションが通るコンパイラって
一般的なのかな?
630デフォルトの名無しさん:01/12/01 08:48
少ない言葉で曖昧に説明して、独自の解釈や妙な前提条件を強要するアフォは
相手にしないほうがいいと思うよ>625
631Kusakabe Youichi:01/12/01 08:48
>>628 デフォルトの名無しさん wrote:
> >>625
> K&RはISO/IEC 9899:1990についての解説。これは古い規格で、

こっちは俗にC89と呼ばれるやつ。
その昔「ANSI対応」とか言われていたのはこれですね。

> ISO/IEC 9899:1999によって置き換えられています。

こっちが俗にC99と呼ばれるやつです。
ですのでISOやANSIにも複数の規格が(時間軸上は)存在したわけで、
いまどきの本で「ANSI対応」とか書いてあるやつはちょっと内容が古いかも。
632デフォルトの名無しさん:01/12/01 08:49
クサカベって誰?
633Kusakabe Youichi:01/12/01 08:51
>>629 デフォルトの名無しさん wrote:
> ところで-C99(もしくは同等の)オプションが通るコンパイラって一般的なのか
な?

3年前までは一般的ではなかったですね(あたりまえ)。

これからは一般的ですね。
クサカベは放置の方向でお願いします。
635Kusakabe Youichi:01/12/01 08:53
>>630 デフォルトの名無しさん wrote:

> 少ない言葉で曖昧に説明して、独自の解釈や妙な前提条件を強要するアフォ

ということにしたいみたいですが、
実際には一番適切に(多すぎず少なすぎず)、もっとも正しい教え方をしていますね
636C勉強中 ◆RubyOmS2 :01/12/01 08:56
>>627
そうなんですか、、、
Cってたくさん規格があるみたいで面倒ですね、、、
で、現在の標準規格というのは、何て言うのですか?
それは、gcc2.95.3(cygwin)でも使えるのですか?
>>619と同じコンパイラを僕も使ってます、、、
>>632
二度は書かないよ(荒れるから)

“作ってわかるCプログラミング”でCを勉強 part4
http://pc.2ch.net/test/read.cgi/prog/1007148964/

ここで暴れてる人。
638Kusakabe Youichi:01/12/01 08:59
>>636 C勉強中◆RubyOmS2 wrote:

> >>627
> そうなんですか、、、
> Cってたくさん規格があるみたいで面倒ですね、、、

たくさんはないですよ(ほかの言語よりは)

C99、C89とそれ以前のtraditionaなものの3種類だと思えばよいでしょう。

> で、現在の標準規格というのは、何て言うのですか?

俗に「C99」といわれています。
639デフォルトの名無しさん:01/12/01 09:00
>>636
使えないYO!

とりあえず、「標準」が本当の標準になるまでは
てきとうに教科書にしたがってコーディングしとこうZE!
640C勉強中 ◆RubyOmS2 :01/12/01 09:00
ありゃ、、ログが流れるのが早い、、、
>>628さん、ありがと〜〜〜
でも、-C99オプションって、、gcc2.95.3では通らないの?
641Kusakabe Youichi:01/12/01 09:01
>>637 デフォルトの名無しさん wrote:

> >>632
> 二度は書かないよ(荒れるから)

荒らすのかー
642C勉強中 ◆RubyOmS2 :01/12/01 09:02
>>639
うぃっす、、、
がんばるっす!
643Kusakabe Youichi:01/12/01 09:06
>>639 デフォルトの名無しさん wrote:
> とりあえず、「標準」が本当の標準になるまでは

もうなっていますよ。
古い標準の範囲内で書くかどうかは、
そのソースを古いコンパイラーで処理する可能性がある場合に
気をつかうべきでしょうね。
644Kusakabe Youichi:01/12/01 09:06
>>640 C勉強中◆RubyOmS2 wrote:
> ありゃ、、ログが流れるのが早い、、、
> >>628さん、ありがと〜〜〜
> でも、-C99オプションって、、gcc2.95.3では通らないの?

新しいのにすればいいのに。
>>633
> 3年前までは一般的ではなかったですね(あたりまえ)。
ISO/IEC 9899:1999が発行されたのはちょうど2年前の今日です。
3年前どころか、2年前ですら準拠した処理系はなかったはずです。

>>640
gcc 2.95.3だと、対応しようとしたらしい-std=iso9899:199xという
オプションがありますが、そのコードは通らないみたいです。
gcc 3.0以降にするしかないみたい。
646デフォルトの名無しさん:01/12/01 09:08
>>643
とりあえず手持ち全部のコンパイラでコンパイルできないんだもん
そのソースを古いコンパイラーで処理する可能性が100%だし
しょうがねいね
>>643
なってないよ。JIS X 3010:1993はまだ改訂されてない。
VisualCとViaualBasicをやるならどっちがいい?
と友人に聞かれた。
俺は自分に合ったほうにすればと一応答えておいたが
本当はどちらのほうがいいんだろう…
やる用途にもよるだろうが友人は色々やってみたいと言っていたので
やはりどちらかと言えばVisualCの方だろうか…
むむむ
とすると、標準 の基準ってなんだ?
650Kusakabe Youichi:01/12/01 09:13
In article <[email protected]>, 645 デフォルトの名無しさ
ん <[email protected]> wrote:

> >>633
> > 3年前までは一般的ではなかったですね(あたりまえ)。
> ISO/IEC 9899:1999が発行されたのはちょうど2年前の今日です。
> 3年前どころか、2年前ですら準拠した処理系はなかったはずです。

だから「あたりまえ」と書いてあるわけです。

> gcc 3.0以降にするしかないみたい。

gccの場合はそうですね。
651Kusakabe Youichi:01/12/01 09:15
>>647 デフォルトの名無しさん wrote:
> >>643
> なってないよ。JIS X 3010:1993はまだ改訂されてない。

JISは問題外ですね。
一夜にして 100 レス以上・・・珍しいこともあるもんだ。
デファクトスタンダード=標準 って考えちゃだめ?
655Kusakabe Youichi:01/12/01 09:18
>>648 デフォルトの名無しさん wrote:
> VisualCとViaualBasicをやるならどっちがいい?

どちらもやらない。
>>655
そりゃあんまりだ。
657Kusakabe Youichi:01/12/01 09:19
>>649 デフォルトの名無しさん wrote:
> むむむ
> とすると、標準 の基準ってなんだ?

標準に「基準」なんてないでしょう。

そもそもCに関して「ANSI対応!」とか「ISO標準準拠!」とかかかれた
本はあっても「JIS準拠のC!」とか書かれたやつは見たことないですね:)
マジで放置の方向でお願いします。相手にしてはいけません。
すくなくとも今流通してるコンパイラで
新しい標準でコンパイルできないは
けっこう多いので、古い基準で作った方が
幸せになれる、と
相手にしてはいけません。レス付け厳禁。
「あれ?」と思っても、それは罠なので無視しましょう。
変数を宣言するたびにスタックを確保するとか変なことを言ったので
猛烈にKusakabeさんが活躍したんですか?
じゃあひとりごと。ひとりごとなので意見無用。
条約が批准され、国会で承認されないかぎり国内において効力を持たないのと同様、
国際規格は国家規格として制定されてはじめて国内で効力を得るのになあ。
663Kusakabe Youichi:01/12/01 09:27
>>654 デフォルトの名無しさん wrote:
> デファクトスタンダード=標準 って考えちゃだめ?

それがC99でしょ。いまは。
放置の方向でお願いします。レス厳禁です。荒れないためにも。
665仕様書無しさん:01/12/01 09:30
voidにレスする,無視できない人間は、ム板の住人として
失格である。よってお前は去れ!
>>657
>「JIS準拠のC!」とか書かれたやつは見たことない

ほとんどのC処理系は海外製だから。
放置の方向でお願いします。レスしないでください。
>>665
そういうお前はマ板の住人じゃないか。
>>668
今,マ板でやりあってるから、名前がそうなった。
voidにレスしたければ,ここへこい。
http://pc.2ch.net/test/read.cgi/prog/1007148964/
現在,討論中。
670Kusakabe Youichi:01/12/01 09:35
In article <[email protected]>, 656 デフォルトの名無しさ
ん <[email protected]> wrote:

> >>655
> そりゃあんまりだ。

いや、そんな悩みかたをする人はぜったいどっちもやらないほうが正解です。
671Kusakabe Youichi:01/12/01 09:36
>>659 デフォルトの名無しさん wrote:
> すくなくとも今流通してるコンパイラで
> 新しい標準でコンパイルできないは
> けっこう多いので、古い基準で作った方が
> 幸せになれる、

それはそこローカルな特殊な事情であって、「標準かどうか」の話題とは
無関係ですね。

単に「おれは古いのを使ってるぞ」っていうだけのことじゃん。
672Kusakabe Youichi:01/12/01 09:37
>>661 デフォルトの名無しさん wrote:

> 変数を宣言するたびにスタックを確保するとか変なことを言ったので

そういう変なことを言ってたひとがそういえばいましたね。

> 猛烈にKusakabeさんが活躍したんですか?

私が書いたのはそれより前からです。
673Kusakabe Youichi:01/12/01 09:37
>>662 デフォルトの名無しさん wrote:
> じゃあひとりごと。ひとりごとなので意見無用。
> 条約が批准され、国会で承認されないかぎり国内において効力を持たないのと同
様、
> 国際規格は国家規格として制定されてはじめて国内で効力を得るのになあ。

で、「国内」がどこかが問題ですね。

# こういうひとはきっと世の中にタイムゾーンも1つしかないと思っているに
# ちがいない:)
放置の方向でお願いします。

***決してレスしてはいけません***
675Kusakabe Youichi:01/12/01 09:42
>> 666 デフォルトの名無しさん wrote:
> >>657
> >「JIS準拠のC!」とか書かれたやつは見たことない
>
> ほとんどのC処理系は海外製だから。

っていうか、日本の本とかの話ですが。
放置の方向でお願いします。相手にしてはいけません。発言は無視してください。
まあ、Linux界もほぼ全部ローカルな特殊事情だあね。
cygwinもそうだね。
UNIXっぽい世界はほとんど特殊なローカル事情だあね。
678デフォルトの名無しさん:01/12/01 10:10
すみません、最近Cをはじめた者ですが
ディメンジョンを
例えばa[10][10][10][10][10][10]やa[10000][10][10]
としたいのですが、コンパイルは通るんのですが、
走らせるとセグメンテーションエラーとなります。
ディメンジョンを小さくすると
走るのでこれが原因だと思うのですが、
ディメンジョンを多くするにはどうしたら良いですか?
gccのバージョンは2.95.2です。
>>678
charだとしても、10の6乗だと、えーと、すげー大きいので
スタックに入らないとかなんとかじゃねーの?
よくわかんねーけど
そういうときは何かおまじないがあったと思うけど
面倒だからスタティックなところに確保しちゃえば?
それかmallocで確保しちゃうとか
680Kusakabe Youichi:01/12/01 10:27
>>678
In article <[email protected]>, 678 デフォルトの名無しさ
ん <[email protected]> wrote:

> すみません、最近Cをはじめた者ですが
> ディメンジョンを
> 例えばa[10][10][10][10][10][10]やa[10000][10][10]
> としたいのですが、

すればいいじゃん、4個でも5個でも通ります。50個は無理でしょうけど。

> 走らせるとセグメンテーションエラーとなります。
> ディメンジョンを小さくすると
> 走るのでこれが原因だと思うのですが、

じゃあそうなのでしょう。

> ディメンジョンを多くするにはどうしたら良いですか?
> gccのバージョンは2.95.2です。

そもそもそんなに確保しなきゃいいだけでは?
681デフォルトの名無しさん:01/12/01 10:50
fopenしたらfcloseは絶対にしないといけないのですか?
>>681
ほっといてもプログラムが終了したら閉じてくれると思う
でもなるべくなら開けたら閉じよう。
このへん、マッピーのドアと一緒だね
>>681
っつーか、それfjねたじゃん。
malloc()、free() みたいな。
684Kusakabe Youichi:01/12/01 11:14
>>681 デフォルトの名無しさん wrote:
> fopenしたらfcloseは絶対にしないといけないのですか?

fcloseするか終了するまでは開いたままになりますが、
それでかまわなければ。
>>678
その配列は、サイズが最低でも 1000000 バイトもあって、
スタックが足りません。
グローバル変数にするか、static 変数にするか、
malloc で確保するか、スタックサイズを大きくするか、
しましょう。
>>681
さては、開けたドアを閉めないタイプの人間だな?
687デフォルトの名無しさん:01/12/01 11:24
>>686
自動ドアだから気にしたことないもんで…
OSのファイルハンドルに直結していると
OS側の上限個数にひっかかるだろうねえ
>>678
679 さんの言う「おまじない」は,多分 679 さん自身がズバリ言ってる
「スタティックに確保」じゃないかなーと思いました
  static Type a[10000][10][10];
ただし調子に乗って要素数を増やしていくと
  static Type a[10000][10000][10000];
コンパイルエラー「配列が大きすぎます」が出てきました(VC++5.0)
10000x10000x10000 が整数型か何かで表せないからかなあ? よく知らないけど・・・

個人的には malloc でメモリを割り当ててくれるとなんか安心します
int i, j;
Type ***a;
a = (Type ***)malloc(10000 * sizeof(Type **));
for(i=0; i<10000; ++i){
  a[i] = (Type **)malloc(10 * sizeof(Type *));
  for(j=0; j<10; ++j){
    a[i][j] = (Type *)malloc(10 * sizeof(Type));
  }
}

コレはコレで問題がないワケじゃないんだけど,
それはまた別のお話・・・
690Kusakabe Youichi:01/12/01 11:31
>>687 デフォルトの名無しさんwrote:
> >>686
> 自動ドアだから気にしたことないもんで…

っていうか、ふつうの自動ドアは「開け閉め」が自動なので、
stdinみたいなもので、「開ける」ことはしないでしょうね手動で。

だからよくある「半自動」ドア(閉まるのだけ自動)みたいなのを
例に出したほうがいいのでは?
>>689
あーあー
開放わすれてるー
692689:01/12/01 11:37
>>691
ぎゃふん (;´Д`) そこまで示さないとダメですか

for(i=0; i<1000; ++i){
  for(j=0; j<10; ++j){
    free(a[i][j]);
  }
  free(a[i]);
}
free(a);
>>688
OSの制限以前にfopenで、開けるファイル数は制限されてる。
てか、今回の話題とは関係薄い。
しなかったときの弊害、という点では関係があると思うけど。
695デフォルトの名無しさん:01/12/01 11:41
CのプログラムをC++のコンパイラでコンパイルするのは
いけないことなのでしょうか?
696Kusakabe Youichi:01/12/01 11:41
>>692 689 wrote:
> >>691
> ぎゃふん (;´Д`) そこまで示さないとダメですか
>
> for(i=0; i<1000; ++i){
> for(j=0; j<10; ++j){
> free(a[i][j]);
> }
> free(a[i]);
> }
> free(a);

で、それがプログラムの終了時だったりすると「アホだ」といわれたりする
わけです:)
>>693
それってOSの制限なのでは?
698Kusakabe Youichi:01/12/01 11:43
>>694
694 デフォルトの名無しさん wrote:
> しなかったときの弊害、という点では関係があると思うけど。

ないですね。

fcloseすればかならず上限を超えないという保証があるわけじゃあないんだから。
放置の方向でお願いします。
***レス付け厳禁です***
荒れないために、ご協力ください。
700Kusakabe Youichi:01/12/01 11:44
>>695 デフォルトの名無しさん wrote:
> CのプログラムをC++のコンパイラでコンパイルするのは
> いけないことなのでしょうか?

お好きなように。(コンパイルできるコードなら(上位コンパチじゃあないからね))
>>689
>a[10000][10000][10000];

10000×10000×10000 = 1000000000000 = 1テラ (1000ギガ)
それわ無理です。。。
702Kusakabe Youichi:01/12/01 11:46
>>697 デフォルトの名無しさん wrote:
> >>693
> それってOSの制限なのでは?

OSの制限以前にプロセスごとの制限が小さいのでは?
>>702
小さい って言い切る根拠は?
>>697
fopenの制限はOSの制限よりかなりきつめ。(の処理系が多い)
放置の方向でお願いします。>>703
***レス付け厳禁です***
荒れないために、ご協力ください。
OSのファイルハンドルそのものと直結しない実装もありそうなもんだが・・・
707692:01/12/01 11:50
>>696
それもいいけど,アソコにも突っ込んで欲しかった・・・
誤:for(i=0; i<1000; ++i){
正:for(i=0; i<10000; ++i){

ところで free on exit ネタにも触れたいんだけど
Kusakabe さんとしては
「終了時には free すんな!(`Д´)!」派?
「終了時には free してもしなくてもいいよ(´_`)」派?
「終了時でも free しろ!(`Д´)!」派?
708689:01/12/01 11:52
>>701
今気づいたです (;゚∀゚)> あと,笑ったです
あ、ニセモノ探知機なのか
710Kusakabe Youichi:01/12/01 11:53
>>703 デフォルトの名無しさん <[email protected]> wrote:
> >>702
> 小さい って言い切る根拠は?

「のでは?」を「言い切る」だとぼけたことを言う頭の程度は? :)
放置の方向でお願いします。***レス付け厳禁です***荒れないために、ご協力ください。
712Kusakabe Youichi:01/12/01 11:54
>>707 692 wrote:
> ところで free on exit ネタにも触れたいんだけど

これはよそでやったほうが楽しめるのでは?

> Kusakabe さんとしては
> 「終了時には free すんな!(`Д´)!」派?
> 「終了時には free してもしなくてもいいよ(´_`)」派?
> 「終了時でも free しろ!(`Д´)!」派?

わたしのfj.comp.lang.cに以前書いた記事をみればわかりますね:)
放置の方向でお願いします。
>>711 >>713
誰もアンタにレス付けたりしないよ。放置しといてやるから安心しな。
715707:01/12/01 11:58
んー・・・んじゃ,fj 再読します・・・
# だって fj の記事って皮肉交じりで読みにくいんだもん
ロケールについての質問はここでいいですか?
717デフォルトの名無しさん:01/12/01 12:01
傲慢だなKusakabeは。
718Kusakabe Youichi:01/12/01 12:01
>>715 707 <[email protected]> wrote:
> んー・・・んじゃ,fj 再読します・・・

あ、もしくは、fjだけじゃなくて本もいっしょに読むと、
「実はどう主張しているのか」わかるかも:)

> # だって fj の記事って皮肉交じりで読みにくいんだもん

気のせいでは? 気にしすぎというか。
719Kusakabe Youichi:01/12/01 12:06
>>717 デフォルトの名無しさん wrote:
> 傲慢だなKusakabeは

ということにしたいのですか?

# でもどこも傲慢ではないですね。
放置の方向でお願いします。
傲慢だね。
722715:01/12/01 12:26
すいません
こ,これだけ,これだけ教えてくれればすぐに逝きますんで

 fj の記事のバックナンバーどこぉ?

>>718
> > # だって fj の記事って皮肉交じりで読みにくいんだもん
> 気のせいでは? 気にしすぎというか。

そですかー
ニューズグループのこと,まだあんまし慣れてないや・・・
>>722
>fj の記事のバックナンバーどこぉ?

検索してください。

http://groups.google.co.jp/groups?hl=ja&group=fj.comp.lang.c
http://queen.heart.ne.jp/
724722:01/12/01 12:41
>>723
クスコ
言い訳:www.google.co.jp で検索しても出てこなかったんだー(T_T)
725Kusakabe Youichi:01/12/01 13:13
>>722 715 wrote:
> すいません
> こ,これだけ,これだけ教えてくれればすぐに逝きますんで
>
>  fj の記事のバックナンバーどこぉ?

当該グループでそのように、大きめのフォントで叫べば、
親切な人がその話題をまとめたファイルを送ってくれる可能性は大きいです。
(そんなときのための全国40万人のfj読者がある)

もちろんその前にあちこちのアーカイヴを探して見つからないという
前提が必要ですが。

> > > # だって fj の記事って皮肉交じりで読みにくいんだもん
> > 気のせいでは? 気にしすぎというか。
>
> そですかー
> ニューズグループのこと,まだあんまし慣れてないや・・・

ニュースグループじゃないでしょ。

たとえばTVやTVの番組はいくつものチャネルにわかれていますが、
「TVに出演する」のかわりに「ちゃねるに出演する」とか、
「TVに慣れていなくて」のかわりに「ちゃねるになれていなくて」って言いますか
?
下手な例え話は、本質を霞ませるだけなので嫌い。
こんなに書き込みがあるーっ!! (^o^)
放置の方向でお願いします。
729デフォルトの名無しさん:01/12/01 14:25
># でもどこも傲慢ではないですね。

へみねこかぁ。別に傲慢ではないな。

あたりまえのことをあたりまえに言ったら傲慢あつかいされるという妙な現世ならば、
存在するけど。

あともう1つ。
へみねこを、「状態をもつ」という意味での人間あつかいをする必要は、ないだろう。

現世が上記のように妙なことになってる理由は、(多くの)人が自分の「状態」を
持ちたがる(自分の考えかたとか好みとかを曲げたくない)という意味で
「状態」を持っていて、そのことを正当化したいから、だ。
だからこそみんなが言うんだ。「俺を思いやってくれ」と。

それに半旗(ナイス誤字)を飜してる(本人狙ってるのかどうか知らぬが)のが奴なんだから、
そのへみねこの「状態」にこっちが気を配る必要は、ない。
こっちが奴に何を言ったからといって、奴の「状態」、たとえば
怒ったとか笑ったとか悲しんだとか、がどうなっちゃうか?を気にする必要は、ない。

そう捉えれば、あれくらい「つきあいに手のかからない」人間(たぶん人間なんだよねえ)は
めずらしいくらいであり、かえって重宝する、と思われ。
730引用ウザ:01/12/01 14:39
731Kusakabe Youichi:01/12/01 14:39
>>729 デフォルトの名無しさん wrote:
> へみねこかぁ。別に傲慢ではないな。

ですね。
放置の方向でお願いします。
ほうちほうち言ってる方へ。
日下部さんにかまわないで、放置してください。
734Kusakabe Youichi:01/12/01 14:55
>>733 デフォルトの名無しさん wrote:
> ほうちほうち言ってる方へ。

新聞の勧誘なのかも。
735デフォルトの名無しさん:01/12/01 15:01
>>733

放置って言っている奴はうざいから放置しよう。
わけわからんが、荒れてるのは確かだな。
そのきっかけが誰かも確かだな。逝ってよし。
738Kusakabe Youichi:01/12/01 15:36
お願いですから、思いやってください。
739デフォルトの名無しさん:01/12/01 17:01
でもよー、K&R読めとかあれはわかりやすいとか知ったかコイてるヤツは、
「実はガッコで懇切丁寧に教えられたクチ」なんだよ。K&Rで真に理解したんじゃないのよ。
K&Rは難解だとの評価は大多数から既に出ている。
人の理解度なんかはそれぞれだから、K&Rが難しく感じても気にすることではないし
わかったからって偉いものでもない。

そういう俺はK&Rをバイブルとして崇め奉ってるけど(w
「自分がわかりやすいと思うものでやれ しかし向上心は何であれ忘れるな」
つうこったわ(ワラ
voidにレスするから、こんなことになる。
煽りたいやつは勝手に煽れ。俺はもうこのスレ放置する。
voidじゃねえだろ、あれ。
つまらん
>>681
いいえ。規格上、main 終了後に正しく後始末されることが保証されています。

>>740
俺も、このスレは今後放置する。今まで何度か回答側に回ってたけど、ね。

俺程度の人間が一人抜けたところで大した影響はないけど、スレを荒らすと
回答側に回ってる人間に見放される可能性があるから、注意しろよ。>質問
してる人
構造体と共用体ってなんでしょうか?
あと、プログラムを作る際の手法として流れ図と状態遷移図以外に何かあるんでしょうか?
744デフォルトの名無しさん:01/12/01 18:45
>743
同じフィールドに複数の名前を割り当てるのが共用体。
別の名前は別のフィールドに割り当てるのが構造体。
745デフォルトの名無しさん:01/12/01 18:48
>>744
厨房ですいません。フィールドって何でしょうか?
それと構造体をもう少し詳しく教えてもらえないでしょうか?

みなさんに聞きたいんですが、プログラムを作る際の手法として流れ図と状態遷移図以外に何かあるんでしょうか?
>>745

同じ記憶領域に複数の名前をつけるの。
同じデータを共用するから共用体と。
747デフォルトの名無しさん:01/12/01 18:59
>>747
なるほど〜 ありがとうございました。
C言語でポインタの所では結構詰まる人が多いようですが何ででしょうね?

質問ばかりで申し訳ないんですが、コマンドラインパラメータとオプションフラグって何でしょうか?
>>747

コマンドラインパラメータはmain関数の第二引数(第一引数はそれの個数)かな?
749デフォルトの名無しさん:01/12/01 19:05
プログラムを作る際の手法として流れ図と状態遷移図以外に何かあるんでしょうか?
750Kusakabe Youichi:01/12/01 19:14
>>738
In article <[email protected]>, 738 Kusakabe Youichi
<[email protected]> wrote:

> お願いですから、思いやってください。

意味不明ですね。
751デフォルトの名無しさん:01/12/01 19:14
>749
HIPO,PADとか(w

っていうか宿題くさいんだが気のせいか?
752Kusakabe Youichi:01/12/01 19:15
>>739 デフォルトの名無しさん wrote:`
> でもよー、K&R読めとかあれはわかりやすいとか知ったかコイてるヤツは、
> 「実はガッコで懇切丁寧に教えられたクチ」なんだよ。

そう思い込みたいんでしょうね:)

> K&Rで真に理解したんじゃないのよ。
> K&Rは難解だとの評価は大多数から既に出ている。

あれを難解だと思うようでは「なんちゃって」系なんでしょうね:)
753デフォルトの名無しさん:01/12/01 19:16
>プログラムを作る際の手法として流れ図と状態遷移図以外に何かあるんでしょうか
「プログラムを作る際の手法」としての「流れ図」とかって言葉としてどうなん?
意味はわかるけど微妙にひっかかる。
754Kusakabe Youichi:01/12/01 19:16
>>743 デフォルトの名無しさん wrote:
> 構造体と共用体ってなんでしょうか?

本に説明が書いてありますよ。
755デフォルトの名無しさん:01/12/01 19:22
あぁ、相変わらずstaticの使い勝手がわからんのだが、ぁ、
大きい領域をあるスコープ内で宣言すると、ときたま
文字列が壊されちゃう可能性があるから、その文字列の
安全を保証するためにstatic宣言を行うんですか?
長くなくても、ある瞬間だけ使う変数じゃなくて、
数プロセスを経ても内容を安全に確保したいときは
staticを使うんですか?
756デフォルトの名無しさん:01/12/01 19:25
>>753
なんて言ったらいんでしょう・・・
プログラムを記述する際に、流れ図や状態遷移図なんかを書いてからプログラム作りませんかね?
プログラムを作る前に使う道具として流れ図や状態遷移図以外にないですかねって事なんですけど・・・
これじゃさっきと同じですかね・・・?
>>755
金をケチらないで、入門書買え。
>>756
書く人もいるし書かない人もいると思います。
759Kusakabe Youichi:01/12/01 19:37
>>747 デフォルトの名無しさん wrote:
> >>747
> なるほど〜 ありがとうございました。
> C言語でポインタの所では結構詰まる人が多いようですが何ででしょうね?

難しいとおもいこまされているからでは? > つまる

実際どうってことないです。

> 質問ばかりで申し訳ないんですが、
> コマンドラインパラメータとオプションフラグって何でしょうか?

41ペイジと102ペイジを読みましょう。
書く場合で考えたいんですが、作る前の道具として『流れ図』や『状態遷移図』以外に何かないですかねって事です。
なにかないですかね?
761Kusakabe Youichi:01/12/01 19:39
>>749 デフォルトの名無しさん wrote:
> プログラムを作る際の手法として流れ図と状態遷移図以外に何かあるんでしょう
か?

べつにそれは「手法」ではないですね。

「プログラム作成の一般的な手順」については182ペイジに書いてあります。
>>761
182ペイジって何の本の話?
763Kusakabe Youichi:01/12/01 19:41
>>755 デフォルトの名無しさん wrote:
> あぁ、相変わらずstaticの使い勝手がわからんのだが、ぁ、
> 大きい領域をあるスコープ内で宣言すると、ときたま
> 文字列が壊されちゃう可能性があるから、その文字列の
> 安全を保証するためにstatic宣言を行うんですか?

いいえちがいます。

> 長くなくても、ある瞬間だけ使う変数じゃなくて、
> 数プロセスを経ても内容を安全に確保したいときは
> staticを使うんですか?

まず、関数の定義内に書いてあるstaticと、外に書いてあるstaticでは
意味が違います。
あとは178ペイジと254ペイジを読んでください。
764デフォルトの名無しさん:01/12/01 19:42
>>756
使っているかどうかはともかく、プログラムの設計のためのダイアグラム
なら、DFDとかUMLとかいっぱいあるよ。

俺はJavaやC++では、UMLのクラス図ないときついな。
765デフォルトの名無しさん:01/12/01 19:42
>>760
それはそういった設計手法を新たに会得したいという
ことなのか?
流れ図や状態遷移図が肌に合わないとかで。
それだったらどれぐらいの規模のプログラムを組むとか
書いてくれなきゃなんともいいようがないよ。
短いプログラムで再利用もしないのならそんなの要らないし。
>>761
あの・・・ 何の本のことでしょうか・・・
できればタイトルを教えていただきたいです。

>>764
そういうのがあるんですか。初めて知りました。

>>765
いえ、別に会得したいとかじゃなくて、ただ単に気になったので・・・
>>766
K&R
関数スコープで宣言したローカル変数は関数を抜けると領域開放されてしまう。
次回その関数が呼ばれたときのために、前回の内容を残しておきたい場合に
はstatic宣言する。そうすれば変数領域は開放されない。
769Kusakabe Youichi:01/12/01 19:54
>>760 デフォルトの名無しさん wrote:
> 書く場合で考えたいんですが、作る前の道具として『流れ図』や『状態遷移図』
以外に何かないですかねって事です。
> なにかないですかね?

そもそもなんで「書く」が前提になるわけ?
どれがいいかわからないぐらいの知識なのに。
>>767
あの・・・ どちらの版でしょうか・・・
771@@:01/12/01 19:58
http://freepage.gaiax.com/home/higashide/main このサイトつぶしてください
>>769
書くにこだわらなくてもいいんです。
ただどんなものがあるのかを知りたくて・・・
>>771
ムリ。
>>772
意味不明、やっぱり宿題か?
775デフォルトの名無しさん:01/12/01 20:05
>>772
書かないなら「手法」はいらないじゃん?
776Kusakabe Youichi:01/12/01 20:07
>>766 デフォルトの名無しさん wrote:
> >>761
> あの(Iゥァ_燭遼椶里海箸任靴腓Δォ(Iゥ・
> できればタイトルを教えていただきたいです。

文字化けしないようにもう1回書いてみてください。
Kusakabeに質問すると効率悪いので無視の方向で。
779デフォルトの名無しさん:01/12/01 20:13
>>752 デフォルトの名無しさん wrote:`
>> でもよー、K&R読めとかあれはわかりやすいとか知ったかコイてるヤツは、
>> 「実はガッコで懇切丁寧に教えられたクチ」なんだよ。

>そう思い込みたいんでしょうね:)
そう思い込みたいんでしょうね:)

>> K&Rで真に理解したんじゃないのよ。
>> K&Rは難解だとの評価は大多数から既に出ている。

>あれを難解だと思うようでは「なんちゃって」系なんでしょうね:)
人それぞれを理解できないようではプログラム以前の問題ですね:)
放置の方向でお願いします。荒れないように。
***レス付け厳禁です***
781Kusakabe Youichi:01/12/01 20:18
>>772 デフォルトの名無しさん wrote:
> >>769
> 書くにこだわらなくてもいいんです。
> ただどんなものがあるのかを知りたくてゥ・

知る必要はないです。
782Kusakabe Youichi:01/12/01 20:27
>>779 デフォルトの名無しさん wrote:
> > > でもよー、K&R読めとかあれはわかりやすいとか知ったかコイてるヤツは、
> > > 「実はガッコで懇切丁寧に教えられたクチ」なんだよ。
>
> > そう思い込みたいんでしょうね:)
> そう思い込みたい

なるほど、やはりそうでしたか。

> > > K&Rで真に理解したんじゃないのよ。
> > > K&Rは難解だとの評価は大多数から既に出ている。
> >あれを難解だと思うようでは「なんちゃって」系なんでしょうね:)
>
> 人それぞれを理解できないようではプログラム以前の問題ですね

本気で「ひとそれぞれ」だと思っているんだったら、
「K&Rは難解だとの評価は大多数から既に出ている」とかいう理屈は
使えないわけですよね:)
つまり「ひとそれぞれ」という言葉を使ってごまかそうとしているだけな
わけですね。
783デフォルトの名無しさん:01/12/01 20:42
>>779 デフォルトの名無しさん wrote:
> > > でもよー、K&R読めとかあれはわかりやすいとか知ったかコイてるヤツは、
> > > 「実はガッコで懇切丁寧に教えられたクチ」なんだよ。
>
> > そう思い込みたいんでしょうね:)
> > そう思い込みたいんでしょうね:)
>私はそう思い込みたい。

なるほど、やはりそうでしたか。

> > > K&Rで真に理解したんじゃないのよ。
> > > K&Rは難解だとの評価は大多数から既に出ている。
> >あれを難解だと思うようでは「なんちゃって」系なんでしょうね:)
>
> 人それぞれを理解できないようではプログラム以前の問題ですね

大多数が認めているから
「K&Rは難解だとの評価は大多数から既に出ている」とかいう理屈は
使えるわけですよね:)
つまり「そう思い込みたい」という言葉を使ってごまかそうとしているだけな
わけですね。
おんなじ内容がダブってるね。
nntpの中継システムがバグってるのかな?
785デフォルトの名無しさん:01/12/01 20:46
適当にまんまコピーをしているので。
本人たちにはわからないの?
ハタから見てると間抜けでしかない。
ん〜、適当なものに
臭かべちゃんが狼狽しているとしか・・・(笑
>>768
わかりやすくてサイコーでした。
そっかー、そーすっと、少し応用的に考えると、
コールバック内でHWND hChildとかをstaticにしないと
ページ違反とかがおきるのは、存在してるhChildが
関数を抜けるときいたづらされちゃうからとかそーいうのも
あるのKANA
>>788
スレ違いだがそれはまったく別の理由だと思う
>>788

便利な使い方を聞いていたんじゃなくて、意味を聞いていたのか。。。
あるのKANAって書いて正解でした。
断定しないでよかったです。
前にAPI初心者のときstaticにしたかどうか忘れたけど
switch(msg)の前にi++とかやってカウンタできるかな
とか思って失敗してそれきりだった覚えがあるんですけど、
void func(){
static i=0;
i++
.....
}
とかやればiはカウンタになるのかが疑問だ!
C実践プログラミング VS プログラミング言語C

どっちの本がいいか?
793デフォルトの名無しさん:01/12/01 21:08
>>789
別の理由かな?
HWNDをローカル変数に格納してるから、コールバックされたとき参照できな
くなって、スタックのゴミ値でWindowクラスにアクセスしようとしてるんじ
ゃないの?
staticにすれば解決するよ、多分。
つきなみですがint
つきです
795デフォルトの名無しさん:01/12/01 21:09
>>791
なるよ。
おっしゃー!
ナイスゲッチュー
ありがとうでゴザイ!(ました)
797Kusakabe Youichi:01/12/01 21:13
>>792 デフォルトの名無しさん wrote:
> C実践プログラミング VS プログラミング言語C
>
> どっちの本がいいか?

「迷ったら両方買う」が秋葉原の原則1の2
798それはいい:01/12/01 21:18
両方参照すべし。
>>792
やっぱK&RがCのバイブルなのでは・・・?
>>788
テンションは妙だが、それであっている。
801デフォルトの名無しさん:01/12/01 22:02
>>779 デフォルトの名無しさん wrote:
> > > でもよー、K&R読めとかあれはわかりやすいとか知ったかコイてるヤツは、
> > > 「実はガッコで懇切丁寧に教えられたクチ」なんだよ。
>
> > そう思い込みたいんでしょうね:)
> > そう思い込みたいんでしょうね:)
>いや、そもそもK&Rとは、Kusakabe & Real 厨房なので、
>そんなものをバイブルにするなどもってのほか:)

なるほど、やはりそうでしたか。

> > > K&Rで真に理解したんじゃないのよ。
> > > K&Rは難解だとの評価は大多数から既に出ている。
> >あれを難解だと思うようでは「なんちゃって」系なんでしょうね:)
>
> 人それぞれを理解できないようではプログラム以前の問題ですね

この"K&R"は読むに及ばないものですね:)
いやさ、何かいいものがあるはずさ。キラリと光る禿げの一つもあろうというものさ。
:)
>>801
面白くないからもうヤメレ。
803Kusakabe Youichi:01/12/01 22:07
>>801
In article <[email protected]>, 801 デフォルトの名無しさ
ん <[email protected]> wrote:
> > > > K&Rで真に理解したんじゃないのよ。
> > > > K&Rは難解だとの評価は大多数から既に出ている。
> > >あれを難解だと思うようでは「なんちゃって」系なんでしょうね:)
> >
> > 人それぞれを理解できないようではプログラム以前の問題ですね
>
> この"K&R"は読むに及ばないものですね:)

っていうか「自分が理解できないぼけ」だったことを正当化したいといって
K&Rを不当におとしめるのは問題ありますね:)
804デフォルトの名無しさん:01/12/01 22:13
ANSI-C言語辞典(技術評論社)は辞典です。
大部分は標準ライブラリ関数についての説明です。
欲しい関数があったらここから探せます。
便利ですので一冊持っておきましょう。
>いや、そもそもK&Rとは、Kusakabe & Real 厨房なので、
>そんなものをバイブルにするなどもってのほか:)

>この"K&R"は読むに及ばないものですね:)



「このK&R」にしないと理解できないのかヨ!
806臭カベ勇み足:01/12/01 22:29
買う人が少ないので、単価が
伝わることを願うのですが、
3次配列をやりたいんです。
char *data1[]={"1","2","3"};
char *data2[]={"a","b","c"};
char *data3{}={"A","B","C"};
....
だったらいっそのことdata[1][][],data[2][][]...
としたいのが人情というものです。
僕は
char *data[][]=(***dataとか**data[])
{
{"1","2","3"},{"a","b","c"},{"A","B","C"}
}
とかしか思いつかないんですけど、これでいいんですか?
あぁ、
>>807
いいんじゃねーの?;
まぢですか?やってみりゃいいっつー話も
あるんすけどやってみるっす。
>>808
二次以上の場合、配列の上限値をすべて書かずに [][] だとまずいと思われ。
現実問題、そこまで複雑になったら構造体つかうべき。
812ミニラ:01/12/01 23:54
マクロの__func__が使えない場合、
代わりにデバッガ等でできますか?
環境はSun WorkShop 5or6です
使えたらデバッグ便利になるのになあ
単純配列にいちいち構造体割り当てるの?
「代わりにデバッガ等でできますか」って意味わかんない。
かなり限定された処理系のマクロじゃない?
816デフォルトの名無しさん:01/12/02 00:00
当方、C言語を始めて5日目。恥ずかしながら四則計算が関の山です。
助けてっください。

次の方程式の解を以下の4つの方法で求めるプログラムを作成し、小数点以下第4位まで正確に解を求めよ。
   
   x−cos(x)=0

1、2分法
2、割線法
3、ニュートン法
4、反復法
printf("%s\n",__STDC__);
printf("%s\n",__TIME__);
printf("%s\n",__DATE__);
printf("%s\n",__FILE__);
printf("%s\n",__LINE__);

だけかな標準__マクロ__は
818デフォルトの名無しさん:01/12/02 00:03
数学板逝ってください
検索エンジンで 2分法 割線法 ニュートン法 反復法 で検索して出てきたソース使え。

つーか、C言語初めて5日目でそんな課題出されたのか?
>>819
5日目にしちゃ簡単な問題だと思われ
821デフォルトの名無しさん:01/12/02 00:07
プログラムの問題というより補間法の知識の問題だからねえ。
822デフォルトの名無しさん:01/12/02 00:10
くさかヴェ先生2号がカタッてた洒落なのですが

「構造体を使ってプログラム構成をやり直すことを"構造改革"と呼びます」

こりゃ何点あげればよかと?
>>822
山田君、ざぶとん全部持ってきなさい

(ついでに sage なかった 822 のざぶとんも没収)
824816です:01/12/02 00:18
せめてヒントだけでも
825 :01/12/02 00:19
>>817

printf("%s\n",__LINE__);

文字列出力できたっけ?
826デフォルトの名無しさん:01/12/02 00:22
すいません %dですだ。
>>824
おいおい、たった20分弱でしびれを切らすなよ。
puts(__LINE__);
>>824
簡単なプログラムなんだな。
だが俺は補間法なんかとっくに忘れてしまっているから答えられないんだな。
2分法なんてバイナリサーチの実数版でしょ。
831:01/12/02 00:33
>>814
プログラム実行して、
使われる順番に関数名出力したいんでしょ

やりかたはわからんけどね
832デフォルトの名無しさん:01/12/02 00:33
じゃあ書いてやるからアルゴリズム書け!(一休)
K&Rの演習問題1-13をやっているのですが、(先には進んでますが、ここだけが引っ掛かってます)

格納された数をヒストグラム風に出力してみようと思い、

( 0, * *
  1, * * * * * *・・・・ というふうに)

色々試したのですが、どうも上手くいきません。
ndigit[c - '0']で数を格納したときに、ヒストグラム部でも" *"を足していけばいいのかなと思いましたが
上手いコードが書けず、
結局、ndigit[1]、ndigit[2]、・・・・とイチイチ一つづつ格納されている数を見させながら

n = 0;
while(ndigit[1] > n) {
    n++;
    printf(" *");
      if(n == ndigit[1])
printf("\n");
 }

こんな感じで
ヒストグラムを表示させる方法しかできませんでした。
理想的なコードはどのようなものなのでしょうか。
>>824
何がわからん?

>>833
終端は何?
とりあえずそのプログラム滅茶苦茶
835816です:01/12/02 00:48
ああ、無能な俺・・・
ヘルプ・・・
836833:01/12/02 00:51
や、でしょうなあ。

K&Rの27ページと28ページにまたがって載ってるプログラムに、
これをホイッとくっつけてみたのです。
>>835
とりあえず、どこがわからないのか書きなさいよ。
そうしたら手伝ったゲルよ
838833:01/12/02 00:58
これでも必死に考えてやってみたんですよ・・・
何かものすごく短くできる良い案が浮かびそうでカタチにならない、
そんな状況で、コレが出来てしまいました。
>>833
for(i=1;i<=MAX;i++){
printf("%d,",i);
for(j=ndigit[i];j--;)
printf("*");
printf("\n");
}
普通にこんな風で駄目?
<pre>
   for(i=0;i<100;i++){
n=rand()%10;
hist[n]++;
}
    for(k=0;k=10;k++){
printf("%d",k);
for(i=0;i<hist[k];i++){
printf("*");
}
printf("\n");
}
}
</pre>

恐ろしく適当に作って見ました。
841デフォルトの名無しさん:01/12/02 01:14
K&Rスタイル
K&R時代の(今となっては旧式の)書き方を言う。
(ANSIC言語辞典(技術評論社)より)
どうでもいいけど__func__はC99にあるよ。
まあ、C99は限られた環境かもしれないけど…
843833:01/12/02 01:17
試しています・・・・・・・・・・・・・・・・
844 デフォルトの名無しくん:01/12/02 01:19
C99ってコンパイルオプションとかで指定できるの?
>>844
とりあえずgcc3.0以上ならオッケーっぽいぞ
846833:01/12/02 01:23
#include <stdio.h>

int main()
{

int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for(i=0; i<10; ++i)
ndigit[i] = 0;

while((c = getchar()) != 'Q'){

if(c >= '0' && c <= '9'){
ndigit[c-'0']++;
d = ndigit; }
else if(c == ' ' || c == '\n' || c == '\t'){
nother++;
e = nother; }
else {
nwhite++;
f = nwhite; }

}

printf("digit =");

for(i=0; i<10; ++i)
printf(" %d", ndigit[i]);

printf(" other = %d white = %d\n", nother, nwhite);

return 0;

}


元のはこういうものなんです・・・・
847デフォルトの名無しさん:01/12/02 01:27
私はプログラム初心者で、Cを習ってるんですが、全く分かりません。
何か良い本はありますか?プログラミング自体初心者です。
ホントに基礎から勉強したいんですが、いい本あったら教えてください。
お願いします
848833:01/12/02 01:31
あ、d, e, fはテスト用です。消し忘れました。

頭が悪いもので、短時間では上手いこと結果が出せません。
腰据えてやりたいと思います。
アドバイスくださった方、ありがとうございました。
849デフォルトの名無しさん:01/12/02 01:32
>>847
明解C言語 入門編 柴田望洋 著  ソフトバンク
これ、初心者に最高!
850デフォルトの名無しさん:01/12/02 01:34
この問題、教えてください。お願いします
キーボードから二つの整数x、yを入力し、
それらの整数の最大公約数(gcd)と最小公倍数(lcm)とを求める
。そして、入力データとgcdおよびlcmwp出力するプログラム(gl.c)を書きなさい。
また、入力データが正の整数以外のときは、"illegal number"と出力するようにする。
 なお、lcm=x・y/gcdである。
851デフォルトの名無しさん:01/12/02 01:36
↑四行目 lcmwp→lcmを の間違えです。すいません
852デフォルトの名無しさん:01/12/02 01:39
Visualc++高くて買えないんですが、ただのやつないんですか?
853デフォルトの名無しさん:01/12/02 01:41
通は「初めてのC」
ネーミングがやばめ。プログラミングの本色薄め。これ。
で、これ電車の中で読んでいると次から他のリーマンからマークされる
危険を伴う両刃の剣。素人にはお勧めできない。
854   どうですか?:01/12/02 01:42
初心者ですがBCBのプロフェッショナルと
Delpyi6プロフェッショナルを貯金をおろして
買ってしまいました。もう、後には引けません。
>>852 cygwin と gcc じゃダメかい?
>>852
Win32 なら、Borland C++ Compiler か Cygwin の gcc が無料で入手可能。
VC の無料版はない。
857デフォルトの名無しさん:01/12/02 01:46
>855とりあえず、プログラムが組めるなら何でもかまわないっす。
858デフォルトの名無しさん:01/12/02 01:47
どこにあるのでしょうか・・・
>>858
君は検索エンジンを知らないのかね?
860デフォルトの名無しさん:01/12/02 01:47
BCBのプロフェッショナルってなに?
861デフォルトの名無しさん:01/12/02 01:48
Bolandは無料DL止めちゃったのか。
862デフォルトの名無しさん:01/12/02 01:49
>>859
この件に限っては、検索エンジンで探し当てるのは難しい。
863   どうですか?:01/12/02 01:50
↑ボーランドC++builderです。
864デフォルトの名無しさん:01/12/02 01:51
なぜ、SCANF関数には格納する変数がアドレスなのか?
その理由とPRINTF関数で出力する時、なぜ
* 変数ではなくそのまま出力できるのか?
&変数に値を格納しても、&を外した変数そのものは
空っぽではないのか?
これってさらっと書いてあるけど、自分には良くわからないです。
誰か分かる人、教えて下さい
865デフォルトの名無しさん:01/12/02 01:51
これでいいのかな?
http://www.borland.com/bcppbuilder/freecompiler/cppc55steps.html
リンク切れてただけかな?
868デフォルトの名無しさん:01/12/02 01:56
>>850
テキトゥー

int i, j, t, x, y ;

printf("x,y>") ;
if(2!=scanf("%d,%d", &x, &y)){
printf("illegal number\n") ;
return ;
}

i = x ;j = y;

while(i%=j){
t = j ;
j = i ;
i = t ;
}

printf("GCD:%d\nLCM:%d\n",j,x*y/j) ;
869デフォルトの名無しさん:01/12/02 01:58
>>861

君はどこを見ているんだい?まさかFTPの使えない環境から落とそうとしたとか言わないよね?

http://www.borland.co.jp/cppbuilder/freecompiler/bcc55download.html
870デフォルトの名無しさん:01/12/02 01:59
>>864
printf に渡すのは変数ではなくて、変数から取出した値。
だから printf("%d", a * 100); みたいな式も値として渡せる。
scanf に渡すのは値の格納先(つまりポインタ)。
scanf の中で、受取ったポインタ値 p に対して *p = 入力値;
のように代入している。これでわかるか?
871デフォルトの名無しさん:01/12/02 02:00
>>867
キーワード知ってればそりゃ出せるよ。
そういうのを後知恵というの。

>>864
ポインタで受けてる関数だから。
>>871
別段特殊なキーワードは入れてないつもりだが?
873デフォルトの名無しさん:01/12/02 02:03
>>871

>>856がキーワードを言っていると思うが・・・
874デフォルトの名無しさん:01/12/02 02:05
>>870

格納先を渡す関数は他にもいっぱいあるよね。getsとかstrcpyとか。
ただ、実際使うときに、&をつけてアドレス渡しすることがscanf以外ではあまりないというだけで。
875デフォルトの名無しさん:01/12/02 02:05
>>873
まーなぞなぞみたいだがその通りかもしれない。

>>872
そうか?俺なら
C言語 無料 ダウンロード コンパイラ
とか入れるぞ。
876874:01/12/02 02:06
× scanf
○ scanf系
877デフォルトの名無しさん:01/12/02 02:07
>>874
配列名で渡すと異常動作する処理系が一杯あるから。
俺はいつも &配列名[0] で渡してる。
878デフォルトの名無しさん:01/12/02 02:08
>>877

まじ!?
配列名==先頭のアドレスと定義されていないことがあるとか!?
879デフォルトの名無しさん:01/12/02 02:10
マジ。
今まで三つ体験した。
880デフォルトの名無しさん:01/12/02 02:12
>>879

初耳・・・
今までVC++,BCC32,gccしか使ったことがないから知らなかった・・
881   :01/12/02 02:12
参考書を一通り理解できても
役に立つプログラムが書けません。
どうしたら役に立つプログラムが
書けるようになれるのでしょうか?
>>881

自分が必要に迫られるとか。
>>881
何か自分で作りたいプログラムは無いのかよ。
884デフォルトの名無しさん:01/12/02 02:15
>>880
2つはgccだったり・・・。
885     :01/12/02 02:16
それが何を作っていいのか
分らないのです。
>>884

古いバージョンの?
私は最近のだからなぁ(LINUX用)。
>>885

役立ちそうなライブラリを作って配るとか・・・
参考書ってのがどの類の物か知らんが、言語を一通り理解したんなら
次は自分が使っている環境について勉強。
それで何も思いつかないようなら向いてないんじゃない?
889デフォルトの名無しさん:01/12/02 02:19
>>886
2つはターゲットがx86じゃ無い奴ね。
>>889

そうか。なるほど。
891デフォルトの名無しさん:01/12/02 02:22
>>885
1)ゲーム。
2)就職。(嫌でも何を作るか判ります。)
892       :01/12/02 02:22
>>888
そうですね、気軽に頑張ってみます。
893デフォルトの名無しさん:01/12/02 02:22
>>870 そうなんですか。 SCANFの中でポインタ(入力した値そのもの)
を受け取って
そのポインタの先の変数にそのポインタの値(つまりアドレス)を
代入してるという事ですか。
そうすると アドレスとそのアドレスの先にある変数は同じ値という
事になるのですね。
894デフォルトの名無しさん:01/12/02 02:24
>>893
ちがう
895デフォルトの名無しさん:01/12/02 02:27
>>893

ポインタは入力した値そのものじゃないよ。入力してフォーマットした後のものを入れる場所を指すアドレスだよ。
896895:01/12/02 02:30
アドレス自体はコピーされるけれど、二つのアドレス(実引数と仮引数)は指すところは同じだからその指すところをいじれば間接的に値を変更できるというわけ。

なんか説明が変だな・・
897デフォルトの名無しさん:01/12/02 02:43
そうすると SCANFの代入する値は変数そのものではいけないの
ですか?まず入力した値は、SCANFの&変数の中に代入される
みたいに書いてあったような気が・・
>>892
「エロサイトのポップアップを消すソフトを作るために勉強するやつ。」
↑こういうのが上達すると思う。
ポインタが難しいっていうけど何が難しいの?
Cのポインタって(C++は知らんが)すげー便利だなっておもったよ。
900デフォルトの名無しさん:01/12/02 02:48
>>899

一歩間違えばセグメンテーション違反
901デフォルトの名無しさん:01/12/02 02:52
この場合は関数側で加工するからじゃない?
変数のコピーを渡すと、加工しても元の変数は加工されないまま。
データを加工する関数は大抵ポインタ渡しだね。
やれやれ…土曜の夜は厨房ばかりか。

>>897
入力された値を戻り値として受け取れないから、入れ物の場所を指定して
そこに入れてもらうため。
つか、ポインタと戻り値を理解できるまでK&Rを復唱せよ。
>>899
ポインタのポインタのポインタとポインタのポインタが
ポインタの配列と混じっている関数へのポインタ
とかを使ってデバグではまったら分かる。
904デフォルトの名無しさん:01/12/02 02:54
参照でもメモリ違反起こせますが何か?
905デフォルトの名無しさん:01/12/02 02:56
>>903
んなものは無い。
906デフォルトの名無しさん:01/12/02 03:17
ムヒョース。
907デフォルトの名無しさん:01/12/02 03:27
例外を捕捉したい

try{}catch(){}
みたいな簡単な仕組みでよろしく

セグメンテーションフォールトが手に入ればそれでいい
>>903
デバッグ以前に設計が悪い。
実際問題極端な例(そう言う実装をせざるを得ない)を除いて、
梅干何個くらいならOK?
俺は***までは割とすんなりですが、
それを超えると逝ってよしと思ってしまう。。
漏れも梅干しは3つぐらいまでだな。
それ以上は酸っぱすぎる。
文字列の配列へポインタとか。
P/ECEを買ってC言語を…って方はいらっしゃいますか?(w
912Kusakabe Youichi:01/12/02 05:00
>>807 デフォルトの名無しさん wrote:

> 伝わることを願うのですが、
> 3次配列をやりたいんです。
> char *data1[]={"1","2","3"};
> char *data2[]={"a","b","c"};
> char *data3{}={"A","B","C"};

これ2次元では?
(ああcharレヴェルで数えると3次元か)
913Kusakabe Youichi:01/12/02 05:01
>>811 デフォルトの名無しさん wrote:

> 現実問題、そこまで複雑になったら構造体つかうべき。

なぜ連体形? :)
914Kusakabe Youichi:01/12/02 05:02
>>816 デフォルトの名無しさん wrote:

> 当方、C言語を始めて5日目。恥ずかしながら四則計算が関の山です。
> 助けてっください。
>
> 次の方程式の解を以下の4つの方法で求めるプログラムを作成し、小数点以下第4
位まで正確に解を求めよ。
>   
>    x−cos(x)=0
>
> 1、2分法
> 2、割線法
> 3、ニュートン法
> 4、反復法

ニュートン法とはなにか、ってのをちゃんと授業効いてなかったのでわからない
だけでは? :)

# プログラム以前の問題のような。
915Kusakabe Youichi:01/12/02 05:04
>>831 ○ wrote:
> >>814
> プログラム実行して、
> 使われる順番に関数名出力したいんでしょ
> やりかたはわからんけどね

ふつうに__func__つかえばいいんじゃないの?
そういう話じゃなくって?
916デフォルトの名無しさん:01/12/02 05:05
日下部さんって日コン連の人?
917Kusakabe Youichi:01/12/02 05:07
>>841 デフォルトの名無しさん wrote:
> K&Rスタイル
> K&R時代の(今となっては旧式の)書き方を言う。
> (ANSIC言語辞典(技術評論社)より)

いまK&RっていうとK&R2ndのことを言いそうな気がするが。

C89以前のtradな書き方のことだろうか??
918Kusakabe Youichi:01/12/02 05:08
>>847 デフォルトの名無しさん wrote:
> 私はプログラム初心者で、Cを習ってるんですが、全く分かりません。
> 何か良い本はありますか?

あるのでは?
もう少しヒネリの効いたレスの付け方を考えられないのだろうか(わ
920Kusakabe Youichi:01/12/02 05:10
>>864
In article <[email protected]>, 864 デフォルトの名無しさ
ん <[email protected]> wrote:

> なぜ、SCANF関数には格納する変数がアドレスなのか?
> その理由とPRINTF関数で出力する時、なぜ

標準になさそうな関数ですね:) > SCANF, PRINTF

> * 変数ではなくそのまま出力できるのか?
> &変数に値を格納しても、&を外した変数そのものは
> 空っぽではないのか?
> これってさらっと書いてあるけど、自分には良くわからないです。
> 誰か分かる人、教えて下さい

110ペイジに書いてあります。
921Kusakabe Youichi:01/12/02 05:11
>>877 デフォルトの名無しさん wrote:
> >>874
> 配列名で渡すと異常動作する処理系が一杯あるから。
> 俺はいつも &配列名[0] で渡してる。

それってようするに、バグですよね > 異常動作する処理系

そういうのをさももっともらしく書くと本気にする人がいるかも。
922Kusakabe Youichi:01/12/02 05:12
>>881 wrote:

> 参考書を一通り理解できても
> 役に立つプログラムが書けません。

参考書が悪かったか、もしくは
自分では理解したと思っているが理解できていないかどちらかでしょう。

参考書に書いてあるプログラムが実際に役に立つプログラムだったりすると
そっちほうめんに行きやすいでしょうね。
おい糞壁。
こっちの板の人達に迷惑かけてんじゃねえよ。
924Kusakabe Youichi:01/12/02 05:13
>>885 wrote:
> それが何を作っていいのか分らないのです。

つまり必要性がないかいぎり「役に立つ」ことは不可能なので、
あなたは何も作る必要はないのです。

# モティヴェイションは重要
925デフォルトの名無しさん:01/12/02 05:23
>>885
宿題スレにいって、答えてあげて下さい。
役に立ちます。
日下部さんのヒープソートが大好きです! (・∀・)ヒマナオッサンダナ
928Kusakabe Youichi:01/12/02 06:15
>>926 デフォルトの名無しさん wrote:
> 日下部さんのヒープソートが大好きです! (・∀・)(I墨典?Z歙淌

「ねたを仕入れた」とおもって得意げにかくまえに、
ちゃんと本読んでみたほうが恥かかなくてすむぞ :)
おっさんさぁ、結構ちゃんとしてるし頭切れるのも分かるんだけど
何でそんなにネットに時間費やすの?
俺見たいのなら分かるが、何か時間の使い方間違えてる気がするなぁ・・・
それでストレス発散になるってんならここはいい場所だろけどねー
日下部さんの配偶者が美人だと聞きましたが本当でしょうか?
931Kusakabe Youichi:01/12/02 06:29
>>929 名無しさん@お腹いっぱい。 wrote:

>結構ちゃんとしてるし頭切れるのも分かるんだけど
> 何でそんなにネットに時間費やすの?

そんなに時間使っていますか?

> 俺見たいのなら分かるが、何か時間の使い方間違えてる気がするなぁ・・・

つまり2chばかりしてると思い込んでいるのですね:)
>>930 かわいい人だと思った。
女ってのは駄目な男にひかれるのかな、、、 と(失礼
933デフォルトの名無しさん:01/12/02 06:41
>933
写真がいっぱいある・・・。
結構可愛いですね。
>>934
嫉妬と羨望だよな。
そのサイトを注意深く探れば、もっといい写真が隠されてるよ。
サイトが広いから探せない。
すいません、初心者です。 下の方法はおかしいでしょうか
どうしても返ってきた時distの値が切れてしまうんです(実際は構造体のメンバからのコピー)
strcpyの後でprintしても切れてしまいます 鬱
main()
{
  char *dist = NULL;

  func(&dist);
  printf("%s \n",dist);
  exit(0);
}
func(char **dist)
{
  char src[] = "TEST STRINGS";
  *dist = (char *)realloc(*dist,strlen(src)+1);
  strcpy(*dist,src);
}
938937 :01/12/02 08:12
あわわ、やっぱりしょうもない間違いでした −_−;
コピーの手前でlength=strlen(structsrc->member);メンバの名前を
間違えてました  情けない、、、2時間悩んだよぅ
>>907
Win32 なら構造化例外 (SEH) で捕まえられる。

int isViolated = 0;
__try {
  // やばそうな処理
} __exception (GetExceptionCode() == STATUS_ACCESS_VIOLATION)
{
  isViolated = 1;
}

UNIX だと SIGSEGV に対応するシグナルハンドラを登録すれば、アクセス保護違反が
発生した瞬間にシグナルハンドラが呼ばれる。ただし、そのときに適切な処理を行うた
めには、設計段階でアクセス保護違反が発生しうることを想定しておく必要がある。後
づけてコードを追加するのは、けっこう難しい。
940デフォルトの名無しさん:01/12/02 09:28
ロギングについてご助言下さい。
複数のプロセスから fprintf() で
一つのログファイルに書き出す場合の排他処理の定石は?
特別なこと(排他処理)をしなくてもうまく書き込めている
気がするのですが木の精ですか?
同じようなことをバッファリングなしで putc() で行うと
ログファイルがぐちゃぐちゃになります。
バッファリングとか fprintf() の実装とか関係ありますか?
あとログファイルのローテーションはどう実装したらよいですか?
>>940
ログ専用プロセスを用意してそいつとプロセス間通信。
ローテーションもそのプロセスがやればよい。
942デフォルトの名無しさん:01/12/02 10:29
>>940
write()で一つのブロックを一回で追加書きこみが定石。
ファイルアクセスはそれ自体が排他的なんで、追加書きこみなら
何も気にしなくて良い。
943デフォルトの名無しさん:01/12/02 10:30
>>902 それなら、納得です。
いや、本みたら、ポインタ変数に直接、入力した値が書き込まれるみたい
に書いてあったので、へっ?って思ったけど、そのアドレス先の実体だけに
書き込んでいるのですね。 だからscanf( "%d" , &a)で入力した値は
aに書き込まれて,&aの値(番地)は入力前も入力後も同じですよね。
質問なんですが(厨な質問でしたらゴメンナサイ)、なぜ
scanf()を使うのがよくないんですか?
誰か説明してくれませんか?初めて知りました・・・
scanf()を使うのがよくないって誰か書いた?
946デフォルトの名無しさん:01/12/02 12:18
>>945
いや、なんかさっき別の板でも言ってた人いましたし、
ずいぶん前に、知り合いがボソッと言ってました。
何でかって、知り合いに聞いたんですけど難しい言葉を
並べられただけで・・・
自分には理由がわからないんです。だから教えてもらい
たくって・・・
947デフォルトの名無しさん:01/12/02 12:21
>>939
>SIGSEGV に対応するシグナルハンドラ
おっとーそういやそんな仕組みあったな。
つーか、例外が起こったら適当に傷を記録して
そのあと元処理に復帰したいんだけど、なかなかムずいね

Javaってこの辺楽なんだよね。遅くっても許すって感じ
>>946
書式と型や入力数が異なってもエラー検出できないからかな?
CUIやらないんで使った事ないや。
949Kusakabe Youichi:01/12/02 12:33
>>946 デフォルトの名無しさん wrote:
> ずいぶん前に、知り合いがボソッと言ってました。

その知り合いに聞くってのはだめですか? > scanf()がダメだとかいう人

> 何でかって、知り合いに聞いたんですけど難しい言葉を
> 並べられただけで

なんだ聞いたのですか。
もう少しわかりやすく言ってくれってたのんだらどうですか?
>>949
忘れてました。
でもこの板見つけたから、詳しい人が沢山いるだろうと思って聞いてみました。
>>946
scanf() が使いづらいのは

1. 字句解析
 文字列の並びから、ここまでが数値、ここまでが演算子、といったようにトークンを
 切り出す処理
2. 型変換
 文字列の "1111" を int 型の 1111 に変換するような処理

を一つの関数にまとめてしまっていて、エラー処理などが難しいからでしょう。

実はscanf() の書式指定はかなり強力で(正規表現ほどではないけど、かなりのことが
できる)使いこなすと便利なのですが、それでも

1. 字句解析は getc(), ungetc() で一文字ずつ拾いながら、トークンの切れ目を探す
2. トークンの切れ目が見つかったらところで、トークン種別を確定して itoa, sscanf()
 などで型変換

と 2 段階にした方がつぶしがきくので、よく使われます。
952Kusakabe Youichi:01/12/02 13:23
>>951 デフォルトの名無しさん wrote:
> scanf() が使いづらいのは
>
> 1. 字句解析
>  文字列の並びから、ここまでが数値、ここまでが演算子、といったようにトー
クンを
>  切り出す処理
> 2. 型変換
>  文字列の "1111" を int 型の 1111 に変換するような処理
>
> を一つの関数にまとめてしまっていて、エラー処理などが難しいからでしょう。


あと、ほかのsscanf()などとちがって、改行をまたぐときの問題がありますね。
>>951.952
ありがとうございます。知りたかったことがわかってよかったです。
さて、そろそろ次スレの季節。
他にC言語で、あまりよくないものってあるんでしょうか?

getc,sscanfの他にgetsなんてのはどうなんですか?
>>955
gets() は最悪ですね。バッファオーバーランが防げない。
バッファオーバーランってなんですか?
入力はgetcとsscanfがいいって事ですか?
>>957
とりあえず google 逝け。
>>942
write()では一度に指定したサイズを書ける保障はないので、
ロック -> ファイル末尾へシーク -> 書き込み -> アンロック
の方が確実だと思われ。
960Kusakabe Youichi:01/12/02 14:04
>>955 デフォルトの名無しさん wrote:
> 他にC言語で、あまりよくないものってあるんでしょうか?
>
> getc,sscanfの他にgetsなんてのはどうなんですか?

388ペイジに書いてありますね > gets()
961デフォルトの名無しさん:01/12/02 14:07
gets() では、例えば

 char str[80];  //char 型の str変数を str[0] から str[79] まで 80個確保
 gets(str); //gets でキーボードから文字列を入力

としても、70文字以下の入力だったら問題無いが、80文字以上の入力をされたときになにもできないため、オーバーフローがおきる。
セキュリティーホールになる。

fgets だったら、最大入力可能文字を数字で指定できる。その数字を超えたものは次回の入力にまわせる。
だから、gets は使わず fgets を使うべき。
>>960
すいませんが、特定の本を出されても困っちゃいます。
それに何の本ですか?

>>961
なるほど。そういうことなんですか。ありがとうございます。
>>962
> すいませんが、特定の本を出されても困っちゃいます。
> それに何の本ですか?

Kusakabe 先生のスレ違い/意図不明な書き込みに対する苦情には専門のスレ
が用意されて いるので、ム板では書かないようにお願いします。そのような書き
込みにコメント をつけるのは、彼と一緒に一緒になって荒らし行為をし てるのと
変わりません。

日下部 陽一先生の隔離スレッド void ***
http://pc.2ch.net/test/read.cgi/prog/1006918877/

#同意も反論も不要。なんかあったら↑のスレで言ってくれ。
964Kusakabe Youichi:01/12/02 14:17
>>957 デフォルトの名無しさん wrote:
> バッファオーバーランってなんですか?

たとえば、飛行機が離陸するときに滑走路からはみ出して海に落ちたら痛いですよ
ね。
965デフォルトの名無しさん:01/12/02 14:21
CGIプログラムとして動作させるときは、CONTENT_LENGTHの値から入力されたバイト数が分かる(POSTの場合)ので、gets()でも構いませんよね?
966デフォルトの名無しさん:01/12/02 14:21
> バッファオーバーランってなんですか?

幼女タンのマムコに、大人のチンポを無理やりねじこんだら、子宮破裂するでしょ。
それと同じ。
967デフォルトの名無しさん:01/12/02 14:22
>>965
それを騙す人がいなければ。
というか、ふぇーるせーふ でなるべく使わないに越したことはないかと
968デフォルトの名無しさん:01/12/02 14:23
CONTENT_LENGTHの値ってだませるんですか!?
WWWサーバーソフトが設定するのだとばかり思っていましたが。
969968:01/12/02 14:24
とりあえず、fgetsにします。
>>968
今時 Web サーバにバグがない、なんてことは誰も信じてません(w

まぁ CONTENT_LENGTH が腐ってることはまずないと思いますが、それでも万が一の
ときにバッファオーバーランが発生する(しかも検出できない)のと、エラーをプログラ
ム側で検出してログに残すなり何なりの対処を取るのでは、プログラムの信頼性が
違ってきますし、バグへの対処に要する時間も変わってきます。
赤信号が出てるので新スレ作りました。
速やかに移動してください。
http://pc.2ch.net/test/read.cgi/tech/1007272267/l50
972newbieM:01/12/02 15:12
今ある特定のディレクトリの中のファイル名を比較して
リネームというようなソフトを作ろうと思っているんです。
つまりaっていうフォルダに
abc.txt
efg.txt
・・・・
ってあったとき
abc.txtをエービーシー.txt
efg.txtをイーエフジー.txt
という風に初めからあるリストと比較してリネームしたいんです。
ですが具体的にどのように書いたらいいかがわかりません。
どの命令を組み合わせるかおしえていただけないでしょうか?
>>972
そのプログラムを組むには、いろいろ関数を使います。
もう少し的を絞って質問してください。
それと、新しい、スレに移動もおねがいします。
974Kusakabe Youichi:01/12/02 15:28
>>972 newbieM wrote:
> 今ある特定のディレクトリの中のファイル名を比較して
> リネームというようなソフトを作ろうと思っているんです。

man 5 rename
975newbieM:01/12/02 15:31
了解しました。
早速移動して書き直したいと思います。
が、ほんとにまったくわからないんです。
一つのファイルだけならできるんですが・・・
>>975
プラットフォームは?
977newbieM:01/12/02 15:33
>974さん
意味わからないです(w_−; ウゥ・・
>>977
分からなくていい。>>963 見とけ。
>>977
OSは?
答えはは新スレで
980デフォルトの名無しさん:01/12/02 23:53
>本気で「ひとそれぞれ」だと思っているんだったら、
>「K&Rは難解だとの評価は大多数から既に出ている」とかいう理屈は
>使えないわけですよね:)

「人それぞれ」って「K&Rは簡単ってことになる」と思い込んでいる人もいるようですね:)
っていうか「そういうこと言う人が多いですよ」ということと「理屈は使えない」ってどう繋がるのでしょうね:)
>>980
なに、この人?
名無し登場臭壁チャン
983C初心者:01/12/03 00:05
結城浩せんせのC言語プログラミングレッスンの
EOFまで繰り返せまで進んだんですが僕も話しに加われますか?
>>983
加わってもいいけどもうスレが終わりです。
ちなみに次スレはこれね。

C言語なら、俺に聞け! <9>
http://pc.2ch.net/test/read.cgi/tech/1007272267/