トップページ⇒tech
1001コメント246KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001きょうはいいテンキーです。日下部陽一NGNG
漏れは38才、21年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
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プログラマならこれを買っとけ。
・プログラミング言語C(K&Rと呼べば通だ)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/yfcbookshelf-22/250-3950205-1475419

K&Rで挫折するような救いがたいやつはこれでも読め
・作ってわかるCプログラミング(アヒル本と呼べば通だ)
http://dennou.gihyo.co.jp/books/void_c/
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/249-4698746-2014711

推薦図書/必読書のためのスレッド PART3
http://pc.2ch.net/test/read.cgi/tech/1016722820/

・前スレ C言語なら、俺に聞け! <17>
http://pc.2ch.net/test/read.cgi/tech/1019372139/l50
003025NGNG
マクロでトークンの削除をしたいのです。
0031デフォルトの名無しさんNGNG
>>29
出来てるだろ?
DELETE_TEXT(TEXT, 1) -> DELETE_TEXT(ABCD, 1)
になるじゃん。
まさか、
DELETE_TEXT(TEXT, 1) -> DELETE_ABCD(ABCD, 1)
とでもしたいのか?
003225NGNG
30訂正
部分的な削除です。
0033デフォルトの名無しさんNGNG
そいつぁム図隠邪ないかな
0034デフォルトの名無しさんNGNG
>>32
ううん?
具体例を示して
003525NGNG
>>33
やっぱ追加や置換しかできませんかね・・・

>>34
ABCD というトークンを、マクロ(>>25ならDELETE_TEXT)で
ABC にしたいのです。
0036デフォルトの名無しさんNGNG
>>34
DELETE_TEXT( ABCD, 1 )
とすると
ACD
と指定したのと同じくなるようなマクロ
DELETE_TEXTを作りたいって事でしょ。
003729NGNG
>>27=31
良く見てみ
ABCに変えたいって書いてあるぞ
0038デフォルトの名無しさんNGNG
>>35
#define TEXT ABCD
#define ABCD ABC
003938NGNG
あ、なんか勘違いしていた。
0040デフォルトの名無しさんNGNG
>>35
うーん、あやしいなぁ。
トークンを削除して、最終的に何がしたいのか教えてくれ。
004138NGNG
そういう意味ね(笑)
0042デフォルトの名無しさんNGNG
>>25
やっと分かった!!
DELETE_TEXT(TEXT, 1)
はTEXTをマクロ展開してから後ろから一文字削除ってことか
無茶言うぜ。
0043デフォルトの名無しさんNGNG
文字配列なら
#define DELETE_TEXT(str, n) (str[strlen(str)-(n)] = '\0')
とか?
0044デフォルトの名無しさんNGNG
>>42
カコイイなぁそれ。オレにも使わせて。

・・・無茶言うぜ。
004525NGNG
あれ、なんでだったろ。思い出せない・・・。
昼間に、これできたら便利だなーって思ったんですが。
ちょっと昼間書いたソース見ながら思い出してみます。
0046デフォルトの名無しさんNGNG
本当に>>42の解釈であってるの?
それなら、
DELETE_TEXT( ABCD, 1 )
で1文字削るって分かってるんだから、ABC でええやん
てなわけで、本当は何をしたいんだ?
0047デフォルトの名無しさんNGNG
ちっ、また遅かったか…
0048デフォルトの名無しさんNGNG
>>46
>>43の言うように文字列リテラルじゃなくて文字配列なんだろうな。
実行してみるまで何が入るかわからないってことで。
もっとも、文字リテラルに対してやったりしたら・・・・
0049デフォルトの名無しさんNGNG
前スレ914のことなんですが
http://pc.2ch.net/test/read.cgi/tech/1019372139/914

ようは、これって
sscanf(buf, "%" TOSTR(LEN) "s", buf2);
が
sscanf(buf, "%#32s", buf2);
に、マクロによって置き換わるんだと思うんですが、
書式指定の#32の意味がわかりません。
VC++付属のMSDNを見てみたんだけど、、、、
#「scanf 系関数の書式指定フィールド」ていうやつ

いま手元に本とかないんですが、
どっかホームページで解説してるようなところ無いでしょうか?
005025NGNG
やっと分かりました・・・
#define REFLECTION EBX+0x100
#define REFRACTION EBX+0x104
       :
のような定義がたくさんあります。全てEBX+オフセットという形です。
EBXをオフセットといっしょに定義しているのは、

FMUL DWord ptr [EBX+REFLECTION] より、
FMUL DWord ptr [RELFECTION]     と、書きたかったからです。

C++でも時々定義された値を使用します。
*(float *)(Buffer + REFLECTION) = 1.0;
しかし↑は定義内の「EBX+」が邪魔で当然コンパイルはできません。

そのために、
#define DELETE_TEXT(x, n) ・・・ //←これの作り方が分からない
#define DEL_REG(x) DELETE_TEXT(x, 4) //EBX+を削除するマクロ
を作って、

*(float *)(Buffer + DEL_REG(REFLECTION)) = 1.0;
と、したいのです。
005125NGNG
このマクロがなくても、
EBXが邪魔なときは#defineと#undefでEBXを消したり、
元々定義にEBXを入れないとか(今はそうしてます)、
方法はありますが、マクロでトークンの削除ができたら、

インラインアセンブラでは
FMUL DWord ptr [RELFECTION]

と書けて、C++では、
*(float *)(Buffer + DEL_REG(REFLECTION)) = 1.0;

と書くだけですむようになるので、
便利だなーと昼間思ったわけです。

激しく眠いので
ワケワカな文章になってるかも・・・
0052デフォルトの名無しさんNGNG
>FMUL DWord ptr [EBX+REFLECTION] より、
>FMUL DWord ptr [RELFECTION]     と、書きたかったからです。
そう書きたくなくても、そう書くべきなので
あまり(かなり)勧められないが

#define DEL_REG(s) DEL_REG_(s) // ※1
#define REFLECTION EBX + 0x100 // EBXの後に必ずスペース
#define REFRACTION EBX + 0x104
       :
#define DEL_REG_(s) (DEL_##s) // ※2
#define DEL_EBX 0

マクロの本来の優先順位は知ら(興味)ないが、
※1・2のように、2重にしてやらないと、
某コンパイラでは通らなかったので、まだ他のでは
「DEL_***が未定義」と言われる可能性あり
と言うか、本来こんな使い方をするべきではない
0053デフォルトの名無しさんNGNG
>>49
> ようは、これって
> sscanf(buf, "%" TOSTR(LEN) "s", buf2);
> が
> sscanf(buf, "%#32s", buf2);
> に、マクロによって置き換わる

ちゃうよ。sscanf(buf, "%32s", buf2) に置き換えたかったんだが、# 演算子
は、それ以上マクロ展開しないから "%LENs" になってしまう。(前スレ >>937)
プリプロセサの # 演算子を勉強するべし。

なお、このケースではコンパイル時に "%32s" を生成することはできないみた
い。素直に実行時に作成するか、fgets() 等を使うべし。

>>50
そもそも...
> #define REFLECTION EBX+0x100
から、おかしいのではないのか ? アセンブラから構造体へのアクセス方法を
勉強した方がいいと思う。
0054デフォルトの名無しさんNGNG
>>49,50

#define LEN 32
#define TOKEN_TO_STR(x) #x
#define TOSTR(x) TOKEN_TO_STR(x)
sscanf(buf, "%" TOSTR(LEN) "s", buf2);

とすれば
sscanf(buf, "%" "32" "s", buf2);
すなわち
sscanf(buf, "%32s", buf2);
になる。基本。
0055デフォルトの名無しさんNGNG
>>50

>そもそも...
>> #define REFLECTION EBX+0x100
>から、おかしいのではないのか ?

まったくだ。

どうしてもそうやるなら、
#define DEL_REG_REFLECTION 0x100
#define DEL_REG_REFRACTION 0x104

#define REFLECTION EBX+DEL_REG_REFLECTION
#define REFRACTION EBX+DEL_REG_REFRACTION
としたら? 馬鹿さが際立ってよい。
005653NGNG
>>54
おお、なるほど。先に展開させとけば良いのか。
005725NGNG
根拠は>>50-51のように、
自分でも忘れていたくらいお粗末なものですから
目的はともかくとして、
マクロでトークンの部分的な削除はできるのか?
という単純な疑問として捕らえてください。

といっても、これまでのレスを見る限り、
やっぱり無理そうですね・・・。

>>53 インラインアセンブラで構造体を使う方法は分かるのですが、
なぜか私の前には、オフセットだけの定義が2000もあるヘッダと、
それらの型名を記した「紙」があります。
私にはその「紙」を見ながら構造体を作り、それを使うためにソースを直す気力はありません・・・。
0058デフォルトの名無しさんNGNG
>1 の  ・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
もうちょっとましな日本語にならないの(w
0059超初心者NGNG
#include<stdio.h>
main(){
double nc;
for(nc = 0; getchar() != EOF; ++nc)
;
printf("%.0f\n", nc);
}

K&R、23ページにあるやつなんだけど、実行すると終了できません。
何にも入力しないでEnter押せば終わるんじゃないんですか?
教えてください。
Windows98でVC++6.0をつかってます。
0060デフォルトの名無しさんNGNG
Ctrl+Z→Enterでは?
0061デフォルトの名無しさんNGNG
WinならCtrl + Z
うにくす系なら Ctrl + ・・・・・
・・・・・
・・・・・
D?
だと思う
普通にenter押せば改行が残るでしょうなぁ
0062超初心者NGNG
ありがとうございます。
いちおう終了はできました。
でも結果がでないんですけど。
何ででしょう?
0063デフォルトの名無しさんNGNG
>>62
それはたぶん、結果が表示されると同時に実行窓が閉じてるんでしょう
MS-DOS プロンプト開いてコマンドラインから実行してみそ
0064超初心者NGNG
いえ実行窓は開いてるんですよ。
Ctrl+Zを押すと、
Press any key to continue
と出てくるんですよ。これで何かキーを押すと窓が閉じます。
>>59のncの中身が表示されないんです。

MS-DOSプロンプトからの実行のやり方は知りません。
当該ディレクトリを開くくらいしかできないです。
006563NGNG
ごめん、そうゆう問題じゃないみたいだ。
006653NGNG
>>57
ふ〜〜〜ん、大変そうね。どうでもいいけどさ。
0067超初心者NGNG
出力先をファイルに変えたら結果が見れました。
とりあえずこれで良しとしときます。
ありがとうございました。
006863NGNG
>>64
試してみたら、>>64の言うとおりだった。
VC++(Win98?)固有の問題だと思う。

#include<stdio.h>
main(){
double nc;
printf("start\n");
for(nc = 0; getchar() != EOF; ++nc)
;
printf("Test\n"); /*この行追加、しかし表示されない*/
printf("%.0f\n",nc);
}

このようにすると、期待どおり動作するが、"Test"が表示されない。
これ以上は、わからんのでVC++に詳しい人の解説もとむ
0069 NGNG
表示されないのが普通じゃない?
0070 NGNG
>>68
bccでやったらちゃんと表示されたYO
0071デフォルトの名無しさんNGNG
VC6で普通に表示されてるんだが?
0072デフォルトの名無しさんNGNG
>25は3DCGエソジソを書いてるに3000マクロ
しかしオフセットだけ2000個て(w
0073デフォルトの名無しさんNGNG
fflush(stdin)
0074デフォルトの名無しさんNGNG
>>73
それって何か関係あるの?
printf("Test\n");はstdinとは関係ないのに・・・
0075デフォルトの名無しさんNGNG
>>73
fflush(stdin)の動作は標準では未定義だよ。
0076デフォルトの名無しさんNGNG
>>75
VC++ は、「ストリームが入力用に開いている場合は、バッファの内容を
クリアします。」だよ。
0077デフォルトの名無しさんNGNG
>>76
なんじゃそりゃ〜?気持ち悪いよぅ。
007876NGNG
>>77
だよね〜〜〜。俺もそう思う。MS も、FlushXXX とか XXXFlush とかの
API や ライブラリいっぱい作ってるけど、出力系でないとサポートしない
ものと入力に適用すると入力バッファをクリアするものとあってまちま
ち。(でも、流石に入力に適用する奴は、クリアの動作以外はしないみた
い。そう言う意味では、それなりに統一は取れている。)
0079デフォルトの名無しさんNGNG
>>72
実はShade、に3マクロ
0080デフォルトの名無しさんNGNG
>>79
実はMAYAタン、に-3マグロ
0081デフォルトの名無しさんNGNG
漏れはShadeの体験版でassertメッセージを見た。cppファイルだった。
0082デフォルトの名無しさんNGNG
istream::getlineでデリミタに全角文字を
使いたいときはどうしたらいいのでしょうか。。。
自作しかないですか?
0083デフォルトの名無しさんNGNG
>>80 実はLightWaveに、2マックロクロスケ
>>82 場所間違ってない?
0084デフォルトの名無しさんNGNG
>>82
::なんて演算子はCにはないはずですよ?と言ってみるテスト。
0085初心者にもなってないNGNG
C言語を勉強してプログラミングしたい思っているのですが何が必要ですか?
他のスレ見て「コンパイラっていうのが必要なのかな〜」って
判断しちゃったんですけどそれでいいんですかね。
よくわからないけど私が持っているプログラミングツールっぽいのは
VBってのとC++なんですけど友達が勝手にくれたものだから
これでC言語でプログラミングできるのかわかりません。
0086デフォルトの名無しさんNGNG
> VBってのとC++なんですけど友達が勝手にくれたものだから

VBはわかるがC++って何よ?
0087デフォルトの名無しさんNGNG
>>85
VBはその友達に返すか捨てなされ。
で、C++をもらったってどういうこと?
008885NGNG
ごめんなさい
VisualC++6.0でした
これでC言語でプログラミングできますか?
0089デフォルトの名無しさんNGNG
>>88
できる。


(へぇ・・・あんな高いものをくれたんだ・・・・・・いい人だねぇ)
0090デフォルトの名無しさんNGNG
>>89
多分VS.NETを買ったから(以下略
009182NGNG
ひょえー失礼しました。。。
C言語スレでしたね。ここ。。。
申し訳ないです。

もう少し悩んで分からなかったらC++スレへ移動します。。。
0092デフォルトの名無しさんNGNG
>85
通報しますた。
0093デフォルトの名無しさんNGNG
>>91
いや、別にいいけど。
0094デフォルトの名無しさんNGNG
>>91
ちなみに友達に貰ったといいますが、
この製品はライセンスの譲渡はできません。
したがってそれを使おうとしているあなたは、
違法行為を犯していることになります。
製品は新規に買いなおす必要があるでしょう。
または、最近発生した素晴らしい手段ですが、
MX上で公開することによって、この罪は問われなくなるでしょう。
0095デフォルトの名無しさんNGNG
>>94
誰にレスしてんだよ。
それと例の人の友達がライセンスを持っているとは限らないよ?
未開封パッケージをもらったのかもしれないよ?
0096デフォルトの名無しさんNGNG
はあ、未開封?
おまえ、せっかく買ってきたのに未開封でいられるかっつーの。
おれなら家に帰る前に電車の中で既に空けてるね!
0097デフォルトの名無しさんNGNG
>>96
はあ、電車の中で開けるって?
お楽しみは家に帰ってからだろ!
0098デフォルトの名無しさんNGNG
おまえは小学生か。
家に着くまで待てよ
009997NGNG
といいつつ、それが本なら電車の中で開けて読んでしまう。
0100デフォルトの名無しさんNGNG
どーゆー論議だよ。。。(汗

まぁ>>85は悪いコトしてるからね。
ネタだったらいいけど
マジでやってる厨房なら気をつけた方が良いよ。
0101デフォルトの名無しさんNGNG
お、っていうか俺100じゃんヽ(´ー`)ノ↑
0102デフォルトの名無しさんNGNG
>>100
まあまあ、決め付けなくても良いんじゃない ? ちょっと前に、俺の知ってる奴が
Office2000 Premium 持ってたから、なんでそんなもん持ってんの ? って聞い
たら、「オヤジが、Office2000 Professional 買おうとして間違えたんだよ。
で、交換してもらおうとお店に行ったら Office-XP があったから、そっちを
買っちゃった。お前これ要るか ? と聞かれたから、もらった。」と言う、実話も
あるからな。
0103デフォルトの名無しさんNGNG
>>68
Win2kではちゃんと全て表示されますね。
010485NGNG
レスしてくださった方ありがとうございます
VisualC++でがんばってプログラミングします。

あとソフト自体はビニールで梱包してあって開封はしてないみたいだったんですけど
まぁ大丈夫ですよね
心配してくださった方々ありがとうございます
0105デフォルトの名無しさんNGNG
>>104
なんだ、そうなのか。
がんばれー。
0106デフォルトの名無しさんNGNG
>>104
まあ違法かどうかの真相はおいておいて・・・・

勉強程度ならコマンドラインからVC++のコンパイラを使った方がいいよ。
0107デフォルトの名無しさんNGNG
(゚Д゚)ハァ?
0108デフォルトの名無しさんNGNG
>>106
Win9Xだときついよ、それ。
bash入れろとはいわんが、せめてcmd.exeくらいの便利さがないとね..

チュートリアルとか入ってるから、それをやるのもヨシ。
0109106NGNG
>>107
誰に対して言っているんだろ・・・
私かな・・・いっぱいファイルができてうっとうしいからそう言ったんだけど・・・
0110107NGNG
スマソ誤爆した。
0111デフォルトの名無しさんNGNG
これからCをやろうと思う人がまずここにくるってのが間違ってる。とてもおかしい。そう思わないか? 98よ
0112デフォルトの名無しさんNGNG
まぁ、コンパイラを選ぶ時点からCとの闘いは始まってるってことで。
0113デフォルトの名無しさんNGNG
VBとVC++をただで?友達が勝手にくれた?100%ウソにきまってんじゃん
0114デフォルトの名無しさんNGNG
あんなもの最初はコピーを使うもんだ
買うなんて無駄

人に作ったものを見せるようになってから買えばいい
0115デフォルトの名無しさんNGNG
>>85はゲイシと友達のタモリ。
…などと戯言を吐いてみるテスト。

ところで値を返す必要の無い関数を、とりあえずint型にしといて0を返すのは間違い?
人から「意味の無い値を返すな、void型にしる!」と言われたんだけど、
昔「とりあえずintにしとけ」とも聞いてるんで混乱しとります。
0116デフォルトの名無しさんNGNG
最初はフリーコンパイラを使うもんだ
買うなんて無駄
0117デフォルトの名無しさんNGNG
とりあえずなら、良いんでない?
0118デフォルトの名無しさんNGNG
>>115
&&をif文の代わりに使うことがあるならvoidはまずいな。
俺は&&をifの代わりにするなんて嫌だけど。
そういえばkage.exeのソースにはたーくさんあったな。
0119デフォルトの名無しさんNGNG
>>118
PERLにはそういう習慣があるから、そっちから来た人は好んで使うかも。
0120デフォルトの名無しさんNGNG
>>115
戻り値があると、何か意味のあるものが返ってくるような感じがするので、
意味の無い戻り値(always 0等)は嫌。

最終的には何か意味のある値(処理成功/失敗)を返すか、もしくは
voidにしてしまうことをお勧めします。
0121115NGNG
不要でも0を返す理由は、
・「void」は特殊であり「int」の方が自然な型である
 ⇔ (反論)意味も無い値を返すのは不自然。

・エラー処理を追加する等の、将来の拡張への備え
 ⇔ (反論)XPの「シンプルな設計」に反する。

だったような気が。
0122デフォルトの名無しさんNGNG
>>121
> ・エラー処理を追加する等の、将来の拡張への備え

今まで戻り値ありだったものを無しにするのはまずいけど、
なしだったものをありにするのはそれほどまずくないと思うんだけどどうだろ?
0123デフォルトの名無しさんNGNG
俺は基本的に戻り値のない関数はboolにして常にtrueを返してる。
呼び出し側も、無意味とわかりつつ戻り値チェックする。
0124最近の環境なら気にはならんと思うがNGNG
>>122
プロトタイプの変更
 ↓
ヘッダ書き換え
 ↓
#include してるモジュールは全て再コンパイル
 ↓
(゚д゚)マズー
0125122NGNG
>>124
そうだプロトタイプがあった(汗
0126デフォルトの名無しさんNGNG
>124
 ↓
#include してるモジュールは全て再コンパイル
 ↓
そうだ、例外を投げよう
 ↓
もっと(゚д゚)マズー
0127デフォルトの名無しさんNGNG
"unsigned double"なんて型は存在するのですか?
グーグルすると国内に数件、本気で使ってるような感じのサイトがあるのですが。
0128デフォルトの名無しさんNGNG
>>127
doubleに符号がある以上存在しない理由は無い気がするけど。
メリットがあるかどうかは別として。
あるコンパイラだとちゃんと警告出してくれるとか?
0129デフォルトの名無しさんNGNG
>128
vcでは意味がねえよと警告が。gccでも警告だかエラーだかが。
■ このスレッドは過去ログ倉庫に格納されています