トップページ⇒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
0002デフォルトの名無しさんNGNG
>>1
よくやった。お疲れさま。
0003デフォルトの名無しさんNGNG
1000ズサ
0004デフォルトの名無しさんNGNG
ずざー
0005         NGNG

                     さー――――
0006デフォルトの名無しさんNGNG
(´・ω・`)ショボーン
0007デフォルトの名無しさんNGNG
ラッキー7ゲット
0008デフォルトの名無しさんNGNG
>>7
770番ほど早い
0009デフォルトの名無しさんNGNG
お憑かれー>>1
0010デフォルトの名無しさんNGNG
>>9
引きちぎるぞ
00119NGNG
どういう意味?
0012デフォルトの名無しさんNGNG
こらースクリプトンを使うんじゃない!!
パパ怒っちゃうぞ
0013999NGNG
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ
  ∪∪
0014前スレの1&1000NGNG
>>13
いってよし!
0015デフォルトの名無しさんNGNG
>>14
もう逝ってる!
0016899NGNG
windows2000にのMS-DOSにはEDITという機能はないんですか?
0017デフォルトの名無しさんNGNG
無い
0018デフォルトの名無しさんNGNG
win2000にはMS-DOSはありません。
0019899NGNG
コンパイルできて、.exeを作成できたのですが、ブラウザから実行するとファイルのダウンロードになってしまいます。
なぜなんですか。
0020899NGNG
すみません。出来ました。
0021デフォルトの名無しさんNGNG
>>19
もう知らない(笑)


(ダウンロード状態になるのはヘッダーが適切でないから)
0022デフォルトの名無しさんNGNG
M女史-傲慢 = 899
って感じか?
0023デフォルトの名無しさんNGNG
1. EXE形式の実行にチェックが入ってない
2. 127.0.0.1 or localhost からアクセスしてない
のどちらか(両方?)と見た
0024デフォルトの名無しさんNGNG
何だつまらん、解決してんでやんの
0025デフォルトの名無しさんNGNG
#define TEXT ABCD
というのがあって、
DELETE_TEXT(TEXT, 1)
とやるとTEXTがABCに置き換わるようなマクロは作れるでしょうか。
0026899NGNG
>>23-24
ごめんなさい。AN httpdの.exeを編集の”一般パスでも実行する”をチェックしたら、出来ました。
0027デフォルトの名無しさんNGNG
>>25
できてるじゃん。それで不満か?
0028デフォルトの名無しさんNGNG
>>25
言ってる意味が分からん
もう少し分かりやすく説明しなはれ
0029デフォルトの名無しさんNGNG
>>27
出来てない
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
はあ、未開封?
おまえ、せっかく買ってきたのに未開封でいられるかっつーの。
おれなら家に帰る前に電車の中で既に空けてるね!
■ このスレッドは過去ログ倉庫に格納されています