C言語なら、俺に聞け! <18>
■ このスレッドは過去ログ倉庫に格納されています
0001きょうはいいテンキーです。日下部陽一
NGNGいろいろな言語を極めたが、一番手になじむのは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
003025
NGNG0031デフォルトの名無しさん
NGNG出来てるだろ?
DELETE_TEXT(TEXT, 1) -> DELETE_TEXT(ABCD, 1)
になるじゃん。
まさか、
DELETE_TEXT(TEXT, 1) -> DELETE_ABCD(ABCD, 1)
とでもしたいのか?
003225
NGNG部分的な削除です。
0033デフォルトの名無しさん
NGNG0034デフォルトの名無しさん
NGNGううん?
具体例を示して
0036デフォルトの名無しさん
NGNGDELETE_TEXT( ABCD, 1 )
とすると
ACD
と指定したのと同じくなるようなマクロ
DELETE_TEXTを作りたいって事でしょ。
0038デフォルトの名無しさん
NGNG#define TEXT ABCD
#define ABCD ABC
003938
NGNG0040デフォルトの名無しさん
NGNGうーん、あやしいなぁ。
トークンを削除して、最終的に何がしたいのか教えてくれ。
004138
NGNG0042デフォルトの名無しさん
NGNGやっと分かった!!
DELETE_TEXT(TEXT, 1)
はTEXTをマクロ展開してから後ろから一文字削除ってことか
無茶言うぜ。
0043デフォルトの名無しさん
NGNG#define DELETE_TEXT(str, n) (str[strlen(str)-(n)] = '\0')
とか?
0044デフォルトの名無しさん
NGNGカコイイなぁそれ。オレにも使わせて。
・・・無茶言うぜ。
004525
NGNG昼間に、これできたら便利だなーって思ったんですが。
ちょっと昼間書いたソース見ながら思い出してみます。
0046デフォルトの名無しさん
NGNGそれなら、
DELETE_TEXT( ABCD, 1 )
で1文字削るって分かってるんだから、ABC でええやん
てなわけで、本当は何をしたいんだ?
0047デフォルトの名無しさん
NGNG0048デフォルトの名無しさん
NGNG>>43の言うように文字列リテラルじゃなくて文字配列なんだろうな。
実行してみるまで何が入るかわからないってことで。
もっとも、文字リテラルに対してやったりしたら・・・・
0049デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1019372139/914
ようは、これって
sscanf(buf, "%" TOSTR(LEN) "s", buf2);
が
sscanf(buf, "%#32s", buf2);
に、マクロによって置き換わるんだと思うんですが、
書式指定の#32の意味がわかりません。
VC++付属のMSDNを見てみたんだけど、、、、
#「scanf 系関数の書式指定フィールド」ていうやつ
いま手元に本とかないんですが、
どっかホームページで解説してるようなところ無いでしょうか?
005025
NGNG#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;
と、したいのです。
005125
NGNGEBXが邪魔なときは#defineと#undefでEBXを消したり、
元々定義にEBXを入れないとか(今はそうしてます)、
方法はありますが、マクロでトークンの削除ができたら、
インラインアセンブラでは
FMUL DWord ptr [RELFECTION]
と書けて、C++では、
*(float *)(Buffer + DEL_REG(REFLECTION)) = 1.0;
と書くだけですむようになるので、
便利だなーと昼間思ったわけです。
激しく眠いので
ワケワカな文章になってるかも・・・
0052デフォルトの名無しさん
NGNG>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> ようは、これって
> 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#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>そもそも...
>> #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
としたら? 馬鹿さが際立ってよい。
005725
NGNG自分でも忘れていたくらいお粗末なものですから
目的はともかくとして、
マクロでトークンの部分的な削除はできるのか?
という単純な疑問として捕らえてください。
といっても、これまでのレスを見る限り、
やっぱり無理そうですね・・・。
>>53 インラインアセンブラで構造体を使う方法は分かるのですが、
なぜか私の前には、オフセットだけの定義が2000もあるヘッダと、
それらの型名を記した「紙」があります。
私にはその「紙」を見ながら構造体を作り、それを使うためにソースを直す気力はありません・・・。
0058デフォルトの名無しさん
NGNGhttp://www.catnet.ne.jp/kouno/c_faq/c_faq.html
もうちょっとましな日本語にならないの(w
0059超初心者
NGNGmain(){
double nc;
for(nc = 0; getchar() != EOF; ++nc)
;
printf("%.0f\n", nc);
}
K&R、23ページにあるやつなんだけど、実行すると終了できません。
何にも入力しないでEnter押せば終わるんじゃないんですか?
教えてください。
Windows98でVC++6.0をつかってます。
0060デフォルトの名無しさん
NGNG0061デフォルトの名無しさん
NGNGうにくす系なら Ctrl + ・・・・・
・・・・・
・・・・・
D?
だと思う
普通にenter押せば改行が残るでしょうなぁ
0062超初心者
NGNGいちおう終了はできました。
でも結果がでないんですけど。
何ででしょう?
0063デフォルトの名無しさん
NGNGそれはたぶん、結果が表示されると同時に実行窓が閉じてるんでしょう
MS-DOS プロンプト開いてコマンドラインから実行してみそ
0064超初心者
NGNGCtrl+Zを押すと、
Press any key to continue
と出てくるんですよ。これで何かキーを押すと窓が閉じます。
>>59のncの中身が表示されないんです。
MS-DOSプロンプトからの実行のやり方は知りません。
当該ディレクトリを開くくらいしかできないです。
006563
NGNG0067超初心者
NGNGとりあえずこれで良しとしときます。
ありがとうございました。
006863
NGNG試してみたら、>>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
NGNG0070
NGNGbccでやったらちゃんと表示されたYO
0071デフォルトの名無しさん
NGNG0072デフォルトの名無しさん
NGNGしかしオフセットだけ2000個て(w
0073デフォルトの名無しさん
NGNG0074デフォルトの名無しさん
NGNGそれって何か関係あるの?
printf("Test\n");はstdinとは関係ないのに・・・
0075デフォルトの名無しさん
NGNGfflush(stdin)の動作は標準では未定義だよ。
0076デフォルトの名無しさん
NGNGVC++ は、「ストリームが入力用に開いている場合は、バッファの内容を
クリアします。」だよ。
0077デフォルトの名無しさん
NGNGなんじゃそりゃ〜?気持ち悪いよぅ。
007876
NGNGだよね〜〜〜。俺もそう思う。MS も、FlushXXX とか XXXFlush とかの
API や ライブラリいっぱい作ってるけど、出力系でないとサポートしない
ものと入力に適用すると入力バッファをクリアするものとあってまちま
ち。(でも、流石に入力に適用する奴は、クリアの動作以外はしないみた
い。そう言う意味では、それなりに統一は取れている。)
0079デフォルトの名無しさん
NGNG実はShade、に3マクロ
0080デフォルトの名無しさん
NGNG実はMAYAタン、に-3マグロ
0081デフォルトの名無しさん
NGNG0082デフォルトの名無しさん
NGNG使いたいときはどうしたらいいのでしょうか。。。
自作しかないですか?
0083デフォルトの名無しさん
NGNG>>82 場所間違ってない?
0084デフォルトの名無しさん
NGNG::なんて演算子はCにはないはずですよ?と言ってみるテスト。
0085初心者にもなってない
NGNG他のスレ見て「コンパイラっていうのが必要なのかな〜」って
判断しちゃったんですけどそれでいいんですかね。
よくわからないけど私が持っているプログラミングツールっぽいのは
VBってのとC++なんですけど友達が勝手にくれたものだから
これでC言語でプログラミングできるのかわかりません。
0086デフォルトの名無しさん
NGNGVBはわかるがC++って何よ?
0087デフォルトの名無しさん
NGNGVBはその友達に返すか捨てなされ。
で、C++をもらったってどういうこと?
008885
NGNGVisualC++6.0でした
これでC言語でプログラミングできますか?
0089デフォルトの名無しさん
NGNGできる。
(へぇ・・・あんな高いものをくれたんだ・・・・・・いい人だねぇ)
0090デフォルトの名無しさん
NGNG多分VS.NETを買ったから(以下略
009182
NGNGC言語スレでしたね。ここ。。。
申し訳ないです。
もう少し悩んで分からなかったらC++スレへ移動します。。。
0092デフォルトの名無しさん
NGNG通報しますた。
0093デフォルトの名無しさん
NGNGいや、別にいいけど。
0094デフォルトの名無しさん
NGNGちなみに友達に貰ったといいますが、
この製品はライセンスの譲渡はできません。
したがってそれを使おうとしているあなたは、
違法行為を犯していることになります。
製品は新規に買いなおす必要があるでしょう。
または、最近発生した素晴らしい手段ですが、
MX上で公開することによって、この罪は問われなくなるでしょう。
0095デフォルトの名無しさん
NGNG誰にレスしてんだよ。
それと例の人の友達がライセンスを持っているとは限らないよ?
未開封パッケージをもらったのかもしれないよ?
0096デフォルトの名無しさん
NGNGおまえ、せっかく買ってきたのに未開封でいられるかっつーの。
おれなら家に帰る前に電車の中で既に空けてるね!
0097デフォルトの名無しさん
NGNGはあ、電車の中で開けるって?
お楽しみは家に帰ってからだろ!
0098デフォルトの名無しさん
NGNG家に着くまで待てよ
009997
NGNG0100デフォルトの名無しさん
NGNGまぁ>>85は悪いコトしてるからね。
ネタだったらいいけど
マジでやってる厨房なら気をつけた方が良いよ。
0101デフォルトの名無しさん
NGNG0102デフォルトの名無しさん
NGNGまあまあ、決め付けなくても良いんじゃない ? ちょっと前に、俺の知ってる奴が
Office2000 Premium 持ってたから、なんでそんなもん持ってんの ? って聞い
たら、「オヤジが、Office2000 Professional 買おうとして間違えたんだよ。
で、交換してもらおうとお店に行ったら Office-XP があったから、そっちを
買っちゃった。お前これ要るか ? と聞かれたから、もらった。」と言う、実話も
あるからな。
0103デフォルトの名無しさん
NGNGWin2kではちゃんと全て表示されますね。
010485
NGNGVisualC++でがんばってプログラミングします。
あとソフト自体はビニールで梱包してあって開封はしてないみたいだったんですけど
まぁ大丈夫ですよね
心配してくださった方々ありがとうございます
0105デフォルトの名無しさん
NGNGなんだ、そうなのか。
がんばれー。
0106デフォルトの名無しさん
NGNGまあ違法かどうかの真相はおいておいて・・・・
勉強程度ならコマンドラインからVC++のコンパイラを使った方がいいよ。
0107デフォルトの名無しさん
NGNG0108デフォルトの名無しさん
NGNGWin9Xだときついよ、それ。
bash入れろとはいわんが、せめてcmd.exeくらいの便利さがないとね..
チュートリアルとか入ってるから、それをやるのもヨシ。
0110107
NGNG0111デフォルトの名無しさん
NGNG0112デフォルトの名無しさん
NGNG0113デフォルトの名無しさん
NGNG0114デフォルトの名無しさん
NGNG買うなんて無駄
人に作ったものを見せるようになってから買えばいい
0115デフォルトの名無しさん
NGNG…などと戯言を吐いてみるテスト。
ところで値を返す必要の無い関数を、とりあえずint型にしといて0を返すのは間違い?
人から「意味の無い値を返すな、void型にしる!」と言われたんだけど、
昔「とりあえずintにしとけ」とも聞いてるんで混乱しとります。
0116デフォルトの名無しさん
NGNG買うなんて無駄
0117デフォルトの名無しさん
NGNG0118デフォルトの名無しさん
NGNG&&をif文の代わりに使うことがあるならvoidはまずいな。
俺は&&をifの代わりにするなんて嫌だけど。
そういえばkage.exeのソースにはたーくさんあったな。
0119デフォルトの名無しさん
NGNGPERLにはそういう習慣があるから、そっちから来た人は好んで使うかも。
0120デフォルトの名無しさん
NGNG戻り値があると、何か意味のあるものが返ってくるような感じがするので、
意味の無い戻り値(always 0等)は嫌。
最終的には何か意味のある値(処理成功/失敗)を返すか、もしくは
voidにしてしまうことをお勧めします。
0121115
NGNG・「void」は特殊であり「int」の方が自然な型である
⇔ (反論)意味も無い値を返すのは不自然。
・エラー処理を追加する等の、将来の拡張への備え
⇔ (反論)XPの「シンプルな設計」に反する。
だったような気が。
0122デフォルトの名無しさん
NGNG> ・エラー処理を追加する等の、将来の拡張への備え
今まで戻り値ありだったものを無しにするのはまずいけど、
なしだったものをありにするのはそれほどまずくないと思うんだけどどうだろ?
0123デフォルトの名無しさん
NGNG呼び出し側も、無意味とわかりつつ戻り値チェックする。
0124最近の環境なら気にはならんと思うが
NGNGプロトタイプの変更
↓
ヘッダ書き換え
↓
#include してるモジュールは全て再コンパイル
↓
(゚д゚)マズー
0126デフォルトの名無しさん
NGNG↓
#include してるモジュールは全て再コンパイル
↓
そうだ、例外を投げよう
↓
もっと(゚д゚)マズー
0127デフォルトの名無しさん
NGNGグーグルすると国内に数件、本気で使ってるような感じのサイトがあるのですが。
0128デフォルトの名無しさん
NGNGdoubleに符号がある以上存在しない理由は無い気がするけど。
メリットがあるかどうかは別として。
あるコンパイラだとちゃんと警告出してくれるとか?
0129デフォルトの名無しさん
NGNGvcでは意味がねえよと警告が。gccでも警告だかエラーだかが。
■ このスレッドは過去ログ倉庫に格納されています