5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :凡才ハカー:01/11/15 17:05
おれは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の使い方を教えてください

4 :デフォルトの名無しさん:01/11/15 17:39
>>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の三乗根を求めたいのですが、教えて頂けないでしょうか?
テキスト等で調べてみたものの、初歩的な事は以外と載っていなくて苦労しています。

6 :デフォルトの名無しさん:01/11/15 17:57
>>5
プログラムというより数学の問題じゃない?

7 :デフォルトの名無しさん:01/11/15 18:01
>>5
google で 「ニュートン法 三乗根」を調べれ

8 :デフォルトの名無しさん:01/11/15 18:47
>>3
前のスレからreadline, readlineとしつこいんだが…
manを読めという適切なアドバイスがあるのになぜ実行しないの?

読んだけど分からんと書いてたけど、あんなに簡単に使える関数なのに?
readline()に比べたらprinf()の方が数倍複雑な仕様なんだけど。
分からんじゃなくて読んでないんじゃないの?

9 :デフォルトの名無しさん:01/11/15 18:49
ぎゃあ。もちろん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を使いませんか?

13 :デフォルトの名無しさん:01/11/16 16:50
>>11 enumじゃだめ?

14 :デフォルトの名無しさん:01/11/16 17:09
「C language」と「C言語」の違いを教えて下さい。
別のスレで聞いたら自分の頭で考えろっていうだけで何も教えてくれません。
どうも「C言語」という言葉を使うのはよくないようなのですが
そこらへんはどうなのでしょう?

15 :デフォルトの名無しさん:01/11/16 17:44
「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 って呼ぶことを許してやるよ。

19 :デフォルトの名無しさん:01/11/16 20:00
(`∀′)

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やりたいんだけど
いい勉強サイトない?紹介して

26 :デフォルトの名無しさん:01/11/16 23:16
>>25 こことか。
http://xml.apache.org/xerces-c/index.html

27 :デフォルトの名無しさん:01/11/17 01:02
双方向リストのことで質問なんだけど。
 先頭と後ろに番兵を配置して番兵の中にもデータを格納するのが一般的なのでしょうか?
番兵にデータを入れると ノードを外ずしたり付け加えるときににチェックが大変
なのと チェックにかかるコストが大きいような気がするんですがどうでしょう?

28 : :01/11/17 01:05
素直にはじっこのポインタはNULLにしちゃえばいいんじゃないの?

29 :デフォルトの名無しさん:01/11/17 01:36
双方向リストはリングにしちゃえばケツを探すのが速くなって(゚д゚)ウマーなことも多いよね。

30 :27:01/11/17 02:07
>>29
リストをリングにするやりかたでのデータの終端のチェックは、
ノードが指す次のポインタが、一番最初に読み始めたノードのアドレスかどうか
を 実アドレス同士で比較するってことでしょうか?

31 :デフォルトの名無しさん:01/11/17 02:10
リンク先をたどっていって、元のポインタに戻ったら終わりだヨ

32 :デフォルトの名無しさん:01/11/17 02:15
>>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;
}

33 :27:01/11/17 02:34
>>32
ほんと助かりました。
一部理解できない部分があるけど 後は、どうにかやってみます。
ありがとうございました。
 

34 :デフォルトの名無しさん:01/11/17 03:20
>>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とかの実行結果を表示したい
どなたかお願いします

36 :デフォルトの名無しさん:01/11/17 03:55
>>35
一般的な話なら、ユニークなファイル名を作ってそこにリダイレクトし、
そのファイルを開く。

37 :デフォルトの名無しさん:01/11/17 03:56
>>35
コンソールアプリなら system()

なんにせよ「プログラミング言語C」読みましょう。

38 :35:01/11/17 04:05
さっそくありがとうございます
>>36
テンポラリーなファイルに書き込ませるというのは
盲点でした
でもファイルに書き出すのはちょっと・・・
>>37
sytem("dir")
だと実行されたかどうかしか分からないのではないのでしょうか?

39 :35:01/11/17 04:06
sytem
systemの間違いです
鬱だ

40 :デフォルトの名無しさん:01/11/17 04:09
>>38
普通は、system() 呼び出し時点での stdout, stderr, stdin 引き継ぐから、出力があれば
そのままコンソールに出てくるが。

41 :35:01/11/17 04:11
えっと,コンソールじゃなくて
文字配列として得たいのです

42 :デフォルトの名無しさん:01/11/17 04:17
>>41
じゃあ
> 例:dirとかの実行結果を表示したい
と書いちゃダメでしょ。

標準 C ライブラリの範囲からは逸れますが popen() (処理系によっては _popen() の場合もある) が
目的に合うかと。

43 :デフォルトの名無しさん:01/11/17 04:17
リダイレクトして呼び出せばいいじゃん
system("dir > dir.log");
open("dir.log");

44 :デフォルトの名無しさん:01/11/17 04:27
>>43
>>36

45 :35: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();
}

この二つのファイルはコンパイルされ、リンクされるます。

47 :デフォルトの名無しさん:01/11/17 13:56
( ´_ゝ`)そうかい

48 :デフォルトの名無しさん:01/11/17 13:56
( ´Д`)y──┛~~
そいつはよかったな

49 :デフォルトの名無しさん :01/11/17 14:16
( ´_ゝ`)おめでてーな

50 :デフォルトの名無しさん:01/11/17 14:21
( ● ´ ー ` ● )クソレス付けんなゴラ

51 :名無しさん@おひさまのよう。:01/11/17 15:12
つーか、ヘッダにプロトタイプ宣言書くの面倒だよね?
http://homepage2.nifty.com/nowsmart/opinion_needless_prototype.htm

52 :デフォルトの名無しさん:01/11/17 15:16
>>51
一見凄そうだけど、よく読むとアレなページだ...

53 :デフォルトの名無しさん:01/11/17 15:44
ってNASMんとこだね。

54 :デフォルトの名無しさん:01/11/17 15:56
gccのデフォルトlib検索パスを調べるにはどうすればいいのでしょうか?

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

55 :デフォルトの名無しさん:01/11/17 16:07
>>54
% gcc main.c -lpthread

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

% gcc -c -v main.c

で、どうでしょ。

56 :デフォルトの名無しさん:01/11/17 16:11
>>55
レスありがとうございます。
とてもわかりやすいです。早速やってみます。

57 :デフォルトの名無しさん:01/11/17 16:13
>>46
邪道。あとで int foo1() の定義を変更した場合にコンパイルエラーを検出できず、実行時に謎の
エラーが出ることになる(foo1 を呼び出すとスタックが壊れて、デバッグさえまともにできずに苦し
む、とか)。

C++ を使うなら、クラスのメソッドをヘッダに書いてしまうのはアリです。最近のテンプレートベー
スのクラスライブラリ (ATL, WTL とか) を使うと、そういうコードにせざるを得なかったり。

58 :デフォルトの名無しさん:01/11/17 16:54
>>32はちょっとおかしくない?
headは構造体でeは構造体のポインタだよね?

59 :デフォルトの名無しさん:01/11/17 22:45
% gcc main.c -lpthread

の -lpthreadってなんにゃ?
pthreadってディレクトリはないにゃ。

60 :デフォルトの名無しさん:01/11/17 22:55
-lXXX とやると、 -L で指定したディレクトリから
libXXX.a というライブラリを探してくれます。
libも.aも指定する必要はありません。(←分かりにくいよねえ、コレ)

実際にはもうちっと細かいけど基本はコレ。

61 :デフォルトの名無しさん:01/11/17 23:01
ありがとにゃ

62 :デフォルトの名無しさん :01/11/18 05:27
#include<stdio.h>

main()
{
int i,n;

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

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

/* バカプログラム */

63 :デフォルトの名無しさん:01/11/18 05:29
#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ってソースが汚いよね。

65 :デフォルトの名無しさん:01/11/18 05:34
そんなこと言うなよ!
俺はCしか知らん!(藁

66 :デフォルトの名無しさん:01/11/18 05:38
scanf考えた奴クソ。

67 :デフォルトの名無しさん:01/11/18 05:42
>>66何でだ!?
ところでscanfを考えたのはデニス・リッチーか?

68 :デフォルトの名無しさん:01/11/18 05:47
gets考えた奴はもっとクソ。

69 :デフォルトの名無しさん :01/11/18 05:48
mallocした領域はsizeof出来ないんでしょうか?
reallocする前にサイズが知りたいのです。。。
自分で変数とかに入れて管理しないとだめですか
初心者でごめんなさい。。。

70 :デフォルトの名無しさん:01/11/18 06:09
2つの整数の最大公約数をもとめる関数を作りたんだけど、
互除法以外に方法はないのかな?
誰かアイデアを出してみてくれ!

71 :デフォルトの名無しさん:01/11/18 06:12
>>69
VC++固有だったら_msize()なんてのがあるな。

72 :デフォルトの名無しさん:01/11/18 06:30
>>71
他に持っていったとたん、コンパイルできなくなる。諸刃の剣。

73 :デフォルトの名無しさん:01/11/18 06:38
-4にサイズは格納されていないの?

74 :デフォルトの名無しさん:01/11/18 06:54
出来ないんですね、、難しいです、溢れるからreallocするのにその前
に比べられないなんて
他にも返り値にAUTO変数のポインタ返してる関数が有るし、、、
これでよく動いてたもんだ(-▽-
PC初心者板に逝って来ます。。。。

75 :ビル・ジョブス:01/11/18 07:02
>>69
おいおい・・・
sizeofって演算子だよね。ってことは、演算の出来なければ、
コンパイルエラーだよね。

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

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

ファイルのサイズを、sizeof出来ないのと同じだよ。

76 :デフォルトの名無しさん:01/11/18 07:21
>>75
sizeof(void *)は4か8になるCPUが多いと思われ。
コンパイルエラーにはならん。

77 :デフォルトの名無しさん:01/11/18 07:37
free時サイズを指定しませんが、サイズを知る必要がないのですか?
mallocのソースでもみんと解らん。

78 :デフォルトの名無しさん:01/11/18 07:40
freeはブロックごと放り投げるだけだからね、無責任主義

79 :デフォルトの名無しさん:01/11/18 07:59
>>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の使い方の説明書じゃないぞ。

84 :デフォルトの名無しさん:01/11/18 15:25
>>82
低水準だからだろ・・・・
無知は黙ってなさぁぃ

85 :デフォルトの名無しさん:01/11/18 15:32
大変だからやらない、というポリシーはすばらしい。
負け犬になりたいのなら、ぜひ採用したい。

86 :デフォルトの名無しさん:01/11/18 19:13
>>82
大昔の話をしてんじゃねーよ。age

87 :デフォルトの名無しさん:01/11/18 19:22
>>82
だいたい、今ANSI C制定前の名残が原因で混乱するような事例あるか?
デフォルトでANSI準拠じゃないコンパイラ使ってるってか?
そんなもん10年も前に絶滅したと思ったが。

88 :デフォルトの名無しさん:01/11/18 19:27
「ANSI 完全準拠」
と書かれたコンパイラーを買って、実は全然準拠していないということがわかって愕然とすることはたまにある。

89 :デフォルトの名無しさん:01/11/18 20:29
while(1)とfor(;;)はどちらが正しいの??

90 :デフォルトの名無しさん :01/11/18 20:32
どっちも駄目
通はgotoでループ、これ最狂(´^`;)

91 :win98 borland C++ compiler:01/11/18 20:33
「EOFには0か1のどちらかが入ってる。確認せえよ演習問題」

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

なして?

92 :デフォルトの名無しさん:01/11/18 20:34
>>90
それはコンパイラの最適化を阻害するから、論外。

93 :デフォルトの名無しさん:01/11/18 20:35
>>91
処理系依存。
ガッコのマシンでやったら違うかもよ。

94 :デフォルトの名無しさん:01/11/18 20:35
>>91
-1はどのキャラクタコードにもマップされていない特殊なオードで便利だから

95 :デフォルトの名無しさん:01/11/18 20:36
>>89
while(1)はコンパイラによってはwarningでるから、for(;;)がおすすめ。

96 :win98 borland C++ compiler:01/11/18 20:37
ようわかりました。
ありがとうございます。

97 :デフォルトの名無しさん:01/11/18 20:42
EOFみたいな真偽値は「0か0じゃないか」で判定するので、-1でも1でも
なんでもいいちゅうこと。だからコンパイラによって違う。

98 :デフォルトの名無しさん:01/11/18 20:50
馬鹿かお前

99 :デフォルトの名無しさん:01/11/18 21:13
>>97
しかし、それじゃあgetcがEOFを返せなくなっちゃうよ。

100 :デフォルトの名無しさん:01/11/18 21:19
>EOFみたいな真偽値
おい

101 :デフォルトの名無しさん:01/11/18 21:26
EOFはcharで表せたらいけないんじゃなかったっけ?

102 :デフォルトの名無しさん:01/11/18 21:35
>>97
EOF と feof() と勘違いしているに 1 ガノッサ。feof() も 0, 1 ではなく 0, 非0 だけどさ。

103 :デフォルトの名無しさん:01/11/18 21:43
EOF みたいなのは ANSI C ではなんと言ってるんだろ。
シンボル値?

104 :デフォルトの名無しさん:01/11/18 21:55
>>103
規格書は斜め読みしただけだが、単にマクロとしか書いてない気がする。ただし

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

と規定してあるから 0 or 1 ということは、ありえん。

105 :デフォルトの名無しさん:01/11/18 22:10
getchar != EOF

なら

106 :デフォルトの名無しさん:01/11/18 22:11
()忘れた

107 :デフォルトの名無しさん:01/11/18 22:20
このスレばかばっかりだぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ!

108 :プログラミンゲ:01/11/18 22:28
そんなあなたにK&Rからの問題!!!!!!!!!!!!!!!!

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

ひげぶ&貧乏人 プログラミンゲ言語C より

109 :デフォルトの名無しさん:01/11/18 22:30
>>108
比較演算式の結果は 0 と 非 0 になるが。

110 :デフォルトの名無しさん:01/11/18 22:32
Kusakabe & real cyuubouに訊け

111 :デフォルトの名無しさん:01/11/18 23:13
>>109
わかってねぇなあ。だから>>108をやってみろって。

112 :デフォルトの名無しさん:01/11/18 23:16
>>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
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

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

☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

115 :デフォルトの名無しさん:01/11/18 23:41
お題が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
になる。

119 :デフォルトの名無しさん:01/11/19 00:46
*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() なので追記するのはま
ずいでしょうね。

122 :デフォルトの名無しさん:01/11/19 01:29
あぁ,嘘教えてしまった..すまない.

123 :デフォルトの名無しさん:01/11/19 01:41
**avはallocateされてるのかな,そうすると.

124 :デフォルトの名無しさん:01/11/19 01:57
たびたび教えて君ですみません。>>117です。

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

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

でうまくいってるらしいです。
ワケワカラン・・・。

125 :デフォルトの名無しさん:01/11/19 02:04
>>124
そういうプログラム作ってっとバッファオーバーフローであぼーんされちゃうぞ。

126 :デフォルトの名無しさん:01/11/19 02:09
>>117
>>124desu

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

127 :デフォルトの名無しさん:01/11/19 02:17
>>124desu

atterunokana?
wakewakaran...

128 :デフォルトの名無しさん:01/11/19 02:55
すいません、昨日のアホです
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; //新しいポインタを返してるつもり・・・
}
このコードを書いてテストすると、思ったように動いたのですが、
時々返ってきたポインタが変な所を指している様です。
パラメータと返り値をどちらもポインタのポインタにしたら上手くいくのですが
何処かでローカル変数を指してますでしょうか。。。。

129 :デフォルトの名無しさん:01/11/19 02:58
ああ、何か変な事言ってる気がする。
もっと考えて来ます。

130 :デフォルトの名無しさん:01/11/19 03:33
>>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のエラーメッセージ一覧が載っているページというのは存在するのでしょうか?

133 :デフォルトの名無しさん:01/11/19 23:54
>>132
gcc manual

134 :デフォルトの名無しさん:01/11/20 00:00
ありがとぅ

135 :☆質問です☆:01/11/20 02:41
思い出せなくてどこにも乗ってなくて困っています(汗汗)

>a.out file.txt

としたときに、実行ファイル名のあとにあるファイル名(file.txt)を
実行ファイルから読み込む方法をどなたか教えていただけますでしょうか★
おねがいします!

136 :デフォルトの名無しさん:01/11/20 02:45
>>135
argv[1]

137 :デフォルトの名無しさん:01/11/20 03:09
K&Rの演習問題、模範解答なんぞは本に載ってましたかね?

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

演習問題ってのは、「今まで出てきたものの応用だけで作ってみろ」ということだと思うんですが
それだとコードが長くなるんです。
それでもいいんでしょうか。

138 :>>136 san:01/11/20 03:29
>>136 さんへ
解決しました★すばやい回答ありがとうございました♪ _(._.)_

139 :デフォルトの名無しさん:01/11/20 03:30
>>137
まずその時の自分の技量で自分で解く。
後で新しいことを覚えたらまたその時の技量で解く。
それで両者を比べてみる。

140 :Kusakabe Youichi:01/11/20 03:48
> 実行ファイル名のあとにあるファイル名(file.txt)を
> 実行ファイルから読み込む方法

第2章に出ていますよ。

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

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

訳本も出ています。

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

142 :デフォルトの名無しさん:01/11/20 04:06
2ndに対応したものも出ています。
『TWO Ch ANSWER BOOK』』Prentice-Hall
です。

143 :デフォルトの名無しさん:01/11/20 04:16
>>140-141
ム板にも来たのか…

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

「2chに〜」と書きたかったんだろうなぁ…

144 :128 :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の大きさを変えてください。

148 :デフォルトの名無しさん:01/11/20 17:04
>>146 JavaのStringが変更不可なのは手抜きじゃなくて
マルチスレッド対応のため。
Stringみたいに頻繁に使用されるオブジェクトで
排他同期が必要になると性能に影響が出る。
だから変更可能なStringBufferとreadOnlyなStringとに分けられた。
C++のライブラリはスレッドの事は関知してないんでそ?

149 :デフォルトの名無しさん:01/11/20 17:25
SDKってC言語なの?
C++じゃないの?

150 :デフォルトの名無しさん:01/11/20 17:30
どのSDKを指してるか不明だが、WindowsのPlatformSDKならC。

151 :デフォルトの名無しさん:01/11/20 17:35
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
>>152
http://pc.2ch.net/test/read.cgi/tech/1003674814/

156 :デフォルトの名無しさん:01/11/21 00:00
>>148
> C++のライブラリはスレッドの事は関知してないんでそ?
ANSI C++ にはスレッドに関する規定がない、というのが正しいかな。

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

157 :デフォルトの名無しさん:01/11/21 02:11
#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
任意の待ち時間をつくりたのですが?

159 :デフォルトの名無しさん:01/11/21 13:24
希望の時間が過ぎるまで clock で計測しながらループ待ち

160 :デフォルトの名無しさん:01/11/21 17:48
>>159
お前みたいな奴がいるから困るんだ (涙

161 :デフォルトの名無しさん:01/11/21 18:13
>>160
組み込みなら許すかも。

>>158
環境依存だから、環境を書くように。Win32 なら Sleep(), UNIX なら sleep(), usleep() あたりか。

162 :159:01/11/21 18:16
>>160
あはは (^▽^;
ひとつの案として言ってみただけです。
自分がプログラム作るときはちゃんと Sleep とか使いますから、ご安心召されよ〜。

163 :デフォルトの名無しさん:01/11/21 18:42
>>162
ネタとしても面白くないな。逝って良し。

164 :デフォルトの名無しさん:01/11/21 19:28
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

とエラーが出てしまいます…。
マニュアルで綴りや設定の仕方など見直したのですがわかりません。
すごく初歩的な質問で申し訳ないのですが、
どなたかよろしくお願いします…。

168 :デフォルトの名無しさん:01/11/22 13:04
>>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は空ファイルなのでしょうか??

175 :167: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){
}
とこれを判定しようとしました。これって真にならないんですか?

178 :デフォルトの名無しさん:01/11/22 14:04
>>177
if(p == (char*)0xff)
これだったら真になるよ。

179 :デフォルトの名無しさん:01/11/22 14:06
あ、メモリの内容が0xffなんです。そのアドレスは0xffではないです。
デバッグ中に変数の値見ても*p=0x000000ffって表示されます。(VC++)

180 :178:01/11/22 14:07
すまん。勘違いだ。178は取り消し。

181 :デフォルトの名無しさん:01/11/22 14:08
>>179
符号拡張で、*p == -1 になってるんじゃない?

182 :デフォルトの名無しさん:01/11/22 14:13

>>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

185 :デフォルトの名無しさん:01/11/22 14:24
>>183
有り難うございます。今試したところ
if(*p == (char)0xff)が正解でした。
pがchar*なのでこれにあわせてcharでないとダメと言うことでしょう。

>>184
いっぱいでるから無視してました(w
たぶんでてるかも。

186 :183: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)

189 :デフォルトの名無しさん:01/11/22 15:52
>>187
何がしたいの?文字列の一番目の文字を判定したいのか?
文字と文字列の違いは分かってる?

190 :187:01/11/22 16:09
>>188-189
とりあえずコンパイルはできました。
ありがとう。

191 :デフォルトの名無しさん:01/11/22 16:14
マルチスレッドなプログラムでグローバル変数を読み書きしたいのですが、
どうやって排他処理をすればよろしいのでありましょうか?

192 :デフォルトの名無しさん:01/11/22 16:18
>>191
セマフォ、クリティカルセクションなど。

193 :191:01/11/22 16:22
初耳の言葉だ・・・
調べてまいります。ありがとう。

194 :191:01/11/22 16:35
どうも調べ方が悪かっただけらしい。ありがと。
http://www.remus.dti.ne.jp/%7Etom3/multi_thread_basic.html
http://www.hlla.is.tsukuba.ac.jp/%7Eyas/coins/dsys-1998/1999-01-26/pthread-sync.html
http://www.ncad.co.jp/%7Ekomata/c-kouza17.htm

195 :デフォルトの名無しさん:01/11/22 21:27
いまどきCをはじめるのはやめたほうがいいぞ

196 :デフォルトの名無しさん:01/11/22 21:35
Rubyが入門には最適。
Rubyだけで十分。

197 :デフォルトの名無しさん:01/11/22 21:37
Javaでもいいけどな。

198 : ◆RubyOmS2 :01/11/22 22:41
>>196
RubyのライブラリをCで書く為にCを勉強し始めている俺は、
Ruby厨としては、失格なのか?

199 :デフォルトの名無しさん :01/11/23 00:13
軽い気持ちでcrypt使ったら
undefined reference to `crypt' って (−_−)
プロの皆さんは何を使ってますか、高い強度は必要ではないです
>>195
自分はタコだけど、メモリにグッっと近づいた感じは触ってて気持ち良いよ
生産性を論じてるならアレだけど
VB、Java、Perl辺りをやっていた

200 :199 :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系じゃないと実装されてないよ。

205 :デフォルトの名無しさん:01/11/23 15:49
C言語でCGIを作っていますが、何か?
というか、Perlがよく分からないのでCです。はい。

206 :デフォルトの名無しさん:01/11/23 15:54
#define A "\0\0\0\0"

fn(char* a){

}

int main(){
 fn(A);
}

とした時
fn の a 指す値は
*a 〜 *(a+4) は全部 \0 になるの?

207 :デフォルトの名無しさん:01/11/23 15:57
>>206
なる、と思う・・・

208 :デフォルトの名無しさん:01/11/23 15:58
全部\0になるよ。

main内に
fn("\0\0\0\0");
と書いたのと同じだもん。

209 : :01/11/23 15:57
>>205

文字列操作とか大変じゃないですか?
フォームから送られてくるデータの項目ごとの分割とか。
(Perlではハッシュでかんたん。)
何か美しい解決法があれば聞きたいです。

210 :login:Penguin:01/11/23 15:59
C言語の"C"の由来ってなんなんだろ?

211 :デフォルトの名無しさん:01/11/23 15:59
>>209
そういうのは全部ライブラリでなんとかしたり、
データベースに突っ込んでなんとかしたりするから平気です。

212 :デフォルトの名無しさん:01/11/23 16:00
"B"の次だから "C"

K&R読んだことないの?

213 : :01/11/23 16:00
>>210

Bの次。が有力。

214 :デフォルトの名無しさん:01/11/23 16:06
>208
ありがと
じゃあ、文字列の最後を \0 2個にしたいときは
#define A "abcde\0"
ってすればいいですよね

215 :デフォルトの名無しさん:01/11/23 16:10
すればいいですよ

216 :デフォルトの名無しさん:01/11/23 16:12
>>210
BCPLの頭文字とったのがB言語で、
ダブルにその次ってことでCらしい。よくわからんけど。
次はPか。ピー言語。なんか嫌っ('Д`;)

217 :デフォルトの名無しさん:01/11/23 16:17
>215
ありがとございました

218 : f:01/11/23 16:16
http://cm.bell-labs.com/cm/cs/who/dmr/bintro.html

興味があったのでB言語について。
文法的にはほぼCですな。
BとCって何が違うんですか?
ポインタがないとか?

219 :デフォルトの名無しさん:01/11/23 17:50
>>218
ざっと読んでみた。
ポインタはあるみたい。というか、型は整数しかなくて、キャストしなくても
* 付ければポインタとして扱われているように見える。

220 :デフォルトの名無しさん:01/11/23 20:58
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;

}
こいつを実装とやらをしたいんだけどスタックとかから教えてください

221 :デフォルトの名無しさん:01/11/23 21:05
>>220
まずは日本語を勉強しましょう。「実装とやら」と言われても、何のことやら分かりません。

222 :デフォルトの名無しさん:01/11/23 21:27
え?汎用関数つくることを実装というのではないのかや?

223 :デフォルトの名無しさん:01/11/23 21:47
>>222
意味不明。

224 :デフォルトの名無しさん:01/11/23 21:47
これじゃSJIS扱えないよ

225 :デフォルトの名無しさん:01/11/23 21:55
if(mblen(szFindPoint-1,2)!=2)
szFileName=szFindPoint;
このようにさっき変えた。

そろそろスタックとかやりたいYO

226 :デフォルトの名無しさん:01/11/23 21:56
\\も直したから安心してョ

227 :デフォルトの名無しさん:01/11/23 22:00
こりゃまたすごい意味不明。
>>220さんはスタックってなにか知ってるのかな?

228 :デフォルトの名無しさん:01/11/23 22:03
めもり確保して
めもりに一個ずついれてくんだろ?

229 :デフォルトの名無しさん:01/11/23 22:04
ちなみにstackは積むとかそーゆー意味だと思うんだけどョ

230 : :01/11/23 22:10
>>220
スタック、リスト、キュー、どれもメモリー確保して格納する作業ですが?
出直しておいで。

231 :デフォルトの名無しさん:01/11/23 22:25
なぜ「実装とやら」をしたいのだ?
セインセイにいいつけられた?

232 :デフォルトの名無しさん:01/11/23 22:26
さっきのマイプログラム、配列つくって
whileつかって、ひとつひとつ
if(FullPath[i]='\\'&&mblen(FullPath[i-1],2)!=2)
とかやったほうがいいとおもう?

233 :デフォルトの名無しさん:01/11/23 22:28
いや、はじめてライブラリに挑戦する僕チンなんだ
(スタティック)どーせならひたすら低級路線
で行こうとおもっただけアル

234 :デフォルトの名無しさん:01/11/23 23:07
要するに、
C言語の「標準ライブラリ」を極力使わずに、自作ライブラリを作りたい
ということだろ。
で、手始めにpath nameの分解をしたいと。
大方、mainのargvでわたされたファイルパス名を分解しようという動機だろう。

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

235 :デフォルトの名無しさん:01/11/23 23:12
>>234
strchr()もだめだね。

236 :デフォルトの名無しさん:01/11/23 23:32
クララが・・クララが・・・

でさぁ、どっかのHPにstrchrの定義が
あって、char *strchr( ,int)だったんだけど
あれって実体を返すうーーー、いいのだ。
VCLにはExtractFileNameがあるけど、あれは実体を
返すの?それともポインタかなぁ。もうっかい見てみるからナ!

237 :いかりや長介:01/11/23 23:47
だめだこりゃ。

238 :デフォルトの名無しさん:01/11/24 00:19
mallocで64バイトとったらヌル文字は65バイト目ですか?
それとも64バイト目をヌル文字って考えながらプログラム
することがプログラマの使命なのですか?

239 :デフォルトの名無しさん:01/11/24 00:21
>>238
掟です。

240 :デフォルトの名無しさん :01/11/24 00:22
しょっちゅうアクセス違反してるお馬鹿な私は
char *ptr;
/* 処理 */
if(hoge != NULL && strlen(hoge))
と書いていますが、これは正しいでしょうか。もしNULLならstrlenは
判定されませんか。(僕の環境では大丈夫です)
また、時々重複freeしちゃうダメっぷりなので
if(hoge){
 free(hoge);
 hoge = NULL;
}
こんな感じであっちこっちに散りばめてるのですが、これはドキュソですか
変な事聞いてごめんなさい、、、、

241 :スシばっか食ってるNewBee:01/11/24 00:22
Bの次って

242 :デフォルトの名無しさん:01/11/24 00:25
>>240
&&の処理順序は保証されているし、そのような書き方はよく見かける
後者のfreeについてはそういうマクロなり関数なりを用意しとけ

243 :デフォルトの名無しさん:01/11/24 00:38
>>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 が代入されないんで、
そこからどんなバグが生成されるやら(笑い

244 :デフォルトの名無しさん:01/11/24 00:41
>>240
二重 free() するのは厳禁だが、条件反射的に

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

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

どこで、いつ malloc() して、どこで、いつ free() するのかを良く考えてプログラミングするのが先。
その上で防衛的に NULL 代入するようにするのはアリだと思う。(俺はやらないけど)

245 :デフォルトの名無しさん:01/11/24 00:48
240です、ありがとうですぅ
安心しましたです、出来る方の言葉を聞きたくて(^-^*
でももっと本を読まないと
何故かCよりgdbばっかり触ってるような(鬱
早速マクロにしますです

246 :デフォルトの名無しさん:01/11/24 00:54
>>244さん
なるほど!、次にはまるのはそれの様な気がします(^-^; コワ
やっぱり人間GCよろしく適当に散りばめるのはヤバイんですね
構造がつかめて無いのは仰るとおりです。

247 :デフォルトの名無しさん:01/11/24 01:05
>>246
真面目な話、GC 使うという選択肢はアリだよ。

http://www.hpl.hp.com/personal/Hans_Boehm/gc/

248 :デフォルトの名無しさん :01/11/24 01:14
getsの時に漢字で入力してprintfの時にひらがなで出力するには
どうすればいいの?誰かおしえて。

249 :デフォルトの名無しさん:01/11/24 01:31
漢字をひらがなに変換するプログラムを組んで、それでひらがなになおしなさい。

250 :デフォルトの名無しさん:01/11/24 01:35
ほんとにあったら欲しいな
出来たら英語に翻訳してくれると尚良し

251 :デフォルトの名無しさん:01/11/24 02:05
>249
その変換するプログラムをおしえて欲しいのよ。

252 :デフォルトの名無しさん:01/11/24 02:12
とりあえず、機械翻訳とデータベースについて勉強してからもう一度来なさい。

253 :デフォルトの名無しさん:01/11/24 02:25
形態素解析、あたりで検索。

254 :デフォルトの名無しさん:01/11/24 02:31
>>251
漢字と読み仮名の辞書を作れ。10年もあればできる。

255 :デフォルトの名無しさん:01/11/24 02:32
>>254
単語に区切るのが難しい。

256 :デフォルトの名無しさん:01/11/24 02:45
最長一致法と二文節最長一致法をさらっと流して、
最小コスト法まで話しをもっていくべきか?

IMEのやってることと比べるとUIがいらない点と、
学習する必要がない分、作り込みは簡単だと思うがどうよ?

257 :デフォルトの名無しさん:01/11/24 02:51
KAKASI - 漢字→かな(ローマ字)変換プログラム
http://kakasi.namazu.org/

GPL だから、扱い注意な。自分のプログラムにコードを取り込んだ場合、自分のコードも自動的に
GPL になる。

258 :デフォルトの名無しさん:01/11/24 03:20
>>256
248 のような質問をするやつが理解できるかどうか。

259 :デフォルトの名無しさん:01/11/24 03:22
>>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先にシークできるのでしょうか?

261 :shige:01/11/24 09:16
#include <stdio.h>
int fsetpos(FILE *stream, fpos_t *pos);

262 :デフォルトの名無しさん:01/11/24 12:03
SEEK_CUR で 2GB ずつ何度も移動するとか

263 :デフォルトの名無しさん:01/11/24 12:21
Ruby!

264 : :01/11/24 12:24
>>261

API使った方が良いのでは?
まぁ、内部ではAPI呼び出してるんだけど・・・。

265 :デフォルトの名無しさん:01/11/24 13:06
Win9xがあぼ〜んされるまでは標準ライブラリでは32bitのファイルオフセットが
使われ続けるのだろうなあ。

266 :デフォルトの名無しさん:01/11/24 14:57
C言の本でなんかいいのないか?

267 :デフォルトの名無しさん:01/11/24 15:00
K&R読み終わってから聞きに来い

268 :デフォルトの名無しさん:01/11/24 15:05
おうよ!

269 : :01/11/24 15:13
>>265
NTカーネルでも、intが32ビットの間は、fseek()は、32ビット。

270 :デフォルトの名無しさん:01/11/24 16:00
ISO/IEC 9899:1999調べてみた。fseekの2番目のパラメータはlongなのね。
ftell()もlongを返すからlongであらわせない位置にファイルポジションが
あるとエラーになるのか。

271 :デフォルトの名無しさん:01/11/24 16:27
K&R てのはね。
アセンブラを知ってて、FORTRANを知ってて、BASICを知ってて、COBOLを知ってて、LISPを知ってて、PASCALも知ってる、てゆー人向けに書かれた本だよ。
プログラミングの初心者は林春比古の本からはじめたほうがいいよ。
ついでにいうと、この板の住人は技術者であって、インストラクターではないから、そのへん注意したほうがいいよ。
教育心理学の本とか読んでる人少ないからね。ここは。

272 :デフォルトの名無しさん:01/11/24 16:29
お前第一章読み飛ばしただろ(藁

273 :デフォルトの名無しさん:01/11/24 16:30
林晴彦の本かうなら第一章読み直した方がまし。

274 :デフォルトの名無しさん:01/11/24 16:38
K&R読む。わからなくてもとにかく読み進む。(わからないことはメモしておくとなお良し)
最初にわからなかったことに気をつけながらもう一度読む。
それでもわからないようなら、プログラマには向いてないのであきらめる。

275 :デフォルトの名無しさん:01/11/24 16:47
>>273
同意

276 :デフォルトの名無しさん:01/11/24 19:05
char *ExtractFileNameM(const char* szFullPath,char* szFile)
ポインタと実態についてまた少し知識が確かになったので
このようにしてして無難にやった。

277 :デフォルトの名無しさん:01/11/24 19:20
K&Rの訳者前書きは萎える。
こんな意識の低いやつが翻訳しているのかと思うと読む気にならん。

278 :デフォルトの名無しさん:01/11/24 20:23
>>277 原書買え

279 :デフォルトの名無しさん:01/11/24 20:52
              ∧            .∧
              / ・           / ';,
            . /  ';          ./  ';
            /   ;______/   ;
          /                  \
         /    /          \     \
        /´       |____|          |
        |  /////    |     |    /////    |
       |        .|     |           |
        |         |    |           |
        |        ';    /           /
         \        \/        .. /
           ヽ             ........:::::::<
 __________∧___________
/                                   \
|  英語読めないや...                   |

280 :デフォルトの名無しさん:01/11/24 22:09
勉強しろ

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 したポインタを参照するバグに出くわすと思うぞ
って、どういうこと?

283 :デフォルトの名無しさん:01/11/24 22:30
>>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() みたいなマクロで置き換えた場合、
こういう状況では何の役にも立たなくて、やっぱり同じようなバグに出くわすって話じゃないの。

284 :デフォルトの名無しさん:01/11/24 23:48
free_treeが一個抜けてる。

285 :デフォルトの名無しさん:01/11/25 00:05
>>284
抜けてるのは free_tree() ではなく free() と思われ。

286 :美空ひばり:01/11/25 00:09
func()という関数があるときに、
funcっていう表現(カッコがない)はどういう意味になりますか?

287 :デフォルトの名無しさん:01/11/25 00:10
>>286
関数のアドレス

288 :284:01/11/25 00:13
ガ━━(゜Д゜;)━━ン!
同レベルかよ

289 :デフォルトの名無しさん:01/11/25 00:59
http://www.bohyoh.com/CandCPP/C/Library/pow.html

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

でもなんでコンピュータ上で間違うんだろう・・・・

290 :デフォルトの名無しさん:01/11/25 01:26
>>289 OCRだろ

291 : :01/11/25 07:52
あるプログラムのswitch文と同じ意味のif文ではどちらが速いでしょうか?

292 :デフォルトの名無しさん:01/11/25 08:38
>>291
同じだろ。

293 :デフォルトの名無しさん:01/11/25 08:46
>>291
場合による。
switch(i){
case 0:
case 1:
case 2:
case 3:
}
って感じだと、if より速くなるかもしれない。
コンパイラの最適化の話だから、確実とは言えないが、
if の羅列が switch より速くなることはないだろう。

294 : :01/11/25 10:10
良スレさげ

295 :293:01/11/25 10:53
> if の羅列が switch より速くなることはないだろう。

と思ったけど

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

のように効率的に条件判断するのと比べるなら何ともいえないな。
単純に == で判断してるだけなら switch の方がいいのでは?という程度。

296 :デフォルトの名無しさん:01/11/25 11:32
>>293
たとえばその例ではどういう最適化でifより速くなる可能性があるの?

297 :デフォルトの名無しさん:01/11/25 11:47
ジャンプテーブルを生成したり。
配列みたいな感じで飛び先アドレスが格納されてて、
インデックスで飛び先アドレスを取ってきてジャンプ。

298 : :01/11/25 11:50
間接参照アドレスから即ルーチン先へ飛んで、結局一回の判定で済むからじゃないのか。

299 :デフォルトの名無しさん:01/11/25 11:53
ごめんなさい。
VC で試したら if の羅列でも同様に最適化されました。
最近のコンパイラは優秀なんで、どっちでも同じです。

300 :デフォルトの名無しさん:01/11/25 11:58
bcc出も試してミロ

301 :デフォルトの名無しさん:01/11/25 11:58
ウソ言いまくり。見間違いでした。激しく鬱、、、

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

よって switch でどうぞ。

302 :デフォルトの名無しさん:01/11/25 12:27
テーブルジャンプで最適化されたswitchは確実にパイプラインが
ストールしますから、よく分岐する部分をifで抜き出して、それ
以外(インデックスが連続しなくなる場合はダミーをうめて)を
switchにしたほうがよいです。

303 :デフォルトの名無しさん:01/11/25 12:40
文字列から数値への変換は atoi, atol, atof などありますが
数値から文字列への変換はあるのでしょうか?

304 :デフォルトの名無しさん:01/11/25 12:40
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した分の領域を確保すると丁度よくなる。
恐怖のセグメンテーション違反も起きないし(笑)

312 :305:01/11/25 13:47
>>310

私も最初は標準関数だと思っていたよ。
でもgccでコンパイルできなかった時に初めて気づいたよ。
調べてみたらそんなものはないと・・・

313 :デフォルトの名無しさん:01/11/25 13:47
そうだよ。
hello worldにも使われる関数をばかにしちゃあいかん。

314 :デフォルトの名無しさん:01/11/25 13:48
>>308
たまたまデータの個数が1024個よりも多かったらどうします?

315 :デフォルトの名無しさん:01/11/25 13:48
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文字以上入力してみようかな(笑)

321 :デフォルトの名無しさん:01/11/25 13:54
>>308
mallocなんて、前世紀の遺物です。
使う必要はまったくありません。
コードが不必要に複雑になるだけです。
データの、想定される最大長の同じ長さの配列を使えば、
後は、OSが仮想記憶でうまくやってくれます。

322 :プヨプヨ:01/11/25 13:56
mallocは
データ数が保障されている場合は意味ないの?

323 :デフォルトの名無しさん:01/11/25 13:57
>>322
データ数が1024が上限とか、そういう仕様だったら、
必要ないですね。

324 :あそぼ:01/11/25 13:59
>>322
リストとか木とか実現するときとか使わない?
まぁ、記憶領域をあらかじめ最大数確保してそのポインタを管理すれば良いんだろうけど。

スマートじゃない・・・。

325 :周富徳:01/11/25 13:59
こんな時間にこんなに早くレスがつくとは思いませんでした。
お仕事中ですか?

326 :デフォルトの名無しさん:01/11/25 14:00
いや、自宅ですが、ヒマなもんで。

327 :あそぼ:01/11/25 14:04
>>321

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

328 :デフォルトの名無しさん:01/11/25 14:06
>>327

どうでもいいが、せっかくならvallocという名前にしてほしかった(笑)

329 :白いパラソル:01/11/25 14:07
他人のコードを読むのが一番勉強になるとかいいますが、
公開されているソースとかで勉強した人とかいますか?

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

330 :デフォルトの名無しさん:01/11/25 14:09
>>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でしょう?

336 :デフォルトの名無しさん:01/11/25 15:30
>>335
unsigned かどうかは処理系依存だが、いずれにしろ C では char が整数型であることは間違いない。

337 :_:01/11/25 15:32
>>333

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

338 :デフォルトの名無しさん:01/11/25 15:34
>>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型の関数でエラーと判断した場合、どんな値を返すのがよいと思いますか?

341 :340:01/11/25 15:55
ちなみに、正常の場合、負・0・正のいずれも返す可能性があります。

ポインターならナルポインタでも返してやるんですが・・・

342 :デフォルトの名無しさん:01/11/25 15:59
>>340
期待されるintの範囲による。
期待されるのが0以上ならば、負の数にするのが一般的。
-1,-2...にエラーコードを割り当てれば、エラーパターンを細分化できる。

343 :342:01/11/25 16:02
>>341
あら、そういうことだと・・・

戻り値として期待されない値にエラーを割りあてるわけだから、
正常時にあらゆるint値を返す場合は、そもそもこの方法でエラーを通知
することは不可能だよ。

344 :デフォルトの名無しさん:01/11/25 16:03
>>343

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

ありがとうございました。

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

346 :344:01/11/25 16:06
>>345

エラーコードを設定する変数を呼び出し元で用意するということですか?

347 :342: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){}

でもいい。

後者のほうが使いやすいと思うけど、前者もあり。

348 :342:01/11/25 16:11
>>347
訂正
後者の定義は
int foo(int output, int *input)
ポインタで渡す。

349 :342:01/11/25 16:12
違う
int foo(int input, int *output)
だ。

鬱・・・

350 :344:01/11/25 16:15
>>347

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

ありがとうございました。

351 :sage:01/11/25 16:27
さて、どれからつっこむべきか?

352 :_:01/11/25 16:35
>>351

やるならさっさとな。

353 :デフォルトの名無しさん:01/11/25 17:56
>>351
全部やれ。

354 :デフォルトの名無しさん:01/11/25 18:14
>>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() ? その他もろもろ

358 :デフォルトの名無しさん:01/11/25 23:21
int main()

359 :357:01/11/25 23:21
ちなみに私はmain()です。書かなければint型として見てくれるし。

360 :デフォルトの名無しさん:01/11/25 23:26
int main(void)

361 :358: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)が正しいということ?

365 :デフォルトの名無しさん:01/11/25 23:32
>>363
意味不明。

366 :デフォルトの名無しさん:01/11/25 23:36
mainの第三引数(環境変数)はANSI非準拠なのに、getenv()がANSI Cの標準関数なのはおかしいと思いませんか?

367 :デフォルトの名無しさん:01/11/25 23:38
envp age。

368 :デフォルトの名無しさん:01/11/25 23:38
int main( int argc, char *argv[ ], char *envp[ ] )
これ以外を使ってる奴は基地外

369 :デフォルトの名無しさん:01/11/25 23:39
>>368

変数名なんてどうでもいいじゃない。  

370 :デフォルトの名無しさん:01/11/25 23:41
どちらかといえば、368の方がキティ

371 :デフォルトの名無しさん:01/11/26 02:55
int main(int, char**)

372 :デフォルトの名無しさん:01/11/26 09:20
char main[1] = { 0xC3 };
とかいうのがあったような・・・

373 :デフォルトの名無しさん:01/11/26 09:34
実数が等しいかどうかを下のようにイコールで
判定するのは「素人」って、この板で言ってた
人が居たんですけど、玄人はどうやって判定
するんですか?

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

374 :デフォルトの名無しさん:01/11/26 09:39
>>373

そう言った人が素人

375 :デフォルトの名無しさん:01/11/26 09:48
>>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
警告の内容を理解して、無視して大丈夫かどうかそのつど、判断するしかないね。
警告の内容を理解しないで、闇雲にソースをいじって、無理に消しても
それが、バグの原因になったりするしね。

380 :デフォルトの名無しさん:01/11/26 10:15
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準拠かどうかは分からないけど。

384 :383:01/11/26 10:23
違った。FLOAT.Hだ(鬱
同じページに書いてあったから・・・

385 :383: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 にするなりしないと、誤差は表には現われないと思われ。

387 :デフォルトの名無しさん:01/11/26 11:27
>>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関数でを解放していないようです(そんなことをしたらどうなるかくらいは分かります)。

もしかして、場合によっては解放しなくてもよいのですか?

390 :389:01/11/26 13:31
× free関数でを
○ free関数で

391 :デフォルトの名無しさん:01/11/26 13:43
>>389
>もしかして、場合によっては解放しなくてもよいのですか?

プログラム終了まで確保しっぱなしでも困らない場合は構わない。
でもおすすめできるようなことではない。

392 :デフォルトの名無しさん:01/11/26 13:45
>>391

分かりました。ありがとうございます。

393 :fjネタ:01/11/26 14:44
>>389
> もしかして、場合によっては解放しなくてもよいのですか?
まともなOSかつANSI準拠であれば、exitの直前のfreeはいりません。

394 :デフォルトの名無しさん:01/11/26 15:07
>>393

まともでなかったらプログラムが終了しても解放されないということですか?
で、メモリーリークの原因になると・・・・

395 :デフォルトの名無しさん:01/11/26 15:07
絶対に関数内でfreeしなきゃならなかったら、困ると思うのだが。

396 :デフォルトの名無しさん:01/11/26 15:16
>>394
DOS, Win16, Win32, Solaris, FreeBSD, NetBSD, OpenBSD, Linux あたりは、ぜんぶ問題ない。
っつーか問題がある環境が実例として挙げられた試しがない。(freestanding は除く)

397 :デフォルトの名無しさん:01/11/26 15:31
C歴史と伝統と恒例の祭りが始まった!!!

398 :デフォルトの名無しさん:01/11/26 17:12
伝統の一戦ですね

399 :デフォルトの名無しさん:01/11/26 17:52
>>396
つーことは、組み込み系の人だけ?
mallocを使うのかどうかという問題もあるが。

400 :デフォルトの名無しさん:01/11/26 18:13
>>399
ANSI C の規格は二種類あって、組み込みのほうの処理系は普通 freestanding の方を採用
している。で freestanding の方では、そもそも malloc, free は標準関数ではないから、その
あたりは処理系によりけり。

そもそも、巨大な単一ヒープを前提にした malloc, free は、メモリ制約が厳しい環境では使い
モノにならんよね。

401 :399:01/11/26 18:15
「ANSI C の規格は二種類」「freestanding」、今初めて聞いた……

402 :デフォルトの名無しさん:01/11/26 19:00
> 「ANSI C の規格は二種類」「freestanding」、今初めて聞いた……
なんか誤解してそうだな。
正確に書くと、「ISO/IEC 9899 (ANSI C)に準拠する実装としてはhostedと
freestandingの二種類ある。」てこと。

403 :デフォルトの名無しさん:01/11/27 00:30
外部のバイナリファイルからデータを読み込んで、
色々と操作する関数を書いているのですが、
それをライブラリとして使うようにした場合に、
外部のデータもライブラリとしてまとめてられるのでしょうか?

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

404 :デフォルトの名無しさん:01/11/27 00:32
>>403

外部のデータが何を指しているのか分からない。

405 :デフォルトの名無しさん:01/11/27 00:33
>>403
・・・はい?
外部のデータって、「外部のバイナリファイル」なんでわ?
ライブラリとしてまとめる???
サパーリ妖精が出そう。

406 :デフォルトの名無しさん:01/11/27 01:03
ぶっちゃけなんでポインタってあるの?

407 :デフォルトの名無しさん:01/11/27 01:05
アセンブラでできることがCでできないと困るから。

408 :デフォルトの名無しさん:01/11/27 01:06
>>406

配列を関数に渡せないから。(←初心者発言)

409 :デフォルトの名無しさん:01/11/27 01:19
>407
どゆこと?
>408
・・・・そうだね(冷笑)

410 :デフォルトの名無しさん:01/11/27 01:29
そうなんだよね。配列をスタックに積んでくれないんだよね
なんか方法ある?

411 :C++忘れかけ:01/11/27 01:34
>408
ポインタで、関数配列とか…

412 :デフォルトの名無しさん:01/11/27 01:35
typedef で配列を宣言できないの?

413 :デフォルトの名無しさん :01/11/27 02:37
添え字計算だと遅いから(←原始人

414 :デフォルトの名無しさん:01/11/27 03:08
ポインタは熱いんだYO!
C言語マンセーーーー!!!!
参照なんて捨てちまえ!!!!
* このうめぼし見ただけで唾が出てくるぜ!
**(*(ptr[3])[3]);
うおーーーーーーー (オーバーラン)アヒャっ

415 :デフォルトの名無しさん:01/11/27 03:30
>414
やはりポインタは危険だな。

416 :デフォルトの名無しさん:01/11/27 06:32
>>410
構造体にする。

417 :デフォルトの名無しさん:01/11/27 11:17
age

418 :デフォルトの名無しさん:01/11/27 12:46
文字列が扱えなくなるから

419 :デフォルトの名無しさん:01/11/27 14:54
>>416
確かに構造体にすれば配列でも渡せるけど、例えば1MBの配列をそうやって
渡すのはとんでもなく非効率的だし、下手するとスタックが足りなくなる
からねえ…。

420 :デフォルトの名無しさん:01/11/27 16:36
>>406
C言語ってのはな、もっと殺伐としてるべきなんだよ。
メモリ操作で「どこが間違ってんだよぉ?」いつモニタに喧嘩を売り始めてもおかしくない、
アクセス違反が起きるか起きねーか、そんな雰囲気がいいんじゃねーか。
まあお前、>>406は、VBでも使ってなさいってこった。

421 :デフォルトの名無しさん:01/11/27 19:52
>>419

ただ関数内で参照するだけなのに、データ自体をコピーするなんて非効率的だよね。
在処さえコピーすればいいんだから。そのためにはポインターは必須。

422 :デフォルトの名無しさん:01/11/27 20:55
>>421 参照でもいいじゃん

423 :デフォルトの名無しさん:01/11/27 21:02
>>422
そもそも「ポインタの存在意義は何か」って話に対して「配列を効率よく関数間で渡すこと」という
意見が間違ってると思われ。それなら >>422 が言うように参照でも良いし、参照回数計測 +
copy on write を言語の機能として実装してしまってもいい。

C でポインタがあるのは、言語仕様を小さく押さえつつ、高度なデータ構造、たとえばリストやツリー
などをプログラマが実装できるようにするためでしょ。

424 :デフォルトの名無しさん:01/11/27 22:04
どどど素人意見ですが。
>>423
VBでも実装できるんじゃぁないんすか?
リスト&ツリー

参照ではだめでポインタを使わねば!っていう
具体例を俺もしりたーい!

425 :デフォルトの名無しさん:01/11/27 22:12
ビデオメモリの読み書き(DirectDrawとか)

426 :デフォルトの名無しさん:01/11/27 22:15
参照といっても、Javaのクラス変数みたいに、
ポインタっぽく扱えるものであれば、それで済むのです。

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

単にそれだけのことです。

427 :デフォルトの名無しさん :01/11/27 22:28
>>414みたいな人は多くないかい (´д`;)
Cやってるといつも頭の中に2次元配列の2次元配列の2次元配列
みたいなのがグルグルしてくる。。。3次元ってのはおかしいよなあ・・・・

428 :デフォルトの名無しさん:01/11/27 22:37
>>426
C++の参照とJavaの参照を比べないで欲しい。
Javaのは参照という名前のポインタ。

429 :デフォルトの名無しさん:01/11/27 22:38
ポインタ=参照+イテレタ+キャストに係る邪悪なα

430 :デフォルトの名無しさん:01/11/27 22:44
>>407 で答えが出てるだろうに..
参照とか文字列とかそんなものぜんぜん違う次元の話しだ。

431 :デフォルトの名無しさん:01/11/27 22:51
>>430
システム記述言語として誕生した初期の C では正解だけど、現在の ANSI C の規格の背景は? って
ことになると、微妙に違う気がする。

ポインタに関して単に「メモリアドレス」と書かずに、あれだけ微妙な言い回しをしているのは、それなりの
意味があると思わん?

432 :デフォルトの名無しさん:01/11/27 23:03
メモリアドレスという概念がOSごとに微妙に異なるから、
言語の定義としてポインタ=メモリアドレスと明示的に定義することを
避けたんだ。

アドレス=ポインタは、C++に派生してもその意義は失われていない。
その中でも唯一扱いが異なるのはNULLポインタだが、
そこまで言及する必要もないだろ。

433 :デフォルトの名無しさん:01/11/27 23:05
もちろん、OSのないアーキテクチャ上でCのプログラムを動かすことだってできるし
そういうものも多いよね。

434 :組長:01/11/28 00:10
16進数がテキスト形式(“f4c6・・・・”みたいな感じ)
で書かれたファイルを読み込んで、
int変数まで持っていくプログラムを考えています。
atoi()とsscanf()を使えば簡単と思っていたんですがなかなかできません。
どなたか教えてくだし。

435 :デフォルトの名無しさん:01/11/28 00:11
いやすげえ簡単だろ、それ

436 :デフォルトの名無しさん:01/11/28 00:18
数字なら0x30アルファベットなら
0x37をひけ。

437 :デフォルトの名無しさん:01/11/28 00:21
>>436

アルファベットって二種類あるよ。

438 :デフォルトの名無しさん:01/11/28 00:22
バイトオーダーの問題?
並び順はテキスト作った人にしかわからん。

439 :デフォルトの名無しさん:01/11/28 00:27
>>434
strtol (stdlib.h)

440 :デフォルトの名無しさん:01/11/28 00:30
>>434

char *hex;
int i;

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

こうしたらできたけど。
もちろん、hexは初期化してね。

441 :440:01/11/28 00:32
あ、テキストから読むのか。

442 : :01/11/28 00:32
strtol()って16進数でもいいの?

443 :デフォルトの名無しさん:01/11/28 00:33
>437
それぐらい判断してからひけ。それかマスクしろ。

444 :デフォルトの名無しさん:01/11/28 00:35
>>442

10進数字列として数値にすると思うけど・・・
アルファベットの無い16進数字列は10進数字列と見分けがつかないし。

445 :デフォルトの名無しさん:01/11/28 00:38
おっと、strtolは基数を指定するんだ(鬱

446 :デフォルトの名無しさん:01/11/28 00:38
>>442,444
マニュアル見ろや。2進から36進まで可能。

447 :デフォルトの名無しさん:01/11/28 00:40
>>446

すまない。名前しか知らない関数でatolと同じものだとばかり思っていた。

448 :デフォルトの名無しさん:01/11/28 00:41
>>442
long int strtol(const char *nptr, char **endptr, int base);

449 :447:01/11/28 00:42
メール欄に444と入れてしまった(鬱
もう寝よう・・・

450 :デフォルトの名無しさん:01/11/28 00:53
>>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);
で問題ない?

452 :デフォルトの名無しさん:01/11/28 01:45
>>451

reallocはmalloc,callocで確保した領域にしか使ってはならない。freeも同様。

453 :デフォルトの名無しさん:01/11/28 01:53
ちぇ!明日やろうと思ってたんだけど
今やったんだけどできなかった。
あーあ。

454 :デフォルトの名無しさん:01/11/28 01:57
char *p=strdup("abcde\0"); なら可

455 :デフォルトの名無しさん:01/11/28 02:01
¥0は要らないと思うけどーー

456 :デフォルトの名無しさん:01/11/28 02:01
>>450
うちの会社のCコンパイラでは動かないんですけど

457 :デフォルトの名無しさん:01/11/28 02:07
うちの幼稚園のCコンパイラでも動かないんですけど

458 :デフォルトの名無しさん:01/11/28 02:12
WindowsとUNIXで使ってる文字コードがすべてだと思ってるかわいそうな人なんだよ。

459 :デフォルトの名無しさん:01/11/28 02:25
>>456
コンパイラに何つかっているの?
それとOS。

460 :デフォルトの名無しさん:01/11/28 02:40
hitac-cとかでは?

461 :デフォルトの名無しさん:01/11/28 07:12
ふつー動かん。

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とかつかうのかなぁと考えたんですが、
どうすりゃいいのかさっぱりわかりません。どうすりゃいいですか?

463 :デフォルトの名無しさん:01/11/28 07:23
重複を無くしたいの?
a[]に0〜Nまで入れて、
位置をランダムに変えればいいYO!

464 :Kusakabe 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,・・]
とかはだめと。そんなかんじなんです。

466 :Kusakabe Youichi:01/11/28 07:36
In article <2ch.pc.tech.1005811510.465@2ch.net>, デフォルトの名無しさん <2
ch@2ch.net> 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
そういうことっす。

470 :デフォルトの名無しさん:01/11/28 07:47
do-while使わなければいいじゃん。
forでやれ。

471 :デフォルトの名無しさん:01/11/28 07:49
そっか!!

472 :デフォルトの名無しさん:01/11/28 07:58
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
頑張って作ります。ありがとうございました

474 :Kusakabe Youichi:01/11/28 08:13
>>46 デフォルトの名無しさん wrote:
> でも、それでどうかけばいいのか。
> do{
> a[i]

475 :デフォルトの名無しさん :01/11/28 08:26
UNIXで大きなテキストのお尻500行とか抜きたい時
真C屋さんな皆さんならどうしますか? 低レベルの方が速いですかね
tail読めって言うのは無しの方向でお願い出来ますでしょうか(^^;

476 :Kusakabe Youichi:01/11/28 08:30
>>475 デフォルトの名無しさん wrote:
> UNIXで大きなテキストのお尻500行とか抜きたい時
> 真C屋さんな皆さんならどうしますか? 低レベルの方が速いですかね
> tail読めって言うのは無しの方向でお願い出来ますでしょうか

tail読め。

477 :デフォルトの名無しさん:01/11/28 08:42
やっぱり(^-^
こう言うのってレベル高い人には一番面白く無さそうですよね
低レベルでシコシコやってみるです。。。
関数も全部突っ込んで。。。main一個で
tail読めるかなあ。。。。

478 :デフォルトの名無しさん:01/11/28 08:56
>>477
基本的には

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

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

でぐるぐる回すだけじゃない。'\n' が出てきたら行の区切り目ということで。

479 :デフォルトの名無しさん:01/11/28 08:57
>456
あんたの使ってる糞マシンの文字コードに合わせればいい。ただそれだけ。

480 :デフォルトの名無しさん:01/11/28 09:01
>>472
そういうのって、毎回重複をチェックするんではなくて、
あらかじめ乱数を生成しといて、あとでシャフルするのが
定石だと思うけど。

481 :デフォルトの名無しさん:01/11/28 09:11
>>478
unixだったらそれでいいけど、移植性なくなるよね。

482 :デフォルトの名無しさん:01/11/28 09:15
>>481
fseek() は ANSI C 標準関数だけど。(そういう話じゃなくて?)

483 :デフォルトの名無しさん:01/11/28 09:23
>>482
テキストモードだと、3.の動作が保証されないみたい。
http://www.bohyoh.com/CandCPP/C/Library/fseek.html

バイナリモードだと、dosやmacで、\nが使えないし。

484 :デフォルトの名無しさん:01/11/28 09:31
>>483
あとマルチバイト文字の扱いを考え出すと、話が厄介になるね。

485 :デフォルトの名無しさん:01/11/28 11:17
ファイルを頭から読んでいって、改行が見つかるたびにファイル位置を
記録していった方が楽じゃない? ファイルの最後に達したところで、
500行手前のファイル位置へseekしてそこから先を表示すればOK。

この場合、全ての行のファイル位置を記録する必要はなくて、戻りたい
行数分の位置を格納できるバッファだけを確保すればよい。

486 :デフォルトの名無しさん:01/11/28 11:41
たしか、GNUのtailは、ファイルポインタを一気に
最後尾まで移動して、後ろから順番にみていってた
ような記憶がある。

487 :デフォルトの名無しさん:01/11/28 14:34
一旦EOFにfseek()、ブロック単位で先頭に向かってfseek()&fread()、'\n'の
数を数えていく。

488 :デフォルトの名無しさん:01/11/28 16:12
>>487
がいしゅつなんてもんじゃないな。>>483読め。

489 :475 :01/11/28 19:54
みなさんご回答有難う御座います。これはちょっと意地悪問題みたいなのでして
最低でもtail位の実行時間で、だそうです 鬱
readとlseekでやってみようと思います、後はなるべくインラインにして、、
普段ジャバ夫で、ざっくりしたのしか書かないので、こう言うの超苦手なんです
心がおもひ
失礼します

490 :487: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>
多くてすいません。でもお願いします。

492 :デフォルトの名無しさん:01/11/29 22:14
>>491 自分の買った本ってCの本ですか?ジャンプには載ってませんよ?

493 :あはは:01/11/29 22:17
>>492
ジャンプってマンガ雑誌の?なんでそんなものに・・・

当然C言語の本です!

494 :デフォルトの名無しさん:01/11/29 23:21
>>491
man
ttp://www.linux.or.jp/JM/

495 :デフォルトの名無しさん:01/11/29 23:44
>>491
☆assert
assert(i == 0);
などと書くと、i が 0 以外のときはプログラムがエラー終了します。

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

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

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

これでOK?

496 :デフォルトの名無しさん:01/11/29 23:57
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だろ。

500 :デフォルトの名無しさん:01/11/30 07:53
その前に「はじめてのC」だろ。

501 :デフォルトの名無しさん:01/11/30 09:29
その前に「はじめてのB」だろ。

502 :デフォルトの名無しさん:01/11/30 09:50
その前に「はじめてのCASL」だろ。

503 :デフォルトの名無しさん:01/11/30 10:00
C言語でマイナス無限大からプラス無限大への積分はどうやったらいいのでしょうか? 無限という概念はなさそうなのでどうしたらいいのかわかりません。
わかる方いたら教えてください。
初心者ですみません汗

504 :Kusakabe Youichi:01/11/30 10:11
>>503 デフォルトの名無しさん wrote:
> C言語でマイナス無限大からプラス無限大への積分はどうやったらいいのでしょ
うか?

だいたい同じですよ > Fortranのときのやりかたと

505 :デフォルトの名無しさん:01/11/30 10:14
積分範囲が有限範囲に収まるように式を書き直してから計算したら?

506 :デフォルトの名無しさん:01/11/30 10:16
積分を計算可能な式に解いてから計算すれ。

507 :デフォルトの名無しさん:01/11/30 21:48
はじめて〜の〜チュウ

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の代わりに逝ってよし!とか?

511 :デフォルトの名無しさん:01/11/30 22:07
これ以上 意味の無い言語を増やすな。

512 :デフォルトの名無しさん:01/11/30 23:36
とりあえず、ギコ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;
}

514 :デフォルトの名無しさん:01/11/30 23:44
>>513
1 は使い方を間違う可能性がありそう。戻り値を入れ忘れるとか。
2 なら間違いは起きまい。おれ的には 2 を推奨。

515 :デフォルトの名無しさん:01/11/30 23:53
headとtailのポインタもって、尻尾に追加していったほうが使いやすいと思う。

516 :デフォルトの名無しさん:01/11/30 23:58
キーボードバッファをクリアする為に

rewind(stdin);

とするのは良くないでしょうか?

517 :デフォルトの名無しさん:01/12/01 00:15
rewind・・・?
またワケのわからんことを・・・

標準入力がコンソールの場合は知りませんが、
標準入力がファイルにリダイレクトされてたりすると、
クリアどころか先頭に戻って入力し直しになる気がする〜。

518 :デフォルトの名無しさん:01/12/01 00:27
UNIXでプログラムをつくっているのですが、
三次以上の配列をつくるとすぐに
Segmentation fault
とでてしまいます。
また、一次の配列でも千以上のものを2つとると同じような状況になります。
メモリ不足なのでしょうか?
これを解決しないと僕の卒研が進まないので
だれかわかる方、教えていただけないでしょうか?

519 :デフォルトの名無しさん:01/12/01 00:29
その糞コードを晒してくれないと答えようもない。

520 :デフォルトの名無しさん:01/12/01 00:29
>>518
かなり FAQ ですが、配列を自動変数で取ってますね? 自動変数は、一般には
スタックという比較的狭いメモリ領域に配置されるため、巨大な配列を取るとスタッ
クを使い切ってしまいます。

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

いずれかの方法をとってください。

521 :デフォルトの名無しさん:01/12/01 00:30
たぶんスタックの使いすぎ。
mallocを使ってミロ。

522 :デフォルトの名無しさん:01/12/01 00:38
>>518
それにしても、一次元配列で「千以上のものを2つ」で、
落ちるってのは小さすぎるな。せいぜい数キロから数十キロだろ?
10年くらい前のパソコンでもそのくらい平気なはずだけど。

523 :デフォルトの名無しさん:01/12/01 00:40
UNIXってスタックあふれるとsegmentation faultなん?

524 :デフォルトの名無しさん:01/12/01 00:42
>>522
スタックサイズは環境による。

科学計算系のプログラムっぽいから
配列は一個だけじゃないんだろうよ。

525 :516(初心者):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だとちゃんと動くんだけど・・。

どうか、教えてください!

527 :デフォルトの名無しさん:01/12/01 00:50
>"C:/abc/test.txt"
"C:\\abc\\test.txt"じゃない?

528 :デフォルトの名無しさん:01/12/01 00:51
>>522
環境によるけど、OS の制限ではなくシェルで limit かけてる可能性もある。その
場合にはシェルのコマンド (ulimit とか) で、OS の制限まではスタックを増やせる
ね。

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

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

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

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

という感じで処理。今ソースが手元にないので、間違ってたらごめんな。

529 :デフォルトの名無しさん:01/12/01 00:52
>>526
とりあえず、エラーは perror() で表示しよう。その方が詳しい原因が
分かるよ。

530 :デフォルトの名無しさん:01/12/01 01:00
>>526

アクセス権の問題とか?

531 :デフォルトの名無しさん:01/12/01 01:53
たぶんファイル名を区切る / がマズイんではないかと。

532 :デフォルトの名無しさん:01/12/01 01:55
実は単にファイルが無いだけとか・・・

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 を使用 ---
}
って書いた場合よりパフォーマンスの面で問題あるんでしょうか。
それともコンパイラの最適化とかいうもののおかげで問題ないのでしょうか。
(過去ログもあんまり読んでません。再度スマソ)

534 :デフォルトの名無しさん:01/12/01 03:16
>>533
なんだそのへりくだった態度は?

つーのはさておき
まじでなんでだろね。オレも疑問。

535 :デフォルトの名無しさん:01/12/01 03:22
>>533
構文解析器が作りやすい。

536 :デフォルトの名無しさん:01/12/01 03:29
NULLが臭くない?

537 :533:01/12/01 03:31
>>534
2chで初めてポストしたんでびびってました(ます)。
ってか厨房ってのはほんと。
で、もとの質問なんですが、ローカルに変数を宣言してもコンパイルは
通るんで、できればそうしたいんですが、普通そうしていないというのは
(少なくとも漏れが見たソースの範囲で)、
>>535
という理由だけでなくてパフォーマンス的に実際問題あるってことなんでしょうか。
そこがずばり疑問なわけです。

538 :デフォルトの名無しさん:01/12/01 03:38
厨ですいませんが、
atoiの逆の関数ってないでしょうか。
数を文字列にしたいんです。
たとえば
int a = 123 を
char b[] = "123"
みたいに。
上の桁から数字を取り出して
b[i] = 数字 + '0'
b[おわり] = '\0'
とかやってみたんですが、
もっとスマートな方法でなんとかしたいんです。

539 :デフォルトの名無しさん:01/12/01 03:39
>>という理由だけでなくてパフォーマンス的に実際問題あるってことなんでしょうか。
ない。
昔の言語は使う変数は最初に宣言するのが普通だった。
その名残なんじゃないの。

540 :デフォルトの名無しさん:01/12/01 03:41
>>538
sprintf( b, "%d", a); とか。
バッファオーバーフローが怖いなら sn 系とか
バッファかました関数作るとかてきとーにやってくれい。

541 :デフォルトの名無しさん:01/12/01 03:42
>>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 忘れたけど、どこかに日本語訳もあったはず。

542 :540:01/12/01 03:43
s/オーバーフロー/オーバーラン/

543 :デフォルトの名無しさん :01/12/01 03:45
何だ???マジレスしちゃダメなのか(´д`;)??
>>533
俺も厨房だけど、スコープ絞りたいなら最適化されると困るんじゃないの?
ていうか初期値代入するのにまたカッコで括って、、、
余計ややこしそうな気がするけど
ifはともかくループの中でそんな事出来るんだろうか??

544 :デフォルトの名無しさん:01/12/01 03:46
>>540-541
ありがとございました。

545 :533:01/12/01 03:49
>>539
ありがとうございました。
といいたいところでしたが、
>>543
意味がよくわかりませんでした。やっぱ漏れって厨房だね。

546 :デフォルトの名無しさん:01/12/01 03:55
>>543
ループスコープで宣言するのは可。
ふつースタックフレーム(古いね)に展開するから
宣言の手間は構文解析→変数配置の時点で終了しているはず。
ちゃうの?

547 :デフォルトの名無しさん:01/12/01 03:56
>>533
Javaやればそんな事は忘れちまうぜ!

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

}

548 :デフォルトの名無しさん:01/12/01 04:02
>>547
スレ違い――と言おうかと思ったけど、せっかくだから聞いておこう。Java だと、
そうやって i を定義した場合、実行時効率に差が出る? バイトコードのレベル
と、最近の JVM で JIT かけた場合と、両方について簡単にコメントもらえると
嬉しいかな。

549 :546:01/12/01 04:07
眠くなってきたよ…おやすー

550 :533:01/12/01 04:08
>>546
ループスコープの中で宣言しても外で宣言しても、スタックフレームに
展開した時点で結果は同じになるのでしょうか?

551 :533: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度しか出てこないなら変わらない
何度も出てくるなら初めに宣言した方がいい
と言う事でよろしいでしょうか?

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

色んな所に宣言がある方が気持ち悪いのは漏れだけでしょうか?

559 :Kusakabe 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;;)みたいにするか。

560 :Kusakabe 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;
}
だとどうでしょうか。

562 :デフォルトの名無しさん:01/12/01 04:48
>>561>>557

563 :561:01/12/01 04:51
>>562
あ、スマソ。寝ぼけてきたみたい。回線きって逝きます。

564 :553: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
質問でスレ伸ばしてスマソ。
このあたりのことについての厨房向けの書籍などあったら教えてください。
修行して戻ってきます。

565 :Kusakabe Youichi:01/12/01 05:02
>>550 533 wrote:
> >>546
> ループスコープの中で宣言しても外で宣言しても、スタックフレームに
> 展開した時点で結果は同じになるのでしょうか?

コンパイラーにもよりますが、
その同じ変数名を中と外で使っているような場合でない限り、
同じコードがでてくるのがふつうでしょうね。

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

あのー、何か勘違いしていませんか?

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

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

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

なんで「できない」とか勝手に思い込んでいるんだろう?

568 :デフォルトの名無しさん:01/12/01 05:05
>>566
for文のなかで宣言するより外で宣言した方がそりゃはやいだろ

569 :デフォルトの名無しさん:01/12/01 05:06
>>Kusakabe
根拠示せ

570 :Kusakabe Youichi:01/12/01 05:07
>>558 デフォルトの名無しさん wrote:
> a, b が1度しか出てこないなら変わらない
> 何度も出てくるなら初めに宣言した方がいい
> と言う事でよろしいでしょうか?

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

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

それ以前に、カーニハン氏の「効率を云々するならまず測定せよ」という
言葉をプリンターで印刷して画面の上に貼ってください。

571 :デフォルトの名無しさん:01/12/01 05:08
>>Kusakabe
測定結果示せ

572 :553: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

575 :Kusakabe Youichi:01/12/01 05:17
>>568 デフォルトの名無しさん wrote:
> >>566
> for文のなかで宣言するより外で宣言した方がそりゃはやいだろ

なんでそう思い込んでいるのですか?

576 :デフォルトの名無しさん:01/12/01 05:17
>>568-569
Kusakabe は放置の方向でお願いします。

まともに技術的な話をしている分には相手にして構いませんが、思い込みでいい加減
な事を言い出したら、取り合わないで下さい。こちらから質問しても、はぐらかされた回
答がくるだけで、スレが荒れる原因になります。

577 :デフォルトの名無しさん:01/12/01 05:21
>>573
それって問題コードだと思うよ・・・
初期値不定なところで、たまたまスタック上の同じ場所に
aが確保されてるだけだから。

578 :Kusakabe Youichi:01/12/01 05:22
>>569 デフォルトの名無しさん wrote:

> >>Kusakabe
> 根拠示せ

...

# 入門書から勉強しなおしたほうがいいぞ :)

579 :Kusakabe Youichi:01/12/01 05:24
>>574 デフォルトの名無しさん wrote:
> >570
> てことは変わらないんですね

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

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

遅くなる実装の存在する確率と同じぐらいでしょう > 速くなる

580 :Kusakabe 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
つーかさー毒舌もいいんだけどさー、
せっかく正解知ってるんだったらとっとと教えてくれよ
プログラマとしちゃ優秀かもしれんがヒトとしちゃなってないぜ?

583 :573:01/12/01 05:32
>577
aは初めにifで1回だけ0を入れてうまくいったんですが
たまたま同じ場所を確保したら値が残っててうまくいっただけなのですね
先頭以外で宣言したことないのでよくわかりません・・・

584 :Kusakabe Youichi:01/12/01 05:35
>>581
>> 581 デフォルトの名無しさん wrote:
> だけど、変数が初期化されずに使われるワーニングを恐れて

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

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

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

585 :デフォルトの名無しさん:01/12/01 05:38
隔離スレから外に出るなよ。

586 :デフォルトの名無しさん:01/12/01 05:38
>(中に++a;でも書いてみればバカでもわかるでしょ?)

バカでもわかる、ということにしたいのですね?

587 :デフォルトの名無しさん:01/12/01 05:38
for 文の中で宣言しようが、外で宣言しようがアセンブリ言語の
レベルでは一緒ですよ。一度コンパイルしてアセンブリリストを眺めてみては?

#両者に違いがでる特殊な処理系があるのかもしれないけどね

588 :Kusakabe Youichi:01/12/01 05:40
>>582 デフォルトの名無しさん wrote:
> つーかさー毒舌もいいんだけどさー、

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

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

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

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

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

「ということにしたい」だけですね?

589 :デフォルトの名無しさん:01/12/01 05:42
>世間のマニュアルや書籍は超毒舌だぞ。

世間のマニュアルが超毒舌、ということにしたいのですね?

590 :デフォルトの名無しさん:01/12/01 05:42
>正解を「みえないふり」しているの?

見えないふりしてる(ということにしたい)ですね。

591 :7ポイントゲット!:01/12/01 05:43
ちっ
あんまりポイント稼げなかったな
最後の文はわりと高得点だったけど

592 :Kusakabe Youichi:01/12/01 05:43
>>586 デフォルトの名無しさん wrote:
> >(中に++a;でも書いてみればバカでもわかるでしょ?)
>
> バカでもわかる、ということにしたいのですね?

ということは、あなたは「それでもわからなかった」例外的な馬鹿なのですか?

593 :デフォルトの名無しさん:01/12/01 05:44
いい大人がこんな時間に何やってるんだろうね。。

594 :デフォルトの名無しさん:01/12/01 05:44
だから Kusakabe の煽りには反応するなって。技術的な話だけに絞って議論する
ならともかく、そうでない部分まで反応しだすと話が拡散してスレが荒れる。

どうでもいい話は放置してくれ。

595 :デフォルトの名無しさん:01/12/01 05:46
>ということは、あなたは「それでもわからなかった」例外的な馬鹿なのですか?

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

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

「〜ならば」の条件節を無視したいのかな:)

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

いいえ。わたしが「そうしたい」のではなく、
「そうなのか?」と質問しているだけですが。

598 :Kusakabe Youichi:01/12/01 05:52
>>593
>> 593 デフォルトの名無しさん wrote:
> いい大人がこんな時間に何やってるんだろうね。。

2chでは?

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

「反応」しているのは私のほうですね。(話が逆)

600 :Kusakabe Youichi:01/12/01 05:53
>>595 デフォルトの名無しさん <news2ch@toc.dyndns.org> wrote:
> >ということは、あなたは「それでもわからなかった」例外的な馬鹿なのですか?

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

「なのですか?」と質問しているだけですよ。
(でも答えていない)

601 :デフォルトの名無しさん:01/12/01 06:09
Kusakabe 氏は少々ぶっきらぼうだけど
間違ってないですね

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

ループの外に移すことで高速になるのは C++ で何らかの
処理を行うコンストラクタ付きのクラス変数を宣言したとき
でしょうか。でも、ここは C スレなので脱線しますが。

602 :Kusakabe Youichi:01/12/01 06:14
>>601 デフォルトの名無しさん wrote:
> Kusakabe氏は少々ぶっきらぼうだけど

え、ちっともぶっきらぼうじゃないですよ。
すごく丁寧で親切だといつも言われています。

603 :Kusakabe Youichi :01/12/01 06:17
ではまた明日。

604 :デフォルトの名無しさん:01/12/01 06:20
>>601
本題と逸れるけど「宣言」と「定義」を混同してる。これは規格で明確に使い分け
られてる単語なんで、細かい話をするときには注意した方が良いです。

605 :601:01/12/01 06:24
>>602
そうですね。失礼しました。

ここは C 初心者も書き込みますので
そのあたり察してあげてくださいませ。 :)

606 :デフォルトの名無しさん:01/12/01 06:26
>>602
いつも言われてます、か・・・

607 :601:01/12/01 06:27
>>604
あー混同してましたか。またしても失礼をば…。
C の本読みなおしてくる :)
ありがとう

608 :Kusakabe Youichi:01/12/01 06:30
>>606 デフォルトの名無しさん wrote:
> >>602
> いつも言われてます、か・・・

はい。

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

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

興味があります。

610 :デフォルトの名無しさん:01/12/01 06:39
>>609
>いったいどんな本を読んでいるのでしょうか?

そのツッコミワラタよ。

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

ん? まじめに聞いているのですが。興味があるので。

612 :デフォルトの名無しさん:01/12/01 06:53
Cでは最初に変数の宣言が必要では?

613 :Kusakabe Youichi:01/12/01 07:02
>>612 デフォルトの名無しさん wrote:
> Cでは最初に変数の宣言が必要では?

べつに「最初」じゃなくても、使う前ならOKですね。

614 :土曜の朝はパラダイム:01/12/01 07:51
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);
}

615 :C勉強中 ◆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!
ってあるんですけど、、、
どっちが正解なんですか?

616 :Kusakabe 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だとダメなのな。ちょっと残念。

618 :Kusakabe 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じゃだめなの?

620 :617=619:01/12/01 08:23
どうも gcc 2.95.x だと全然だめっぽいな
gcc 3.0以降ならいいのかな?

>>617がOKなコンパイラをぜひ教えてください。

621 :Kusakabe Youichi:01/12/01 08:25
>>619
In article <2ch.pc.tech.1005811510.619@2ch.net>, 619 デフォルトの名無しさ
ん <news2ch@toc.dyndns.org> 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

623 :620:01/12/01 08:33
>>622
おお!サンクス!

624 :デフォルトの名無しさん:01/12/01 08:38
クサカベって、叩かれると急に真面目になるからなあ。

625 :C勉強中 ◆RubyOmS2 :01/12/01 08:38
>>616
え?
>べつに「最初」じゃなくても、使う前ならOKですね。
って言ってるようですけど、
K&Rの付録にはANSI Cでは宣言はブロックの「最初」になってませんか?
612が言っている「最初」というのはブロックの「最初」って言うことだと思ったんですが、、、

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

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

としていいよと聞こえるんですが、、、
#僕はCについては初心者なので、、、

626 :Kusakabe Youichi:01/12/01 08:42
>>624 デフォルトの名無しさん wrote:

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

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

# そんなにこわがらなくていいのに。

627 :Kusakabe 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を選んだのは正解でしょうね。
(でも現在の標準規格については書いてないので...でもまあ些細な差ですが)

628 :デフォルトの名無しさん:01/12/01 08:45
>>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

631 :Kusakabe 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
クサカベって誰?

633 :Kusakabe Youichi:01/12/01 08:51
>>629 デフォルトの名無しさん wrote:
> ところで-C99(もしくは同等の)オプションが通るコンパイラって一般的なのか
な?

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

これからは一般的ですね。

634 :デフォルトの名無しさん:01/12/01 08:52
クサカベは放置の方向でお願いします。

635 :Kusakabe Youichi:01/12/01 08:53
>>630 デフォルトの名無しさん wrote:

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

ということにしたいみたいですが、
実際には一番適切に(多すぎず少なすぎず)、もっとも正しい教え方をしていますね


636 :C勉強中 ◆RubyOmS2 :01/12/01 08:56
>>627
そうなんですか、、、
Cってたくさん規格があるみたいで面倒ですね、、、
で、現在の標準規格というのは、何て言うのですか?
それは、gcc2.95.3(cygwin)でも使えるのですか?
>>619と同じコンパイラを僕も使ってます、、、

637 :デフォルトの名無しさん:01/12/01 08:57
>>632
二度は書かないよ(荒れるから)

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

ここで暴れてる人。

638 :Kusakabe 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!

640 :C勉強中 ◆RubyOmS2 :01/12/01 09:00
ありゃ、、ログが流れるのが早い、、、
>>628さん、ありがと〜〜〜
でも、-C99オプションって、、gcc2.95.3では通らないの?

641 :Kusakabe Youichi:01/12/01 09:01
>>637 デフォルトの名無しさん wrote:

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

荒らすのかー

642 :C勉強中 ◆RubyOmS2 :01/12/01 09:02
>>639
うぃっす、、、
がんばるっす!

643 :Kusakabe Youichi:01/12/01 09:06
>>639 デフォルトの名無しさん wrote:
> とりあえず、「標準」が本当の標準になるまでは

もうなっていますよ。
古い標準の範囲内で書くかどうかは、
そのソースを古いコンパイラーで処理する可能性がある場合に
気をつかうべきでしょうね。

644 :Kusakabe Youichi:01/12/01 09:06
>>640 C勉強中◆RubyOmS2 wrote:
> ありゃ、、ログが流れるのが早い、、、
> >>628さん、ありがと〜〜〜
> でも、-C99オプションって、、gcc2.95.3では通らないの?

新しいのにすればいいのに。

645 :デフォルトの名無しさん:01/12/01 09:07
>>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%だし
しょうがねいね

647 :デフォルトの名無しさん:01/12/01 09:11
>>643
なってないよ。JIS X 3010:1993はまだ改訂されてない。

648 :デフォルトの名無しさん:01/12/01 09:13
VisualCとViaualBasicをやるならどっちがいい?
と友人に聞かれた。
俺は自分に合ったほうにすればと一応答えておいたが
本当はどちらのほうがいいんだろう…
やる用途にもよるだろうが友人は色々やってみたいと言っていたので
やはりどちらかと言えばVisualCの方だろうか…

649 :デフォルトの名無しさん:01/12/01 09:13
むむむ
とすると、標準 の基準ってなんだ?

650 :Kusakabe Youichi:01/12/01 09:13
In article <2ch.pc.tech.1005811510.645@2ch.net>, 645 デフォルトの名無しさ
ん <news2ch@toc.dyndns.org> wrote:

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

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

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

gccの場合はそうですね。

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

JISは問題外ですね。

652 :デフォルトの名無しさん:01/12/01 09:15
>>649
http://www.jsa.or.jp/ 見れ。

653 :デフォルトの名無しさん:01/12/01 09:16
一夜にして 100 レス以上・・・珍しいこともあるもんだ。

654 :デフォルトの名無しさん:01/12/01 09:17
デファクトスタンダード=標準 って考えちゃだめ?

655 :Kusakabe Youichi:01/12/01 09:18
>>648 デフォルトの名無しさん wrote:
> VisualCとViaualBasicをやるならどっちがいい?

どちらもやらない。

656 :デフォルトの名無しさん:01/12/01 09:19
>>655
そりゃあんまりだ。

657 :Kusakabe Youichi:01/12/01 09:19
>>649 デフォルトの名無しさん wrote:
> むむむ
> とすると、標準 の基準ってなんだ?

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

そもそもCに関して「ANSI対応!」とか「ISO標準準拠!」とかかかれた
本はあっても「JIS準拠のC!」とか書かれたやつは見たことないですね:)

658 :デフォルトの名無しさん:01/12/01 09:20
マジで放置の方向でお願いします。相手にしてはいけません。

659 :デフォルトの名無しさん:01/12/01 09:21
すくなくとも今流通してるコンパイラで
新しい標準でコンパイルできないは
けっこう多いので、古い基準で作った方が
幸せになれる、と

660 :デフォルトの名無しさん:01/12/01 09:22
相手にしてはいけません。レス付け厳禁。
「あれ?」と思っても、それは罠なので無視しましょう。

661 :デフォルトの名無しさん:01/12/01 09:26
変数を宣言するたびにスタックを確保するとか変なことを言ったので
猛烈にKusakabeさんが活躍したんですか?

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

663 :Kusakabe Youichi:01/12/01 09:27
>>654 デフォルトの名無しさん wrote:
> デファクトスタンダード=標準 って考えちゃだめ?

それがC99でしょ。いまは。

664 :デフォルトの名無しさん:01/12/01 09:29
放置の方向でお願いします。レス厳禁です。荒れないためにも。

665 :仕様書無しさん:01/12/01 09:30
voidにレスする,無視できない人間は、ム板の住人として
失格である。よってお前は去れ!

666 :デフォルトの名無しさん:01/12/01 09:30
>>657
>「JIS準拠のC!」とか書かれたやつは見たことない

ほとんどのC処理系は海外製だから。

667 :デフォルトの名無しさん:01/12/01 09:32
放置の方向でお願いします。レスしないでください。

668 :デフォルトの名無しさん:01/12/01 09:32
>>665
そういうお前はマ板の住人じゃないか。

669 ::デフォルトの名無しさん :01/12/01 09:35
>>668
今,マ板でやりあってるから、名前がそうなった。
voidにレスしたければ,ここへこい。
http://pc.2ch.net/test/read.cgi/prog/1007148964/
現在,討論中。

670 :Kusakabe Youichi:01/12/01 09:35
In article <2ch.pc.tech.1005811510.656@2ch.net>, 656 デフォルトの名無しさ
ん <news2ch@toc.dyndns.org> wrote:

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

いや、そんな悩みかたをする人はぜったいどっちもやらないほうが正解です。

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

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

単に「おれは古いのを使ってるぞ」っていうだけのことじゃん。

672 :Kusakabe Youichi:01/12/01 09:37
>>661 デフォルトの名無しさん wrote:

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

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

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

私が書いたのはそれより前からです。

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

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

# こういうひとはきっと世の中にタイムゾーンも1つしかないと思っているに
# ちがいない:)

674 :デフォルトの名無しさん:01/12/01 09:40
放置の方向でお願いします。

***決してレスしてはいけません***

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

っていうか、日本の本とかの話ですが。

676 :デフォルトの名無しさん:01/12/01 09:43
放置の方向でお願いします。相手にしてはいけません。発言は無視してください。

677 :デフォルトの名無しさん:01/12/01 10:03
まあ、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です。

679 :デフォルトの名無しさん:01/12/01 10:13
>>678
charだとしても、10の6乗だと、えーと、すげー大きいので
スタックに入らないとかなんとかじゃねーの?
よくわかんねーけど
そういうときは何かおまじないがあったと思うけど
面倒だからスタティックなところに確保しちゃえば?
それかmallocで確保しちゃうとか

680 :Kusakabe Youichi:01/12/01 10:27
>>678
In article <2ch.pc.tech.1005811510.678@2ch.net>, 678 デフォルトの名無しさ
ん <news2ch@toc.dyndns.org> 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は絶対にしないといけないのですか?

682 :デフォルトの名無しさん:01/12/01 10:55
>>681
ほっといてもプログラムが終了したら閉じてくれると思う
でもなるべくなら開けたら閉じよう。
このへん、マッピーのドアと一緒だね

683 :デフォルトの名無しさん :01/12/01 11:08
>>681
っつーか、それfjねたじゃん。
malloc()、free() みたいな。

684 :Kusakabe Youichi:01/12/01 11:14
>>681 デフォルトの名無しさん wrote:
> fopenしたらfcloseは絶対にしないといけないのですか?

fcloseするか終了するまでは開いたままになりますが、
それでかまわなければ。

685 :デフォルトの名無しさん:01/12/01 11:20
>>678
その配列は、サイズが最低でも 1000000 バイトもあって、
スタックが足りません。
グローバル変数にするか、static 変数にするか、
malloc で確保するか、スタックサイズを大きくするか、
しましょう。

686 :デフォルトの名無しさん:01/12/01 11:21
>>681
さては、開けたドアを閉めないタイプの人間だな?

687 :デフォルトの名無しさん:01/12/01 11:24
>>686
自動ドアだから気にしたことないもんで…

688 :デフォルトの名無しさん:01/12/01 11:25
OSのファイルハンドルに直結していると
OS側の上限個数にひっかかるだろうねえ

689 :デフォルトの名無しさん:01/12/01 11:26
>>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));
  }
}

コレはコレで問題がないワケじゃないんだけど,
それはまた別のお話・・・

690 :Kusakabe Youichi:01/12/01 11:31
>>687 デフォルトの名無しさんwrote:
> >>686
> 自動ドアだから気にしたことないもんで…

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

だからよくある「半自動」ドア(閉まるのだけ自動)みたいなのを
例に出したほうがいいのでは?

691 :デフォルトの名無しさん:01/12/01 11:31
>>689
あーあー
開放わすれてるー

692 :689: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);

693 :デフォルトの名無しさん:01/12/01 11:37
>>688
OSの制限以前にfopenで、開けるファイル数は制限されてる。
てか、今回の話題とは関係薄い。

694 :デフォルトの名無しさん:01/12/01 11:40
しなかったときの弊害、という点では関係があると思うけど。

695 :デフォルトの名無しさん:01/12/01 11:41
CのプログラムをC++のコンパイラでコンパイルするのは
いけないことなのでしょうか?

696 :Kusakabe 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);

で、それがプログラムの終了時だったりすると「アホだ」といわれたりする
わけです:)

697 :デフォルトの名無しさん:01/12/01 11:42
>>693
それってOSの制限なのでは?

698 :Kusakabe Youichi:01/12/01 11:43
>>694
694 デフォルトの名無しさん wrote:
> しなかったときの弊害、という点では関係があると思うけど。

ないですね。

fcloseすればかならず上限を超えないという保証があるわけじゃあないんだから。

699 :デフォルトの名無しさん:01/12/01 11:43
放置の方向でお願いします。
***レス付け厳禁です***
荒れないために、ご協力ください。

700 :Kusakabe Youichi:01/12/01 11:44
>>695 デフォルトの名無しさん wrote:
> CのプログラムをC++のコンパイラでコンパイルするのは
> いけないことなのでしょうか?

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

701 :デフォルトの名無しさん:01/12/01 11:45
>>689
>a[10000][10000][10000];

10000×10000×10000 = 1000000000000 = 1テラ (1000ギガ)
それわ無理です。。。

702 :Kusakabe Youichi:01/12/01 11:46
>>697 デフォルトの名無しさん wrote:
> >>693
> それってOSの制限なのでは?

OSの制限以前にプロセスごとの制限が小さいのでは?

703 :デフォルトの名無しさん:01/12/01 11:47
>>702
小さい って言い切る根拠は?

704 :デフォルトの名無しさん:01/12/01 11:48
>>697
fopenの制限はOSの制限よりかなりきつめ。(の処理系が多い)

705 :デフォルトの名無しさん:01/12/01 11:49
放置の方向でお願いします。>>703
***レス付け厳禁です***
荒れないために、ご協力ください。

706 :デフォルトの名無しさん:01/12/01 11:50
OSのファイルハンドルそのものと直結しない実装もありそうなもんだが・・・

707 :692: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 しろ!(`Д´)!」派?

708 :689:01/12/01 11:52
>>701
今気づいたです (;゚∀゚)> あと,笑ったです

709 :デフォルトの名無しさん:01/12/01 11:53
あ、ニセモノ探知機なのか

710 :Kusakabe Youichi:01/12/01 11:53
>>703 デフォルトの名無しさん <news2ch@toc.dyndns.org> wrote:
> >>702
> 小さい って言い切る根拠は?

「のでは?」を「言い切る」だとぼけたことを言う頭の程度は? :)

711 :デフォルトの名無しさん:01/12/01 11:53
放置の方向でお願いします。***レス付け厳禁です***荒れないために、ご協力ください。

712 :Kusakabe Youichi:01/12/01 11:54
>>707 692 wrote:
> ところで free on exit ネタにも触れたいんだけど

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

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

わたしのfj.comp.lang.cに以前書いた記事をみればわかりますね:)

713 :デフォルトの名無しさん:01/12/01 11:55
放置の方向でお願いします。

714 :デフォルトの名無しさん:01/12/01 11:56
>>711 >>713
誰もアンタにレス付けたりしないよ。放置しといてやるから安心しな。

715 :707:01/12/01 11:58
んー・・・んじゃ,fj 再読します・・・
# だって fj の記事って皮肉交じりで読みにくいんだもん

716 :デフォルトの名無しさん:01/12/01 11:59
ロケールについての質問はここでいいですか?

717 :デフォルトの名無しさん:01/12/01 12:01
傲慢だなKusakabeは。

718 :Kusakabe Youichi:01/12/01 12:01
>>715 707 <news2ch@toc.dyndns.org> wrote:
> んー・・・んじゃ,fj 再読します・・・

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

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

気のせいでは? 気にしすぎというか。

719 :Kusakabe Youichi:01/12/01 12:06
>>717 デフォルトの名無しさん wrote:
> 傲慢だなKusakabeは

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

# でもどこも傲慢ではないですね。

720 :デフォルトの名無しさん:01/12/01 12:07
放置の方向でお願いします。

721 :デフォルトの名無しさん:01/12/01 12:07
傲慢だね。

722 :715:01/12/01 12:26
すいません
こ,これだけ,これだけ教えてくれればすぐに逝きますんで

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

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

そですかー
ニューズグループのこと,まだあんまし慣れてないや・・・

723 :デフォルトの名無しさん:01/12/01 12:35
>>722
>fj の記事のバックナンバーどこぉ?

検索してください。

http://groups.google.co.jp/groups?hl=ja&group=fj.comp.lang.c
http://queen.heart.ne.jp/

724 :722:01/12/01 12:41
>>723
クスコ
言い訳:www.google.co.jp で検索しても出てこなかったんだー(T_T)

725 :Kusakabe Youichi:01/12/01 13:13
>>722 715 wrote:
> すいません
> こ,これだけ,これだけ教えてくれればすぐに逝きますんで
>
>  fj の記事のバックナンバーどこぉ?

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

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

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

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

たとえばTVやTVの番組はいくつものチャネルにわかれていますが、
「TVに出演する」のかわりに「ちゃねるに出演する」とか、
「TVに慣れていなくて」のかわりに「ちゃねるになれていなくて」って言いますか
?

726 :デフォルトの名無しさん:01/12/01 13:19
下手な例え話は、本質を霞ませるだけなので嫌い。

727 :デフォルトの名無しさん:01/12/01 14:03
こんなに書き込みがあるーっ!! (^o^)

728 :デフォルトの名無しさん:01/12/01 14:08
放置の方向でお願いします。

729 :デフォルトの名無しさん:01/12/01 14:25
># でもどこも傲慢ではないですね。

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

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

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

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

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

そう捉えれば、あれくらい「つきあいに手のかからない」人間(たぶん人間なんだよねえ)は
めずらしいくらいであり、かえって重宝する、と思われ。

730 :引用ウザ:01/12/01 14:39


731 :Kusakabe Youichi:01/12/01 14:39
>>729 デフォルトの名無しさん wrote:
> へみねこかぁ。別に傲慢ではないな。

ですね。

732 :デフォルトの名無しさん:01/12/01 14:40
放置の方向でお願いします。

733 :デフォルトの名無しさん:01/12/01 14:50
ほうちほうち言ってる方へ。
日下部さんにかまわないで、放置してください。

734 :Kusakabe Youichi:01/12/01 14:55
>>733 デフォルトの名無しさん wrote:
> ほうちほうち言ってる方へ。

新聞の勧誘なのかも。

735 :デフォルトの名無しさん:01/12/01 15:01
>>733

放置って言っている奴はうざいから放置しよう。

736 :デフォルトの名無しさん:01/12/01 15:21
わけわからんが、荒れてるのは確かだな。

737 :デフォルトの名無しさん:01/12/01 15:21
そのきっかけが誰かも確かだな。逝ってよし。

738 :Kusakabe Youichi:01/12/01 15:36
お願いですから、思いやってください。

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

そういう俺はK&Rをバイブルとして崇め奉ってるけど(w
「自分がわかりやすいと思うものでやれ しかし向上心は何であれ忘れるな」
つうこったわ(ワラ

740 :デフォルトの名無しさん :01/12/01 17:13
voidにレスするから、こんなことになる。
煽りたいやつは勝手に煽れ。俺はもうこのスレ放置する。

741 :デフォルトの名無しさん:01/12/01 17:18
voidじゃねえだろ、あれ。
つまらん

742 :デフォルトの名無しさん:01/12/01 17:20
>>681
いいえ。規格上、main 終了後に正しく後始末されることが保証されています。

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

俺程度の人間が一人抜けたところで大した影響はないけど、スレを荒らすと
回答側に回ってる人間に見放される可能性があるから、注意しろよ。>質問
してる人

743 :デフォルトの名無しさん:01/12/01 18:01
構造体と共用体ってなんでしょうか?
あと、プログラムを作る際の手法として流れ図と状態遷移図以外に何かあるんでしょうか?

744 :デフォルトの名無しさん:01/12/01 18:45
>743
同じフィールドに複数の名前を割り当てるのが共用体。
別の名前は別のフィールドに割り当てるのが構造体。

745 :デフォルトの名無しさん:01/12/01 18:48
>>744
厨房ですいません。フィールドって何でしょうか?
それと構造体をもう少し詳しく教えてもらえないでしょうか?

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

746 :デフォルトの名無しさん:01/12/01 18:52
>>745

同じ記憶領域に複数の名前をつけるの。
同じデータを共用するから共用体と。

747 :デフォルトの名無しさん:01/12/01 18:59
>>747
なるほど〜 ありがとうございました。
C言語でポインタの所では結構詰まる人が多いようですが何ででしょうね?

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

748 :デフォルトの名無しさん:01/12/01 19:00
>>747

コマンドラインパラメータはmain関数の第二引数(第一引数はそれの個数)かな?

749 :デフォルトの名無しさん:01/12/01 19:05
プログラムを作る際の手法として流れ図と状態遷移図以外に何かあるんでしょうか?

750 :Kusakabe Youichi:01/12/01 19:14
>>738
In article <2ch.pc.tech.1005811510.738@2ch.net>, 738 Kusakabe Youichi
<void@merope.pleiades.or.jp> wrote:

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

意味不明ですね。

751 :デフォルトの名無しさん:01/12/01 19:14
>749
HIPO,PADとか(w

っていうか宿題くさいんだが気のせいか?

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

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

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

あれを難解だと思うようでは「なんちゃって」系なんでしょうね:)

753 :デフォルトの名無しさん:01/12/01 19:16
>プログラムを作る際の手法として流れ図と状態遷移図以外に何かあるんでしょうか
「プログラムを作る際の手法」としての「流れ図」とかって言葉としてどうなん?
意味はわかるけど微妙にひっかかる。

754 :Kusakabe Youichi:01/12/01 19:16
>>743 デフォルトの名無しさん wrote:
> 構造体と共用体ってなんでしょうか?

本に説明が書いてありますよ。

755 :デフォルトの名無しさん:01/12/01 19:22
あぁ、相変わらずstaticの使い勝手がわからんのだが、ぁ、
大きい領域をあるスコープ内で宣言すると、ときたま
文字列が壊されちゃう可能性があるから、その文字列の
安全を保証するためにstatic宣言を行うんですか?
長くなくても、ある瞬間だけ使う変数じゃなくて、
数プロセスを経ても内容を安全に確保したいときは
staticを使うんですか?

756 :デフォルトの名無しさん:01/12/01 19:25
>>753
なんて言ったらいんでしょう・・・
プログラムを記述する際に、流れ図や状態遷移図なんかを書いてからプログラム作りませんかね?
プログラムを作る前に使う道具として流れ図や状態遷移図以外にないですかねって事なんですけど・・・
これじゃさっきと同じですかね・・・?

757 :デフォルトの名無しさん:01/12/01 19:28
>>755
金をケチらないで、入門書買え。

758 :デフォルトの名無しさん:01/12/01 19:32
>>756
書く人もいるし書かない人もいると思います。

759 :Kusakabe Youichi:01/12/01 19:37
>>747 デフォルトの名無しさん wrote:
> >>747
> なるほど〜 ありがとうございました。
> C言語でポインタの所では結構詰まる人が多いようですが何ででしょうね?

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

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

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

41ペイジと102ペイジを読みましょう。

760 :デフォルトの名無しさん:01/12/01 19:38
書く場合で考えたいんですが、作る前の道具として『流れ図』や『状態遷移図』以外に何かないですかねって事です。
なにかないですかね?

761 :Kusakabe Youichi:01/12/01 19:39
>>749 デフォルトの名無しさん wrote:
> プログラムを作る際の手法として流れ図と状態遷移図以外に何かあるんでしょう
か?

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

「プログラム作成の一般的な手順」については182ペイジに書いてあります。

762 :デフォルトの名無しさん:01/12/01 19:40
>>761
182ペイジって何の本の話?

763 :Kusakabe 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
それはそういった設計手法を新たに会得したいという
ことなのか?
流れ図や状態遷移図が肌に合わないとかで。
それだったらどれぐらいの規模のプログラムを組むとか
書いてくれなきゃなんともいいようがないよ。
短いプログラムで再利用もしないのならそんなの要らないし。

766 :デフォルトの名無しさん:01/12/01 19:47
>>761
あの・・・ 何の本のことでしょうか・・・
できればタイトルを教えていただきたいです。

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

>>765
いえ、別に会得したいとかじゃなくて、ただ単に気になったので・・・

767 :デフォルトの名無しさん:01/12/01 19:52
>>766
K&R

768 :デフォルトの名無しさん:01/12/01 19:53
関数スコープで宣言したローカル変数は関数を抜けると領域開放されてしまう。
次回その関数が呼ばれたときのために、前回の内容を残しておきたい場合に
はstatic宣言する。そうすれば変数領域は開放されない。

769 :Kusakabe Youichi:01/12/01 19:54
>>760 デフォルトの名無しさん wrote:
> 書く場合で考えたいんですが、作る前の道具として『流れ図』や『状態遷移図』
以外に何かないですかねって事です。
> なにかないですかね?

そもそもなんで「書く」が前提になるわけ?
どれがいいかわからないぐらいの知識なのに。

770 :デフォルトの名無しさん:01/12/01 19:57
>>767
あの・・・ どちらの版でしょうか・・・

771 :@@:01/12/01 19:58
http://freepage.gaiax.com/home/higashide/main このサイトつぶしてください

772 :デフォルトの名無しさん:01/12/01 20:03
>>769
書くにこだわらなくてもいいんです。
ただどんなものがあるのかを知りたくて・・・

773 :デフォルトの名無しさん:01/12/01 20:03
>>771
ムリ。

774 :デフォルトの名無しさん:01/12/01 20:04
>>772
意味不明、やっぱり宿題か?

775 :デフォルトの名無しさん:01/12/01 20:05
>>772
書かないなら「手法」はいらないじゃん?

776 :Kusakabe Youichi:01/12/01 20:07
>>766 デフォルトの名無しさん wrote:
> >>761
> あの(Iゥァ_燭遼椶里海箸任靴腓Δォ(Iゥ・
> できればタイトルを教えていただきたいです。

文字化けしないようにもう1回書いてみてください。

777 :デフォルトの名無しさん:01/12/01 20:10
>>770
http://cm.bell-labs.com/cm/cs/cbook/

778 :デフォルトの名無しさん:01/12/01 20:10
Kusakabeに質問すると効率悪いので無視の方向で。

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

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

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

>あれを難解だと思うようでは「なんちゃって」系なんでしょうね:)
人それぞれを理解できないようではプログラム以前の問題ですね:)

780 :デフォルトの名無しさん:01/12/01 20:16
放置の方向でお願いします。荒れないように。
***レス付け厳禁です***

781 :Kusakabe Youichi:01/12/01 20:18
>>772 デフォルトの名無しさん wrote:
> >>769
> 書くにこだわらなくてもいいんです。
> ただどんなものがあるのかを知りたくてゥ・

知る必要はないです。

782 :Kusakabe 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は難解だとの評価は大多数から既に出ている」とかいう理屈は
使えるわけですよね:)
つまり「そう思い込みたい」という言葉を使ってごまかそうとしているだけな
わけですね。

784 :デフォルトの名無しさん:01/12/01 20:45
おんなじ内容がダブってるね。
nntpの中継システムがバグってるのかな?

785 :デフォルトの名無しさん:01/12/01 20:46
適当にまんまコピーをしているので。

786 :デフォルトの名無しさん:01/12/01 20:46
本人たちにはわからないの?
ハタから見てると間抜けでしかない。

787 :デフォルトの名無しさん:01/12/01 20:51
ん〜、適当なものに
臭かべちゃんが狼狽しているとしか・・・(笑

788 :デフォルトの名無しさん:01/12/01 20:53
>>768
わかりやすくてサイコーでした。
そっかー、そーすっと、少し応用的に考えると、
コールバック内でHWND hChildとかをstaticにしないと
ページ違反とかがおきるのは、存在してるhChildが
関数を抜けるときいたづらされちゃうからとかそーいうのも
あるのKANA

789 :デフォルトの名無しさん:01/12/01 20:59
>>788
スレ違いだがそれはまったく別の理由だと思う

790 :デフォルトの名無しさん:01/12/01 21:00
>>788

便利な使い方を聞いていたんじゃなくて、意味を聞いていたのか。。。

791 :デフォルトの名無しさん:01/12/01 21:07
あるのKANAって書いて正解でした。
断定しないでよかったです。
前にAPI初心者のときstaticにしたかどうか忘れたけど
switch(msg)の前にi++とかやってカウンタできるかな
とか思って失敗してそれきりだった覚えがあるんですけど、
void func(){
static i=0;
i++
.....
}
とかやればiはカウンタになるのかが疑問だ!

792 :デフォルトの名無しさん:01/12/01 21:07
C実践プログラミング VS プログラミング言語C

どっちの本がいいか?

793 :デフォルトの名無しさん:01/12/01 21:08
>>789
別の理由かな?
HWNDをローカル変数に格納してるから、コールバックされたとき参照できな
くなって、スタックのゴミ値でWindowクラスにアクセスしようとしてるんじ
ゃないの?
staticにすれば解決するよ、多分。

794 :デフォルトの名無しさん:01/12/01 21:08
つきなみですがint
つきです

795 :デフォルトの名無しさん:01/12/01 21:09
>>791
なるよ。

796 :デフォルトの名無しさん:01/12/01 21:13
おっしゃー!
ナイスゲッチュー
ありがとうでゴザイ!(ました)

797 :Kusakabe Youichi:01/12/01 21:13
>>792 デフォルトの名無しさん wrote:
> C実践プログラミング VS プログラミング言語C
>
> どっちの本がいいか?

「迷ったら両方買う」が秋葉原の原則1の2

798 :それはいい:01/12/01 21:18
両方参照すべし。

799 :名無しさん@お腹いっぱい。:01/12/01 21:24
>>792
やっぱK&RがCのバイブルなのでは・・・?

800 :デフォルトの名無しさん:01/12/01 21:25
>>788
テンションは妙だが、それであっている。

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

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

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

この"K&R"は読むに及ばないものですね:)
いやさ、何かいいものがあるはずさ。キラリと光る禿げの一つもあろうというものさ。
:)

802 :デフォルトの名無しさん:01/12/01 22:06
>>801
面白くないからもうヤメレ。

803 :Kusakabe Youichi:01/12/01 22:07
>>801
In article <2ch.pc.tech.1005811510.801@2ch.net>, 801 デフォルトの名無しさ
ん <news2ch@toc.dyndns.org> wrote:
> > > > K&Rで真に理解したんじゃないのよ。
> > > > K&Rは難解だとの評価は大多数から既に出ている。
> > >あれを難解だと思うようでは「なんちゃって」系なんでしょうね:)
> >
> > 人それぞれを理解できないようではプログラム以前の問題ですね
>
> この"K&R"は読むに及ばないものですね:)

っていうか「自分が理解できないぼけ」だったことを正当化したいといって
K&Rを不当におとしめるのは問題ありますね:)

804 :デフォルトの名無しさん:01/12/01 22:13
ANSI-C言語辞典(技術評論社)は辞典です。
大部分は標準ライブラリ関数についての説明です。
欲しい関数があったらここから探せます。
便利ですので一冊持っておきましょう。

805 :デフォルトの名無しさん:01/12/01 22:13
>いや、そもそもK&Rとは、Kusakabe & Real 厨房なので、
>そんなものをバイブルにするなどもってのほか:)

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



「このK&R」にしないと理解できないのかヨ!

806 :臭カベ勇み足:01/12/01 22:29
買う人が少ないので、単価が

807 :デフォルトの名無しさん:01/12/01 23:02
伝わることを願うのですが、
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"}
}
とかしか思いつかないんですけど、これでいいんですか?
あぁ、

808 :デフォルトの名無しさん:01/12/01 23:06
>>807
いいんじゃねーの?;

809 :デフォルトの名無しさん:01/12/01 23:11
まぢですか?やってみりゃいいっつー話も
あるんすけどやってみるっす。

810 :デフォルトの名無しさん:01/12/01 23:23
>>808
二次以上の場合、配列の上限値をすべて書かずに [][] だとまずいと思われ。

811 :デフォルトの名無しさん:01/12/01 23:27
現実問題、そこまで複雑になったら構造体つかうべき。

812 :ミニラ:01/12/01 23:54
マクロの__func__が使えない場合、
代わりにデバッガ等でできますか?
環境はSun WorkShop 5or6です
使えたらデバッグ便利になるのになあ

813 :デフォルトの名無しさん:01/12/01 23:55
単純配列にいちいち構造体割り当てるの?

814 :デフォルトの名無しさん:01/12/01 23:56
「代わりにデバッガ等でできますか」って意味わかんない。

815 :デフォルトの名無しさん:01/12/01 23:58
かなり限定された処理系のマクロじゃない?

816 :デフォルトの名無しさん:01/12/02 00:00
当方、C言語を始めて5日目。恥ずかしながら四則計算が関の山です。
助けてっください。

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

1、2分法
2、割線法
3、ニュートン法
4、反復法

817 :デフォルトの名無しさん:01/12/02 00:02
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
数学板逝ってください

819 :デフォルトの名無しさん:01/12/02 00:03
検索エンジンで 2分法 割線法 ニュートン法 反復法 で検索して出てきたソース使え。

つーか、C言語初めて5日目でそんな課題出されたのか?

820 :デフォルトの名無しさん:01/12/02 00:07
>>819
5日目にしちゃ簡単な問題だと思われ

821 :デフォルトの名無しさん:01/12/02 00:07
プログラムの問題というより補間法の知識の問題だからねえ。

822 :デフォルトの名無しさん:01/12/02 00:10
くさかヴェ先生2号がカタッてた洒落なのですが

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

こりゃ何点あげればよかと?

823 :デフォルトの名無しさん:01/12/02 00:12
>>822
山田君、ざぶとん全部持ってきなさい

(ついでに sage なかった 822 のざぶとんも没収)

824 :816です:01/12/02 00:18
せめてヒントだけでも

825 : :01/12/02 00:19
>>817

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

文字列出力できたっけ?

826 :デフォルトの名無しさん:01/12/02 00:22
すいません %dですだ。

827 :デフォルトの名無しさん:01/12/02 00:23
>>824
おいおい、たった20分弱でしびれを切らすなよ。

828 :デフォルトの名無しさん:01/12/02 00:24
puts(__LINE__);

829 :デフォルトの名無しさん:01/12/02 00:25
>>824
簡単なプログラムなんだな。
だが俺は補間法なんかとっくに忘れてしまっているから答えられないんだな。

830 :デフォルトの名無しさん:01/12/02 00:29
2分法なんてバイナリサーチの実数版でしょ。

831 ::01/12/02 00:33
>>814
プログラム実行して、
使われる順番に関数名出力したいんでしょ

やりかたはわからんけどね

832 :デフォルトの名無しさん:01/12/02 00:33
じゃあ書いてやるからアルゴリズム書け!(一休)

833 :デフォルトの名無しさん:01/12/02 00:39
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");
 }

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

834 :デフォルトの名無しさん:01/12/02 00:47
>>824
何がわからん?

>>833
終端は何?
とりあえずそのプログラム滅茶苦茶

835 :816です:01/12/02 00:48
ああ、無能な俺・・・
ヘルプ・・・

836 :833:01/12/02 00:51
や、でしょうなあ。

K&Rの27ページと28ページにまたがって載ってるプログラムに、
これをホイッとくっつけてみたのです。

837 :暇人allザピーポー:01/12/02 00:52
>>835
とりあえず、どこがわからないのか書きなさいよ。
そうしたら手伝ったゲルよ

838 :833:01/12/02 00:58
これでも必死に考えてやってみたんですよ・・・
何かものすごく短くできる良い案が浮かびそうでカタチにならない、
そんな状況で、コレが出来てしまいました。

839 :デフォルトの名無しさん:01/12/02 01:00
>>833
for(i=1;i<=MAX;i++){
printf("%d,",i);
for(j=ndigit[i];j--;)
printf("*");
printf("\n");
}
普通にこんな風で駄目?

840 :デフォルトの名無しさん:01/12/02 01:05
<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言語辞典(技術評論社)より)

842 :デフォルトの名無しさん:01/12/02 01:15
どうでもいいけど__func__はC99にあるよ。
まあ、C99は限られた環境かもしれないけど…

843 :833:01/12/02 01:17
試しています・・・・・・・・・・・・・・・・

844 : デフォルトの名無しくん:01/12/02 01:19
C99ってコンパイルオプションとかで指定できるの?

845 :デフォルトの名無しさん:01/12/02 01:19
>>844
とりあえずgcc3.0以上ならオッケーっぽいぞ

846 :833: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を習ってるんですが、全く分かりません。
何か良い本はありますか?プログラミング自体初心者です。
ホントに基礎から勉強したいんですが、いい本あったら教えてください。
お願いします

848 :833: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プロフェッショナルを貯金をおろして
買ってしまいました。もう、後には引けません。

855 :デフォルトの名無しさん:01/12/02 01:44
>>852 cygwin と gcc じゃダメかい?

856 :デフォルトの名無しさん:01/12/02 01:45
>>852
Win32 なら、Borland C++ Compiler か Cygwin の gcc が無料で入手可能。
VC の無料版はない。

857 :デフォルトの名無しさん:01/12/02 01:46
>855とりあえず、プログラムが組めるなら何でもかまわないっす。

858 :デフォルトの名無しさん:01/12/02 01:47
どこにあるのでしょうか・・・

859 :デフォルトの名無しさん: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
リンク切れてただけかな?

866 :デフォルトの名無しさん:01/12/02 01:53
http://www.jaist.ac.jp/~fujieda/cygwin/

867 :デフォルトの名無しさん:01/12/02 01:54
>>862
http://www.google.com/search?hl=ja&q=C%2B%2B+Compiler+%96%B3%8F%9E%81%40%83_%83E%83%93%83%8D%81%5B%83h&btnG=Google+%8C%9F%8D%F5&lr=
そうか?

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
ポインタで受けてる関数だから。

872 :デフォルトの名無しさん:01/12/02 02:02
>>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言語 無料 ダウンロード コンパイラ
とか入れるぞ。

876 :874: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
参考書を一通り理解できても
役に立つプログラムが書けません。
どうしたら役に立つプログラムが
書けるようになれるのでしょうか?

882 :デフォルトの名無しさん:01/12/02 02:14
>>881

自分が必要に迫られるとか。

883 :デフォルトの名無しさん:01/12/02 02:15
>>881
何か自分で作りたいプログラムは無いのかよ。

884 :デフォルトの名無しさん:01/12/02 02:15
>>880
2つはgccだったり・・・。

885 :     :01/12/02 02:16
それが何を作っていいのか
分らないのです。

886 :デフォルトの名無しさん:01/12/02 02:17
>>884

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

887 :デフォルトの名無しさん:01/12/02 02:18
>>885

役立ちそうなライブラリを作って配るとか・・・

888 :デフォルトの名無しさん:01/12/02 02:19
参考書ってのがどの類の物か知らんが、言語を一通り理解したんなら
次は自分が使っている環境について勉強。
それで何も思いつかないようなら向いてないんじゃない?

889 :デフォルトの名無しさん:01/12/02 02:19
>>886
2つはターゲットがx86じゃ無い奴ね。

890 :デフォルトの名無しさん:01/12/02 02:20
>>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

ポインタは入力した値そのものじゃないよ。入力してフォーマットした後のものを入れる場所を指すアドレスだよ。

896 :895:01/12/02 02:30
アドレス自体はコピーされるけれど、二つのアドレス(実引数と仮引数)は指すところは同じだからその指すところをいじれば間接的に値を変更できるというわけ。

なんか説明が変だな・・

897 :デフォルトの名無しさん:01/12/02 02:43
そうすると SCANFの代入する値は変数そのものではいけないの
ですか?まず入力した値は、SCANFの&変数の中に代入される
みたいに書いてあったような気が・・

898 :デフォルトの名無しさん:01/12/02 02:43
>>892
「エロサイトのポップアップを消すソフトを作るために勉強するやつ。」
↑こういうのが上達すると思う。

899 :デフォルトの名無しさん:01/12/02 02:47
ポインタが難しいっていうけど何が難しいの?
Cのポインタって(C++は知らんが)すげー便利だなっておもったよ。

900 :デフォルトの名無しさん:01/12/02 02:48
>>899

一歩間違えばセグメンテーション違反

901 :デフォルトの名無しさん:01/12/02 02:52
この場合は関数側で加工するからじゃない?
変数のコピーを渡すと、加工しても元の変数は加工されないまま。
データを加工する関数は大抵ポインタ渡しだね。

902 :デフォルトの名無しさん:01/12/02 02:54
やれやれ…土曜の夜は厨房ばかりか。

>>897
入力された値を戻り値として受け取れないから、入れ物の場所を指定して
そこに入れてもらうため。
つか、ポインタと戻り値を理解できるまでK&Rを復唱せよ。

903 :デフォルトの名無しさん:01/12/02 02:54
>>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(){}
みたいな簡単な仕組みでよろしく

セグメンテーションフォールトが手に入ればそれでいい

908 :デフォルトの名無しさん:01/12/02 04:00
>>903
デバッグ以前に設計が悪い。

909 :デフォルトの名無しさん :01/12/02 04:15
実際問題極端な例(そう言う実装をせざるを得ない)を除いて、
梅干何個くらいならOK?
俺は***までは割とすんなりですが、
それを超えると逝ってよしと思ってしまう。。

910 :デフォルトの名無しさん:01/12/02 04:33
漏れも梅干しは3つぐらいまでだな。
それ以上は酸っぱすぎる。
文字列の配列へポインタとか。

911 :デフォルトの名無しさん:01/12/02 05:00
P/ECEを買ってC言語を…って方はいらっしゃいますか?(w

912 :Kusakabe 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次元か)

913 :Kusakabe Youichi:01/12/02 05:01
>>811 デフォルトの名無しさん wrote:

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

なぜ連体形? :)

914 :Kusakabe Youichi:01/12/02 05:02
>>816 デフォルトの名無しさん wrote:

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

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

# プログラム以前の問題のような。

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

ふつうに__func__つかえばいいんじゃないの?
そういう話じゃなくって?

916 :デフォルトの名無しさん:01/12/02 05:05
日下部さんって日コン連の人?

917 :Kusakabe Youichi:01/12/02 05:07
>>841 デフォルトの名無しさん wrote:
> K&Rスタイル
> K&R時代の(今となっては旧式の)書き方を言う。
> (ANSIC言語辞典(技術評論社)より)

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

C89以前のtradな書き方のことだろうか??

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

あるのでは?

919 :デフォルトの名無しさん:01/12/02 05:09
もう少しヒネリの効いたレスの付け方を考えられないのだろうか(わ

920 :Kusakabe Youichi:01/12/02 05:10
>>864
In article <2ch.pc.tech.1005811510.864@2ch.net>, 864 デフォルトの名無しさ
ん <news2ch@toc.dyndns.org> wrote:

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

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

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

110ペイジに書いてあります。

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

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

そういうのをさももっともらしく書くと本気にする人がいるかも。

922 :Kusakabe Youichi:01/12/02 05:12
>>881 wrote:

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

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

参考書に書いてあるプログラムが実際に役に立つプログラムだったりすると
そっちほうめんに行きやすいでしょうね。

923 :デフォルトの名無しさん:01/12/02 05:13
おい糞壁。
こっちの板の人達に迷惑かけてんじゃねえよ。

924 :Kusakabe Youichi:01/12/02 05:13
>>885 wrote:
> それが何を作っていいのか分らないのです。

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

# モティヴェイションは重要

925 :デフォルトの名無しさん:01/12/02 05:23
>>885
宿題スレにいって、答えてあげて下さい。
役に立ちます。

926 :デフォルトの名無しさん:01/12/02 05:58
日下部さんのヒープソートが大好きです! (・∀・)ヒマナオッサンダナ

927 :デフォルトの名無しさん:01/12/02 06:11
元祖厨房って・・・。
ttp://www14.big.or.jp/~midoriko/kusakabe/jinmei_4.htm

928 :Kusakabe Youichi:01/12/02 06:15
>>926 デフォルトの名無しさん wrote:
> 日下部さんのヒープソートが大好きです! (・∀・)(I墨典Z歙淌

「ねたを仕入れた」とおもって得意げにかくまえに、
ちゃんと本読んでみたほうが恥かかなくてすむぞ :)

929 :名無しさん@お腹いっぱい。:01/12/02 06:18
おっさんさぁ、結構ちゃんとしてるし頭切れるのも分かるんだけど
何でそんなにネットに時間費やすの?
俺見たいのなら分かるが、何か時間の使い方間違えてる気がするなぁ・・・
それでストレス発散になるってんならここはいい場所だろけどねー

930 :デフォルトの名無しさん:01/12/02 06:25
日下部さんの配偶者が美人だと聞きましたが本当でしょうか?

931 :Kusakabe Youichi:01/12/02 06:29
>>929 名無しさん@お腹いっぱい。 wrote:

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

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

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

つまり2chばかりしてると思い込んでいるのですね:)

932 :デフォルトの名無しさん:01/12/02 06:35
>>930 かわいい人だと思った。
女ってのは駄目な男にひかれるのかな、、、 と(失礼

933 :デフォルトの名無しさん:01/12/02 06:41
>>930
http://www.void.tako.org/void/

934 :デフォルトの名無しさん:01/12/02 06:53
>933
写真がいっぱいある・・・。
結構可愛いですね。

935 :デフォルトの名無しさん:01/12/02 06:57
>>934
嫉妬と羨望だよな。
そのサイトを注意深く探れば、もっといい写真が隠されてるよ。

936 :デフォルトの名無しさん:01/12/02 07:12
サイトが広いから探せない。

937 :デフォルトの名無しさん:01/12/02 08:03
すいません、初心者です。 下の方法はおかしいでしょうか
どうしても返ってきた時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);
}

938 :937 :01/12/02 08:12
あわわ、やっぱりしょうもない間違いでした −_−;
コピーの手前でlength=strlen(structsrc->member);メンバの名前を
間違えてました  情けない、、、2時間悩んだよぅ

939 :デフォルトの名無しさん:01/12/02 09:23
>>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() の実装とか関係ありますか?
あとログファイルのローテーションはどう実装したらよいですか?

941 :デフォルトの名無しさん:01/12/02 09:37
>>940
ログ専用プロセスを用意してそいつとプロセス間通信。
ローテーションもそのプロセスがやればよい。

942 :デフォルトの名無しさん:01/12/02 10:29
>>940
write()で一つのブロックを一回で追加書きこみが定石。
ファイルアクセスはそれ自体が排他的なんで、追加書きこみなら
何も気にしなくて良い。

943 :デフォルトの名無しさん:01/12/02 10:30
>>902 それなら、納得です。
いや、本みたら、ポインタ変数に直接、入力した値が書き込まれるみたい
に書いてあったので、へっ?って思ったけど、そのアドレス先の実体だけに
書き込んでいるのですね。 だからscanf( "%d" , &a)で入力した値は
aに書き込まれて,&aの値(番地)は入力前も入力後も同じですよね。

944 :デフォルトの名無しさん:01/12/02 12:00
質問なんですが(厨な質問でしたらゴメンナサイ)、なぜ
scanf()を使うのがよくないんですか?
誰か説明してくれませんか?初めて知りました・・・

945 :デフォルトの名無しさん:01/12/02 12:13
scanf()を使うのがよくないって誰か書いた?

946 :デフォルトの名無しさん:01/12/02 12:18
>>945
いや、なんかさっき別の板でも言ってた人いましたし、
ずいぶん前に、知り合いがボソッと言ってました。
何でかって、知り合いに聞いたんですけど難しい言葉を
並べられただけで・・・
自分には理由がわからないんです。だから教えてもらい
たくって・・・

947 :デフォルトの名無しさん:01/12/02 12:21
>>939
>SIGSEGV に対応するシグナルハンドラ
おっとーそういやそんな仕組みあったな。
つーか、例外が起こったら適当に傷を記録して
そのあと元処理に復帰したいんだけど、なかなかムずいね

Javaってこの辺楽なんだよね。遅くっても許すって感じ

948 :デフォルトの名無しさん:01/12/02 12:30
>>946
書式と型や入力数が異なってもエラー検出できないからかな?
CUIやらないんで使った事ないや。

949 :Kusakabe Youichi:01/12/02 12:33
>>946 デフォルトの名無しさん wrote:
> ずいぶん前に、知り合いがボソッと言ってました。

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

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

なんだ聞いたのですか。
もう少しわかりやすく言ってくれってたのんだらどうですか?

950 :デフォルトの名無しさん:01/12/02 12:54
>>949
忘れてました。
でもこの板見つけたから、詳しい人が沢山いるだろうと思って聞いてみました。

951 :デフォルトの名無しさん:01/12/02 13:13
>>946
scanf() が使いづらいのは

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

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

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

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

と 2 段階にした方がつぶしがきくので、よく使われます。

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


あと、ほかのsscanf()などとちがって、改行をまたぐときの問題がありますね。

953 :デフォルトの名無しさん:01/12/02 13:26
>>951.952
ありがとうございます。知りたかったことがわかってよかったです。

954 :デフォルトの名無しさん:01/12/02 13:37
さて、そろそろ次スレの季節。

955 :デフォルトの名無しさん:01/12/02 13:40
他にC言語で、あまりよくないものってあるんでしょうか?

getc,sscanfの他にgetsなんてのはどうなんですか?

956 :デフォルトの名無しさん:01/12/02 13:43
>>955
gets() は最悪ですね。バッファオーバーランが防げない。

957 :デフォルトの名無しさん:01/12/02 13:51
バッファオーバーランってなんですか?
入力はgetcとsscanfがいいって事ですか?

958 :デフォルトの名無しさん:01/12/02 13:54
>>957
とりあえず google 逝け。

959 :デフォルトの名無しさん:01/12/02 13:56
>>942
write()では一度に指定したサイズを書ける保障はないので、
ロック -> ファイル末尾へシーク -> 書き込み -> アンロック
の方が確実だと思われ。

960 :Kusakabe 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 を使うべき。

962 :デフォルトの名無しさん:01/12/02 14:13
>>960
すいませんが、特定の本を出されても困っちゃいます。
それに何の本ですか?

>>961
なるほど。そういうことなんですか。ありがとうございます。

963 :デフォルトの名無しさん:01/12/02 14:17
>>962
> すいませんが、特定の本を出されても困っちゃいます。
> それに何の本ですか?

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

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

#同意も反論も不要。なんかあったら↑のスレで言ってくれ。

964 :Kusakabe 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サーバーソフトが設定するのだとばかり思っていましたが。

969 :968:01/12/02 14:24
とりあえず、fgetsにします。

970 :デフォルトの名無しさん:01/12/02 14:31
>>968
今時 Web サーバにバグがない、なんてことは誰も信じてません(w

まぁ CONTENT_LENGTH が腐ってることはまずないと思いますが、それでも万が一の
ときにバッファオーバーランが発生する(しかも検出できない)のと、エラーをプログラ
ム側で検出してログに残すなり何なりの対処を取るのでは、プログラムの信頼性が
違ってきますし、バグへの対処に要する時間も変わってきます。

971 :デフォルトの名無しさん:01/12/02 14:53
赤信号が出てるので新スレ作りました。
速やかに移動してください。
http://pc.2ch.net/test/read.cgi/tech/1007272267/l50

972 :newbieM:01/12/02 15:12
今ある特定のディレクトリの中のファイル名を比較して
リネームというようなソフトを作ろうと思っているんです。
つまりaっていうフォルダに
abc.txt
efg.txt
・・・・
ってあったとき
abc.txtをエービーシー.txt
efg.txtをイーエフジー.txt
という風に初めからあるリストと比較してリネームしたいんです。
ですが具体的にどのように書いたらいいかがわかりません。
どの命令を組み合わせるかおしえていただけないでしょうか?

973 :デフォルトの名無しさん:01/12/02 15:21
>>972
そのプログラムを組むには、いろいろ関数を使います。
もう少し的を絞って質問してください。
それと、新しい、スレに移動もおねがいします。

974 :Kusakabe Youichi:01/12/02 15:28
>>972 newbieM wrote:
> 今ある特定のディレクトリの中のファイル名を比較して
> リネームというようなソフトを作ろうと思っているんです。

man 5 rename

975 :newbieM:01/12/02 15:31
了解しました。
早速移動して書き直したいと思います。
が、ほんとにまったくわからないんです。
一つのファイルだけならできるんですが・・・

976 :デフォルトの名無しさん:01/12/02 15:32
>>975
プラットフォームは?

977 :newbieM:01/12/02 15:33
>974さん
意味わからないです(w_−; ウゥ・・

978 :デフォルトの名無しさん:01/12/02 15:36
>>977
分からなくていい。>>963 見とけ。

979 :デフォルトの名無しさん:01/12/02 15:38
>>977
OSは?
答えはは新スレで

980 :デフォルトの名無しさん:01/12/02 23:53
>本気で「ひとそれぞれ」だと思っているんだったら、
>「K&Rは難解だとの評価は大多数から既に出ている」とかいう理屈は
>使えないわけですよね:)

「人それぞれ」って「K&Rは簡単ってことになる」と思い込んでいる人もいるようですね:)
っていうか「そういうこと言う人が多いですよ」ということと「理屈は使えない」ってどう繋がるのでしょうね:)

981 :デフォルトの名無しさん:01/12/02 23:55
>>980
なに、この人?

982 :デフォルトの名無しさん:01/12/03 00:01
名無し登場臭壁チャン

983 :C初心者:01/12/03 00:05
結城浩せんせのC言語プログラミングレッスンの
EOFまで繰り返せまで進んだんですが僕も話しに加われますか?

984 :デフォルトの名無しさん:01/12/03 00:27
>>983
加わってもいいけどもうスレが終わりです。

985 :デフォルトの名無しさん:01/12/03 00:35
ちなみに次スレはこれね。

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

236 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)