C言語なら私に聞け(33)

このエントリーをはてなブックマークに追加
1ジョブ子
姉です。30年プログラムを作りつづけて嫁に行きそびれてしまいました。
でもC言語の腕には自身があるので何でも聞いてね。

PS
関連擦れは面倒なのでほかの人に任せます。ウフッ
無責任一代女かYO!
3せめて、前スレくらい:02/09/21 20:06
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
【その他】
http://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/prog/progf.html
http://www.bloodshed.net/index.html

【注意】
Cmachineは一般的なCと挙動が違いすぎるので動作の保証はできません。
まともな処理系を使いましょう。
C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART 5
http://pc3.2ch.net/test/read.cgi/tech/1027593322/
7デフォルトの名無しさん:02/09/21 20:11
【過去ログ】
31 http://pc3.2ch.net/test/read.cgi/tech/1031340950/
30 http://pc3.2ch.net/test/read.cgi/tech/1030786546/
29 http://pc3.2ch.net/test/read.cgi/tech/1029605182/
28 http://pc3.2ch.net/test/read.cgi/tech/1028495798/
27 http://pc3.2ch.net/test/read.cgi/tech/1027160374/
26 http://pc3.2ch.net/test/read.cgi/tech/1026048820/
25 http://pc.2ch.net/tech/kako/1024/10249/1024918442.html
24 http://pc.2ch.net/tech/kako/1024/10240/1024033400.html
23 http://pc.2ch.net/tech/kako/1023/10230/1023024817.html
22 http://pc.2ch.net/tech/kako/1022/10224/1022402165.html
21 http://pc.2ch.net/tech/kako/1022/10220/1022045622.html
20 http://pc.2ch.net/tech/kako/1021/10214/1021459016.html
19 http://pc.2ch.net/tech/kako/1020/10207/1020756993.html
18 http://pc.2ch.net/tech/kako/1020/10202/1020260813.html
17 http://pc.2ch.net/tech/kako/1019/10193/1019372139.html
16 http://pc.2ch.net/tech/kako/1018/10184/1018453690.html
15 http://pc.2ch.net/tech/kako/1016/10165/1016519243.html
14 http://pc.2ch.net/tech/kako/1015/10152/1015286974.html
13 http://pc.2ch.net/tech/kako/1013/10139/1013990673.html
12 http://pc.2ch.net/tech/kako/1012/10123/1012348974.html
11 http://pc.2ch.net/tech/kako/1009/10094/1009499565.html
10 http://pc.2ch.net/tech/kako/1008/10083/1008300863.html
9 http://pc.2ch.net/tech/kako/1007/10072/1007272267.html
8 http://pc.2ch.net/tech/kako/1005/10058/1005811510.html
7 http://pc.2ch.net/tech/kako/1003/10034/1003418249.html
6 http://piza2.2ch.net/tech/kako/999/999617524.html
5 http://piza2.2ch.net/tech/kako/994/994908590.html
4 http://piza.2ch.net/tech/kako/992/992357382.html
3 http://piza.2ch.net/tech/kako/989/989929288.html
2 http://piza.2ch.net/tech/kako/979/979529893.html
1 http://piza.2ch.net/tech/kako/967/967985026.html
うお、カブッタ。。鬱
おっつっつ。>>1
>>10
世の中間違ってる。。。
12デフォルトの名無しさん:02/09/21 20:21
>>11
気持ちはわかるが一応立てたことだし。
13デフォルトの名無しさん:02/09/21 20:21
<33>
だと かちゅ〜しゃ で化けることがあるからなのか?
subject.txt取得後だと問題ないんだけど。
>>13
そう
だんだんこのスレの>>1は面白みに欠けてきてる・・・
16  :02/09/22 00:48
質問です
配列を宣言と同時に初期化する際、
array[] = "ABCDEFG";
とするような感じで、文字列ではなく
数字を入れる方法がありましたら教えてください。

17打・サイタマ@受信料未払い:02/09/22 00:51
>>16
array[] = {1,2,3,4,5,.......};
じゃダメなん?
>>16
int n[]={4,12,76,3,0,65};
>>16
型は一体何なんだ、ボケナス。
>>15
君のコメントほどじゃないかと
2116:02/09/22 00:58
大事なことを書き忘れました。
関数の引数として
func("ABCDEFG");
のように使える関数をつくりたいのです。
で、文字列だと上記のように渡せるのに、数字だと""で囲めない?ので
困っています。
型は、char型を考えています。
22打・サイタマ@受信料未払い:02/09/22 00:59
>>21
もう一回文字列リテラルのこと調べなおすべし!
2316:02/09/22 01:01
>>22
あおりは勘弁してください。
>>21の言ってる意味がわからんのは俺だけか?
2516:02/09/22 01:03
>>24
難しい質問だから聞いているんです。
もう少し考えてください。お願いします。
違ってるかもしれんが、
func("\x01\x02\x03");
という意味なのか?

渡されるのがポインタだということは
わかってるんだよな?ボケナス。
27デフォルトの名無しさん:02/09/22 01:05
>>25
質問の意味がわかりません。
2816:02/09/22 01:08
>>27
何がわからないのかがわかりません。
わからないことを書いていただかないと質問に答えられません。
配列に入れて渡すのはダメなの?
3016:02/09/22 01:10
脱いでもすごいです。
ネタかこいつ。面白くないから無視。
>>28
何がと言うか、ぜんぜんわかりません。
初歩的なことですみませんが、はじめから教えてもらえませんか?
いいかげんウザイ
3416:02/09/22 01:13
       ε=ε=ε=ε=ヾ(;@×@)ノ
3516 ◆Ms2nrv3c :02/09/22 01:14
あの、23、25、28、30は偽者です
面白ければ放置しようとおもっていたのですが。。。
いま、実験しています
3616:02/09/22 01:15
いつのまにか偽者がたくさん。だから2ちゃんは...
37打・サイタマ@受信料未払い:02/09/22 01:15
>>23
すまん、煽りじゃないんだよ。
func()内で中身を入れ替えたりするなら気をつけよう。
....ところで、ポインタって知ってるかい?
関数に直接配列か、それは無理だった気が。
C99ではできるんだっけ?
3916 ◆a9RattCo :02/09/22 01:17
誰に口聞いてんだ貴様ら
>>39

( ´,_ゝ`) プッ

そこまでやるか普通?
4116:02/09/22 01:20
プログラムやるやつは糞だと聞いていましたが、
ホントだったようですね。
失望しました。
42:02/09/22 01:22
>41
あのさ、とりあえず俺は真面目にあんたの
質問聞いてやってるつもりだよ。
その言い方はないんじゃない?
はっきり言ってあんたの質問の意味がわからん。
関数作りたいなら
void Test(char* s);
じゃだめなのか?
なんでこれが駄目なのかよくわからん。
4316:02/09/22 01:22
全員16を名乗るスレはここですか?
44打・サイタマ@受信料未払い:02/09/22 01:22
やれやれ、まだ夏厨の残党が
いたのか・・・。荒ちまったな。申し訳ない。
16ウイルス、自己増殖中・・・。
4616:02/09/22 01:23
最近涼しくなったよねー。
>>42
偽物だと気付けよ。
本物は mailto: が全角の空白1文字になってる。
これより上のカキコだけはな。
48:02/09/22 01:25
そろそろオレも「C++なら全手俺に聞け」というスレでも立てるか・・・。
4916:02/09/22 01:26
♪人生1616〜
5016 ◆Ms2nrv3c :02/09/22 01:27
>>偽者
痛いところを疲れて完全にキレられたようですね
>>26
ポインタはわかっています
\xというのは使ったこと無いのでよくわかりませんでした。
>>37
もちろん、入れ替えたりしません。
>>22
文字列リテラルに数値をもぐりこませることは出来ないと言う意味でしょうか
本物は 16,21,35,50 だけ。
残りは2人の低能な偽物による荒らし。
5216 ◆Ms2nrv3c :02/09/22 01:32
それと、
>>29
配列に入れないといけないようでは使い勝手が落ちると思い、
このような質問をすることになりました。
相変わらず16のしたいことがわからないんだが

func( int[]{ 0, 10, 20 } ); 風にしたいってことですか?
使い勝手って何?
55打・サイタマ@受信料未払い:02/09/22 01:39
>>50
文字列って言っても、要はキャラクターコードが入ってる配列のポインタを関数に渡しているってことだから、渡したいchar型数値に該当するキャラクターコードを突っ込んだ文字列リテラル作って渡すこと可能だよ。
array[] = "abc" なら array[]={ 0x41,0x42,0x43} と同じものが入っていると考えてもいける。

でも、素直に

char array[] = {1,2,3};
func(array,sizeof(array));

とかしたほうが良さそうだけど・・・。
5616 ◆Ms2nrv3c :02/09/22 01:39
>>53
文字列だと
char array[] = "ABCDEFG";
func(array);

func("ABCDEFG");
にできるのに、
数字だと
char array[] = {0, 10, 20};
func(array);

func({0, 10, 20});
みたいにできればメモリ領域の節約にもなるし
関数としては使い勝手がいいとおもうのです。
57打・サイタマ@受信料未払い:02/09/22 01:41
あ、array[]={ 0x41,0x42,0x43}なら "ABC"だな・・・鬱だ。
58デフォルトの名無しさん:02/09/22 01:42
>>57
それよりももっと重要な'\0'を付加することを忘れているぞ。
今日は電波強いね
ようやく16のやりたいことが見えてきた。
6158:02/09/22 01:46
>>59
俺のこと?
もしかして間違っている?(^_^;)
62打・サイタマ@受信料未払い:02/09/22 01:47
>>57
ああ、やってしもうた・・・。出直してきます。
63デフォルトの名無しさん:02/09/22 01:47
そんで、結局のところC99で型安全かつ可変の引数を受け取る関数は書けるようになったの?
>>61
間違ってないぞボケナス。
でもこれは揚げ足とも言う。
>>63
...の部分の引数の型がチェックされるということ?
6658:02/09/22 01:48
>>64
ごめん。
16にはC#をお勧めしたい
6859:02/09/22 01:50
>>61
いや16のことだよ
6916 ◆Ms2nrv3c :02/09/22 01:50
>>55
逆に、
{0x41,0x42,0x43}を渡したいのであれば、
"ABC"を渡すことで可能ですが、その方法だと
{0x01,0x02,0x03}を渡したいときに
対応するASCII文字が無く、不可能になってしまいます。

また、
char array[] = {0, 10, 20};
func(array);
な方法だと配列の宣言&初期化とfunc()が離れてしまって見づらく
なりますし、初期化をfunc()の直前でやるのもあほらしいなと。

#defineじゃ・・・
71デフォルトの名無しさん:02/09/22 01:52
>>69
"\x01\x02\x03"

これってできなかったかな。
72打・サイタマ@受信料未払い:02/09/22 01:52
あああ! >>58 と間違えたぁ!
あかん、残業しすぎや・・・。
>26
これは?
7471:02/09/22 01:52
>>26で既出やん。
よく見たら間違ってた
"\01\02\03"
>>69
エスケープシーケンス
77sage :02/09/22 01:55
>>65
>>67 という意味です。
[\x1b2J]は(・O・)イイ!
>>1
今更だが乙。
>>56
> メモリ領域の節約にもなるし

リテラル文字列であっても静的なメモリ領域に
置かれることには違いない。
まあ、autoな記憶クラスの配列よりはスタックを
節約できると思うが。
#define するのが一番素直か
8216 ◆Ms2nrv3c :02/09/22 02:09
エスケープシーケンスでできました。みなさんありがとうございました。
勉強になりました
毎回エスケープシーケンス使うほうが直前に変数に入れるよりもさらに面倒だと思うが・・・
16がスタック消費をそんなに気にするなら
extern const int table[] = { ... };
function( table);
にしたらいいんでないの
まあどうでもいいことだけどね…。
ところでなんで16は「関数の直前で初期化できる配列>>69」を
関数に渡そうとするんだ?

そんなもん関数内でローカルに扱えと思うのは漏れだけか?
漏れもそうおもふ.
87打・サイタマ@受信料未払い:02/09/22 02:25
中身を触らず、かつfunc()内でしか使わないなら、
func()内にstatic const で持つのもいいかなとか思いますです。
8816 ◆Ms2nrv3c :02/09/22 02:32
>>84
そんなことが出来るんですか。
配列の中身を静的領域に置くテクニックですか。
でも外部変数は使わない方針なんです。
>>85-87
関数としての汎用性がおちる気がして。。
メモリを気にしてるんだったらスコープつければ?
{
char bbb[]={1,2,3,4};
Saru(bbb);
}
90デフォルトの名無しさん:02/09/22 02:46
>>89
?
>>89
スコープの意味わかってんのか?
スコープ抜けたときに変数のスタック領域って開放されるんじゃないの?
 {
 char A[]={1,2};
 Func(A);
 }

 Func("\x01\x02");
でメモリの使われ方に違いが有るの?
>>89
その場合メモリは関係ないですよ( ´,_ゝ`)
94デフォルトの名無しさん:02/09/22 02:56
例えば関数printfの実物をみてみよう
ということで
stdio.hをみてみたのですが
プロトタイプの宣言はあるものの
それらしきものが見当たらない気がするのですが
気のせいですか?
>91
立派なブロックスコープでつがなにか?
>>95
>>91はそれがメモリの節約と何か関係あるのか?と言っているんだと思うぞ。
97デフォルトの名無しさん:02/09/22 03:00
>>94
ライブラリのソースを見よう。
>>94
そりゃhファイルだからねぇ…
\Program Files\Microsoft Visual Studio\VC98\CRT\SRC
あたりにあるCファイルにないか?

# CRTって何? C Run timeってことかな?
実装レベルで即座に解放されるかは知らんが、
変数が有効でなくなる立派なスコープだわな。
>>98
C Run Timeか・・・俺もわからんかった。
コンパイル済みのライブラリなら、\Program Files\Microsoft Visual Studio\VC98\Bin\LIBC.LIBの中にあるね。
>>96
んで>>92のような問いかけに戻る、と。
実際のところ>>92のほうはどうなのよ?
最適化も何もしない素コンパイラだったら節約になりそうな気はする。
>>101
解放されてもメモリーを消費することにはかわらんだろ。
使っている時間の長さが違うだけで。

それとも、
void func()
{
int a,b;
}
と、
void func()
{
{int a;}
{int b;}
}
で違うと言いたいのか?
>>103
むしろスタック分だけ余計にメモリ使いそうな気がする
スタックは関数から返れば、解放されるから節約しても無駄。
ブロックスコープ変数は、ほとんどのコンパイラで関数突入時に確保される。
関数内のブロックスコープって人間様のためじゃなかったのか…
下記ならメモリの使用量としては変わらないね。

Func("\x01\x02");
 ->2Byte分の領域が確保され、関数を抜けたときに開放される。

{
 char A[]={1,2};
 Func(A);
}
 ->2Byte分の領域が確保され、スコープを抜けたときに開放される。
>>107
前者が解放されるのってプログラム終了時じゃないの?
109108:02/09/22 03:13
"\x01\x02"へのポインタが解放されるのは関数を抜けたときだけど。
>108
それなら後者の方が得ということになるの?
コンパイラスレになってきました
>105
速度で見ればローカル変数使うだけ当然遅くなる。
あと、関数呼び出しも戻りのアドレスをスタックに待避する処理や引数を
渡す処理が入るので当然遅くなる。
後者だと、A[]={1,2};でメモリコピーが走らない?
前者の利点が見えないんだけど
114空気を読めない奴:02/09/22 03:15
たかだか数バイトけちんなよ。
>>114
。・゚・(ノД`)・゚・。
要するに、↓のコードの前者と後者でメモリ使用量が違うか?
ということだな。

hoge()
{
 { char A1[]={1,2}; Func(A1); }

 { char A2[]={1,2}; Func(A2); }

 { char A3[]={1,2}; Func(A3); }
}

hoge()
{
 char A1[]={1,2};
 char A2[]={1,2};
 char A3[]={1,2};

 Func(A1);
 Func(A2);
 Func(A3);
}

ソースに記述したブロックの通りにスタックを確保すれば、
後者より前者の方がスタック使用量を節約できるわけで。

ただ、実際にはソースと同じような確保はしてくれない
と思った方がいいだろうな。
117105:02/09/22 03:20
>>112
すみません言ってることの意味が分かりません。
>>103 は処理が違うということでしょうか?
>>116
しかも前者は読みづらいね。
あまり現実的じゃないよね。
119デフォルトの名無しさん:02/09/22 03:22
>>116
スタック節約してどうすんの?
>>119
16君がメモリの消費に神経質だから。
121120:02/09/22 03:23
あ、俺は>>116ではないです。
122116:02/09/22 03:24
>>119
俺も知らんよ。(再帰関数でもない限り)
最初に書いた奴はこういうことが言いたかったんだろ?
と書いただけ。
123105:02/09/22 03:24
>>116
仮にブロックスコープで確保解放が行われるとして、スタック操作に掛かる
コストのほうが、スタック消費量を抑えることより問題だと思われ
for(int i=0; i<10000; i++ )
{
int n;
...
}
とかやると、大変なことに。。。
124デフォルトの名無しさん:02/09/22 03:24
>>1
スレタイトルの番号を囲んでいる括弧が、左は半角で右は全角なのが気になる。
125105:02/09/22 03:26
ぐは、またやっちまった
技術板でこのスレだけ進行早すぎ
それと、10000くらいなら全然平気でした
>>123
16以外はみなそう思っていると思うぞ(笑)

でもC++だとfor(int i=0;i<100000;i++)とかやるんだよな・・・あれもスタックに取ると思うんだけど。
127126:02/09/22 03:27
おっと、スタックに確保する操作はforにはいったときの一回か。
話を元に戻すと
まず16さんが下記の記述はいやだと、
char[] A = {1,2};
Func(A);
理由、メモリを無駄にしたくないから。

よって
Func("\x01\x02");
ではどうだと、、、

それよりも
{
char[] A = {1,2};
Func(A);
}
こうすれば、同じことだしFunc("\x01\x02")より分かりやすいんでは?
という流れ。
>>128
そんな感じだね。
130116:02/09/22 03:28
>>123
俺もそう思うよ。
ただ、スタック操作だけならx86ではespを加算と減算だけだわな。
初期化が問題だな。
>112
スレを前から読んでないのでよく解らんが
要するにスピードを重視するのか容量を重視するのかというわけで
そのトレードオフによって決めるべきかと。
132デフォルトの名無しさん:02/09/22 03:35
話かわるけど、VC++のqsortって関数の再帰呼び出しは使っていないみたいだね。
これはスタックオーバーフロウが起らないようにしているのかな?
それともやっぱりパフォーマンスを向上させるためかな。
パフォーマンスに一票
134116:02/09/22 03:41
でもスタックオーバーフローの可能性があるqsortなんかいやだな。
最近のコンパイラでもあるのかな?
>>128
本題じゃないが、
数字をcharの配列で渡そうとしているあたりに16の徹底ぶりがうかがえる(w
>>135
なるほど。気づかなかった。
きっとそうなんだろうな。
intは(例えば)4バイトも消費するからもったいないです!!ってか?(w
じゃあfloatでいいところでもdouble使っている俺はやばいな(鬱
実際それはまずいんだろうけど。なんとなくfloatは嫌い。
>>137
それはそれですごいなw
0〜255(-128〜127)の値しかとらないことが分かっているのかな?
エスケープシーケンス使うってことは初期化に変数使えないんじゃ・・・
> intは(例えば)4バイト
> 0〜255(-128〜127)
この辺にもツッコミ禁止の徹底ぶりがうかがえる。

ネタですた。謝ります。スマソ。
142137:02/09/22 04:06
>>141
だってここの人怖いもん(;_;)
おかげで注意深くなれたけど(w
MinGWで
--------------------------------
main () {
  void *pa, *pb;
  {
    int a;
    pa = &a;
  }
  {
    int b;
    pb = &b;
  }
  printf ("&a = %p\n", pa);
  printf ("&b = %p\n", pb);
}
--------------------------------
&a = 0073FDDC
&b = 0073FDD8
--------------------------------
>>143
それが何か?
・・・荒れてる(?)っぽいけど、質問して良いかな?

2次元配列へのポインタってどうやって記述すればいいんですか?
手元にある参考書には配列へのポインタは書いてあるんだけど
2次元配列へのポインタについては全く書いてないんで。
>>144
もしブロック終わったら解放するってんなら、a と b は同じ領域を
共有するかもしれないって思ったわけだが、違うらしいなって事
>>116の話題ね
>>145
ポインタと配列の関係については、ここをひととおり目を通すといい
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

「配列へのポインタ」というのはまー慣用的な表現で、
実際には配列の先頭へのポインタの意味する事が多い。
char a[3]; char *p = a;
で、この例の先頭がさらに配列(char[5])だった場合を考えてみればいい
char b[3][5]; char (*q)[5] = b;
これとは別に、(別途確保した)配列(の先頭)をさすポインタの配列、
というものを使うことも多い
>>146
そんなもんコンパイラはもとよりコンパイルオプションによって変わるぞ。
VC++6 なら、Debug なら共有しないが、Release なら共有する。

何で実装依存なのに、一つの結果見ただけで「違うらしいな」なんて結論付ける
かなぁ...。
>>148
馬鹿ですか?「MinGWで」って書いてるのに
>>149
アフォですか ? 「コンパイルオプションによって変わる」と書いてあるのに
> 「違うらしいな」なんて結論付ける

プ
152デフォルトの名無しさん:02/09/22 08:41
逆コンパイルするツール何か教えれ。
忘れていたが、はるか昔、俺も16と同じこと考えたことあった。
いまとなってはなんでそんな事考えたのかも思い出せないけど。

メモリの節約しようって発想はなかったけど、使い勝手から結局va_list使った。パスカル文字列風に先頭はデータ数入れて。でも、va_listで自動キャストされる規則をわすれたりして型を間違えると誤動作する。
154名無しさん@Emacs:02/09/22 09:02
3D ライブラリが無い環境 (Palm 等) で 3D グラフィックを表示する
アプリケーションを作りたいのですが、参考になりそうなソースコード
がありましたら教えて下さい。
今は cbzone のソースを読んでいます。
>>152
こっちで聞け。
http://pc3.2ch.net/test/read.cgi/tech/1014404990/l50

>>151
その程度の書き込みしかできないなら、止めとけ。ヴァカみたいだぞ。
(みたいじゃねーのかもな。ププ)
156nobodyさん:02/09/22 15:01
もう156.早い.
聞け!
158デフォルトの名無しさん:02/09/22 16:14
VC買うのと無料のBCCつかうのって、どっちがいい?
>>158
売ってるティッシュ買うのと街頭で配ってるティッシュ使うのって、どっちがいい?
160デフォルトの名無しさん:02/09/22 16:32
>>159
どっちでも良いってことですか?
ケツの拭き心地が違うということ
162デフォルトの名無しさん:02/09/22 16:38
>>161
ケツの拭きごこちってどう言う意味?
作業のしやすさ?
>>162
配ってるティッシュ使ってみて不満があるなら売ってるの買えや
164デフォルトの名無しさん:02/09/22 16:42
>>163
わかりました。
ありがとうございました。
165デフォルトの名無しさん:02/09/22 16:42
>>163
僕は意味を聞いているのですが!
ケツの拭きごこちとプログラムを作るのと何の関係があるの?
あおりはやめてください。
>>165
騙りやめれ
なんでこれぐらいの事で怒るのか。
168デフォルトの名無しさん:02/09/22 16:50
BCCでCのソースをコンパイルするとき拡張子を必ず.cにしないと
いけないと聞きました。Cのソースを.cppでコンパイルしたらどんな
不都合があるのですか。「倉薫」の入門本にもそんなくだりがあったが
理由がわかりません。


 ケ ツ 拭 い て み り ゃ あ わ か る だ ろ う が !
うっ・・・
171デフォルトの名無しさん:02/09/22 16:54
>>168
明らかだろ。オマエがそうやって人に聞いてるの見てると、
もう(。A。)(.Λ.)(:>)(゚∀゚)(<:)(.Λ.)(。A。)って感じだな。
172デフォルトの名無しさん:02/09/22 16:55
http://www.bloodshed.net/index.html

ここのPascalとC++の統合開発環境はけっこうよかったです。報告まで
173デフォルトの名無しさん:02/09/22 16:57
>>171

いっている意味がわかりません。Hello,World程度の簡単なソースを
拡張子.cにしようが.cppにしようがコンパイル結果に関係ないと思うのですが。
>>168
> BCCでCのソースをコンパイルするとき拡張子を必ず.cにしないと
> いけないと聞きました。Cのソースを.cppでコンパイルしたらどんな
> 不都合があるのですか。「倉薫」の入門本にもそんなくだりがあったが
> 理由がわかりません。

C と C++ で一部非互換のところがあるからだよ。BCC は、使ったこと無いからわからんけど、VC++ では xxx.c なら sizeof 'a' == 4 となるが、xxx.cpp なら sizeof 'a' == 1 となる。
>>173
全然違う・・・
CとC++ではNULLの意味が異なります。
177168,172,173:02/09/22 17:05
C++ってCのスーパーセットだから、CのソースをC++コンパイラでコンパイルすると
エラーはでないけど、実行時エラーがでる場合があるということですか?
まぁまぁ。
>>173は未だにトランスレータ式のC++コンパイラ使ってるんだよ。
なのに次からBCC使わなきゃなんなくなって、不安でしょうがないんだよ。
179裕美子 ◆lIp1b.Ek :02/09/22 17:09
会話についていけないからもう質問はやめにします。すみませんでした。

参考までに、使用コンパイラは 試食版とBCCです。
>>179
あんただれ
181裕美子:02/09/22 17:12
>>180
痴漢が話しかけないで!
char *c = malloc(128);
C++ではエラー出ます。
183デフォルトの名無しさん:02/09/22 17:15
かといって
char* c = static_cast<char*>(malloc(128));
にするとCでコンパイルできなくなる罠
Cのソースを*.cppでコンパイル必要があるのかと問い詰(ry
186デフォルトの名無しさん:02/09/22 17:36
まあ、まあ、これでも見て落ち着けよ

          /:::|:::::::|:::::::::::::/::::::/::::::::::::::/:::::::/`\_
       / ̄\::::::|:::::/:::......-―――--..........__/:::::::::::::::\
   ┌ー ̄::::::::::::ヽ::|:::..-^ ̄            ^ ヽ、:::::::::\
   ヽ::::::::::::::::::::::::::::/                  \::::::::ヽ
    ヽ:::::::::::::::::::::::/             ::::       \:::::ヽ
    ヽ::::::::::::::::::/              ::::::::        \::::|_
     ):::::::::::::::|              ::::*:::::        ヽ:|::::ヽ
     /::::::::::::::::|              ::;;;;:          l::::::::ヽ
    /::::::::::::::::::|             ノ::ii:ヽ::          l::::::::::|
    |::::::::::::::::::::|            /::::;リ:::l::::         |::::::::::::|
    |:::::::::::::::::::::l           ...l::::;リ:::/::         /:::::::::::::|
    .|::::::::::::::::::::::l          . /:ア/:::        /:::::::::::::::i
    l:::::::::::::::::::::::::l          ./::`^:::::        /:::::::::::::::::/
    ヽ::::::::::::::::::::::::l         /::::::::::        /:::::::::::::::::::/
     /:::::::::::::::::::::::l        /:::::::::::::      /::::::::::::::::::::::/
     /::::::::::::::::::::::::i __-ー--=;;;::::::::::::::  ....::::/:::::::::::::::::::::::/
裕美子脱ぐなよ汚ネェ
>>186
リリアたん・・・ハァハァ
charはなんと読むの?
190デフォルトの名無しさん:02/09/22 20:33
sageちまった
>>189
> charはなんと読むの?
もうこの話題はいいよ、「キャー」でも「シャー」でも何でもいいよ。
193デフォルトの名無しさん:02/09/22 20:56
>>191
ぷっ、
シャーだって
ぷぷぷぷぷぷぷ
くっくっくっ
194デフォルトの名無しさん:02/09/22 20:57
勝俣
>>189
友人の飼っていた犬が「ちゃる」だったので、
charも「ちゃる」になりますた。
196nobodyさん:02/09/22 21:14
キャッだろ。
キャラクターの略だからな。
キャルかなぁ。
友人の飼っていた子が「ゆみ」だったので、
charも「ちゃー」になりますた。
19816 ◆Ms2nrv3c :02/09/22 21:17
ちょっと気になったのですが、
>>70>>81で出てるdefineではどうやってやるのでしょうか
199デフォルトの名無しさん:02/09/22 21:19
>>198
#define VAL_ 0
200get
20116:02/09/22 21:21
とっとと答えんかいっ!!!
糞どもがーーーーっ!!
#define UZEE 16
#define 16 メモリケチケチ厨
#define _16 -1
#define ANSWER "これ以上メモリ節約なんて考えるなタコ"
warning C4305: 'argument' : 'const int' から 'char' へ切り詰めます。

#define FLG_AGE 1

void a( char b );

a( FLG_aGE );

どうすればいいんでしょうか?
キャスト?
#define 206 16
#define FLG_AGE '\1'
>>208
間違い
#define FLG_aGE '\1'
210206:02/09/23 00:30
放置?
>>210
> 放置 ?

はぁ ? >>208-209 を見てんのか ?
別にキャストでいいんじゃないの

a( (char)FLG_AGE );

FLG_AGEを常にcharにしたい(理由はあえて聞かない)なら、
#define FLG_AGE ((char)1)

あと、C FAQに
   文字リテラル('\1'とか)は実はint型な罠
ってのがあったような気がするのだが、どうか。(C++ではcharだという話も)
>>213
間違い
#define FLG_aGE ((char)1)
215212:02/09/23 01:09
>>214
いや>>206の聞いてる人が既にミスしてるからw

>>#define FLG_AGE 1
>>void a( char b );
>>a( FLG_aGE );
↑ここねw
216 :02/09/23 01:12
楽しそうですね
217デフォルトの名無しさん:02/09/23 01:35
>>206
void a(char b);をvoid a(int b);にする。char型の引数ってあまりみないな。
>>217
charにしても別にメモリの節約にはならないし(w
>>218
プ
220デフォルトの名無しさん:02/09/23 02:56
unsigned char 型の定数を32ビット右シフトすると、
元の値とまったく同じになるんだけど、何故?環境はVC++6.0SP5
221220:02/09/23 02:57
ちなみに31ビット右シフトすると0になります。
もうわけ分かりません。
222必要なくね?:02/09/23 03:00
っていうかなんで
8bitの unsigned char 型のデータを
32bit右シフトしてるの?
全然シフトについての構造とかは知らないけれど、
隣との、xorを取るようなことを繰り返して、
シフトをしているのであれば戻るのかもね。
224223:02/09/23 03:15
全然的外れな事書いていたらご免ね。
225デフォルトの名無しさん:02/09/23 03:25
数の決まっていない数値データの文字列からタブなどを判別してdouble型の配列に値を代入するにはどうしたらよいのですか?
ま た 未 定(略
数の決まっていない数値データの文字列からタブなどを判別してdouble型の配列に値を代入すればいいです。
228デフォルトの名無しさん:02/09/23 03:32
ヒントだけでも教えていただけないでしょうか?
strtokですか?
分かるとこから書いていけばいいです。
それでも詰まったらコードを晒す。
231220:02/09/23 03:34
>>222
こんな感じの文を書いてる。

unsigned char *p;
unsigned long a;
    :
a |= *p >> (32 - s); // 0 <= s <= 32

s=1〜32のときは期待通り動くのが、s=0のときだけ0にならず驚いた。

>>223
こんな夜中にレスつけてくれただけでも有難う。

いろいろ検索してるうちにこの症状について書いてあるページを見つけた。
どうやらこれは処理系依存らしいが、ANSI Cでもそう定められてるのだろうか。
ttp://www.biwa.ne.jp/~chu0296/laboratory/cpp.html
さて今日もいってみようか

>>231
それは処理系依存ではなく未定義です
>>231
これ試してみたら多分、まずunsigned charをシフトするときでも
32bitレジスタに値を入れてそれをシフトする命令を出してるらしい。
で、それをシフトするとき何ビットシフトするかを入れるレジスタ
の値が31以上だったとき下位5bitだけ使うっぽい。
だから33bitシフトとすると1bitシフトする。
ちょっと脱線。

x86形の話だけど、コンパイラはシフトをアセンブラレベルの
シフト命令(shr/sar)に展開するのね。
で、8086の頃は、シフト命令は1ビットだけシフトする命令か、
CLレジスタに数値を入れてシフトさせるしかなかったのね。
で、ハードウェア的には、本当に繰り返しで処理してたのね。
80186(かな?)以降は、直接nビットシフトする命令が出来たんだけど、
これもハードウェア的には(マイクロコードで)繰り返し処理してたのね。
で、386になってから、多ビットシフトのハードウェアが導入されて、
ようやくシフトが"軽い"命令になったわけ。

で、たしか、386からだと思うけど、clレジスタに32以上の数値を指定しても、
下位ビットだけがマスクされて、実際には31ビット以下のシフトしか
行われないようになったわけ。
だから、16bitコンパイラを使って、32bit以上のシフト命令を使ったプログラムを作ると、
むかーしのCPUと今のCPUで結果が異なるわけ。
この結果を、CPU種別の判別なんかに使ってたりしたんだな。

コンパイラは、CPUの判別なんかしない(実行環境は別だし、以降に生まれたCPUにも対応できない)から、
効率重視のC言語において結果が異なる(未定義になる)のは
ある意味仕方がないとも言えるんだろうね。
235nobodyさん:02/09/23 05:39
>>234
私、初発言の初心者ですが、>>234さんの説明は目から鱗でした。
なるほど、機種依存ってのはここに根本原因があったのですね。
ありがとうございました。久しぶりに濃い文章だっだなぁ。
236220:02/09/23 05:54
>>233-234
235氏と同じく目から鱗でした。
アセンブリ言語の知識はZ80〜8086時代で止まってるからなぁ。
まさに、内部でシフト演算をn回ループしてるものだと思ってたよ。
double i=0;

for(i=0;i<10;i+=0.1){
printf("%1.1f ",i);
}

表示するとなぜか最後に10.0が入るのはどうしてなんですか。
  ま た 浮 動 小 数 点 か ( 藁


って、昨日見たのはJavaスレだったか。
二進数の世界だから、0.1はあらわせなく、誤差が生じて
判定されてしまうって言うのが一般的な回答なのでは?
for(int i=0;i<100;i+=1){ //i++で充分
  printf("%1.1f ",i/10.0);
}
こういうふうにしなさいと言うのもあると思う。
違ってたらご免。
>>233
2^5(2進5bit)で割った余りか。なるほど。
>>237
10.0?なんかソースのコピペミスってないか?
最後だけじゃなく、途中経過も書いてみな。
>>241
ウチだと10.0も出た。たぶん
0.1が0.09999..とかで、
10.0も9.99999...なんだと思われ
9.99999999999998050000
>>241
> 10.0?なんかソースのコピペミスってないか?

既に、>>239 で答えでてるよ。初心者が良く陥りやすい罠のひとつ。

0.1 って言うのが本当の 0.1 じゃないから10回めのループの判定の時に i が 10.0... にならなくて、9.9... とかなっているため、もう一回余分に回るだけ。解決策は、>>239 のようにやるのが普通。

ちなみに、最後に i が 10.0... になって無いのに表示が 10.0 となるのは、出力時に四捨五入しているから。
(0.1)10 = (0.00011001100110011〜〜)2
2進表現内での循環小数になる。=>まぁこれが誤差などの原因かな
#include <stdio.h>
void main()
{
printf( "%f\n", 1 );
}

表示するとなぜかアプリケーションがクラッシュするのですがどうしてなんですか。
http://www.catnet.ne.jp/kouno/c_faq/c15.html#3
15.3:
解けなくてイライラしていた問題が実は、

        printf("%d", n);

で起きていることがわかった。ANSIの関数プロトタイプは上のような 引数の型
の不一致から守ってくれると思っていたのだが。

A:

関数が可変数個の引数を取るとき、プロトタイプは可変数個の引数の 数やその
データ型についての情報を与えない(そもそも出来ない)。よっ て通常の保護の
仕組みは、可変数個の引数リストの可変長の部分には あてはまらない。コンパ
イラは暗黙の変換も(通常の)データ型の不 一致も警告もできない。

質問5.2, 11.3, 12.9, 15.2も参照のこと。
>>247
main()の型がvoidだからです。
標準Cではmain()の型はintと決まっています。
>>249
ネタにマジレスするが
そんなOS依存環境依存なことをどうどうと正論ぶるのはやめにしませんか?
251247:02/09/23 14:37
>>248
レスありがとうございます。
しかし、浮動少数点が正しく表示されないのならば
まだ分かるのですが、なぜクラッシュするのでしょうか?

>>249
int main() にしてもダメでした。
>>251
sizeof( double )!=sizeof( int )だからでないの?
253デフォルトの名無しさん:02/09/23 15:22
>>247
環境も書いてないし、クラッシュしたとは具体的にどうなったのかも
提示されていない。
void なら return ;
int なら return 0;
を入れなさいという事では?(コンパイラの要求)
>>247
printf( "%f\n", 1.0 );
intとdoubleの大きさの違いを思い知れ スッタコ

あと頓珍漢な回答してた>>253も氏ね アホボケ
>>250
> ネタにマジレスするが

メールアドレス見た ?
>>251
呼び出し側がスタックに投げ入れるデータの量と、
呼び出された関数がスタックから取り出すデータの量が食い違えば、
スタックポインタがずれて、まともに動作できなくなる。

とゆーシナリオを想像するんだけど、事実は知らん
そして事実がどうであれ、保証を失う事をしておいて「なぜ?」と問う
自分のセンスを疑ったほうがいいのではないか。
「やっぱり」と思ってほしいぞ
>>255 にしても、クラッシュっていうのは?
259258補足:02/09/23 16:05
だって引数いっこだし、sp弄らないはずだよねえ?
とおもったけど、リターンアドレスもスタックに積んでるか。
うーん、3時間半で11レスか
思ったより釣れたな

一応用意していた回答は
「printfは引数の型チェックを行えないので
浮動小数点を使う場合は、明示的に使ってやらないと
CPUが浮動小数点ユニットを切り離してしまうから
クラッシュする」でした。

ちなみに環境はVC6ですが、インテル系のCPU使っていれば大体どんな
コンパイラ使ってもクラッシュすると思う。

#include <stdio.h>
double d; // <-- 追加
void main()
{
printf( "%f\n", 1 );
}

コレなら表示はおかしいけど死にはしない。

>>257
もちろん実装によるけど...

> 呼び出し側がスタックに投げ入れるデータの量と、
> 呼び出された関数がスタックから取り出すデータの量が食い違えば、
> スタックポインタがずれて、まともに動作できなくなる。

なんてことは、普通起こらない。スタックポインタの操作は呼び出し側の仕事だから、呼び出され側がスタックから一つも読まなくても、ポインタがずれたりはしない。
つーか、printf() なんかだといくつ積まれて呼び出されるかわからないから、呼び出され側でスタックポインタの操作をしようが無い。

> とゆーシナリオを想像するんだけど、事実は知らん

今回の件は、多分 (int)1 の値とその後ろのスタックの内容を (double) として見た時に浮動小数点じゃねーぞって言って怒られたんだと思う。

> そして事実がどうであれ、保証を失う事をしておいて「なぜ?」と問う
> 自分のセンスを疑ったほうがいいのではないか。
> 「やっぱり」と思ってほしいぞ

ここは、同意。「何で、これぐらいうまくやってくんねーんだよ。」とか思う奴は、C なんか使っちゃいかん。
262258:02/09/23 16:11
>260 あー俺FPU意識しなきゃいけない石使ったことなかったよ
263デフォルトの名無しさん:02/09/23 16:21
ドキュソ質問で申し訳ないですが、、、

int buff;

(char)buff; と書いてあればbuffをchar型にキャストせよと言う事ですが
(char*)buff; ならばどーゆー意味でしょう?buffをchar型のポインタ型とせよ、ってことであってます?
bccだとクラッシュしなかった・・・(0.000000と表示された)
>>260
> 「printfは引数の型チェックを行えないので
> 浮動小数点を使う場合は、明示的に使ってやらないと
> CPUが浮動小数点ユニットを切り離してしまうから
> クラッシュする」でした。

やっぱりただのアフォだったか...。printf() 使ってる時点で、浮動小数点ルーチンは組込まれるよ。うそだと思うなら、printf() のソース見てみ。(VC++ なら、output.c だよ。)

> コレなら表示はおかしいけど死にはしない。

たまたまだ。最適化オプションちょっと変えるだけで、クラッシュしたりしなかったりするよ。
>>260
ちょっとまった。それでクラッシュしないのと
浮動小数点ユニットを切り離してしまうのとは
まったく別次元なんだけど、そこは認識してる?

つーか、>>260の回答は間違っている。
>>258
スタックオーバーフロー
>>263
> (char*)buff; ならばどーゆー意味でしょう?buffをchar型のポインタ型とせよ、ってことであってます?

まあ、あってる。多分 int のビット幅と char へのポインタのビット幅が同じ (か、int の方が広い) なんだろうな。

デバッガなんかを作っていて、アドレス値を整数 (多分 16進数から変換して) で入力させて、そのアドレスからデータを引き出すとかやる時に使ったりする。
269263:02/09/23 16:51
>>268
でも

int a = 10;
char b = (char)a;
printf("%c\n" , b);

で10と表示されませんが。
>>260
それでしなないのは、それこそ「たまたま」じゃん。
スタックが増えたからでしょ。 dになんか入れれば表示も変化するよ。
FPU切り離しって何言ってんだかわかんない。
もし万が一そうだとしてもprintf使ってりゃありえんことを理解してよ。
>>269
a=65を突っ込んで、もう一度報告してみろ
俺は
int a = 'A';
をお薦めする
>269 ネタだよね?
274デフォルトの名無しさん:02/09/23 17:12
>>269
%cなんだから10になるわけないのでは?
場が荒れてしまって、申し分け有りませんでした。

こちらで、起きているエラーはこれです。
http://msdn.microsoft.com/library/en-us/vccore98/html/r6002.asp

> たまたまだ。最適化オプションちょっと変えるだけで、クラッシュしたりしなかったりするよ。

確かにグローバル変数で取っても、最適化でクラッシュしますね。

#include <stdio.h>
void f(){ double d=0.0; } // 明示的にFPUを使う
main()
{
printf("%f\n", 1 );
}

これでもクラッシュするオプションあったら教えて欲しいです。
VC++で、各標準関数に対応するソースファイルはどうやったらわかりますか?
真実は知らんがどうせなら __int64 を使って欲しかった。
>>275
VC++だとFloating pointがロードされていないとでるかな。
ちょっとやってみよう。
279278:02/09/23 18:14
やってみた
void f(){double d=0.0; }があると出ないのか・・・
>>257
なるほどな。可変個の引数ゆえにか。
double型の引数を取ると分かっていればintを渡してもdoubleに変換されるんだろうけどね。
281280 :02/09/23 18:22
>>261
いや、違うのか(汗
printf側でスタックに積んだ量よりも多く読もうとしてアクセス違反が起きたということはないの?
数バイトで起るとは思えないけど。
>>275
> http://msdn.microsoft.com/library/en-us/vccore98/html/r6002.asp

ふむ、確かに "%f" の変換ルーチンがテーブルになっていて、浮動小数点関連の操作をしていない時は、エラールーチンを指すようにしている。
大昔に、8087 が必要だった頃の名残りか、ちょっとでも実行サイズを減らそうとする努力なのかも知れないな。
そこまで読めなかったよ、すまん。(ちょっと言い訳すると、IDE で実行すると R6002 の前に、アサーションエラーが先に出るので気付かなかったよ。)
>>282
printf( "%08x %08x\n", 1 );
をリリースモードで実行したところ
00000001 00401145
     ↑mainのアドレス
と表示されますので、アクセス違反は起きていないと思います。

>>283
5年くらい前に、学校の授業ではまったバグです。
ネタのつもりで書き込んだのですが、場が荒れてしまい
申し訳ありませんでした。
C言語での未定義の振る舞いの原因を
議論すること自体がナンセンス。

たとえ外科医を雇って鼻を解剖したとしても
原因の確証はつかめないだろう。
と、アメリカンを気取ってみた。
287デフォルトの名無しさん:02/09/23 19:35
>>285
でもバグの原因追求するときには必要な知識なんだよ。
とくに、クライアントが「結果」しか教えてくれないときとか。
>>285
> C言語での未定義の振る舞いの原因を
> 議論すること自体がナンセンス。

まあ、たまには処理系べったりの議論も悪くないさ。ここだとちょっとスレ違いかもしれないけどね。久々に output.c のソースなんかも見たしね。
(でも、結局誰が 変換ルーチンのテーブルセットしてるか良くわかんなかったけと。)
289デフォルトの名無しさん:02/09/23 20:59
C言語なら私に聞け
>>289
質問!

Cで、mallocされたあとに使われてなくなった(参照の無くなった)メモリを
ガーベッジコレクトしてくれるような仕掛けをどうにか作りたいと考えてるんだけど
どうしたらいいかな?

今考え中なのはmallocで返却されるポインタをすべてライブラリで一元管理して
ポインタへのポインタを持ち歩いてもらうことでリソースの利用状況を監視できる
ようなものを考えたんだけどスコープの外れたスタック変数なんかは
どうしても監視しようが無くて困ってまぅ
291289:02/09/23 21:40
よし!次!
>>290
> Cで、mallocされたあとに使われてなくなった(参照の無くなった)メモリを
> ガーベッジコレクトしてくれるような仕掛けをどうにか作りたいと考えてるんだけど
> どうしたらいいかな?

基本的に C でやるのは難しいし、あまり益が無い。そう言うのを作るのが楽しいと言うのでなければ、Java とかにした方がいい。

> 今考え中なのはmallocで返却されるポインタをすべてライブラリで一元管理して
> ポインタへのポインタを持ち歩いてもらうことでリソースの利用状況を監視できる
> ようなものを考えたんだけどスコープの外れたスタック変数なんかは
> どうしても監視しようが無くて困ってまぅ

基本的に C にはその手の監視機能が無いから、プログラマーに関数から抜ける時は ○○の関数を呼んでね、としておいてその関数が頑張ってスコープの外れたポインタを知るようにするしかないと思う。
ソース自体に書くのはあまりにも面倒だから、プリプロセサに手を入れるとかする必要があると思う...、とか考えるとせめて C++ にした方がいい。
293デフォルトの名無しさん:02/09/23 21:42
DLLをつかってプログラムを作りたいのですが
DLLに処理を渡すときはどういう風にするのですか?
295デフォルトの名無しさん:02/09/23 21:43
さっき友達から電話かかってきて、質問受けたけど
コンパイル時に「Sample.obj(Sample):Undefined symbol:_power_」などと表示され、プログラムを実行したときに途中で止まってしまうらしい
なんか心当たりはある?
296290:02/09/23 21:50
>>294
わーお!
これナイスだな。 GCのタイミングは良くわかんないけど。
そうか、スタックもヒープも全部検査するか、そうきたか。
遅いかなーと思って敬遠気味だったけどそれが楽だしな。
>>296
これナイスってアンタ、死ぬほど有名だぞ………
Boehm GCって速度的にはどうなんだろう。
>>295
*途中で*止まるのなら面白いね
>>298
w3mでも使ってみればええやんけ。
>>300
なんですかそれ?
調べろよ厨
>>297
> これナイスってアンタ、死ぬほど有名だぞ………

使ってんの見たことないけど...。
>>303
w3mでつかってるよ
305デフォルトの名無しさん:02/09/23 22:07
今日大学の授業で課題がでました。
課題の内容がWindowsのコマンドプロンプトで動作するアドレス帖です。
そんなプロでも作れるかどうかわからないものを学生に作れという教授に問題がある、という皆さんの意見はわかりますが僕は何とか作って提出したいと思っています。
そこで皆さんにお願いがあります。

作って!!
>>305
そんなプロでも作れるかどうかわからないものを学生に作れという教授に問題がある。
>>305
そんなプロでも作れるかどうかわからないものを学生に作れという教授がいる大学に入る>>305に問題がある。
アドレス帖って、住所の一覧表示するだけ?
>>305
了解!
#include <stdio.h>
int main(void)
{
 printf("漏れのアドレスは%p\n", (void*)main);
 return 0;
}
>>305
何も制限無いんだったら、適当に作ってアドレス長帳だと言い張れば?
>>305
「アドレス帖」 というのが何かのソフトウェアだと仮定しよう。
それがどういう動作をするものなのか教えてくれないかな?

たとえば、実行したら Hello,wolrd! と出力する、という仕様なら
それはプロでなくてもできるレベルだよね。
312305:02/09/23 22:18
>>311
すみません。アフォの相手をするつもりはありません。
あおりは別スレにいってください。つーか氏ね。
今度は305祭りか、、
このスレでの 305の将来が決定いたしました!!
>>312
てゆーか、仕様書けよ、と言ってるんだけど。
オフィスやアウトルックにあるような他アプリ連動型とかいきなり作るわけでもないっしょ
316305:02/09/23 22:22
>>312は偽者ですので無視してください。ということで、

作って!!
つーか、宿題やってってとこだろ
C言語初心者で、問題を沢山こなしたいんですが
〜を作れ!という初級問題があるサイト無いでしょうか?
>>316
309が丁寧に作ってくれたじゃないか。
ということで君の問題は解決済みと判断する。
>>381
子を作れ!
>>318
305は?
322先生:02/09/23 22:26
>>318
どこか寂れた誰も使ってないスレッドに誘導してくれれば
sage進行でオレがみっちり鍛えてやるよ。
[Q1]渡した文字列を反転して返す関数fugaを作れモルァ
{Q2]メモリを確保する関数hogeを作れ
- 内部でmallocを使ってよい
- そのmallocがNULLを返したらabortする
- hogeの戻りはvoid。引数は好きにしな

>>318
324323:02/09/23 22:35
風呂に入ってくるのでその間に回答ヨロシク
…もっと勉強して出直してきます。ありがとうございました。(;´д⊂)
>>325
マ、マジでつか?
#include <string.h>
unsigned int hh(const char *s)
{
  const char *p;
  unsigned int n = 0;

  if(s) {
    p = s + strlen(s);
    while(--p >= s) n = (n<<1) + *p;
  }
  return n;
}

上の関数を作って実行したところ、愛しいあの子にコクられました。
何がよかったんでしょうか?
328318:02/09/23 22:41
char *fuga(char *s) {
 int len;
 char *p;
 len = strlen(s);
 p = (char*)malloc(len);
 strcpy(p , len);
 for(i = 0;i < len ; i++)
  s[i] = p[len - i - 1];

 free(p);
 return s;
}
>>328
strcpyもついでにやっちゃえ
char *fuga(char *s) {
 for(i = 0;i < strlen(s) ; i++)
  s[i] = ~s[i];
 return s;
}
>>328
ネタ?だよね?
332323:02/09/23 22:48
>>328
fugaではmalloc禁止で。
333:02/09/23 22:49
文字列AとBを比較して
Aの中にBの文字列が含まれているかどうかを
調べる標準関数ってありませんか?
一文字ずつ自分でif文で比較していくのがいいのでしょうか?
いい方法あれば教えてください。
>>330
エレガントに書け!

while(*s=~*s++);
>>330
正解!!
int i;
が無いけど。
strstrのこと?
>>333
index
338323:02/09/23 22:51
>>333
strstr(3)
>331
あ、漏れもそういうコードよく見るよ。
>>334
ネタ?だよね?
>>334
物凄い勢いで2箇所ほど突っ込み鯛。
342333:02/09/23 22:54
ありがとうございます。
やってみます。
343334:02/09/23 22:55
>>341
おれも書いた瞬間に感じたよ。 やっちゃったって感じさ。
344323:02/09/23 23:01
>>337
それなに?
345327:02/09/23 23:06
漏れの質問は放置かゴルア!
>>345 放置です。
>>345
かっこつけずに手続きをきちんと書き直してみなよ
348C初心者:02/09/23 23:11
>>225 面白そうなのでちょっとやってみたっす。それ以前に、まだ、このスレみてますか?
struct suji {
char tmpbox[512]; double suji[64];
} box={ {0x00}, {0} };
int dblsave( struct suji *TpData, const unsigned char *rec, const char *kugiri )
{
    int i, s, c;
    for( i=s=c=0; *(rec+i)!=0x00; ){
        if( 0x30<=(int)*(rec+i)&&(int)*(rec+i)<=0x39 )
            *(TpData->tmpbox+s++)=*(rec+i++);
        else if( memcmp("0", rec+i, 2)<=0 && memcmp(rec+i, "9", 2)<=0 ){
            *(TpData->tmpbox+s++)=*(rec+i+1)-0x1f; i+=2;
        }
        else if( !memcmp(rec+i, kugiri, strlen(kugiri))){
            TpData->suji[c]=atof(TpData->tmpbox); c++; s=0; i+=strlen(kugiri);
            memset(TpData->tmpbox, '\0', sizeof(TpData->tmpbox));
        }
        else return (-1);
    }
    if( !*(TpData->tmpbox) ) c--;
    else    TpData->suji[c]=atof(TpData->tmpbox);
    return (c);
}
void main( void )
{
    int i,c; char test[256]={"123|123|"}; /* 7c を tab に変換してテストしてチョ */
    if(-1==(i=dblsave( &box, test, "|" ))) exit(1); /* "|" を "\t" に変更 */
    for( c=0; c<=i; c++ )  printf( "%lf\n", box.suji[c] );
}
349327:02/09/23 23:12
>>347
どういう意味でしょうか。
>>349
きちんと分解してロジックを見直せばわかるよ、ということ。
練習だと思ってやってごらん
351デフォルトの名無しさん:02/09/23 23:20
C言語ってポインタが使えるからいいなあ。
352デフォルトの名無しさん:02/09/23 23:25
printfで、 \ から始まる特殊文字の一覧ってどこにあるんすか?
353327:02/09/23 23:25
>>350
うむむ。分解するとますます分からなくなりますた。
  if(s) {
    p = s + strlen(s);
    p--;
    while(p >= s) {
      n <<= 1;
      n += *p;
      p--;
    }
  }
>>352
> printfで、 \ から始まる特殊文字
??
355352:02/09/23 23:29
>>354
\n とか \r とか、その辺の一覧
あまり詳しくなくてよくわからんのですが、
>>334
int i = 0;
while(~(TempString[i] = ~TempString[i++]));
TempString[i] = '\0';
return TempString;

こんな感じならいいの?
>>356
n=n++; がおもっくそ未定義だったんだよウワァン
>>353
どこも間違ってないです
>>357
何か勘違いしてると思うよ。
360359:02/09/23 23:39
あ、いや俺の勘違いか。スマソ。
361356:02/09/23 23:39
334の俺の解釈は下記ですがOK?
・ポインタが進んでしまう
・'\0'が反転されてwhileの判定がおかしくなる
・最後の'\0'が0xFFになってしまう
363356:02/09/23 23:41
>>362
ということは359もダメということですね。
>>355
その辺の文字はprintfにおいて特別な意味はありません。
>>361
25点

・ポインタが進んでしまうのは間違いじゃない
・\0が反転されておかしくなる
・だから、上のと同じことだ

あとは後方演算子++の挙動がこの場合未定義だっつーことで
>>364
言い方が悪かった。

といってもなんと言えばいいかうまく言えないけど
\r とか
367356:02/09/23 23:46
>>363 訂正
ということは356もダメということですね
> ということは356もダメということですね
だね。
369356:02/09/23 23:49
一応、356を修正しておきます。
int i = 0;
while(~(TempString[i] = ~TempString[i])) i++;
TempString[i] = '\0';
return TempString;
渡した文字列を反転って、ビット反転じゃなくて順番を入れ替えろってことじゃなかろうか。
0xFF が 0 になっちまうし
>>370
漏れもそう思った。
そりゃそうだろ
>>370
ネタから派生した疑問ということで、、
>>369
fuge(char *s){
char *d=s;
while(*s){*s=~*s;s++;}
return d;
}
こうしなきゃならんかったわけだね
プログラム中でLinuxのコマンド(cpとかrouteとか)を呼び出したいのですが、
どうしたらいいのでしょうか?
>>374
たしか、参照型とポインタ型で、この char *d を省くことができたような。
よく覚えてないから誰かフォローして
>>375
system("ls");
378デフォルトの名無しさん:02/09/23 23:54
000
001
 ・
 ・
100
という風にファイルに3桁の番号を順番に書き込みたいのですが
fprintf(fp,"%3d\n",i);
では上の桁の0が追加されません
どうすれば上のように3桁で書けますか?
>>375
呼ぶな || perl使え || system(3) || popen(3) || die
>>378
%03d
%03d
*s=~*s;

*s^=0xFF;
ってどっちが速そう?
383378:02/09/23 23:58
できました。ありがとうございました。
ここのスレってsage推奨のようですね・・あげてしまってすみませんでした。
>>382
出来の悪いコンパイラでなければどっちも同じになる。
>>382
fuge(char *s){
char *d=s;
while(~(*s++^=~0));
return d;
}
って感じ? 動くんかな
>>376
そんなもの省いてもメリットなし。
値を返さない関数にしてもいいわけだし。
>>386
一応、お題的にポインタをそのまま返して欲しそうだったから。
388デフォルトの名無しさん:02/09/24 00:03
>>383
質問はageてもらわないと困る
>>382
同じくなるのか・・・コンパイラの最適化ってすごいな。
390デフォルトの名無しさん:02/09/24 00:07
なんで&&と||はあるのに^^はないの?
391デフォルトの名無しさん:02/09/24 00:08
>>390
必要ないから
>>390
元に戻るからじゃん?
>>390
^ひとつで十分だからじゃない?
(a=b)^(c=d)
394デフォルトの名無しさん:02/09/24 00:10
>>392
>>390の言う^^って、多分どちらかの式が真のときのみ真となる演算子という意味だと思うぞ。
^^ は !!(a) ^ !!(b) という意味だと思う
滅多に使わないが、有っても良かったかな

396386:02/09/24 00:12
>>387
だったら少なくとも変数(仮引数含む)が2つは必要だね。
じゃあ>>385で完成だ
398C初心者:02/09/24 00:22
>>323 [Q1]ならできそうなのでやってみたっす。
[Q2]はちょっと... 一応2byte文字対策も前提で作成してみました。
文字列の反転 EX)あいうえお -> おえういあ みたいな感じでいいのですか?
void *fuga( void *buf, const void *rec )
{
    int i;
    int c;
    int l=strlen((char *)rec);

    *((char *)buf+l)=0x00;
    for( i=c=0; *((char *)rec+i)!=0x00; i+=c,l-=c )
    {
        if((0x81<=(int)*((unsigned char *)rec+i)&&(int)*((unsigned char *)rec+i)<=0x9f)
        || (0xe0<=(int)*((unsigned char *)rec+i)&&(int)*((unsigned char *)rec+i)<=0xfc))
            c=2;
            else    c=1;
        memcpy( (char *)buf+l-c, (char *)rec+i, c );
    }
    return ((char *)buf);
}
void厨ウザイ
>>399
どんな厨房だよ(^_^;)
>>398
ナイスボケ!
あとはいいツッコミ役を探さなくては・・・
402突っ込み厨:02/09/24 00:30
>>398
呼ばれたので
"あaいbうcえdおe"こんなのは?
もんだに前提が無いのでEUCとか全ての文字コードに対応しよう。
>>327 も未定義。
というネタだったんだろな。
405出題者:02/09/24 00:36
もしマルチバイト文字に対応するなら、wchar_t型の文字列に変換できる
エンコーディングのみに対応でいいよ。>>398

#と、難しくしてみるテスト
Shift_JISなら
if ( ch^0x20-0xA1&0xFF<0x3C )
でマルチバイトらしい
407名無し募集中。。。:02/09/24 00:39
>>323の問題ってどちらもK&Rに載ってる香具師だな
408出題者:02/09/24 00:40
あ、そうなん?
即席なんだけど。
327のしたいことがよくわからないのです
被K&R洗脳厨ウザイ
411406:02/09/24 00:42
演算子の優先順位考慮すんの忘れてた・・・まあいいか
>>409
いや、だから未定義の箇所を探せっていう
ネタじゃないの?
マルチするなよ〜〜(違っ)
>>413
意味わかんね
俺には未定義が見つけられない(´д`;)
416出題者:02/09/24 00:49
>>415
俺漏れも
未定義箇所は未定義です
418403:02/09/24 00:57
>>415,416

この部分 ↓
> while(--p >= s)
だめなん?なんでだめなん?
420403:02/09/24 01:05
>>420
へえ
勉強になりますた。

それで暴走する処理系があったら紹介きぼん。遣って見たい

しまった、気づかなかった
p が s の前に行った瞬間に未定義か・・・
>>418
そこゼンゼン問題ないよ。
p >= s の評価前に p をデクリメントするから。
ちなみに、もし仮にここが
p-- >= s であったとしても未定義ではない。(ロジックはでたらめになるけど)
なぜなら、デクリメントはwhileの式評価のあとに直ちに行われるから
( {}のあととか、そういうことは決してない。 for文の挙動を思い出そう )
やっぱり駄目だな、C言語は。
という結論。
>>423
多分君はとても阿呆
>>422
問題ないよ
アドレスの比較であってアドレスの指し示す中身を取り出してるわけじゃないしね
アドレスの比較すら駄目な罠
フレームになる前にさっさと誰か規格の英文引用汁!

アドレスの比較=単なる数値比較 だけど
それでもダメな理由はなんだろう・・・
>429
駄目になっても文句が言えないだけで駄目な処理系なんてないだろ
アドレスが連続しているとは限らない
アドレスが単なる直列な数値とは限らないからでわ
>>430
>駄目になっても文句が言えない
ここがおかしいと思う。「文句が言えない」という理由がないよね。
C++だとどうなんだろう。ポインタ演算なんてまずしないけど
ちょっと気になるな。同じくIS引用希望。
435403:02/09/24 01:18
>>423
> p >= s の評価前に p をデクリメントするから。

そうなの?
評価前にデクリメントするから問題なんじゃないの?

ループを終了するには p < s になる必要があるよね。
sより小さくなったpを比較に使った時点でアウトなんじゃない?
432が妥当 >>433
>>431
ああ、そういうこと言いたかったのね。
しかし、この場合はそれでも問題ないと思うよ。
438403:02/09/24 01:19
>>432
俺もそう思う。
>>437
>しかし、この場合はそれでも問題ないと思うよ
何故?小一時間。
440323:02/09/24 01:24
sのアドレスが0x0でかつNULLとは!=であったならどうだろうか?
と言ってみるテスト
アドレスが連続空間にないという前提だと、
char *t=hoge[256];
このtをインクリメントしていったときにもtは不連続に変化する、ということにならない?
配列でとった部分は連続なんだっけ?
--t は、やっぱり t-sizeof(char) にならない?
愛しいあの子にコクられる処理系なら漏れも使ってみたい
>>441
char (*t)[256]; のtなら256バイト毎に変化するかも。
>>440
あーそれかー。 それなら、えーと
(--p >= s) じゃあなくて (--p-s>=0) であれば問題ないね。
>>432 この理由なら
下記がいいという説明がつかない。
while (head + 1 < tail) { /* +1は、なくても動作する */
一応、ルーチンの先頭で型定義してるので、
連続して無くても問題ないのでは?

未定義なのは別の理由じゃないかな?
未定義厨ウザイ
別の理由は440じゃだめなん?>>445
>>446
C言語なんてもはや頭の体操にしか使えないんだから微笑ましいじゃねえか。
黙って見守れ。
わたくし、間違っておりました!

--p>=s はダメですね。
配列のアドレスで許容されているポインタ(アドレス)の可動範囲は
hoge[HOGE]なら hoge〜hoge+HOGEまででした! (hoge〜hoge+HOGE-1ではない)

どーもすみませんでした
>>447
sが0x7FFFFF(32Bitアドレスとして)の場合は?
451440:02/09/24 01:34
駄目だね。ごめんよ。
いや、とにかくポインタってのは規格の上では
整数値と同等に考えちゃだめなのよ。
 char *p;
この pが有効なオブジェクトの範囲を指していない場合は
 p++;
を実行した後のpの値は予測できない ってことでどうよ?
>>444
同一の配列を指していないポインタ同士の減算は未定義なので、
結局同じこと。
>>452
それはOKだって。
なんでそういう規格にしたんだろう?ってのが話題。
たとえば処理系によってはポインタの上位16バイトでさしている配列のID
下位16バイトで配列内でのオフセット
とかなってるかもしれない

ptr<Tail
は仕様によって保障されているから、内部表現に関わらずOKだけど
ptr>=Head
はこういう処理系では誤作動するよね
>>452
規約では+1までは移動だけは許可されておりますです!
さらにそのポインタの指すものも取り出せるであります!
しかし、そのときの取り出したもの(*p)の中身はぐちゃぐちゃであります!
457デフォルトの名無しさん:02/09/24 01:37
なぜ
> (hoge〜hoge+HOGE-1ではない)
なんだろう。
458452:02/09/24 01:38
>>454
ごめんなさい。逝ってきます。
>>457
>>456であります!
>>458
うんうん。ガス管でな。

>>454
カニチャーハンにその辺ちょっぴり載ってた。
C-FAQにも出てたよ
462452:02/09/24 01:39
>>456
ごめんなさい。逝きます。
>カニチャーハン
微藁
>>454
典型的な例がx86のfarポインタ。
規格を決めた当時、最も使われていたアーキテクチャを無視することは
できなかったのでは?
465デフォルトの名無しさん:02/09/24 01:40
>>420
どうでもいいことなんだけど、そのint len;ってなんのために定義しているんだろう。
>>464
感動した!!
>>457
char s[100];
char *end = &s[100];
while ( p != end ) ++p ;
を動かすためだろ、C++やるとこんなのがそこら中で出てくる。
C++でも一緒ですか?
469452:02/09/24 01:43
>>456
いや、ちょっと待った。
俺が
> 有効なオブジェクトの範囲
と書いたのはそのことだよ。
>>467
出てくるがそれはraw pointerではなくてiteratorなわけで、
同じ枠内で議論するには無理があるのでは..?
char *strrev(char *str)
{
char *head,*tail;
int c;

head=str;
tail=s+strlen(str)-1;

for(;head<tail;head++,tail--)
c=*head,*head=*tail,*tail=c;

return str;
}


これならOK?
俺ならこう書くけど。
472467:02/09/24 01:44
すみません
p 宣言するの忘れました。

オマエラいい加減寝ろよ、明日から仕事あるんだろ。
漏れはもう寝る。
乙〜
>>470
禿同

実際には>>467みたいなのは出てこなくて
std::vector<char>::const_iterator p = v.begin();
while( p != v.end() ) { /* hoge */ p++; }
なわけだが。

474467:02/09/24 01:47
>>470
一応、ポインタもお終いの一個先まで保証されている。
それと、vector のイテレータは殆どの実装で生ポインタの
typedef だからそんなに的外れという訳じゃないと思うが、
>>474
またMSだが、VS7のSTLはちゃうね。
任意の型のポインタはランダムアクセスイテレータに分類されまする

と手元の STL 本にはあります
だから桶でしょう
すれ違い
>>468
ISO/IEC 14882 によれば、
> If both the pointer operand and the result point to elements of the
> same array object, or one past the element of the array object, the
> evaluation shall not produce an overflow; otherwise, the behavior
> is undefined.
らしいので、一緒のようだ。
じゃぁやめとこう。そして寝よう。
>>471
だめっぽい。
sとはなんだ?
>>478
どうもありがとうございます。
>>480
あ、、、そこだけ修正し忘れました。sはstrです。
手元で書いた時はsにしたんで。
結論はネタがみんなの役に立ちましたと。
好きなあの娘にコクられまくってましたと。
アホかと。

>>482
ようは
char* str="";
のときに、str+1は比較に使ってもよいが、
str-1は比較に使ってはだめだということ。
だと思う、、、、
485482:02/09/24 02:04
>>484
あーなるほど。
それでメモリーが連続しているとは限らないと誰かが言っていたのか。
ありがと
>>484
誰に解説しているの……?
>>486
>誰に解説しているの……?
>>471 = >>482
488482:02/09/24 02:16
ん?まてよ・・・そうすると>>471でもまずいような気が・・・・
↓こうするか・・・

char *strrev(char *str)
{
char *head,*tail;
int c;
size_t len;

len=strlen(str);
if(len<=1)
return str;
head=str;
tail=str+len-1;

for(;head<tail;head++,tail--)
c=*head,*head=*tail,*tail=c;

return str;
}
>>488
よさげ。
490デフォルトの名無しさん:02/09/24 02:41
printf等でよく使う、\r とか\nとかの
完全な一覧表ってどこかにあるんでしょうか?
エスケープ厨ウザイ
>>490
ま た お な じ し つ も ん か 。
ウザイ厨ウザイ
>>490
入門書とかじゃダメなの?
>>490
どこかにはあります。
以上。
496490:02/09/24 02:52
>>494
不完全なのしか載ってないんだ
\0と\nくらいしかない

>>492
流されちゃったからね
>>490
abfnrtvだ。さっさと帰れ。
490=82=16
と推測しますた。
>>496
立ち読みしてから載ってるのを買ってくればいいじゃん。
>>490
> printf等でよく使う
とか言ってる段階では、完全なものは必要ないのでは?
>>497
よくわかんない
>>501
完全な一覧表だが、見て分からないのか?
>>502
うん
じゃあ何読んでも分からないな
>>490
「エスケープシーケンス」で検索した?
4,000件以上ヒットするよ。
わかんなかった
二次元配列をポインタに代入したいのですが,うまくできません。

char L_box[20][30];
char *P_box[20][30];

P_box=L_box;

どのようにすればいいのでしょうか?
いったい何がやりたいんだ?
まずそれを明確にしろ。
L_Boxをポインタ変数に代入して使いたいんです
FAQですよ>2次元配列とポインタ
>>6のですか?
見てみます
わからなかったです

void func(char a[][30]);

のように関数に渡すのはわかるんですが,
同関数ないで,

2次元配列を宣言
@ポインタ変数を宣言
Aポインタ変数にアドレスを渡す

の@の宣言の仕方がよくわかりません。
Aの右辺と左辺,両方の形もよくわかりません
>もし2次元配列を以下の関数に渡すと
>int array[NROWS][NCOLUMNS]; f(array);
>関数の宣言は以下のどちらかでないといけない。
>f(int a[][NCOLUMNS]) { ... }
>あるいは
>f(int (*ap)[NCOLUMNS]) /* apは配列へのポインター */ { ... }
char L_box[68][51];
char *box[51];

box = &L_box[51];

error C2440: '=' : 'char (*)[51]' から 'char *[51]' に変換することはできません。

どうすれば・・・?
char (*box)[51];


できました

>>515
まじでありがとう
お詫びに今日ごみ一個拾うことにするよ
>>505
正確には「エスケープシーケンス」という呼称はあてはまらないんですよね。
520505:02/09/24 11:18
>>519
よく知らない。
一文字では「シーケンス」ではないからな
522等幅フォントで見れ:02/09/24 16:28
・エスケープシーケンス

\a     BEL: ベル                        \\      \: バックスラッシュ
\b      BS: バックスペース              \?      ?: 疑問符
\f      FF: 改頁                        \'      ': 単一引用符
\n      LF: 改行                        \"      ": 二重引用符
\r      CR: 復帰
\t      HT: 水平タブ                    \ooo     8 進数(o=[0-7])
\v      VT: 垂直タブ                    \xhh    16 進数(h=[0-9a-fA-F])

・演算子の優先順位と結合規則
本文長すぎの為省略
>>522
それで全部かい?
0.0fや0L(ゼロ、エル)はわかるんですが
0U(ゼロ、ユー)は何ですか?
あと、他にも直打ち数値のサフィックスってあるんでしょうか?
>523
\o=ママ バックドロップ
見える見える
>>519
エスケープシーケンスでいい。
コンソールを制御する記号列もまた、エスケープシーケンス。
区別したければ「Cの」とか「ANSI端末の」とかつけれ
>>527
> 区別したければ「Cの」とか「ANSI端末の」とかつけれ

「プリンタの」も忘れないでね。
529デフォルトの名無しさん:02/09/24 23:41
char *a="こんにちわ",*b;
scanf("%s",&b);
if(a==b)
printf("正解です\n");
else
printf("違います\n");
}
エラーは出ないけどできません・・・
なぜですか?
>>529
入力された文字列が何処へ格納されるか考えてみたかい?
・bが未初期化でメモリが割り当てられてない。
・比較の方法
>>529
> エラーは出ないけどできません・・・
> なぜですか?

間違ってるからです。strcmp() あたりを調べるがよろし。
あと、scanfのパラメータが・・・
>>533
> あと、scanfのパラメータが・・・

それ以前に、b の初期値が...。
524 にでてるんだけど, 0.0f や 0L のようにサフィックスを
付けなければいけない状況ってどんなときですか ?
>>535
型あわせだろ。
直打ち小数演算はdoubleとして扱われるので
float a = 1.0f/0.3f;
とか
float a = (float)1.0/0.3;
>>538
> float a = (float)1.0/0.3;

>>537 でいいんだから、キャストはやめようよ。
あれ ?, 537 と 538 って同じなんだ.
勉強不足だ, 俺 ...
流れ読めてねーよ
float a = 1/0.3;
じゃダメなの?
543デフォルトの名無しさん:02/09/25 01:10
で、>524がわかる方はいらっしゃいませんのでしょうか?
U:Unsignedでいかんか?
>>524
標準だと他にLLがある。VCの拡張ならi64というのも。
>>543
わからんのならキャストでもしとけ。
>546
すいません、おっしゃっている意味が全くわかりません
0U(ゼロ、ユー)がコンパイラ(あるいはプリプロセッサ)に
どう解釈されるのか知りたいだけなのですが?

そもそもキャストとかいうC言語の汚点を隠すために
サフィックスが使われているんじゃないんですか?
>>547 unsigned の Uっしょ。
>>547
> そもそもキャストとかいうC言語の汚点を隠すために
> サフィックスが使われているんじゃないんですか?

んじゃ、((void*)0) を数値定数で表現してみろ
550デフォルトの名無しさん:02/09/25 02:32
先生!スレタイトルの(33)ってのは年齢のことですか?
>549
キャストを使うなって言ってるんじゃなくて
使わなくて良い所で不用意に使うなって意味なんですが・・・

これだから年寄りは・・・
552デフォルトの名無しさん:02/09/25 02:38
−−−−−−−−−−−−−−−−−−−−−−−−−−
俺様用しおり
                \ │ /
                 / ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚ ∀ ゚ )< 読んだ読んだ読んだ!
                 \_/   \_________
                / │ \
                    ∩ ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< 読んだ読んだ読んだ読んだ!
読んだ〜〜〜〜!   >( ゚∀゚ )/ |    / \____________
________/ |    〈 |   |
              / /\_」 / /\」
               ̄     / /
                    ̄
−−−−−−−−−−−−−−−−−−−−−−−−−−
何だ、ただの釣り師かよ・・ツマラン
>>先生!スレタイトルの(33)ってのは年齢のことですか?
スレが33枚目(32000以上レスがついた)ってこと。
>>551
> キャストを使うなって言ってるんじゃなくて
勝手に勘違いすんな。

> キャストとかいうC言語の汚点を隠すために
> サフィックスが使われている
と言うのならなんでポインタ等のサフィックスが無いのか?
という意味なんだが。
検索エンジンで探すことすらしない厨房の頭じゃ理解不能か。
556555:02/09/25 02:50
あ、555ごっと!
524=490=352  =スレ立てるまでもない質問スレの820
と断定しますた。
だいたい、ポインタに即値を代入するのは
ほとんどがヌルポインタだけだと思うが、、、
559555:02/09/25 02:58
>>558
あ、確かにそうだわな。
検索しなかったのは悪いと思うし
後半のレスが無意味だった事も認めるけど
「0Uってどう解釈されるの?他にもサフィックスてあるの?」って問いに
いきなり「キャスト使え」って答えられても困ります

「普通に数値書いただけだと警告がでてしまうので云々」て質問に対してならわかるけど
561デフォルトの名無しさん:02/09/25 03:02
>>554
ありがとうございます!!
漏れの脳内では33歳の女性教師が眼鏡とストッキングを着用の上教えてくれるスレ
だとばかり思い込んでしまっていたので真実が知れて胸をなでおろしています
これからはマジメにC言語にハァハァしますので今後ともお見捨てなきようおながいします
>557
ちがいます

てか、490=352=スレ立てるまでもない質問スレの820
まではあってると思うけど
563555:02/09/25 03:10
>>560
それは俺に対して言ってんのか? >>546に言えよ。

答えは上で出てるけど、
数値の型を表すためにサフィックスで使われる文字は
L long (or long double)
U unsigned
F float
合わせ技もあり。
あとはそれぞれの処理系定義かな。あまり自信はないけど。
564555:02/09/25 03:13
↑C99ではどうなのか知らんよ。
565546:02/09/25 03:33
>>560
> いきなり「キャスト使え」って答えられても困ります

いきなり検索等もせずに質問して、しかも回答されてるのを
無視してたヤツに言う権利はない。キャストでも使っとけ。
たまに>>560みたいな勘違い坊やが出てくるけど
まあ生暖かく見守ってやろうぜ。
567 :02/09/25 12:59
毎スレ 毎スレ スレ立て人の歳が違うじゃないか!
男か女か!

自分の歳も性別もわからんのか このぼけどもが!!!
ランダムな数値の入っている配列全てに、
1度に定数を加えるってことは可能?(int型です)
n[]={5,9,4,7,22,6,10};
*n+=20;  これで出来ないような気がするのです。
結果25,29,24,27,42,26,30になるような。
>>568
> ランダムな数値の入っている配列全てに、
> 1度に定数を加えるってことは可能?
無理です、そういう関数を作るかループを使ってください。

> *n += 20;
先頭の要素だけが加算され、残りはそのままです。
結果25,9,4,7,22,6,10};
570デフォルトの名無しさん:02/09/25 13:24
16進数を10進数に変換するにはどうしたらいいでしょうか?
>>569
ありがとうございます
16進数の各桁に、16のn乗を掛け加えて行く。
>>568
char にして MMX で一気に処理しる
>>570
質問の意味がわからないが
16進数文字列を数値に変換する関数ならsscanfという関数がある。
575570:02/09/25 13:39
>>572
16のE乗とかってあるのですか?
>>574
調べてみます。

あと逆の変換の仕方もわかるかたいますか?
手順としては、A〜Fを10進数に直してから。
>>575
> あと逆の変換の仕方もわかるかたいますか?
やっぱり質問の意味が良くわからないのだが、
数値を10進数文字列に変換する関数ならsprintfという関数がある。
「進数変換」で検索したら?
10進数を16で割っていき、余りを逆順にならべるで出来なかった?
579570:02/09/25 13:48
えっと、printfやscanfを使わずに変換する方法を知りたいのですが、
質問の意味わかっていただけましたか?
わかるやつはサイコメトラー
581570:02/09/25 14:05
>>578
15を16で割ったらあまり15ですけど・・・
582うんっちっち君:02/09/25 14:11
プログラマ(SE?)で内定ということで
いままで独学で無茶苦茶やってきたプログラムを正しく勉強しなおしているのですが、
まあいままではVCでゲーム作ってばっかりだったので
じつは基本のCが理解できてなかったりします。とくに演算系。

で知らないものがいくつかでてきました。
printf("ああ\n")=puts("ああ")
scanfのかわりのgets、これはもう絶滅した使わないものととらえていいのでしょうか。
if文と同じ処理なんだけど a?b:c ってやつです。
これら3つって使うことあるのでしょうか?
ぜんぶprinf,scanf,ifで済ましたほうが文面的には長くなるけど
のちのち解読しやすいと思うのですが。
しかもコンパイルした時点でどうせおなじ処理なので重さとか処理速度には
関係しませんよね。?
>>579
> 質問の意味わかっていただけましたか?
わからない。
>16進数を10進数に変換するにはどうしたらいいでしょうか?
16進数とは「数値」なのか?「文字」なのか?
10進数とは「数値」なのか?「文字」なのか?
数値→数値は意味がないし、
文字→数値ならばsscanfがあるし、
数値→文字ならばsprintfがあるし、
文字→文字ならばCでは非常に面倒で私には答えかねる
584 :02/09/25 14:14
>>582
仕事として やってくならば、リストの解読のしやすさに
重点を置いたほうがいいな。

自分が作ったソースを 他人が 見て修正するなんてことは しょっちゅうだからな。
0xFBA = 15 * 16^2 + 11 * 16^1 + 10 * 16^0
>>581
Cライブラリのソース嫁
>>582
> scanfのかわりのgets、これはもう絶滅した使わないものととらえていいのでしょうか。
使うならfgetsを使え

> if文と同じ処理なんだけど a?b:c ってやつです。
> これら3つって使うことあるのでしょうか?
プログラムを書くためには必要ないかもしれんが、
プログラムを読むためには必要なものだ。
他人のソースを読んでメンテするのもプログラマの仕事の1つだ。
>582
てか、三項演算は使うぞ
1ステートメントしか入れられない場所で
どうしても条件分岐が必要な事はある
>>583
文字→数値→文字とやるのが楽。
>>582
printf("ああ\n") と puts("ああ") とでは前者の方が遅いぞ。
といってもこの程度だと大した差ではないが。
「printf("ああ\n");」VS「printf("%s", "ああ\n");」だとどうなるのか?

と言ってみるテスト
後者が遅い













のか?
>>588
printf("iは%sの数です。\n",i<0?"負":"正");

こんなのとか?
printf("iは%sの数です。\n",&"負\0正"[(i<0)*3]);

トリッキースレ逝きだな、、、
>>594
printf("iは%sの数です。\n","負\0正"+((i<0)*3));
せめてこう書こうよ(笑)
596595:02/09/25 18:12
printf("iは%sの数です。\n","正\0負"+((i<0)*3));

こうだな。間違った。
いや、こうしようよ。

printf("iは%sの数です。\n",&(sgn(i)*3["負\0正"]));

むかついて会社辞めるときはこんな感じのソース残して辞めると吉。
>>592
スタックの積み下ろしがあるからねぇ
速度なんか大して変わらないからいいんじゃないか?
printf(引数で受け取ったポインタ)とかにさえしてなきゃ。
>>599
理解を深める
これ大事
アスパラ アスパラ
不法滞在
これは禁止
601デフォルトの名無しさん:02/09/25 20:21
柴田望洋の本は読みにくくて学習に時間がかかる。
602デフォルトの名無しさん:02/09/25 20:28
ぼーよーの標準関数一覧は便利だったけど、今はlinux.or.jpのJM使っているからいらない。
>>597
sgn()って標準関数?
>>603
うえの方に
#define sgn(x) ((x)>=0)
と書かれています。
605デフォルトの名無しさん:02/09/25 21:09
const char *s[] = { "aa", "bb", "cc" };
const char *s2[] = { "AA", "BB", "CC", "DD" };
const char *s3[] = { s, s2 };

これでエラーがでるんですけど...どうしてですか?
606デフォルトの名無しさん:02/09/25 21:10
引数で渡した文字列を十六進数で
ファイルに書きこみたいんですけど
どーすれば(・∀・)イイ?
>>606
ファイルを開いてfprintfだね。
const char **s3[] = { s, s2 };
型が違うから
配列の配列だからね
>>606
さっきから何を言っているのかサパーリ。
16進数の文字列でファイルに書きたいの?
10進とか16進とか言ってるヤツはネタだろ。
612デフォルトの名無しさん:02/09/25 23:01
ビット演算子と代入演算子だけでCプログラミングは出来ますか?
一度やってみたことはやったのですが構造化で挫折しますた
>>612
よく意味がわからんが、ビット演算と代入演算以外の演算子の使用を禁じるってこと?
というか先生! += は代入演算子に入りますか?
614デフォルトの名無しさん:02/09/25 23:17
>>613
+とかついてたらだめです。使っていいのは(&|~^=)
で、漏れは関数呼び出し、条件制御が出来なくて挫折しますた
つーか、できたのは足し算関数(論理回路で言う加算器)ぐらいだけど
どなたか>>276教えてください。お願いします。
>>615
・デバッガでステップ実行して標準関数の中に入り込む
・grep (VC++なら[ファイルから検索...]とかいうメニュー)
新卒採用で,externとかたくさん使っていたら落ちますか?
全てのソースファイルにインクルードするヘッダファイルで外部変数全部extern汁
>>614
足し算できたのなら引き算は簡単だべ。
>>606
たとえば「2ch」とか放り込んだのが変換されて、
「0x32 0x63 0x68」になればいいってことなのかしらん?
>>619
できたのは自然数の足し算なんですよ
符号ビット調べての足し算もやりましたが所々にバグがちりばめられてます
乗除算はシフト使いたくなりますが・・・
>>570 = >>579 = >>606
全て同一人物とみなしていいのかなぁ?
だとすれば「 "a = 10;" と "a = 0x0A" とは全く同じコードだよ」
とかそういうことが分からないんだろうか?
>>621
俺も自然数のつもりだった。
自然数の足し算ができたとのことなので、
a - b = a + ~(b) + 1
を使えば自然数の引き算は簡単じゃないかという突っ込み。
BCD演算のことを言っているのか?
625617:02/09/25 23:57
大丈夫みたいね
>>606
void hoge(char *p)
{
 ・・・
 for(;*p!='\0';p++)
  fprintf(fp,"%x",*p);
 ・・・
}
こういうことですか?
>>624
BCD(Binary Coded Decimal,2進化10進数)のこと?
いやそういうわけじゃないけど、、
>>623
2の補数を使うと加算が2回出るじゃないですか
それなら最初からと思うのですが
速度気にするくらいなら普通にしろよ(ワラ
>>628
それでは、、、、
足し算はレスを見る限り
i1(入力1),i2(入力2),ic(キャリー入力)と
o(出力),oc(キャリー出力)のフルアダーを各ビットごとに
構成して実現したんだよね?
同じように減算回路をソースに落とせば?
>>629
例えば5+(−8)とか0をまたぐときにバグバグなんです
条件分岐とかはプログラムカウンタいじらないと無理ですか?
>>630
足し算を629のように作れば5+(-8)も上手くいくはずだよ。
(&|~^=)しか使ちゃだめなら条件分岐に関しては見当もつかない。
おいお前ら、ここ何のスレだ?
いいかげんウザイ。
>>631
そうですかでなおしてきます
れすありがとうございました
>>632
すまん。C言語よりもむしろハードに近い内容になってしまった。
635632:02/09/26 00:46
いや半分ネタだから気にすんな。言い過ぎたよ。
636606:02/09/26 00:47
ミナサソ

混乱させてしまい大変申し訳ございませぬ。
ワタクシは>570でも>579でもございません。

ワタクシがやろうとしておりますのは
fprintf ( fp , "%x",argv [2] );
ってことでして。。。
これじゃーargv [2]の先頭アドレスを
16進数でfpに書き込むだけなんですよね?

そこで代替案っちゅーか、なんちゅーか。
とにかく
$hoge.c smp.txt 34567
と、したときにsmp.txtに"34567"が16進数で
書き込まれるプログラムをつくりたいんのです。

ほんと糞厨でごめんなさい。
637606:02/09/26 00:49
(´Д` )ウワァァン
636禿げしくマチガテルヨ!!

$a.out smp.txt 34567
デスタ・・・

スミマセソ
argv[]をatoiで整数に変換してからfprintf
>>638の argv[] は argv[2] に訂正すます
>>622
×"a = 0x0A"
○"a = \x0A"

>>636
それじゃ16進なんか関係ないじゃん。
「10進数の文字列を数値にしたいんですけど」って聞いとけや
>>640
( ´,_ゝ`) プッ

ネタ?
片思いの彼女に16進数で告白したいのですが
どうすればいいですか?
>>642
コネクションをはってプロトコルを合わせ、文字コードを聞き出したら、喋れ。
内容についてはご自由に。
>>641 ばかだなあ。ネタに決まってんじゃんプププ



・・・
645デフォルトの名無しさん:02/09/26 04:22
どなたか教えてください。Rt-Linuxでロボットの制御をしているのですが、ある間隔でサンプリングしてくるデータをリアルタイムにプロットするにはどうしたらよいのでしょうか?どこかこういうことが説明してあるURLでも構いませんので教えていただけないでしょうか?
よろしくお願いします。
gnuplotとかのプロッタにパイプで流し込むとか、
Xで書くとかしか思い浮かばないけど
647645:02/09/26 04:59
>>646
プログラムも初心者でgnuplotも今日初めて使い出したばかりなので詳しいことがわからないのですが、
今gunuplotを使ってロボットが動いている間中、手動でプロットのコマンドを打っています。シェルを使って自動的に打たせたいとは思っているのですが、gnuplot上のシェルでFor文かWhile文のようなものが記述できるのでしょうか?
んー詳しくないけど、「gnuplot パイプ」「gnuplot 標準入力」とかを
検索するとヒントになるかも
649デフォルトの名無しさん:02/09/26 05:08
>>612
無理。
他のすべてを禁止するということは関数の使用も禁止するんだろ?
無理だね。
650645:02/09/26 05:09
ありがとうございます。ではちょっと調べてみます。
助かりました。
>>612
ああ、大抵できるね。
>>651
出来ないのって何?
>>652
わかんない。
ぱっとやってみた幹事ひととおり出来てるけど
抜けがあるかもしれない
#include <stdio.h>
typedef void (*callback_t)();

int callback(void) { printf("test\n"); return 1; }
void func(void (*callback)(void)) { callback(); }
int main(void) { func((callback_t)callback); return 0; }

コールバックの型が違うのにエラーが出ません。
どうしてなんでしょう?
>>636
> ワタクシがやろうとしておりますのは
> fprintf ( fp , "%x",argv [2] );
> ってことでして。。。
> これじゃーargv [2]の先頭アドレスを
> 16進数でfpに書き込むだけなんですよね?
文字列の終わりまで繰り返せばいいだけ
char *p;
for(p = argv[2]; *p = '\0', p++)
  fprintf(fp, "%x", *p);
または
int i;
for(i = 0; i < strlen(argv[2]); i++)
  fprintf(fp, "%x", argv[2][i]);
好きな方を使え
ループの中で strlen を使うのは止めてホスィ(´Д` )
>>654
引数が空とvoidの違いのことを言ってるのかな?

処理系依存だろうけど、関数の引数が空とvoidでは
普通は全く同じコードが生成されるんで問題なし。

func((callback_t)callback)でキャストしてるから警告も消える。
>>654
Cでは引数の省略と引数voidは関数定義以外では違うんだってば・・・・
>>656
655はどう考えてもネタだろ。
660デフォルトの名無しさん:02/09/26 21:59
変数の例などで hoge と使ったのは誰が最初ですか?
661デフォルトの名無しさん:02/09/26 21:59
時代遅れでも私は使い続けます。
C++に負けるな! VIVA C言語!
662デフォルトの名無しさん:02/09/26 21:59
>>660
スレ違い
663デフォルトの名無しさん:02/09/26 22:00
22:00げと
揚げ
おかしい、age入れたつもりだったのに・・・





・・・666get
667デフォルトの名無しさん:02/09/26 23:12
おめーん 666 ゲット
668667:02/09/26 23:13
取られてた・・・(鬱)
お前ら質問しる
float = 0xXXXX; てな感じで、代入したいんすけど、
上記のXXXXの部分をユーザ側からもらうには、どうすりゃいいん
でしょうか?思いつかんので、俺に教えてくらはい!
int main(int argc, char **argv)
scanf ?
673デフォルトの名無しさん:02/09/27 00:47
>>657,658
そうでは無くてcallback_tの戻り値をvoidにしていて、
callbackの戻り値をintにしてる所です。
>>673
ポインタってちゃんと理解してる?
ところで、654は文法エラーのことを言っているのか、
それとも実行時のエラーのことを言っているのか。
質問です
FILE構造体が利用するバッファ(ストリーム)はどの関数がどのメモリ領域に確保しているのでしょうか
>>676
どのメモリ領域って何よ?
それと、処理系依存の話なら処理系が何かを書け。
678676:02/09/27 01:10
処理系は特に考えてないですが、メモリというのはスタックとか、そういうやつです。
スタックは無理じゃねーか?
>>678
ヒープに決まってんだろ
>>676
printf()やscanf()等が関数の静的変数として確保しています
>>678
処理系が指定されていなければ答えは出せないな。
一般的な話で言えば、ヒープ領域に確保されるだろうね。
でも自分でsetvbuf等を使ってスタックとかstatic領域を
割り当てることもできるわけだし。

どの関数かは完全に処理系依存。
俺の使っているVC++では_getbufあたりかな。
これをfreadやfgetc等の関数が内部で呼び出している。
>>678
Linuxの場合はマニュアルによるとデフォルトではmallocを呼び出して確保するみたいだね。とするとヒープか。
プログラマがsetvbufなどで割り当てなければスタックはないと思う。
684678:02/09/27 02:02
なるほど。つまり、free()はfclose()がfree(fp->base)な感じで
行っていることになりますか?
>>684
そうです。
686デフォルトの名無しさん:02/09/27 02:26
>>675
両方ともエラーは出ません。
処理系はgcc(version2.95.4)です。
687675:02/09/27 02:32
>>686
そういう意味ではなくて、
エラーにならないのがおかしいと思うのは、どっちのエラーのことか?

言い換えると、文法エラーにならないのは当たり前なんだけど
それはわかっているのか?
>>686
callbackの戻り値がintだろうがなんだろうがそれを無理やりcallback_tにキャストしてんだからエラーはでないでしょ
実行時にどうなるかは知ったこっちゃないけど
689デフォルトの名無しさん:02/09/27 02:40
恐らくincompatibleなポインタ型を指摘するメッセージが出ると思う。
エラーと言うかワーニングメッセージ

#include <stdio.h>
typedef void (*func_t)();
int func2(void){return 1;}
int main(void) { func_t func; func = func2; func(); }

これは出た。
>>689
ネタですか?
691デフォルトの名無しさん:02/09/27 02:42
>>688
あ、そう言われればそうですね。
692C厨:02/09/27 05:24
チンコウィルスがさ
693657:02/09/27 10:18
>>673
多くの処理系では(少なくともIA-32では)longくらいまでの戻り値は
レジスタ経由で返されるから呼び出し側に影響はない。

コンパイル時にエラーにならないのはキャストしてるから。

以上。
> 多くの処理系では(少なくともIA-32では)
IA32では戻り値に必ずレジスタを使わないといけない
という規約があるとでも言うのだろうか。

そういう俺もレジスタで返す処理系しか知らないのだが。
695657:02/09/27 13:47
>>694
Intelが作った呼び出し規約の資料はあるのか知らないけど、
Visual C++やx86版のSoralisでは決まっているから、
それらのプラットフォームではその規約に従う必要がある。
696694:02/09/27 15:13
>>695
Visual C++がEAXレジスタで戻り値を返すからといって、
他のコンパイラまでその規約に従う必要はないはず。
API等の外部関数とのやりとりだけを、それ専用の
呼び出し規約で対応してもいいわけだし。

慣習としてこの方式が使われているのは事実だけど、
絶対的な規則ではない気がする。 (間違ってたらごめんよ)
697教えて君:02/09/27 15:57
教えてください
char ch[32] = "utudashinou";
と文字列を作ります。この文字列の末尾を指すようにポインタを使うと
char *p;
p = str1 + strlen(str1) - 1;となると本に書いてあるんですが
↑このポインタがどういったアドレス(?)を保持しているのか解らないです
ついでに、
char ch[32] = "utudashinou";←日本語文字だといけないっていうのは解ります
日本語は第1バイト、2バイトで一組で、1バイト目と2バイト目を逆にすると文字にならない
ってことですよね?・・・
698教えて君:02/09/27 16:00
あれ、ミスがある・・・
5行目のp = str1 + strlen(str1) - 1
は、p = ch + strlen(ch) - 1
です
p = ch;    str1の先頭要素のアドレス
p = ch + 1; その次の要素のアドレス
p = ch + 2; その次の次の要素のアドレス
p = ch + 3; その次の次の次の要素のアドレス
p = ch + strlen(ch); 終端NULL文字のアドレス
p = ch + strlen(ch) - 1; 最後の文字(終端NULL文字の1つ前)のアドレス

> 日本語は第1バイト、2バイトで一組で、1バイト目と2バイト目を逆にすると文字にならない
> ってことですよね?・・・
はい。
逆にすると文字にならないというより、おかしなことになるのでやめろ。
700699:02/09/27 16:12
訂正。700げと。
× p = ch;    str1の先頭要素のアドレス
○ p = ch;    chの先頭要素のアドレス
701デフォルトの名無しさん:02/09/27 16:12
素人です
ポインタ型変数の宣言の時
int *pnt;
int pnt*;
どちらでもよいの?
>>701
試しに自分でやってみましょう。
703教えて君:02/09/27 16:18
ありがとうございました!>>699さん
もう一つよろしいですか?
なんとなくわかるんですが、
char str[][32];
char *p;
として、多重配列になった場合
p = (char *)str;
と、キャストしないといけないのはなぜですか?
704デフォルトの名無しさん:02/09/27 16:21
fscanf(fp,"%8d %2d %2d\n",&a,&b,&c);
としたときのフォーマット指定部分の最後の \n は付けると付けないとでどう違うのか分からないのですが
違いはあるんでしょうか?
>>703
次元が違うじゃん。配列strに適合するポインタは
char (*)p[32] = str; /* 32要素のchar配列(strの先頭要素に相当)へのポインタ */
706教えて君:02/09/27 16:33
>>705さんありがとー
次元か。そっかそか
たびたびごめんなさい。がんばってきます
>>705
char (*p)[32] = str;
>>707 スマソ
>>701
多分、
int *pnt;
int* pnt;
の間違いだと思うけど。基本的には好みの問題なのでどっちでもよい。

>>704
付けても付けなくても動作は同じ。
fscanf()のフォーマット文字列のスペース、タブ、改行はどれも、
「スペース、タブ、改行のどれかがあったらなくなるまで読み飛ばす」
という意味。
710704:02/09/27 16:55
>>709
サンクス!参考になりました
711709:02/09/27 16:56
あ、後にfscanf()が続く場合に動作が変わるかも。スマソ。
>fscanf()のフォーマット文字列のスペース、タブ、改行はどれも、
>「スペース、タブ、改行のどれかがあったらなくなるまで読み飛ばす」
>という意味。
の説明は合ってるはず。
712デフォルトの名無しさん:02/09/27 17:57
void hoge(char str[])と
void hage(char *str)は
関数内部に実体を持つか持たないかの差ですか?
hogeにポインタで渡すと配列サイズが分からない気がしますが・・・
やっぱり等価かなぁ
同じ。
>>712
つーかやってみろよ。sizeof(str)とか
文字列だったら '\0' で終端がわかるだろ
716712:02/09/27 18:11
よく分かりました
ありがとうございます
void hoge(char str[])

↑これって関数がポインタを受け取るときは(間接的に)配列を受け取る場合が多いから、わかりやすく書けるようにしただけだよね? 構文糖というかどうかは分からないけど。
718デフォルトの名無しさん:02/09/27 18:37
void **p;
これ、どうやってつかうんですか?
>>718
ポインタ配列
720719:02/09/27 21:27
ごめん嘘だvoid **pだったね
CoCreateInstance()とか1つの関数でいろいろな型(クラス)を
作って渡すのに使うのだと思う
例えば簡単に書くと
void hoge(int n,void **p)
{
 switch(n){
 case 0: *p=(char *)new char; return;
 case 1: *p=(float *)new float; return;
 ・・・
 default: *p=(int *)new int; return;
}
・・・これも嘘かも
new使ってるのがスレ違いとか言わないで
721デフォルトの名無しさん:02/09/27 21:28
キャスト(void *)の間違い鬱だ
何を言っておる。
void *a[N];
void **p = a;
って使えるじゃん。ポインタ配列に適合するポインタでもいいんだよ?
それと、配列の生成は new char[n]
723720:02/09/27 21:44
>>722
voidのポインタ配列を参照するときにキャストするのならば
最初からキャストする型で宣言した方がいいのでは?と思い直したんですよ
hogeで作るオブジェクトは配列でなくて
1個のインスタンス生成を想定してましたが、
724720:02/09/27 21:47
ただC++ならテンプレート使えば済む話ですが
725722:02/09/27 21:51
あーそーか勘違いした>配列
726デフォルトの名無しさん:02/09/27 23:47
forループの中で,インクリメントされた値を異なる変数名に
順次代入したい場合ってどうしたらいいの?
なにそれ。こんなのしかイメージできないぞ↓
int a, b, c;
int *vars[] = { &a, &b, &c };
int i;
for (i = 0; i < 3; i++) *vars[i] = i;
728デフォルトの名無しさん:02/09/27 23:52
すべての車バイクが電気で動くようになったら暴走族の被害がかなりへるかと
違法改造で放電しまくってうるさいかもしれない

一体何の関係が
730デフォルトの名無しさん:02/09/28 01:06
ループ(for、while等)の中で一回だけ実行するにはどうしたらいい?
例えば、

for(i=0; i<3; i++)
{
printf("%d\n", i)
}

において、一回だけprintfを実行させたい場合。
/*
for(i=0; i<3; i++)
{
*/
printf("%d\n", i)
/*
}
*/
for(i=0; i<3; i++)
{
if(i==0)printf("%d\n", i);
}
ループの外に出すわけにはいかんのだろうか?
>>720
単純に「void*へのポインタを使いたい時」でいいんじゃない?
たとえば
void free_mem(void **p)
{
 free(*p);
 *p = NULL;
}

でもいいんだし。
735デフォルトの名無しさん:02/09/28 01:22
今日、初めてC言語のソースを書きました。
本当に感激しました。
よーし、この調子で明日は少し進むぞ〜
736デフォルトの名無しさん:02/09/28 01:24
んじゃ、無限ループのなかにおいてはどう?
>>736
for(;;) {
  static int only_one=1;
  if ( only_one ) {printf("hoge\n"); only_one=0;}
}
738720:02/09/28 01:33
>>734
#define SAFE_DELETES(o) if(o){delete[] o;o=NULL;}
との違いは?
void*使ってたら型安全性もくそもないし
Cスレなのでdelete[] o;が嫌でしたらfree(o);と読んで下さい
739デフォルトの名無しさん:02/09/28 01:35
>>737
それメインループの中で初期化するときによくやってる
740720:02/09/28 01:37
>>738
マクロと関数の違い。
オーバーヘッドがある分関数が不利?
742720:02/09/28 01:44
>>741
速度を取るかバイナリのサイズを取るかだね。
ただし、free自体にかかるコストがかなり大きいので、
場合によっては全体のコードサイズの関係でマクロの方が
遅くなるケースも考えられる。
743720:02/09/28 01:45
↑ アプリケーション全体を考えた時の話ね。
744720:02/09/28 01:47
いや、この程度ならマクロでもサイズはほとんど同じかも。
度々スマソ。
745デフォルトの名無しさん:02/09/28 03:13
>>730

for(i=0; i<3; i++)
{
printf("%d\n", i);
break;
}
746デフォルトの名無しさん:02/09/28 03:50
画像処理でBitmapの読み込み、書き込みに苦労してます。
助けてください。読み込んだあとにHough変換するのですが、
よくわかりません
マルチウザイ
>>730
sw=0;
for(i=0; i<3; i++)
{
if(sw==0){printf("%d\n", i);sw=1;}
}
//printf(--) <= ;付けとけよ!
749デフォルトの名無しさん:02/09/28 11:14
ポインタのソートの仕方が分かりません。
誰か教えてください。
qsort関数でも見てみる?
751デフォルトの名無しさん:02/09/28 11:19
>>750
学校の課題で出されているんですがqsort関数は使用不可なんです。
ポインタの位置を入れ替えてしないといけないみたいので。
753デフォルトの名無しさん:02/09/28 11:26
Base64 エンコードやりたいのですが、
6ビットごとの操作ってところで詰まっています

どっかにサンプルってないでしょうか?
>>749
if(a<b)
swap(&a,&b);
〜〜〜〜〜〜〜〜〜〜
swap(*aa,*bb){
int *cc;
*cc=*aa;
*aa=*bb;
*bb=*cc;
}
こんな奴かな?
755デフォルトの名無しさん:02/09/28 11:47
>>754
構造体のソートなんです。
なんとかんらないでしょか?
ポインタに構造体の先頭アドレス放り込んだらいいんでないの?

struct tbl tb1, tb2;
struct tbl *ptb1, *ptb2;

ptb1 = &tb1;
ptb2 = &tb2;

こんな感じで
757デフォルトの名無しさん:02/09/28 11:59
>>756
もう少し詳しく教えてもらえないでしょうか?
ソートはどうやっておこなうのですか?
>>749
> ポインタのソートの仕方が分かりません。

>>755
> 構造体のソートなんです。

結局何がしたいのよ ? 構造体を指すポインタの配列があって、それをソートしたいの ? つまり...

struct _s {
 /* ... */
} s[100];

struct _s p[100];

for(i = 0; i < sizeof(p)/sizeof(p[0]); i++){
 p[i] = &s[i];
}

となってて、p[] をソートしたいのか ?
>>753
> Base64 エンコードやりたいのですが、
> 6ビットごとの操作ってところで詰まっています
> どっかにサンプルってないでしょうか?

「base64 サンプル ソース」 あたりでググレばいっぱいあるぞ。

でも、何故に「6ビットごとの操作ってところで詰まっています」なの ?

unsigned char in[3];
unsigned char out[4];

out[0] = in[0] >> 2;
out[1] = ((in[0] & 0x03) << 4) | (in[1] >> 4);
out[2] = ((in[1] & 0x0f) <<2) | (in[2] >>6);
out[3] = in[2] & 0x3f;

でいいと思うけど...。(適当に書いてるから、バグってたらごめんね。)
64bit機ではintの大きさは8バイト?
>>760
オプション次第
すいません・・・
オプションって何でしょう?
1バイト三千五百円です・・・・・・・・・・・日給かよっ!安いよっ!
>>762
自機の後ろについてくるまるくてフワフワした憎いヤツ。
オプションイーターに喰われてスゲー泣ける
765デフォルトの名無しさん:02/09/28 12:54
最初にdoubleで宣言してある配列に、
いろいろな小数が入っています。
この配列のそれぞれ整数部分だけを取り出すにはどうしたらいいですか?
それhグラディウス
>>761
> オプション次第

つーか処理系 (コンパイラ他) 次第。
768753:02/09/28 13:02
おお、なるほど
激しく感謝
>>765
> 最初にdoubleで宣言してある配列に、
> いろいろな小数が入っています。
> この配列のそれぞれ整数部分だけを取り出すにはどうしたらいいですか?

int で宣言してある配列に代入しろ。
キャストじゃダメなのかな?
758のソースも何やってるのかわからんのだが。
* の書き忘れかな?
>>771
> 758のソースも何やってるのかわからんのだが。
> * の書き忘れかな?

もう少し、頑張りましょう。
773770:02/09/28 13:11
>>765
なんならfloor、ceil 調べたら?
774765:02/09/28 13:13
>769
なるほど、ありがとうございます。
>770
キャストって何ですか?
>>774
すかいらーくグループのひとつ
776771:02/09/28 13:23
>>772
頑張ってみたがダメだったよ。

あんた以外の人間にもわかるように
あのソースが正しいことを説明してみてくれないか。
777756:02/09/28 13:25
> 771

まずやりたいことを詳細に書いたら?
あの内容じゃワケワカラン
778758:02/09/28 13:27
>>776
マジなのか ?
どこらあたりがわからんの ?
特に、どこに * を書き忘れたと思うの ?
779771:02/09/28 13:33
はあ? おまえら全員でネタ披露してんの?

> p[i] = &s[i];

構造体へ構造体ポインタを代入できるの?

> 特に、どこに * を書き忘れたと思うの ?

struct _s p[100];
 ↓
struct _s *p[100];
780758:02/09/28 13:37
>>779
おおなるほど、間違いだ。で、それが「何やってるのかわからんのだが。」ともったいぶって言うことか ?
単に、「間違ってるぞ、ヴォケ !!」ですむ話だと思うが。
みんな!
もちつけ!
     /\⌒ヽペタン
   /  /⌒)ノ ペタン
  ∧_∧ \ (( ∧_∧
 (; ´Д`))' ))(・∀・ ;)  
 /  ⌒ノ ( ⌒ヽ⊂⌒ヽ
.(O   ノ ) ̄ ̄ ̄()__   )
 )_)_) (;;;;;;;;;;;;;;;;;;;)(_(
782758:02/09/28 13:40
>>780
ごめん、悪気はなかったんだよ。
*の書き忘れなのか、それとも &が余計なのか、
それとも他の意図があったのかわからんかった。
783770:02/09/28 13:42
>>774
#include <stdio.h>
main(){
  double d=5.239;
  d=(int)d;//(int)<=intへのcast
  printf("%f",d);
  return 0;
}
//こんなプログラムでわかるかな?なんとなくだよ
↑ の名前は758でなはないです。 771の間違いですだ。
772が全部悪いということで
while(*p && *p!=' ')
この条件判定はどういう意味ですか?
>>786
*p かつ *p が ' ' でないなら
です
>>786
while(*p=0 && *p!=' ')
間違えた
while(*p==0 && *p!=' ')
*p!=0だべ
>>789
ネタですか?
間違えた
while(*p!=0 && *p!=' ')
空白文字で無くポインターの最後まで行っていない間ってところか?
間違えた
while(*p==0 && *p!======' ')
>>794
はい、間違えてますが・・・
796758:02/09/28 13:50
> 772が全部悪いということで

まあ、心配するな、元を間違った俺が一番悪いのは当然だ、すまん。コンパイルして見りゃ良かったんだけどな。

>>786
p の指す先が文字列の終端でなくてかつ空白でない間...
797デフォルトの名無しさん:02/09/28 13:51
海外の比較的マイナーな文学作品を翻訳出版する
小さな出版社がある。そして文学ファンはこういった出版社を
潰さないため、今後も翻訳を続けてもらうために
1人で同じ本を2・3冊買うことが良くある。

我々もこういう時だからこそDelphi7を買って
ボーランドを支えるべきなんじゃないだろうか。
Delphi7の売り上げはDelphi8以降の開発資金となるし、
ボーランドジャパンの今後に大きな影響をもたらすだろう。

Delphi7の出来のみを云々するのは
あまりにも近視眼的ではないだろうか?
つまり文字列が終了するか空白が現れるまでループってことで。
>>793
ありがとーベリーマッチ
んじゃ、whlie(*p)っていうのは、ポインターが最後まで行ってない間でFA?
初心者質問でスマソ
みんなありがとね!
>>799
> んじゃ、whlie(*p)っていうのは、ポインターが最後まで行ってない間でFA?

Yes, 俺は、while(*p != '\0') と書くけどね。
>>799
注意。
”文字列を格納した”ポインターだけだよ。
マジありがと!
大体わかってきたけど、まだポインタを使う意図が理解していません・・・
勉強してるうちにわかってくるもんなのかな?
>>803
たとえば関数に配列(文字列含む)を渡す時は
ポインタで渡すのが一般的です。
ふむふむ
まだ多重間接参照とかポインタを仮引数として使った奴とか勉強してないから
修行してきます(・.・;)
806ぶた:02/09/28 15:21
#include <stdio.h>
#define N 1500
#define XSIZE 320
#define YSIZE 240
main()
{
int x,y;
int count;
int image1[N][N],image2[N][N];

printf("OK1");
for(y=0;y<N;y++){
count=0;
for(x=0;x<N;x++){
image1[y][x]=count;
count++;
}
}
printf("OK2\n");
for(y=0;y<YSIZE;y++){
for(x=0;x<XSIZE*3;x=x+3){
image2[y][x/3]=image1[YSIZE-1-y][x/3];
printf("x=%d,y=%d, 中身%d\n",x,y,image2[y][x]);
}
}
}
が動きません。理由を教えてください
int を450万単位確保できるの?
Nで指定した数値を少なくして実行してみて。
808765:02/09/28 15:52
>>783
遅くなりましたがありがとうございます
809C初心者:02/09/28 16:17
>>806
>理由を教えてください
オーバーフローが原因ではないかと。。。
対策としては、
static int image1[N][N],image2[N][N];
~~~~~~
みたいにしてスタック領域に確保してみては。
>>809へのツッコミよろしく。
811デフォルトの名無しさん:02/09/28 16:25
>807
どのくらい小さくしたらいいと思いますか?
812809:02/09/28 16:26
>810
すみません。スタックではなく、静的でした。。。(--;
スタックではなくスタティックだったというギャグだな
814ぶた:02/09/28 16:36
staticを付けたら動くようになりました。
しかし配列のなかにcountの値が格納されません。
どうしてですか?
815デフォルトの名無しさん:02/09/28 17:08
if(経験人数==0)
goto 820
816ぶた:02/09/28 17:10
>>814
教えてください.countはきちんと表示されるのに実際
image2の中を見ると0ばかりです
817C初心者:02/09/28 17:13
>しかし配列のなかにcountの値が格納されません。
格納されていますよ。出力画面で[中身]の値が0でそう思っているのでしたら
printf("x=%d,y=%d, 中身%d\n",x,y,image2[y][x/3]); にかえてみては。
~~~~~
>814がどのような結果を求めているのかはわかりませんが。。。
それにしても、日本語 C が普及しなくてよかったと思った今日この頃っす。

818C初心者:02/09/28 17:19
ハァー。また、やってしまった。。。~の位置は気にしないで下さい。(_ _)
ついでに逝ってきます。;y=-( ゚д゚)・∵・ターン
819デフォルトの名無しさん:02/09/28 17:48
#include <stdio.h>
main()
{
char name[50];
printf("名前を入力してください\n");
scanf("%s",name);
printf("%sですね\n",name);
return 0;
}
漢字で入力したいのですがどうすればできますか?
日本語入力モードにする
821デフォルトの名無しさん:02/09/28 17:53
alt+半角な
822デフォルトの名無しさん:02/09/28 18:00
>>821
できません
823デフォルトの名無しさん:02/09/28 18:02
できたけど・・・
824デフォルトの名無しさん:02/09/28 18:04
>>819
漢字で入力できないのはそのプログラムのせいではないと思うぞ(^_^;)
ところで、>>819を書いたときはなんで入力できたの?
単に文字列を入力するだけなのにscanfを使うのもどうかしている。
826デフォルトの名無しさん:02/09/28 18:07
>>824
??
scanfで入力するときできないんですが
>>826
だったらfgetsでもつかっておけ。
828827:02/09/28 18:09
scanfのせいだとは思えないけどな。
829デフォルトの名無しさん:02/09/28 18:34
質問の時間がやってまいりました。
System::TextとどっかのライブラリのText定義が
曖昧ですよエラーが発生します(´д`;)

簡単に解決するにはどうしたらいいのでしょか。
どっかのライブラリの方は弄りたくないらしい
ですが・・・
言語を明確にして他スレに書く。
>>829
C#かな。よー分からんけど、クラス名を明示的に指定してみたら?例えば、
Text var;
   ↓
System::Text var;
たぶん、Textってクラスが名前空間に2つあるから、コンパイラが混乱してるんだと思う。
832831:02/09/28 18:50
しまった…ここC言語スレだったんだ…。逝ってくる。
833デフォルトの名無しさん:02/09/28 18:53
逝って来るといいつつ滞在する
834829:02/09/28 18:56
言語はC++(BCB)らしいです。
使いたい方のライブラリのクラス名が不明なので
もいっかい探してみます・・。
835831:02/09/28 18:57
バ、バレてる…(;´Д`)。
836デフォルトの名無しさん:02/09/28 19:03
質問です。。
自分のPCだと
printf("\033[%d;%dH",x,y);
の実行結果が
[x;yH
となってしまうのですが・・・(ι ´ェ`)
どうすれば正しくエスケープコードを
認識してくれるようになるでしょうか・・・?

知り合いのPCだと正常に動作したソースを使ってます。
環境はペンティアム3の1.6Gでosはxpです。
他に記載すべき点があれば言ってください・・・。

よろしくお願いします。
837836:02/09/28 19:05
追記
[x;yHの前にエンターの記号みたいなのが表示されます(ι ´ェ`)
>>836
NT系のOSでは、Win32プログラムはエスケープシーケンスは使えない。
Win9xを使うか、16bitコンパイラを使うか、Console APIを使って書き換える必要あり。
839836:02/09/28 19:16
>>838
レスありがとうございます。

使えないんですか・・・
そしたら32bitコンパイラでは、
カーソルの位置を指定する方法はないのでしょか?
840デフォルトの名無しさん:02/09/28 19:17
標準ライブラリの strstr の実装例のソースってどこかに落ちてませんか?
#include <stdio.h>
#include <string.h>
int main(){
  char *str1 = "Borland International", *str2 = "atio", *ptr;
  ptr = strstr(str1, str2);
  printf("The substring is %s\n", ptr);
  return 0;
}
//これで充分か?
838じゃないんだけど

>>839
> Console APIを使って書き換える必要あり
読めないのですか?
843840:02/09/28 19:25
>>841
いや、strstr の使い方じゃなくて、strstr のソースが欲しいのです。
libcのソースってどこにあるんすか?
>>843
VC++のCDの中に入ってる。
847845:02/09/28 19:28
リロードはきちんとしましょう。
strstr.c でググれ。
849デフォルトの名無しさん:02/09/28 19:29
オリバーのソースってどこにあるんすか?
strstrの中でstrncmpを使うのは反則?
strncmpを使うとすっきりとかけるんだけど。
851836:02/09/28 19:36
>>842
意味がつかめなかったので、読み流してました。
やり方わからないですが、試してみます。

ありがとうございました。
852デフォルトの名無しさん:02/09/28 20:00
\x1b[1;31m←これで赤字で出力されます
どなたか解説お願いします
>>852
エスケープシーケンスについて調べてみれ
854852:02/09/28 20:17
>>853
感謝感謝!!
エスケープシーケンスって言葉で検索するだけで情報がいっぱい得られました
ありがとうございました
質問ですが、
Cを大体マスターしたのですが、あまりにも生産性が低いため次の言語へ
いきたいと思います。
C#なんかよさそうだと思ったのですが、C++を1秒もやらずにC#を習得することは
現実的でしょうか。
C#はC++を改良したものだそうなので、どうしてもC++をやるのが無駄に見えてしまうのですが、
C++をやっておいたほうがよいのでしょうか。それとも、まったくの無駄足になるのでしょうか。
>>855
C# と C++ は別物。つか、なんでそんな事いちいち人に訊くわけ?
857頭悪い人:02/09/28 23:09
10個の数を入力して
順位を求めるプログラム作ってくださいな
#include <stdio.h>
main()
{
int dd[10],jun[10];
int jj,kk;
for(jj=0;jj<10;++jj)
jun[jj]=1;
printf("10個の数字を入力\n");
for(jj=0;jj<10;++jj)
scanf("%d",&dd[jj]);
for(jj=0;jj<10;++jj){
for(kk=0;kk<10;++kk){
if(dd[jj]<dd[kk])
jun[jj]=jun[kk];
}
}
for(jj=0;jj<10;++jj)
printf("%4d",dd[jj]);
printf("\n");
for(jj=0;jj<10;++jj)
printf("%4d",jun[jj]);
return 0;
}
こんな感じで
>>857
swap()
作ったら?
並び替えなくても良いのか?
>>857
>if(dd[jj]<dd[kk])
>jun[jj]=jun[kk];
if(dd[jj]<dd[kk])
jun[jj]++;
にしてみれば?
それで出来るでしょう。
>>857=806
宿題代行してもらいたいならインデントくらいきちんとしろ。
読みづらいので放置。
863頭悪い人:02/09/28 23:22
並び替えのプログラムと順位求めるプログラムって
考え方違う?よくわからんのだけど
>>863
順位だと、タイ(同着)があるからちょっぴりだけロジック増える とか
865頭悪い人:02/09/28 23:30
>>861
どういうことかはわからないけどできたよ
ありがとう

>>864
ロジック?聞いたことないw
100回も比較する必要はないと思うのだが。

for(jj=0;jj<9;++jj)
 for(kk=jj+1;kk<10;++kk)
  if(dd[jj]>dd[kk]) jun[jj]++;
  else if(dd[jj]<dd[kk]) jun[kk]++;
>>865
ほら、順位もついでに表示させたいとか、とういいうことdhじゃろp
868866:02/09/28 23:38
あ、インクリメントする添字が逆になってるわ。
  if(dd[jj]>dd[kk]) jun[kk]++;
  else if(dd[jj]<dd[kk]) jun[jj]++;
869頭悪い人:02/09/28 23:43
このプログラムの意味がわからない
特にインクリメントのところが
>>864
そんなロジックいらないでしょ。結果的に。
つかqsort()使えよ。
教師の出題意図を出し抜くくらいでないと大物になれないぞ。
871頭悪い人:02/09/28 23:50
クイックソートって難しそう・・
>>865
> どういうことかはわからないけどできたよ

できたのか ? じゃいいな。とりあえず qsort 使う版作ったけど、必要ないってことで...。
873デフォルトの名無しさん:02/09/29 00:24
=と++じゃ++の方が演算子の順位が高いのに、どうして
a = b++;は
a = b;
b = b + 1;
になるんですか?
ネタデスカ?
a=b++;とa=++b;の違いを考えて下さい
あれだ、マジレスすると「ツレター!!!」とか言って大喜びする手合いだ。
877デフォルトの名無しさん:02/09/29 00:33
>>873
コンパイラのバグですね。何を使っているんですか?
>>877
ネタなのか。マジなのか。
879デフォルトの名無しさん:02/09/29 00:34
o= --o - o--;
>>879
せいしだせいしだー
>>879
未定義厨がくるからヤメレ。
882デフォルトの名無しさん:02/09/29 00:46
たいよう と 太陽
そら と 空
などの文字列を比較したときに同じ意味だと判定するロジック、ライブラリ、サンプルソースなどはありませんか?
あったら教えてください.
883デフォルトの名無しさん:02/09/29 00:58
マジなのに・・・
884デフォルトの名無しさん:02/09/29 00:58
↑873です
>>884
そういう仕様だから
886デフォルトの名無しさん:02/09/29 01:12
>>883
コンパイラのバグだっていってるだろ。
マジなのに・・・
>>882
ほら...

#include <stdio.h>
#include <string.h>
struct Dictionary_t{
 char *Text;
 char *Reading;
} Dictionary[] = {
 {"空", "そら"}, {"太陽", "たいよう"}
};
int main(int argc, char* argv[])
{
 struct Dictionary_t *p;

 if(argc != 3){
  printf("Usage: %s word1 word2\n", argv[0]);
  return 2;
 }
 for(p = Dictionary; p < &Dictionary[sizeof Dictionary / sizeof Dictionary[0]]; p++){
  if((strcmp(argv[1], p->Text) == 0 && strcmp(argv[2], p->Reading) == 0) ||
   (strcmp(argv[2], p->Text) == 0 && strcmp(argv[1], p->Reading) == 0)){
    printf("%s と %s は同じだよ。", argv[1], argv[2]);
    return 0;
  }
 }
 printf("%s と %s は違うよ。", argv[1], argv[2]);
 return 1;
}
後は、辞書をひたすら入力しろ。
VC++6.0は,遅くていらいらしてきたんですが,
win98で他に使えるコンパイラってありますか?
動作がなるべく軽いものがいいんですが。
889デフォルトの名無しさん:02/09/29 01:20
コンパイラのバグじゃないってば。
b = a++; と b = ++a; の違いも知ってる。
ただ、本みたら= より ++の演算子の方が順位高かったから
あれ?なんでだろ?って疑問に思っただけ。
やっぱそういう仕様だからなのかな。
>>873
マジレスだけど、演算子の優先順位と、
b++ が加算前の値を返すこととは別の話。
まずは優先順位の意味について調べてみた方がいいと思う。
891デフォルトの名無しさん:02/09/29 01:25
>>890
ありがとう
>>888

>>2-10あたり見てみろ
>>5

まともな処理系とは?
では,皆さんは何を使っていますか?
おすすめは?
VC++
896デフォルトの名無しさん:02/09/29 01:36
VC++ gcc
秋月のオマケ
gccって英語みたいなんですけど,大丈夫ですかね?
DirectX使えますか?
>>898
使える
苦労したけど
>>889
> ただ、本みたら= より ++の演算子の方が順位高かったから

= より ++の方が優先順位が高いというのは、たとえば
b = a++;  という式なら、
b = (a++);  と等価であって、
(b = a)++;  ではないということ。
(後者は実際には文法エラーだけどね)

要するに式内の各演算子の結び付く強さという感じ。
901デフォルトの名無しさん:02/09/29 01:54
>>893
こういうこというやつって友達いねぇんだろうな・・・・
>>>888
VCのコマンドラインコンパイラとか。
903デフォルトの名無しさん:02/09/29 02:01
++ のような単項演算子では優先順位云々とかないだろう。
右から左に解釈されるだけでは?
>>903
おいおい大丈夫?
>>898
gcc は日本語化するとエラーメッセージがわけ分からなくなるので
英語のまま使え。
>>903
正しい!
コンパイラなりの返すエラーメッセージとかってそんなに難しいか?
先にするのは構文解析だっけ?
906=903だと信じたい。
>>901
いなければ何か?
哀れみますか?
911901:02/09/29 02:20
>>910
いや、孤独な俺と友達になってもらえるかと。
>>911
成人式までに職を見つけなければ,友を失う事になるでしょう
来年で良ければ
構造体の全部のメンバの初期化って,

memset( &Kouzoutai ,0 ,sizeof( DOUZO ) * DOUZO_MAX );

とかでいいんでしょうか?

それとも構造体のメンバ1個1個初期化していくんでしょうか?
構造体の配列の話?
それとも
memset(&Kouzoutai ,0 ,sizeof(Kouzoutai));
の書き間違い?
915913:02/09/29 02:30
あ,ミスりました
構造体のメンバが配列で,
構造体は,ひとつです
NULLポインタの実際の(実装上の)値がゼロ以外の処理系
があったとすれば、
構造体のメンバにポインタが含まれている場合に
memsetではNULLが入らないね。
それ以外だったらmemsetでいいんじゃない?

または、変数を定義する時に
struct hoge Kouzoutai ={0,};
という感じで初期化してもいい。
>>913
メンバーにひとつひとつ値を入れていった方がよいぞ。
doubleの場合、すべてのビットが0が0.0と同じになるとはかぎらないらしいし。
918913:02/09/29 02:44
double型とポインタ型とかくせのあるものは,今回は使わないので,memsetを使うことにします

>>916
>>917
あとあと知っておいて役に立つ事なので,ありがとうです
>>913
どうしてもメンバごとの代入がいやなら、
初期状態の構造体をひとつ作っておいて、丸ごと代入。
  (初期化したい構造体) = (初期状態の構造体);
>>919
なるほど。
ANSIできちんと保証されているしな。
姫宮ANSI
922913:02/09/29 02:58
>>919
画期的
盲点をつかれました
これで,明日はドライブシュートが打てそうな気がします
923デフォルトの名無しさん:02/09/29 02:58
Sleep関数の引数って定数でないとダメなの?
つまり、Sleep(1000+x);ってのはダメ?xに数字を代入して。
924913:02/09/29 03:00
つーことは,

void a()
{
 KOU Kou;

 Kouzou=Kou; //memcpyの方がいいか?
}

ではだめで,外部変数で用意しなきゃだめってことですよね?
それかa関数の中にstaticで用意するか
>>923 頭文字からして標準関数ではないヨカン
>>923
constついてるか確認して
>>923
なんでそんな質問する気になったの?
>>923
なんかサイレントヒルの裏世界に迷い込むぐらいの疲労を覚えたよ。
>>889
> b = a++; と b = ++a; の違いも知ってる。
> ただ、本みたら= より ++の演算子の方が順位高かったから
> あれ?なんでだろ?って疑問に思っただけ。
> やっぱそういう仕様だからなのかな。

ちょっとマジレス。

a++ は、(temp = a, a = a+1, temp) と言う形に展開される。
だから、b = a++; は、
(1) temp = a;
(2) a = a + 1;
(3) b = temp;
となる。ただし、(1) → (2), (1) → (3) の順序は、保証されてるけど、(2) と (3) の順序は保証されていない。((1) → (3) → (2) もありえるし、システムによっては (2) と (3) が同時に実行されるかもしれない。)
だから、a = a++; は、結果が保証されない。
>>923は大人気。
>>929は結論は正しいが過程はでまかせ

923や929見て思ったんだけど、ここってそういうスレなの?
mov ax,a
inc ax
mov b,ax
>>924
そんな面倒なことしないでも定義時に初期化すればいいじゃん。
それとも一旦何かに使った構造体を再初期化したいの?
 
>>931
禿しく同意。
>>934

1回構造体のメンバに例えばカウントを取る変数とかがあって,毎回0に初期化しないといけないんです
あとは,毎回座標を入れていったり
>>931, >>935
>>929 は結論は正しいが過程はでまかせ

どこがでまかせか、指摘してみ。
938934:02/09/29 03:29
>>936
意味がわからん。
スコープ内で同じ構造体を二回以上初期化する必要があるということ?
もしそうならいいんだけど。
c=10;

c%50

は,0.5とかになるはずなんですが,なぜに10が返ってきますか?
>>939
> c=10;
> c%50
> は,0.5とかになるはず

なんて知識をどっから仕入れた ?
どーいう演算をしたら10と50から0.5がでてくるんだろう?
加算とインクリメントの区別ができない人間の集まるスレ。
943935:02/09/29 03:38
>>937
結論以外全部ってのはダメかな。

主に↓の辺り。
> a++ は、(temp = a, a = a+1, temp) と言う形に展開される。
>>929は(2)と(3)が入れ替わってもbには加算される前のaが代入されるという罠
945935:02/09/29 03:51
>>944
順序が入れ替わるかもしれないと本人も書いてるじゃん。
a++;ってその戻り値(?)を受け取らなければ最適化で++a;と同じコードが吐き出されることが多い?
>>946
a++ も ++a も a+=1 も a = a+1 も (temp=a,a=a+1,temp) も同じと思われ
だから>>929の論理だと、入れ替わってもbの値は変わらないんだって
>>947
さんきゅ。
じゃあ今までどおりforの中などではa++を使うわ。++aってなんか格好悪くて嫌い。
950935:02/09/29 03:56
>>948
ごめん。意味がわかったよ。
>>950
いや、俺もまちがってたw
>>929の最後は"a=a++"の結果は保証されないって書いてあるので
952935:02/09/29 04:01
>>948
やっぱり意味わかんないわ。 
953デフォルトの名無しさん:02/09/29 04:02

新スレたてるよ。
954935:02/09/29 04:03
>>951
とりあえず了解。
955935:02/09/29 04:03
>>948
ああ、やっと意味わかったよ。
一年間に40スレ消費される勢いですね
957935:02/09/29 04:06
>>955
騙るな。
958953:02/09/29 04:06
>>1はひねらなくてもいいよね。
959935:02/09/29 04:06
>>958
あ、どうもすみません。よろしくお願いします。
さっきブックマークを整理していたら、
偶然SHOW-Aのライブカメラのページが出てきた。
彼は変わりないようで、ちょっとさびしくマターリ
http://pc3.2ch.net/test/read.cgi/tech/1033240509/

新スレ
過去ログなどは他の人に頼みます。
962935:02/09/29 04:26
>>961
どうもおつかれです。過去ログは追加しました。
963929:02/09/29 04:52
>>948
> だから>>929の論理だと、入れ替わってもbの値は変わらないんだって

お前、アホだろ。

b = a++; は、入れ替わろうが変わんないのは当たり前。

入れ替わって困るのは、a = a++; の時。(と書いてあるだろ。)

で、>>929 のどこがでまかせなんだ ?
>>963
後で訂正してるYO!
評価の順序とかの話ではなく、
単にa=a++の結果は未定義なのでは?

aがどんな値でもa=a++を実行すると100になるような処理系
もつくることは可能で、当然それはANSIに準拠している。
(そんなことする奴はいないだろうが・・・)
966929:02/09/29 05:33
>>964
> 後で訂正してるYO!

ん ? どこで訂正してんのかよくわからんけど、>>929 は、正しいと言うことでいいのか ?
負け犬が遠吠えしているスレはここでつか?
968デフォルトの名無しさん:02/09/29 05:37
こういう議論をみるたびに思うんだよな。

おまえら、本当にCが好きだな。と。
( ´,_ゝ`) プッ
今頃。
粘着厨ウザイ
ttp://nxt.sourceforge.jp/ のスレはここですか?
           ,. ''"´    ` ` 、          
           ;'            ':..      
          ;'      ===   ====     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        ./        ●     ●    < ウタちゃんですが、何か?
        ./          ⌒  ▼⌒':     \________
  __  ./         彡  ∵人∵ノミ___
    ̄ ./  _         ミ   ノ"ミ ̄ ̄ ̄
   ̄ ̄ ̄ ̄ ̄━━ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ̄ ̄━━━ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
結論:まあ、厨はインクリメント/デクリメント演算子は使うなってこった。
box[50][60];

char (*lpbox)[60];

lpbox=&box[60];

これでやると,おかしくなるんですが,どう直せばいいんでしょうか?

lpbox=&box[50];

でもおかしかったです
976デフォルトの名無しさん:02/09/29 07:18
lpbox=box;

こうだろ?
>>975
新スレの方で質問した方がいいよ。
このスレには粘着厨と煽りしか残ってないもよう。
>>975
&box[60]はboxの60番目の要素(先頭を0番目とする)のアドレスだぜ。つまりbox+60。
>>975は質問する以前のレベル。
最初からポインタと配列を勉強しなおせ。
やっとうまくいきました
ありがとう
1000!
うめうめ。
ume
書けませんよ。。。( ̄ー ̄)ニヤリッ
書けませすよ。。。( ̄ー ̄)ニヤリッ
うめやふやせや
987
書けるかもねぇ。。。( ̄ー ̄)ニヤリッ
ダレモイナイ…
(~_~)
久しぶりに1000げっちゅ
え〜んやこ〜ら
NULL
1000ぽ
さてと。

   ∧_∧∩  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ( ´∀`)/ < 先生!横から1000取ってもいいですか?
__ /    /    \___________
\⊂ノ ̄ ̄ ̄\
||ヽ|| ̄ ̄ ̄ ̄ ̄||
 ...|| ̄ ̄ ̄ ̄ ̄||
1000げっちゅ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。