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

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

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

1 :sageジョブス:01/10/19 00:17
おれは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言語なら、オレに聞け! <6>
http://piza2.2ch.net/test/read.cgi/tech/999617524/

2 :デフォルトの名無しさん:01/10/19 00:19
ポインタってなんですか?

3 :武夫。:01/10/19 00:19
こんにちは

4 :デフォルトの名無しさん:01/10/19 00:31
>>2
アドレス

5 :前すれ 973:01/10/19 03:07
>> 前すれ 974 さんへ
すみません, 話のふりがまずかったですね.

> if (sscanf(str, " hogehoge = %d ", &n) == 1) {
はもちろんその通りです.

で, scanf() っていろいろ癖がありますよね.
例えば書式文字列中に空白があったときは, 入力フィールドはどういう風に
扱われるとか, 書式文字列中では \n は必要なのかとか, %s 使ったら
(あたりまえなのかもしれないけど)入力フィールドの文字列全部取られたとか ...

そういうのをより実践的な例を使って説明してる本とか Web とかって
ほとんどないですよね ? で, そういう話をここでできてばいいなあと
思って話をふってみました(失敗した感じだけど).

おそらく本職のプログラマさんはこんなのが必要なときは
scanf() なんか使わないで, もっとがりがりトークンの切り出しのプログラムとか
lex/yacc とか使うんだろうとは思うんですけどね(ちなみに私は本職のプ
ログラマではありません).

6 :超初心者:01/10/19 03:58
連立微分方程式を数値積分して解くときに、
最大原理を用いて、4次のルンゲクッタ法で計算したいのですが、
ポインタを使わないで計算するプログラムソースとかありませんか?
または最大原理を説くプログラムソースなどがある場所を教えて下さい。

7 :デフォルトの名無しさん:01/10/19 04:05
シューティング法のプログラムがわかりません。
どこかにないですか?

8 :デフォルトの名無しさん:01/10/19 04:12
シューティング法ってなに?
ねぇ、なに?
教えてよ、お願い

9 :デフォルトの名無しさん:01/10/19 04:38
>8
C言語で書かれた、シューティングゲームのソースです。

10 :デフォルトの名無しさん:01/10/19 04:45
>>6
ポインタを使うと何か不都合がありますか?

11 :超初心者 :01/10/19 04:56
>>10
ポインタを使った事がないので、プログラムが理解できないです・・・鬱
2次の配列を使ってやるのが良いと言われたのですが・・・
何処かにないですか?初心者ですみません。

12 :デフォルトの名無しさん:01/10/19 06:05
最大原理を用いる4次のルンゲクッタ法を私に教えてくれれば、
私がプログラムを書いてあげよう。

13 :デフォルトの名無しさん:01/10/19 07:03
>>12
そのくらい自分で調べろよ。

14 :974:01/10/19 07:26
>>5
K&Rに書いてあるだろ。
他の本はしらん。

15 :デフォルトの名無しさん:01/10/19 10:46
タコな質問ですいません。
VBでChr(9)のようにAscii文字を指定するような関数って
Cにもありますか?

16 :ぷろぐらまぁ:01/10/19 10:50
>>15
出力先によっても違うが、printfかsprintfかfprintfあたりを使うと良い。
ex) printf("%c", 65); /* ASCIIコードで65が出る */

17 :デフォルトの名無しさん:01/10/19 10:54
>>15
char ch = 9;
変数に直接アスキーコードを代入すればいい。

18 :15:01/10/19 10:57
>>16
ありがとうございます。
できれば標準入出力ではなく、VBのように
const chr* Chr( int );
のような感じで関数として使いたいのです。
こういうのってやっぱ自分で作らないといけないんですかね。

19 :15:01/10/19 10:58
>× const chr*
>○ const char*
ですね。

20 :デフォルトの名無しさん:01/10/19 11:07
>>18
Cでの文字列の取扱に関して理解してる? 文字と文字列は別だよ?

21 :!=17:01/10/19 11:08
>>15
何がしたいのか分からん。
'\t'や'\x9'や'\011'の文字定数や(char)9も結局9だし、
それを文字として印字したいならprintf("%c", 9)やputchar(9)。
VBの頭でCを考えてないか?

22 :15:01/10/19 11:22
>>17
そっか、別にわざわざ関数化することないんですよね。
なんか難しく考え過ぎてました。

23 :デフォルトの名無しさん:01/10/19 13:14
String型ってやっぱ欲しいよね。
というわけでむかし自作したんだけど
需要あるのかな?

24 :デフォルトの名無しさん:01/10/19 13:35
>23
PascalやVBで使われてるStringと互換性を持たせれば、あるいは。

ってかもうあるような気もするけど、知らない。

25 :デフォルトの名無しさん:01/10/19 13:53
>>23
オラ、イラネ

26 :デフォルトの名無しさん:01/10/19 14:13
高速かつ低資源な検索ルーチンを教えて。
ハッシュだとある程度の数なら十分に動作するんだが・・・
数が大量になるとスピードがでない。
なんか良いロジックある?

それともここは
「printf」で数値を出力したい場合のフォーマットは何?って
レベルのことを聞くところかな?

27 :デフォルトの名無しさん:01/10/19 14:15
>>26
ハッシュってのがまさしくそれ。
たぶん実装がヘボいと思われ。

28 :デフォルトの名無しさん:01/10/19 14:23
>>27
激しく同意。

>>26
>「printf」で数値を出力したい場合のフォーマットは何?って
>レベルのことを聞くところかな?

というのだったら、

>数が大量になるとスピードがでない。

などとあいまいなことを書かずに、

>逐次検索アルゴリズムでは,検索データが見つかるまでの条件判定文@の
>実行回数は最小1回,最大[(3)]回である。検索データXの出現確率がS1〜Snの間で
>一様分布するとき,条件判定文@の平均実行回数 はおよそ[(4)]回である。
>したがって,この検索アルゴリズムの計算量のオーダは[(5)]であるといえる。
> 一方,2分検索アルゴリズムでは,配列Sのデータは[(6)]必要があり,
>その計算量のオーダは[(7)]である。

ぐらいの考察をかましちゃってもいいんだよ。
みんな分かるから。

29 :26:01/10/19 14:24
>>27
あら、それを言われると辛い(^^;)
じゃ、高速なハッシュってどうやって組むの?
私のルーチン、いたって標準的な使い方だと思う。
100万のオーダなら平気だけど、2000万近くになると…

へぼいって言ってくれるくらいだから、さぞや素晴らしいロジックを
持ってるんだろうね。教えてください。

30 :デフォルトの名無しさん:01/10/19 14:33
>>29
>じゃ、高速なハッシュってどうやって組むの?

だから、オーダーでものを言え。
どう低速なのか説明できないのか?

31 :デフォルトの名無しさん:01/10/19 14:49
>>26
オープンアドレス法?
チェイン法?
(って話からするとチェインか?)
ハッシュテーブルのサイズは?

2000万近くあるなら BST のほうがいいかもよ。
もしくはチェインの下に BST を吊すとか。

32 :26:01/10/19 15:09
>>28、30
27へのレスを書いてる際には28のレスは無かったのよね。
別に変に煽ろうとかって意味じゃないから(^^;)

>>31
チェイン法使ってます(たぶん(^^;))
BSTって言葉の意味がわかりませんので解説してもらえませんか?
申し訳ないです。
ハッシュのサイズは現在色々試してるんですが、資源量との兼ね
合いもあるので、そんなに大きくは取れない状態です。今のとこ
ろ1万位かな?まだ妥協点を探している最中なんで(^^;)

33 :デフォルトの名無しさん:01/10/19 15:29
>>32
BST はバイナリサーチツリー、2分探索木ってやつ。

ハッシュテーブルのサイズが1万ってことは
それにリスト垂らしてて 2000万 とかなら
一つのテーブルに 2000 もの長さのリストがあって
それを線形探索してるのか? 平均1000ぐらいの比較?

BST なら 2000万 の要素でも 24,5回の比較で探索できますよね。
チェインに1000個の要素の BST なら 10回ぐらい。

BST の実装法は探せばいっぱいでてくるはず。

34 :33:01/10/19 15:33
日本語変だ…。鬱氏

35 :26:01/10/19 15:39
>>33
ありがと。確かに自分のコード、しょぼかったです。

36 :デフォルトの名無しさん:01/10/19 15:40
あぁ、オーダーっつーのは、計算量のことね。
データの量じゃないぞ。

37 :デフォルトの名無しさん:01/10/19 16:22
>>33
べつに、木をぶら下げなくても、
じどうでハッシュのサイズを拡張するようにすればいい。
Optimize・・・ とか言う本に詳細載ってたけど、
具体的な書籍名は忘れた

38 :デフォルトの名無しさん:01/10/19 16:55
>>37
チェイン法において、リストの代わりに木を使うって話だよ。
ハッシュテーブルに全てを入れようとするのは大変なだけだと思う。
サイズ変えるコストも馬鹿にならないだろうし。

39 :デフォルトの名無しさん:01/10/19 17:14
>>38
詳細は覚えてないんだけど、再ハッシュする必要がある要素は、
極わずかっていう手法だったはず。

40 :デフォルトの名無しさん:01/10/19 17:19
char *name[]={"ノビタ","シズカ","スネオ"};
char name[][6]={"ノビタ","シズカ","スネオ"};
上と下の初期化の仕方って、どっちがいいの?

41 :デフォルトの名無しさん:01/10/19 17:22
>>40
上と下ではまるで意味が違います。

42 :デフォルトの名無しさん:01/10/19 17:23
>>40
良い悪いじゃなくて、処理内容が違うんで目的によります。
char *str = "abc";
char str[4] = "abc";
この違い分かってます?

43 :42:01/10/19 17:25
あらかぶっちゃった。スマソ。

44 :デフォルトの名無しさん:01/10/19 17:37
>>42
すみませんが詳しく教えてください。

45 :デフォルトの名無しさん:01/10/19 17:43
>>42
自分で勉強しろよ。

46 :デフォルトの名無しさん:01/10/19 17:50
>>44
この程度は基本。2chで訊くようなものじゃない。
K&Rを死ぬほど読め。

47 :デフォルトの名無しさん:01/10/19 17:55
> K&Rを死ぬほど読め。

最近このスレで流行ってる?

48 :デフォルトの名無しさん:01/10/19 18:28
>>47
このスレッドでは最近かもしれないが、世間ではここ十年以上は流行ってると思われ。

49 :デフォルトの名無しさん:01/10/19 18:48
>>6
服部雄一:C言語とPADによる数値計算(培風館)

>本書ではポインタ変数を一切使わずにプログラムを記述する。

50 :デフォルトの名無しさん:01/10/19 18:58
>>49
それって、著者がポインタを理解してない上にサンプルがトンチキで有名な本では…

51 :47:01/10/19 19:10
>>48
あ、K&R でなくセリフがね…

52 :デフォルトの名無しさん:01/10/19 19:55
>>50
そうなの?…じゃあこれ
Numerical Recipies in C[日本語版](技術評論社)

53 :デフォルトの名無しさん:01/10/19 20:34
あげようよ。
そこから始めようよ。

54 :デフォルトの名無しさん:01/10/19 20:47
K&Rってそんなにいいのか?
アンサーブックで十分だろ。

55 :デフォルトの名無しさん:01/10/19 20:58
K&R?
初心者にはお勧めできない。

56 :デフォルトの名無しさん:01/10/19 21:07
すみません、既出かもしれないけど、ここで質問させて下さい。
ポインタで悩んでます。

普通の変数だったら
int a;
a = 10;
を一行で初期化を表現するには
int a = 10;
と書けばよいわけですよね?

ところがポインタだと、
int x = 10;
int *p = &s;
という具合に、右辺に書く内容が *p についてではなくて p になってしまうのですか?
メモリの中身(*p)でなくて、番地(p)を書くのですか?
もしそうだとしても、感覚的に理解できないのです。

57 :56:01/10/19 21:11
すみません、下から4行目は
int *p = &x;
でした。スマソ。

58 :デフォルトの名無しさん:01/10/19 21:14
int a;
int *p = &a; // *はポインタであることを示すだけ

int *p;
p = &a;
int b = *p; // *はポインタが指す内容

という違いがある。
変数宣言時の'*'とその他の場所の'*'は違うよ。

59 :デフォルトの名無しさん:01/10/19 21:17
ちなみに後者は「ポインタ演算子」と呼ばれるもので、+や-などと同じカテゴリ。
&もそうだね。

前者をなんと呼ぶのかは知らん。

60 :デフォルトの名無しさん:01/10/19 21:20
そんなことを56は言ってんじゃないと思うが。
何かを指すものがポインタだから、としか言いようがない。

61 :56:01/10/19 21:21
レスありがとうございました。

>変数宣言時の'*'とその他の場所の'*'は違うよ。
心の中でもやもやしてたものが晴れました。
ありがとうございます。
ポインタの宣言するときだけは
int* p=&a;
のイメージで捉えたらいいのですね?

62 :デフォルトの名無しさん:01/10/19 21:22
漏れはコンパイルの度にmakeって打つことによって、
人生通算で何回負けたかワカラン

63 :デフォルトの名無しさん:01/10/19 21:27
>>60
そんなことを56は言ってんじゃないと思うが。
つーか、あんた何で56の言いたいことがわかるのさ!

64 :デフォルトの名無しさん:01/10/19 21:29
>>61
>int* p=&a;
>のイメージで捉えたらいいのですね?

イメージとしてはそうかもね。C++ではそういう風に書くのが推奨されてるし。

でも、
int *p, *q;
と書くつもりで、
int* p, q;
ってイメージして
int *p, q;
ってやっちゃ駄目よ。

65 :60:01/10/19 21:30
>>63
56を読んでそう思ったからだ。
少なくとも型指定時の*と間接参照の*を混乱しているようには
読めなかった。まぁ56が疑問を解決したのならいいけど。。

66 :デフォルトの名無しさん:01/10/19 22:33
bcc32でコンパイル、実行すると特に問題なく動作プログラムがあって、
それをVCでコンパイルならできるのですが、実行すると

runtime error R6002
- floating point not loaded

というメッセージがでてエラーになります。
このメッセージの意味は何なんでしょうか?

67 :ビル・ジョブス:01/10/19 22:39
>>みんな
宣言時はポインタ修飾詞。

>>56
intは整数を入れる変数だよね。
で、ポインタはアドレスを入れる変数だよ。
(もう分かってる?)

68 :ビル・ジョブス:01/10/19 22:46
>>66
DOS窓だね。
浮動小数点演算がソフトウェアエミュレーションになってる?
VCの設定は確認済み?

69 :66:01/10/19 23:05
>>68
はい、DOS窓です。
浮動小数点を使っているのは一箇所だけ実行時間を計っているところだけ
なんですが、printfで表示するときに直接計算せず、いったんdouble型の
変数に代入してから実行するといけました。
そのソフトウェアエミュレーションというのを設定するというのは
どこをいじればいいんでしょう?ヘルプで「ソフトウェアエミュレーション」
といれても、でてこなかったので...。

70 :デフォルトの名無しさん:01/10/20 11:04
hitck[ix][iy]=off;
ixとiyの関係を教えて下さい。

71 :デフォルトの名無しさん:01/10/20 12:50
>69 一箇所だけなら 整数で計算させたらいいじゃんと思うのだが?
  単に少数点表示がメンドクサって事だけでしょ?

c=a/b
((a-c*b)*100)/b

72 :デフォルトの名無しさん:01/10/20 13:03
flushかそんな感じのあったと思ったけど忘れた。教えて。
printfで事情があって改行しなかったら出力されなかったので、flushしたい。

73 :デフォルトの名無しさん:01/10/20 13:24
fflush()

74 :デフォルトの名無しさん:01/10/20 13:26
>>71 div()というのも蟻

#include <stdlib.h>
div_t d = div(a, b);
printf("%3d.%.2%%\n", d.quot, d.rem);

75 :デフォルトの名無しさん:01/10/20 13:28
fflush(stdout)

76 :74:01/10/20 13:31
これは適切じゃないな、スマソ。

77 :デフォルトの名無しさん:01/10/20 13:48
fパラメータって無いのか

78 :デフォルトの名無しさん:01/10/20 15:45
fflush()って、どういう時に使うのですか?
バッファを書き出す、と言われてもピンと来ない……。

79 :デフォルトの名無しさん:01/10/20 15:55
#innkuru-do <esuthidhiaio-dotto.etti>
boido meinn (zoido)
{
innto a,b,c
huro-to x,y

purinntoehu("itteyosi")
あぎゃあああああああああああ
}

80 :80:01/10/20 17:13
そもそもストリームって何のことですか?

81 :デフォルトの名無しさん:01/10/20 17:22
>>80
川の流れのようなもの

82 :デフォルトの名無しさん:01/10/21 08:34
C言語でマルチスレッドプログラミングってできるもんなんでしょうか?

83 :デフォルトの名無しさん:01/10/21 08:43
>82
 OSによってはAPIを呼び出せば非同期型スレッドは簡単

 SETJMP LONGJMPで 同期型のスレッドは作れる
 もちろんアセンブラでスタック切替をしても同じ。

84 :デフォルトの名無しさん:01/10/21 12:25
タコな質問ですが、たとえば、

あいうえお<A>かきく<B>けこ→あいうえお@かきく\けこ

のようにある記号で挟まれた文字列をその内容によって
変換するようなプログラムってどう書けばいいでしょうか?

85 :デフォルトの名無しさん:01/10/21 12:44
>>84
???
いまカッコ内かどうかのフラグを持たせて、
フラグがたってる間だけ変換処理を実行する。
じゃ、ないの?

86 :デフォルトの名無しさん:01/10/21 13:42
>>82
pthreadライブラリを探せ

87 :デフォルトの名無しさん:01/10/22 05:33
>>84
それって正規表現使うのがいいんじゃない?
Cに正規表現ライブラリってあるかなぁ?

88 :56:01/10/22 10:20
>>56-57で質問させて頂いた者です。
みなさんレスありがとうございました。
しかし一度は納得したものの、再び分からなくなってしまいました。
というのも、

void main(void)
{
char* p="A";
printf ("%d\n",*p);
}

を実行したら、65 が表示されたからです。
『あれ? この場合は65番地の中に入ってるデータが表示されるんじゃなかったのか!?』
とパニックになってます。

どなたかお助けを!!

89 :デフォルトの名無しさん:01/10/22 10:32
>>88
p と *p は全然別のもの。
ちなみに 'A' == 65 である。

void main(void) {
char *p;
p=65;
printf ("%d\n",*p);
}

とするか

void main(void) {
char *p = 65;
printf ("%d\n",*p);
}
とすればお望みの動作になる。

90 :デフォルトの名無しさん:01/10/22 10:34
>>88=56
文字列を " " で囲むと,それは文字列へのポインタになります
しかも文字列の末尾にはちゃんと nil 文字('\0')が付加されます
p にはその文字列へのポインタが代入されます
*p を参照すれば,そこにはポインタに指し示された部分にあるデータを得ることができます
つまり p にはよく分かんないアドレスが,*p には 'A' が入ってるってこと

65 番地のデータを表示させたいならば
char* p = 'A';
もしくは
char* p = 65;

# きっと正確な説明じゃないと思うけど,こんな理解でも大丈夫なはずです

91 :デフォルトの名無しさん:01/10/22 10:34
ここでは65=0x41 という文字コードが印刷されたという事です >>88

C言語の文字列はバイト列をそのまま扱うような形になります
他の言語で文字型、文字列と順序型が明確に区別されていたのに馴れていると
訳が判らなくなると思います。

*p は いつでも (int)ord(*p) という変換がされているとでも考えて下さい

92 :56:01/10/22 10:48
>>90
>文字列を " " で囲むと,それは文字列へのポインタになります

そ、そうだったんですか・・・・(納得)
'A'はどういう意味になるのですか?

>>91
すみません、僕の頭ではちょっと難しくて・・・・(^^;)
C以外さわったことないんで。。

93 :デフォルトの名無しさん:01/10/22 11:13
>>92
char型という8ビットの"整数"です。
char型はASCIIひと文字分の文字コードを扱うのに使ったりします。
C言語の文字列はchar型の単なる配列です。

94 :デフォルトの名無しさん:01/10/22 11:26
文字コードを意識したくない。
どうすればいいかな?

95 :デフォルトの名無しさん:01/10/22 11:28
>>94 他の言語を使え Windowsなら C++とかDelphiとか

96 :デフォルトの名無しさん:01/10/22 11:48
ある掲示板で char, short, long は使うな、
int8_t, int16_t, int32_t を使えと言われたんですが、
char, short, long では何かまずいんでしょうか?
教えてください。

97 :デフォルトの名無しさん:01/10/22 11:51
>>96
なにもまずくないけど?

98 :デフォルトの名無しさん:01/10/22 12:00
>>96
目的も書かずに、「char, short, longは使うな、
int8_t, int16_t, int32_t を使え」っていうのでは何とも言えない。
「何のために」っていうのがまずあるはず。
教えて下さいの前に、質問の仕方を改めること。
場合によっては、Cは使うな、Perlの方がずっとその目的には向いてる、
ということもある。

99 :デフォルトの名無しさん:01/10/22 12:40
>>95
C++やDelphiだと文字コードを意識しなくていいって?
Delはプラットホームが限られるからってことか?

100 :デフォルトの名無しさん:01/10/22 13:59
MS-DOS/V 6.2 で10ms間隔で割り込みを発生させ、カウンタを作りたいんです。

ネットでいろいろ検索しましたが、うまく行きません。
知っておられたら、教えてください。

環境:MS-DOS/V 6.2
コンパイラ:VC++ 1.51 (MS-C 8.03)
で行っています。

よろしくお願いします。

101 :デフォルトの名無しさん:01/10/22 14:00
100のつづき
テスト中のソースは以下の通りです。

struct SREGS sregs;
union REGS inregs, outregs;

long timl;
short tims;

interrupt timint(void)
{
_disable();
timl++;
tims++;
printf(" %04x\n",tims);
_enable();
int86x(0x1c, &inregs, &outregs, &sregs);
}

void timer_set()
{
void far *ptr;

ptr = timint;
inregs.h.ah = 0x02;
inregs.x.cx = 1; // 1で10[ms]
inregs.x.bx = FP_OFF(ptr);
sregs.es = FP_SEG(ptr);
int86x(0x1c, &inregs, &outregs, &sregs);
}

void main(void)
{
// void interrupt (*vect)();

timl = 0l;
tims = 0;
// vect = _dos_getvect(7);
timer_set();
while(1){
printf("xxx=%04x,yyy=%08ld\n",tims,timl) ;
}
// _dos_setvect(7, vect);
}

tims、timl 共に0のままです。

102 :100:01/10/22 14:08
見にくいんで、ソースを上げなおしてみました。

struct SREGS sregs;
union REGS inregs, outregs;

long timl;
short tims;

interrupt timint(void)
{
  _disable();
  timl++;
  tims++;
  // 見やすいようにずらしてます。
  printf("                zzz=%04x\n",tims);
  _enable();
  int86x(0x1c, &inregs, &outregs, &sregs);
}

void timer_set()
{
  void far *ptr;

  ptr = timint;
  inregs.h.ah = 0x02;
  inregs.x.cx = 1;      // 1で10[ms]
  inregs.x.bx = FP_OFF(ptr);
  sregs.es = FP_SEG(ptr);
  int86x(0x1c, &inregs, &outregs, &sregs);
}

void main(void)
{
//void interrupt (*vect)();

  timl = 0l;
  tims = 0;
//  vect = _dos_getvect(7);
  timer_set();
  while(1){
  printf("xxx=%04x,yyy=%08ld\n",tims,timl) ;
  }
//  _dos_setvect(7, vect);
}

103 :デフォルトの名無しさん:01/10/22 14:19
timl,timsの定義にvolatileが必要とかそういうこと?

104 :100:01/10/22 14:32
volatile long timl;
volatile short tims;

long volatile timl;
short volatile tims;

共に駄目でした。

long far timl;
short far tims;

も駄目でした。

105 :100:01/10/22 14:42
と言うか、割り込みが発生していません。
メインルーチン側の printf をコメントすると、動かなくなります。
(Ctrl+Alt+del でリセットされるので、永久ループになってるだけですが。)

106 :103:01/10/22 15:01
非DOSユーザーがレスするのもナニだけど…

googleでちょっと検索してみたら、>>100が参考にしたと思わしきソースを
見付けたんだけど、「PC-9801用」って書いてあるよ?
>>100がMS-DOS/VだということはPC互換機だと思うんだけど、そもそも
この方法でタイマー割り込みが使えるのはPC98onlyだったりしない?

あと、割り込みハンドラ(timint)内でprintf()ってのは大抵の場合
ヤバイと思う。

107 :100:01/10/22 15:28
> この方法でタイマー割り込みが使えるのはPC98onlyだったりしない?

割り込みベクタやアドレスが一緒なので、これでやってます。

> あと、割り込みハンドラ(timint)内でprintf()ってのは大抵の場合
> ヤバイと思う。

削除します。

108 :デフォルトの名無しさん:01/10/22 15:51
DOS/Vタイマベクタは 0x1c or 0x08 のはず。
割り込み周期の変更は知らん。

109 :100:01/10/22 16:18
> DOS/Vタイマベクタは 0x1c or 0x08 のはず。

0x1cに、timer_set() で timint() を割り当ててると思ってました。
timer_set() をやめて、_dos_setvect() で 0x08 に timint() を
割り当てると、『1回だけ』動きました。
(数値が1で止まって、カウントアップしませんが。)
まだ問題はありますが、0x08 で テストを続けたいと思います。
どうもありがとうございます・

引き続き、情報を募集しますので、何か知ってたら教えてください。

110 :103:01/10/22 17:19
MS-DOS自身も使っているベクタみたいだから、setvectでベクタを上書きして
しまうと、DOS自身の割り込みハンドラが呼ばれなくなってまずいような
気がする。

setvectする前にgetvectで古いベクタを保存しておいて、timintの中で
カウントアップの処理をした後で、書き換える前のベクタへジャンプする
必要があるんじゃないかな?

111 :デフォルトの名無しさん:01/10/22 17:22
>>98
なに言ってんだか。

112 :100:01/10/22 17:46
>110

ご忠告ありがとうございます。
今は、テスト中なので、リセット覚悟でやってますが、
最終的にはきっちりしようと思ってます。

0x08でやると、凍ってしまいます。
何か設定があるのでしょうか?
誰か知りませんか?

0x1cでやると、カウントアップは出来ました。
ただ、周期が約55msに固定で、必要な10ms間隔にならない為、
使えない事が判明しました。

113 :ビル・ジョブス:01/10/22 18:16
>>110
chain_intr()とかっていうライブラリ関数あったなー

>>112
CLIしてるなら、きっと中の処理が遅くて再入してるよ

114 :100:01/10/22 18:50
>> 113
もしや最初にスレを立てた伝説の?(@_@)

> CLIしてるなら、きっと中の処理が遅くて再入してるよ
CLIとかNMIとか、よくわからないんですが
メインループの printf の画面表示が止まらないので、
再割り込みはしてない気がします。

ちなみに0x1cでやると、Ctrl+Cで中断できるんですが
0x08でやると、Ctrl+Cで中断出来ません。

115 :デフォルトの名無しさん:01/10/22 19:18
_disable()で割り込みを禁止、
_enable()で割り込みを許可していると思われ。
CLI、STIは割り込みを禁止したり許可したりするアセンブラ命令

割り込み内部(timint)はカウントと
旧ベクタへ飛ばすのみにしておく。

タイマ周期の変更はポート叩く方法しか知らん
しかもアセンブラ。

116 :56:01/10/22 19:27
>>93
それは分かってますよ。
"a"と'a'の違いがわからないのです。

117 :デフォルトの名無しさん:01/10/22 19:31
'a'は整数。
"a"はポインタ。

118 :デフォルトの名無しさん:01/10/22 19:49
>>116=56
もう,これは慣れるしかないと思います・・
とりあえず次のコードを実行してみれば,なんとなく感覚がつかめませんか?
#include <stdio.h>
void main(){
    char* a1 = "A";
    char* a2 = "A";
    char* b1 = (char*)'A';
    char* b2 = (char*)'A';
    printf("a1=%d,a2=%d,b1=%d,b2=%d", a1,a2,b1,b2 );
}

char* b1 = 'A';
ではなく
char* b1 = (char*)'A';
とキャストしているのは,'A' が const char 型であって
const char * 型ではないからです

119 :デフォルトの名無しさん:01/10/22 19:57
"..."はポインタじゃないし、'.'はchar型じゃないだろ。

120 :56:01/10/22 20:21
>>118
main の中の1行目と2行目は内容同じだし、3行目と4行目も内容同じだと思うんですけど・・・。

>>119
え? え? そうなんですか?

121 :デフォルトの名無しさん:01/10/22 20:22
'a' == 'a'
"a" == 'a','\0'

というように文字と文字列は違う。

char a='a';
char b="a";   //エラー。文字列は char に収まりきれない。
char *c = "a"; //"a"という文字列のアドレスを入れているのでOK。
char d[2]="a"; //上記に示したとおり、char2個分だから収まる。

c はポインタ。変数や配列のアドレスを c という名前で管理する。
d は配列。変数の連なりに d という名前を付けている。
その領域を"a"で初期化している。

"a"は変数名のない配列。
しかもプログラムのどこにあるのやら人間には判別つかない。
それではプログラマが利用できないので
名前をつけて"a"のある場所を知る必要がある。
その方法が char *c = "a";

printf("a")では"a"という文字列を表示したいだけで、
"a"のある場所を人間が知る必要ないから
そのままPCにおまかせしている。

122 :デフォルトの名無しさん:01/10/22 20:25
>>121
微妙に痛いんですが。。。

123 :56:01/10/22 20:29
>>121
おお!
なんと解りやすい解説!!

ありがとうございまいた <(_ _)>

124 :デフォルトの名無しさん:01/10/22 20:32
えと 'A' は 文字定数といいます
 文字定数は C 言語では int で C++では charになります

125 :デフォルトの名無しさん:01/10/22 20:54
>>122
同意。この説明で分かった気になってしまうと後がこわいかも。

126 :56:01/10/22 20:57
オレやばいですか?

127 :デフォルトの名無しさん:01/10/22 20:58
>>121
char *c = "a"; の"a"と
char d[2] = "a"; の"a"は意味が違ってる。

char d[2] = "a"; は、単に char d[2] = { 'a', '\0' }; の省略形。
char *c = "a"; の"a"は変数名のない配列…というのは、当たらずとも
遠からずというか、やっぱり文字列定数は文字列定数としか言いようが
ないような。ただの配列だと思い込んでると思わぬ所でハマる。

上記の後で、
d[0] = 'b'; はOKだけど
c[0] = 'b'; ってやるのは規格上NG(実際は動いたりするのでたちが悪い)

更に、
char *e = "a"; とやった場合、c == e である場合も c != e である場合もある
(規格上はどちらも間違いではない)

128 :121:01/10/22 21:00
>127
ありがとう。
教えるのは難しいなり。

129 :56:01/10/22 21:15
お、オレ1人が取り残されてる・・・(泣

>char *c = "a"; の"a"は変数名のない配列…というのは、当たらずとも
>遠からずというか、やっぱり文字列定数は文字列定数としか言いようが
>ないような。ただの配列だと思い込んでると思わぬ所でハマる。

思わぬ所ってどこっすか?

130 :56:01/10/22 21:18
>char *e = "a"; とやった場合、c == e である場合も c != e である場合もある
>(規格上はどちらも間違いではない)

これは感覚的に理解できます。

131 :デフォルトの名無しさん:01/10/22 21:50
strcpy(&(bMfh.bfType),"BM");

いまのとこ画像は本腰でないのでこうしているんだけど、
警告される。bfTypeがchar[2]か[3]かわかんないので、
"BM\0"とやる気にもならないし、メンバの場合の[]の
使い方もわかんない。
bMfh.bfType[0]='B'bMfh.bfType[1]='M'で
いいのかな、(\0はどうすんのかな)それとも、bMfh.(&bfType[0])
とかやっちゃうの?それとも(bMfh).bfTypeとか?

もーわかんない。

132 :デフォルトの名無しさん:01/10/22 22:01
"."や"->"はものすごく優先度が高い演算子で、ほとんど「名前の一部」とみなしていいほど。
・・・と、最初は思ってればいいよん。
bMfh.bfType[0] = 'B';
strncpy(bMfh.bfType, "BM", 2);

>bfTypeがchar[2]か[3]かわかんないので、
これは問題あると思うが。

133 :127:01/10/22 22:04
>>129
うーん、>>127の後半に書いた通りなんだけど、
書き換えができないというのは分かりやすいからいいよね?

後は、「同じ文字列」のとらえ方によって結果が違ってくるってこと。
char *a = "abc";
char *b = a;
この場合、aとbの文字列の内容は同じだし実体も同じ。
if (strcmp(a, b) == 0) { ... } も
if (a == b) { ... } も成り立つわけ。で、
char a[] = "abc";
char b[] = "abc";
これは、aとbの文字列の内容は同じ、だけど実体は別。
if (strcmp(a, b) == 0) { ... } は成立、
if (a == b) { ... } は不成立。だけど、
char *a = "abc";
char *b = "abc";
これは? 文字列の内容はもちろん同じ。
if (strcmp(a, b) == 0) { ... } は成立。でも、
if (a == b) { ... } は?
どちらになるかは不定なので、どちらかを期待してプログラミングしちゃいけない。

こんな感じで、文字列の場合、
・見かけが同じ
・実体が同じ
の二つの「同じ」があって、なおかつ文字列定数の場合は後者の「同じ」が
定義されない場合があるので、自分が期待している「同じ」が何なのかをちゃんと
考えてプログラミングしないとハマるわけ。

てな説明で分かってもらえますか?

134 :デフォルトの名無しさん:01/10/22 22:14
「実体」ってアドレス値のこと?

135 :デフォルトの名無しさん:01/10/22 22:13
>131
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;

これか? MSDNで見つかるだろ。

136 :デフォルトの名無しさん:01/10/22 22:17
>>134
そだね

137 :ビル・ジョブス:01/10/22 22:18
>>56
じゃー"a"はどこにあるのかな?「記憶クラス」って知ってるか?

138 :デフォルトの名無しさん:01/10/22 22:19
ありがと>>132

139 :デフォルトの名無しさん:01/10/22 22:23
strcpy(&(bMfh....),"BM")で
ちゃんと動いてるんだけど、考えると
strcpy(bMfh....,"BM")←つまり&がない。
でも正解なのが不思議だ・・・

140 :ビル・ジョブス:01/10/22 22:31
>>139
文字列はアドレスだから、違和感無いよ・・・

141 :デフォルトの名無しさん:01/10/22 22:33
構造体あれこれ。

bf.bfType = MAKEWORD('B','M');
stBmpFileHeader.bfType = 0x4d42
bmHead.bfType = ('B' | ((WORD)'M' < < 8))
memcpy(&fh.bfType,"BM",2);
bmFileHead.bfType = 19778;
BmpFileHeader.bfType = 'MB'

char bfType[2];

142 :132:01/10/22 22:38
>>139
げげ。135を見るとbfTypeつーのは
char bfType[2]でもchar bfType[3]でもなくてWORD bfTypeじゃんよ。
早く言ってくれよオイ。聞いてないよ−。
それじゃ strcpy(bMfh.bfType, "BM") は間違い。"&"付きが正解。

143 :ビル・ジョブス:01/10/22 22:45
>>142
"&"付きでも基本的に間違い!NULLがセットされるでしょ。
しかーし、今回はアライメント合わせされてるので動作するな。
しかし、いかん、おれには書けない・・・。

144 :100:01/10/22 22:56
>>115
>CLI、STIは割り込みを禁止したり許可したりするアセンブラ命令
アセンブラの割り込み許可/禁止って、EI/DIだと思ってました。
NECだけ?

>タイマ周期の変更はポート叩く方法しか知らん
>しかもアセンブラ。
よろしければ、ポートだけでも教えてもらえませんか?
アセンブラも多少ならわかりますので、見せて頂けたら幸いです。

145 :デフォルトの名無しさん:01/10/22 23:19
tell me

146 :デフォルトの名無しさん:01/10/22 23:30
正解は、
bf.bfType = MAKEWORD('M', 'B');

147 :デフォルトの名無しさん:01/10/22 23:36
>144
かなり昔のを発掘してきた。

ttp://gooside.com/himitsu/timer.zip

DLしたら教えてくれ。即削除する。

148 :どしろ〜とちゃん:01/10/23 00:13
ほんと、ドシロートな質問ですまんす。

「構造体を直接引数で渡すな!ポインタで渡せや!」
って、結構プログラムやってるツレから言われたんですけど、
さっぱり意味がわかりません。
なんで直接渡しちゃだめなん?

149 :デフォルトの名無しさん:01/10/23 00:16
コピーする手間とメモリと時間がもったいないから。

150 :デフォルト名無しさん:01/10/23 00:23
typedef structで定義したのがあるんだけどそれをstructで定義したら使えないんですよね。
なんでっすか?

151 :デフォルトの名無しさん:01/10/23 00:24
>>150
その簡単な例を挙げてくれ

152 :デフォルトの名無しさん:01/10/23 00:25
とりあえずここで同じことを聞いてこい。
http://mentai.2ch.net/test/read.cgi/prog/1002039334/

153 :56:01/10/23 00:34
>>137
知ってますけど、"a"はどこにあるのかは分かりません。

154 :適当マン:01/10/23 00:35
>>148
ポインタで渡すべきシーンと実体で渡すべきシーンがある。
圧倒的に多いのは前者だが、後者もそれなりに使う。
どんな状況で使うかはロジック次第。

155 : :01/10/23 00:52
C++だったら「そっちで間接参照しろや!」って切り替えしたりできるんだけどねぇ。
まあそのツレもあえて「構造体を」って言ってるところがまだ青い。

156 :どしろ〜とちゃん:01/10/23 01:27
総合的に、なんとなく分かったような・・・。レスくれた方々、多謝デス!

結局、場合にもよるが、基本的にメモリにバカバカコピーすんのは
タコでそ?・・・ってことで、おけ〜ですか?

しかし・・・>155サンの
>まあそのツレもあえて「構造体を」って言ってるところがまだ青い。
が、わかんないっす〜。なんで?

157 :デフォルトの名無しさん:01/10/23 03:20
>>143 意味不明。

158 :100:01/10/23 09:03
>>147
ホストが落ちてるみたいなんで、少々お待ちを。

159 :100:01/10/23 10:43
>>147
DL出来ました。
今、MASMが手元に無いんですが、何とか探してテストして見たいと思います。
どうもありがとうございます。

160 :デフォルトの名無しさん:01/10/23 11:35
class A{
virtual foo(const char *name);
virtual foo(const unsigned int num);
}

class B:public A{
foo(const char *name);
foo(const unsigned int num);
}

class C:public B{
foo(const char *name);
foo(const unsigned int num);
}

と書くと、class Cでのオーバーロードが解決できないと言われてしまいます。
もしかして根本的に勘違いしてるのでしょうか?

161 :デフォルトの名無しさん:01/10/23 13:50
C++は、よそで聞け!

162 :デフォルトの名無しさん:01/10/23 22:04
>>154
「実体で渡すべきシーン」とは?

>>155
もう少し詳しい解説きぼん。

163 :デフォルトの名無しさん:01/10/23 22:11
>>162
例外中立をぶちこわしたいとき

164 :デフォルトの名無しさん:01/10/23 22:57
>>154
構造体を実体渡しすると全部をスタックにつむから、ポインタ渡し
と比較して余計にスタックを消費する.
昔の人はメモリは貴重な資源だったので、実体渡しは裂けていた.
あと、ループ中に [] を使用して構造体を参照しているところは
ポインタを取得するとアドレス計算か減って早くなった.

ex)
for (i = 0; i < 100; i++) {
a[i].hohoe01 = 100;
a[i].hohoe02 = 200;
.
.
}

for (i = 0; i < 100; i++) {
pa = &a[i];
a->hohoe01 = 100;
a->hohoe02 = 200;
.
.
}

といった理由で、漏れは必ずポインタ渡しを使用しており、その
習慣は今でも引き継がれている.

ただ、自分の使用している コンパイラでアセンブラソースを
出力するようにして、なにが最適化確認するのが吉.

へたなことして自己満足していると最適化処理の足をひっぱるだけに
なっていることがある.

165 :デフォルトの名無しさん:01/10/23 23:00
>>164
実測で十分。

166 :164 :01/10/23 23:08
>>165
それで十分なら OK.
デブは腹時計が正確らししな。デブヲ。

167 :デフォルトの名無しさん:01/10/23 23:25
>>160
処理系は?

むしろクラス定義の後にセミコロンがないとか戻り値が宣言されてないとかで
文句いわれそうな気が。

168 :適当マン:01/10/24 00:06
>>162
単にコピーしたいときとか、
いつまでも実体があることが保証されないとき。

169 :デフォルトの名無しさん :01/10/24 00:19
>>168
うーむ、ネタでしょうか.詳細キボンヌ

170 :デフォルトの名無しさん:01/10/24 01:00
data.txtから実数の数値を読み込みたいけれど、
下のプログラムが動きません。
表示されるのは0.000000になってしまいます。


#include<stdio.h>

void main(void)
{
double data;
FILE *fp;

fp = fopen("data.txt","r");
fscanf(fp,"%f",&data);
printf("%f",data);
fclose(fp);
}

171 :デフォルトの名無しさん:01/10/24 01:04
%gで表示するとどうなる?

172 :適当マン:01/10/24 01:11
>>169
違うスレッドから同じものをアクセスするときとか。

173 :デフォルトの名無しさん:01/10/24 01:22
>170
%lf にしてみて。
%f は float に反応するけど double には無反応みたい。

174 :デフォルトの名無しさん:01/10/24 01:26
>>160
とりあえず、これならコンパイルできるぞ。

class A
{
virtual void foo(const char *name);
virtual void foo(const unsigned int num);
};

class B : public A
{
void foo(const char *name);
void foo(const unsigned int num);
};

class C : public B
{
void foo(const char *name);
void foo(const unsigned int num);
};

あと、C++こっちでやって
http://piza2.2ch.net/test/read.cgi/tech/1003832761/

175 :デフォルトの名無しさん:01/10/24 01:29
>>160
おそらく、fooに戻り値が無いから、
コンストラクタと解釈されておかしくなってると思われ。

176 :デフォルトの名無しさん:01/10/24 03:12
>>172
その場合、グローバルでとってあるか、動的に確保した領域使うと思う.
前者ならプロセスの寿命で、後者ならポインタで管理になるよね.

177 :デフォルトの名無しさん:01/10/24 08:01
>173
ありがとうございました。
うまく動きました。

178 :56:01/10/24 13:16
>>133
わかりやすい解説ありがとうございました!
>>133のレスに気付きました、遅くなって失礼しました。
了解です、理解しました♪
これで僕の>>56の疑問はかなり霧が晴れました。
レスくれたみなさん、ありがとうございました!!

179 :デフォルトの名無しさん:01/10/24 15:39
enum{ a, b, c }

#if 1 == 2
#error 1 == 2 <- ここはエラーにならない
#endif

#if a == b
#error a == b <- ここでエラー
#endif
何でこれエラーになるの?

180 :デフォルトの名無しさん:01/10/24 15:38
すいません、ひとつ教えてください。
ファイルの操作を行う中でファイルの先頭行と最終行を削除すると
いう機能を盛り込みたいのです。

fopenを追加モードで開いてポインタを先頭に持ってけばいいかなと
簡単に考えていたんですが、思ったようにうまくいきません。
先頭行、最終行ともに文字列があります。
どなたかよろしくお願いします。

181 :信頼度3割:01/10/24 16:01
>>180
fgets で行単位に取得して、1行目と最終行だけファイリングしないようにする。

182 :デフォルトの名無しさん:01/10/24 16:03
>>179
定数じゃないぞ。enum を #define で書き直せ

183 :デフォルトの名無しさん:01/10/24 16:19
>>180
追加モードって、"a"の事?
これだと追加だけで、既存の部分の変更って、出来ないんじゃなかったかな。
多分、この場合は"r+"あたりじゃないかな?
ただし、ファイルがある事が前提。
テストしてないんで、違ってたらスマソ。

184 :デフォルトの名無しさん:01/10/24 18:53
>>183
"a"でも変更できるよ。単にfopen()後のファイルポインタがファイル末尾に
なってるだけなので、fseek()してから書き込めばいい。

でも>>180の答えとしては、>>181が一番いいと思う。

185 :デフォルトの名無しさん:01/10/24 19:20
>>179
enumはプリプロセッサでは見えない。
#ifの式の中の名前はすべてマクロと見なされて、
未定義のものは0として扱われる。

186 :180:01/10/24 19:37
>>181>>183>>184
ありがとうございます。2行目から書きこんで最終行を書きこまないで
ファイルクローズってことですよね?
またなにか分からないことがあったらよろしくお願いします。

187 :デフォルトの名無しさん:01/10/24 20:51
gccでpop3クライアントを作る予定なのですが、どこかにいい
サンプルor解説はないでしょうか?

188 :sage:01/10/24 21:56
おい、だれか激しくつっこめよ。 >>184

189 :デフォルトの名無しさん:01/10/24 22:06
>>184
"a"でオープンして書き込みしたら、どこにシークしても元々あったデータは上書きできないよ。
そんないい加減なコードどっかで試したの?

190 :デフォルトの名無しさん:01/10/24 23:03
>>187
archie fetchmail

191 :184:01/10/25 15:41
>>189
ガーン、なんてこった。
スマソ…。

192 :180:01/10/25 20:11
やはりそうでしたか。
書きこめないのでおかしいなって思ってたんですよ(w

193 :デフォルトの名無しさん:01/10/26 01:42
charは1byteだって、ところでbyteってなに。
NULLポインタ? それってなによ。
sizeof 'a'が4になった。なんで1じゃないの。
const char * const p = "hoge"; どうなるってのさ。
なんでprintfの%fはdoubleでscanfの%fはfloatなのよ?
%cもちがうよ。なんで。

194 :デフォルトの名無しさん:01/10/26 01:46
君にはまずよいこのためのC言語という本を勧める。

195 :デフォルトの名無しさん :01/10/26 01:55
それより、COBOL とか、JAVAの入門書をすすめて。

196 :デフォルトの名無しさん:01/10/26 10:48
>>194
俺に聞けって、結局本買えってことですか。

それにしても、聞いたことない本ですな。こんなの勧める
奴ってたいていヘタレってのが相場なんじゃない。

197 :デフォルトの名無しさん:01/10/26 10:54
>>196
> 俺に聞けって、結局本買えってことですか。
程度による。さすがに「日本語が読み書きできます」とか「バイトの意味がわかっている」のは
前提でしょ。

一応、引っかかりそうなところだけ補足しておくが。

> sizeof 'a'が4
C 言語だと文字リテラルは char 型ではなく int 型です。そういうものだと思ってください。

> なんでprintfの%fはdoubleでscanfの%fはfloatなのよ?
これは引数の格上げ規則のせい。「格上げ」で検索してみましょう。

198 :ぷーち:01/10/26 12:14
C言語に、線引きや円を描く「関数」てあるの?

199 :デフォルトの名無しさん:01/10/26 12:26
>>198 標準ライブラリにはない。
環境依存のライブラリならフリー商用いろいろある。

200 : :01/10/26 12:34
>ところでbyteってなに。
などという質問をしてくる奴にはVBかHSPお奨めします。
君にはC言語ですら100年早いよ。>>193

201 :ぷーち:01/10/26 12:44
>199
レスどうもです。

202 :ジーコ:01/10/26 13:38
ある年月日にx日足した年月日を出力したいんですが、
どうしたらいいんでしょうか。

203 :デフォルトの名無しさん:01/10/26 13:46
>>202
time_t

204 :デフォルトの名無しさん:01/10/26 13:49
年月日→mktime()→time_t→gmtime()→年月日

205 :急ぎMAN:01/10/26 14:37
全角スペースを判別する関数はあるのでしょうか?
教えてください

206 :デフォルトの名無しさん:01/10/26 14:48
>>205
strcmp(s," ")

207 :急ぎMAN:01/10/26 14:50
>>206
サンクス
助かりましたm(..)m

208 :デフォルトの名無しさん:01/10/26 16:06
文字リテラルがchar型でなくてint型?
だったらなんでwchar_t型とかL'a'とかあるんですか?

byteを知らなければCで組むの100年早いですか?
ごたくはいいんでばっちり説明してくださいよ。
できるなら。

209 :デフォルトの名無しさん:01/10/26 16:23
>>208
これ以上こいつに教えないでください。
わざとあおって、答えを引き出そうとする手です。

210 :デフォルトの名無しさん:01/10/26 16:43
>>209
少なくとも君には何も聞かないよ。ま、答えれられるとも
思えないけど。

211 :デフォルトの名無しさん:01/10/26 16:51
>>208
charはintに収まるがwchar_tはその限りでない。

212 :sage:01/10/26 16:51
>>208
昔々、C言語に wchar_t や L'a' がまだ存在してなかった時代。
そのころ 'a' が int だったので、
過去との互換性のために今でも 'a' が int なのです。

byte はデータ量を表す単位のひとつで、一般的に8個の bit から成ります。

213 :208:01/10/26 16:56
sage書くとこ間違えた・・・鬱。

ついでに212に追伸。
そのころなぜ 'a' が int だったか。
それは 'a' と書くのと、単に 97 と書くのが等価だったからかな。

214 :横槍:01/10/26 17:49
>>213 今は違うのか?

215 :デフォルトの名無しさん:01/10/26 18:27
>>214
そのころそうだったので、過去との互換性のために今でも 'a' が int なのです。と書きましたが?

216 :デフォルトの名無しさん:01/10/26 18:54
本当に'a'がintっていうのなら、なんで
int i = '\xff'; これが-1なのさ。charなら
別におかしくないけど。

217 :これってC言語ですか???:01/10/26 19:00
<!-- Begin Anonymizer Control Bar -->
<DIV ID="toolbar1" STYLE="visibility: show">
<SCRIPT LANGUAGE="JavaScript">
function openWin(URL) {
  var anonWindow=window.open(URL,"Subscribe_for_Services","height=320,resizable=no,toolbar=no,width=320");
anonWindow.focus();
}

k=0;
function statusnote() {
 msgs=new Array("ANONYMIZER Restricted Free Trial: Page Privacy Protected","Upgrade NOW!!");
 c=msgs[k];
 window.defaultStatus=c;
 k++;
 if(k==msgs.length)
k=0;
window.setTimeout('statusnote()', 1000);
}
window.setTimeout('statusnote()',10);

218 :デフォルトの名無しさん:01/10/26 19:06
>charはintに収まるがwchar_tはその限りでない。

これはにわかには信じがたいけど。

>byte はデータ量を表す単位のひとつで、一般的に8個の bit から成ります。

それは一つの例であって、byteの定義とはちがうよね。

219 :デフォルトの名無しさん:01/10/26 19:10
>>218
信じるかどうかまで面倒みきれねえよ。
規格上、「charはintを内包する」とは決められているが、wchar_tとintに関して
直接の関係は定義されてないってだけの話だ。

220 :デフォルトの名無しさん:01/10/26 19:11
>>217
C言語です。勉強すれば読めると思うので本でも買って頑張ってください。

221 :デフォルトの名無しさん:01/10/26 19:13
>>217
LANGUAGE="JavaScript"

222 :デフォルトの名無しさん:01/10/26 19:48
>>219
内包の意味がよくわかんない。
intはcharを内包する、なら分るんだけど。

223 :デフォルトの名無しさん:01/10/26 19:52
>>219
>規格上、「charはintを内包する」とは決められている

俺にはchar=1byteってのとshort int <= int <= long intって
ことしか決まってないように思えるが。
本当に規格できまってるなら100%信じるよ。

224 :デフォルトの名無しさん:01/10/26 20:10
>>223
くだらねぇ、ホント、くだらねぇ。
そこまで読めるなら 2.3定数 も読めよ。

> 数値演算では、文字定数は他の任意の整数と同様に扱ってよい。

intかどうかは処理系依存って言うことだろ。

225 :デフォルトの名無しさん:01/10/26 20:42
>>216
たぶん '\xff' は -1 と等価なんでわ?っでもこの辺の事情は詳しく知りません。いま手元に詳しい資料ないし。

>>218
>それは一つの例であって、byteの定義とはちがうよね。

「byte はデータ量を表す単位のひとつ」
ここまでが定義として主張したいことで、
「一般的に8個の bit から成ります」
これはおっしゃる通り「一般的」な「一つの例」です。

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

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)