トップページ⇒tech
986コメント256KB

C言語のことは<46>

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001激しく未定義とするNGNG
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しろ。
むしろ質問する前にWEBで検索するのが常識だ。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへ行け。
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへ行け。

コンパイラを探しているなら >>2 を見よ。

上記を逸した場合の結果は激しく未定義とする。

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/

前スレ
http://pc3.2ch.net/test/read.cgi/tech/1038405432/
0002デフォルトの名無しさんNGNG
【コンパイラ】
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
0003デフォルトの名無しさんNGNG
このスレは冗談で作られたニセスレです。ageないようにお願いします。

本物は↓こちら
C言語のことは俺に聞け<46>
http://pc3.2ch.net/test/read.cgi/tech/1038324550/l50
0004デフォルトの名無しさんNGNG
      |        ___|_              |   |
   _ー|ー-ー      | _      ヽ \    |     |
     __|_」      ̄~| ̄    /         レ    |
    / |ノ ^ヽ     _.、|    <               ノ
    (_ノ| ノ    ∠_ノ\    \            /

.         _」__               ̄──
          _|   \  |    ヽ      /
         (ノ^|.       |     |    |
           (_._」    レ     /     \


                       ●
                ヽ(;´Д`)ノ
0005デフォルトの名無しさんNGNG
>>3
つまらないのでこれで最後にしようね。
0006デフォルトの名無しさんNGNG
また糞スレが立ったか。
0007デフォルトの名無しさんNGNG
また偽スレ厨房が嵐に来るかもしれませんが、
前スレのときを見れば分るとおり、削除人さんがいずれあぼーんしてくれます。
(質問所の方は放置されているので、偽スレだとはっきり分ってよいですね。)
0008デフォルトの名無しさんNGNG
>>1
乙
0009デフォルトの名無しさんNGNG
「C言語のことは激しく未定義とする」か…
また変なタイトルにしちゃったなあ。
0010デフォルトの名無しさんNGNG
で、ドはCなわけですが。
0011デフォルトの名無しさんNGNG
だから、変わるんだって。
0012デフォルトの名無しさんNGNG
>>10
欧米ではFかも。
0013デフォルトの名無しさんNGNG
(;゚Д゚)ぅゎ-
0014デフォルトの名無しさんNGNG
本物スレage
0015デフォルトの名無しさんNGNG
なんだこのスレは?
っていうか、スレタイが糞。いい加減にしてくれ・・・
0016デフォルトの名無しさんNGNG
全くだ。
なんでこんな糞タイトルにしたんだよ! >>1
0017デフォルトの名無しさんNGNG
本スレどこだよおおおおおおおおおお
0018デフォルトの名無しさんNGNG
>>17
ココ
0019デフォルトの名無しさんNGNG
インクルードファイルのコンパイルの仕方教えてください。
mst.hというインクルードファイルがあって
それをtest.cで使っているとき。
test.cなら
>bcc32 test.c
>test
でできるんですが
0020デフォルトの名無しさんNGNG
できるんですが?がんがれ!
0021デフォルトの名無しさんNGNG
さて、名前が気に食わないからまた本スレたてるか。
0022デフォルトの名無しさんNGNG
bcc32ってのはコンパイラの名前です
インクルードファイルを自分でつくった場合それをつくって実行するやり方が
わからないということです
0023デフォルトの名無しさんNGNG
んじゃ俺も俺の気に入るスレタイで本スレ立てるよ。よろしこ。




>>19
インクルードファイルはコンパイルしないよ。
インクルードされるだけだ。
0024デフォルトの名無しさんNGNG
誤解を生むといけないので訂正。
×インクルードファイルはコンパイルしないよ。
○インクルードファイル自体はコンパイルしないよ。
0025デフォルトの名無しさんNGNG
重複スレは
   * * * あ ら ゆ る 手 段 を 使 っ て * * *
排除します。
0026デフォルトの名無しさんNGNG
>>25
じゃあここ削除されるの?
それともマジでここが本スレ?
0027デフォルトの名無しさんNGNG
っていうか、訳がわからない。
どれが本スレなんだよ。
このスレも>>1は変なスレタイ付けるしよ。
0028デフォルトの名無しさんNGNG
スレタイが多少 変でもしょうがない。
後から同じ主旨のを立てたら重複スレになってしまう。
0029デフォルトの名無しさんNGNG
>>1の糞ヤロウ!
何とか言えゴルァ
0030デフォルトの名無しさんNGNG
本物スレは

C言語のことは俺に聞け<45>
http://pc3.2ch.net/test/read.cgi/tech/1038405432/

って誘導書き込みがあるんだけど、もうすぐ1000だよ。
次スレは?
あるんだったら次スレに誘導キボンヌ
0031デフォルトの名無しさんNGNG
ここが次スレ
0032デフォルトの名無しさんNGNG
ここは糞スレ
0033デフォルトの名無しさんNGNG
俺が新スレ立てるか?
0034デフォルトの名無しさんNGNG
>>33
重複スレ立てたら潰す。
0035デフォルトの名無しさんNGNG
>>33
いいよ、ここで。
まったく、>>1も余計な真似をするよ。
0036デフォルトの名無しさんNGNG
もういいよ。C言語スレなんていらねーよ。
どうせまともな話出てこないじゃないか。
全部潰してしまえ糞ヤロウ
0037デフォルトの名無しさんNGNG
C言語で、質問なのですが、
int a;
a = 10;
printf("%s", a);

とやってもダメです。色々調べましたが分かりません。
お願いします。
0038デフォルトの名無しさんNGNG
釣られてたまるか。
0039デフォルトの名無しさんNGNG
このスレは終わりです。
37に釣られないようご注意下さい。
0040デフォルトの名無しさんNGNG
>>39
もう俺は荒らしに負けたよ。
ここが本スレでいいよ。
もしまともな新スレ立てても荒らされて終わりさ。
荒らし本人は正義のつもりなんだろうな。
0041デフォルトの名無しさんNGNG
>>40
それがお前の作戦か?
このスレは糞すれ。放置決定。
0042デフォルトの名無しさんNGNG
>>37
お前が調べたのはここか?
http://aglaia.c.u-tokyo.ac.jp/~yamamoto/diary/?200212a&to=200212021#200212021
0043デフォルトの名無しさんNGNG
>>41
じゃお前はどうしようってんだ。
新しく立てるんなら1の案でも出してみろ。
0044デフォルトの名無しさんNGNG
>>43
図星だからって熱くなってんじゃねーよ。
0045デフォルトの名無しさんNGNG
>>41
はあ?お前リアルで氏ねよ。むかつくな。
0046デフォルトの名無しさんNGNG
>>44
お前頭弱過ぎ。小学校からやり直せ
荒らしてんのお前じゃねーの?

>>40=>>45=>>46 で >>43 は俺じゃねーよ。
0047デフォルトの名無しさんNGNG
>>46
“放置決定”なんて書く莫迦の相手をしちゃ思うツボですよ。
0048デフォルトの名無しさんNGNG
>>44
>>35=>>43なんだが、一人で暑くなってんのはお前じゃないの?
クソスレだと思うならお前は放置しろ。
さもなければ納得させられるような代案を示せ。
0049デフォルトの名無しさんNGNG
おもしれーな。>>45-48は誰かと誰かを勘違いしてんじゃねーの。
0050デフォルトの名無しさんNGNG
なるほど。
>>40 (!=>>35)に突っ込んだ>>41に突っ込んだの>>43が>>35だったのか。
0051デフォルトの名無しさんNGNG
すいませんー。
アラインメントを確実に回避して詰まった構造体を生成するには
どうすればいいのでしょうか?詳しく書かれててるHPとかありましたら
教えて下さい。コンパイラはVC++6.0 Windows98SEです。
0052デフォルトの名無しさんNGNG
>>50
そうなるな。
今のところ、意見を表明してるのはこんだけか?
ここでいい……2 35,40
放置……………1 41
0053デフォルトの名無しさんNGNG
>>51
全部charの配列にしる。
0054デフォルトの名無しさんNGNG
>>52
「放置 1」って?
1が放置表明してるの?(だったら削除以来出せよな)
0055デフォルトの名無しさんNGNG
>>54
書き方がまずかった。

ここでいい……2名 (35,40)
放置…………1名 (41)
0056デフォルトの名無しさんNGNG
>>53
その構造体と同サイズの全部charaの配列を作って
構造体のポインタで参照しながら使うということでしょうか?
0057デフォルトの名無しさんNGNG
>>56
構造体の要素をすべてcharの配列にする
0058デフォルトの名無しさんNGNG
>>51
#pragma pack
で検索しる!
0059デフォルトの名無しさんNGNG
>>57
それしか無理なんでしょうか・・?
構造体の中にはいろんな型の要素を入れておきたいのですが・・・
0060デフォルトの名無しさんNGNG
>>55
あぁ,すまん。読み間違えてた。


本スレ争いなんてくだらなすぎ。
もうちょっと大人な解決ができないのだろうか。
#それだけプログラマの年齢が下がってきているということか…。
0061デフォルトの名無しさんNGNG
なんでまたそんな構造体をつくりたいんだろう。
0062デフォルトの名無しさんNGNG
>>58
ありがとうございます!!
0063デフォルトの名無しさんNGNG
>>59
処理系依存でいいなら>>58。
ポータブルにしたいなら、

struct my_int {
 char data[sizeof(int)];
};

struct my_struct {
 char c;
 struct my_int i;
};

struct foo {
 struct my_struct m;
 my_int n;
};

struct foo foo;
int i;
memcpy(&i, foo.i.data, sizeof(int));

とかする。
C++でtemplate使うとちょっと楽できる。
0064デフォルトの名無しさんNGNG
>>60
> あぁ,すまん。読み間違えてた。
いや、プロポーショナルフォントだってのを忘れてた。

とりあえず、他に代案が出ない限りは有効な質問スレとみなそうと思う。
0065デフォルトの名無しさんNGNG
ここがOKでC言語質問所がNGな理由がわからん。
0066デフォルトの名無しさんNGNG
>>65
あっちは番号が重複
0067デフォルトの名無しさんNGNG
>>63
ありがとうございます。
#pragma pack って処理系依存なんですか・・・
0068デフォルトの名無しさんNGNG
>>66
あとからきたやつが重複したんだが。
0069デフォルトの名無しさんNGNG
>>67
そもそも、#pragmaは処理系依存の命令を与えるためのものだろ?
0070デフォルトの名無しさんNGNG
個人的にはどっちもOKなんだが、このまま両方荒らされ続けるのは望ましくな
いだろうってこと。
一本化されれば荒らしも収まるんじゃないかと期待するのは甘い?
0071デフォルトの名無しさんNGNG
>>70は>>65へね。
0072デフォルトの名無しさんNGNG
いつまでやってんの?
0073デフォルトの名無しさんNGNG
いつまでも
0074デフォルトの名無しさんNGNG
C言語質問所<45>は、
俺に聞け<44>がまだ300かそこらの時に冗談で立てられたネタスレ。
間違えて書き込んでしまった素人に、間違えてかわざとか答えた奴ら
のせいで混乱した。内容は「俺に聞け」と全く重複。
時期的には、「俺に聞け<44>」に300遅れで重複。

いちおう、その時にはC言語質問所<43>というのが
まだ生きていた(実は「質問所」の最初のスレなので、<43>はおかしい)が、
なぜか<44>を飛ばして<45>という番号を付けやがった。
0075デフォルトの名無しさんNGNG
>>70
別にタイトルなぞどっちでも良いのだが、
「重複スレ排除」というルールに従うべきだろう。
0076デフォルトの名無しさんNGNG
いっそ重複スレは次の予約スレってことに。
0077デフォルトの名無しさんNGNG
どこできけばいいかわからないのでここでききます。
IntelのCPUでINT3の命令ってなににつかうのでしょうか?
マニュアル読んでも意味がよくわかりません。
解説お願いします。
0078デフォルトの名無しさんNGNG
>>77すくなくともここで聞く事では無いな。マニュアル読んでも意味が分からないと言うのはちゃんと読んでない証拠。
0079デフォルトの名無しさんNGNG
>>74
粘着キモッ
008077NGNG
>>78
ではあなたはマニュアルを読むと全て理解できるというのですか?
0081デフォルトの名無しさんNGNG
>>78
君より分かってるけどね。
008277NGNG
>>81
口ではなんとでもいえますよね。
0083デフォルトの名無しさんNGNG
>>77
breakpoint
0084ヽ(´ー`)ノNGNG
このスレは殺伐系ですね。
0085デフォルトの名無しさんNGNG
>>77
アセンブラスレで訊け。
0086デフォルトの名無しさんNGNG
>>84
ここはののしりあうためのスレだと思ったのですが
0087デフォルトの名無しさんNGNG
>>80-81
最低限、日本語の読解力は必要。
0088デフォルトの名無しさんNGNG
>>87
すぐ日本語云々だな。そういうのつまらん。
0089デフォルトの名無しさんNGNG
質問しに来た人に親切にしましょうよ。
まあ、このスレを壊したいと未だにがんばる粘着な人もいるんでしょうが。
0090名無しさん@XEmacsNGNG
C言語と関係ない質問に対する反応は未定義です。
0091デフォルトの名無しさんNGNG
>>90
うぜーよ、クズが。
0092名無しさん@XEmacsNGNG
ニヤニヤ(・∀・)>>91
0093デフォルトの名無しさんNGNG
質問です。
C言語で作ったウィンドウスプログラムをCGIで出来ますか?
0094デフォルトの名無しさんNGNG
>>93
ネタはもういい。
0095デフォルトの名無しさんNGNG
>>93
(゚Д゚)ハァ?
CGIでWindowsプログラムを作るのか?
0096デフォルトの名無しさんNGNG
Pythonでつくった開発環境みたいなものもあるしな。
0097名無しさん@XEmacsNGNG
はいはい
0098デフォルトの名無しさんNGNG
>>97
テメーは黙れ。
0099名無しさん@XEmacsNGNG
( ´,_ゝ`)
0100デフォルトの名無しさんNGNG
100
0101デフォルトの名無しさんNGNG
ごめんなさい。
0102デフォルトの名無しさんNGNG
C?
0103デフォルトの名無しさんNGNG
>>93
マジレスするとWindowsでサーバ立ててそこで動くCGIをCで作ることは可能。
0104名無しさん@XEmacsNGNG
>>103
ここは日本語の出来ないやつが来るところじゃないぞ
0105デフォルトの名無しさんNGNG
XEmacsはC言語質問所の1らしい。
放置の方向で。
0106デフォルトの名無しさんNGNG
>>103の書いていることは正しい。
0107名無しさん@XEmacsNGNG
>>105
脳みそ落ちてますよ?( ´,_ゝ`)

>>106
>>93 の質問に対する答えとしては正しくない。
0108デフォルトの名無しさんNGNG
荒らしは放置の方向で。
0109デフォルトの名無しさんNGNG
>>107
> >>93 の質問に対する答えとしては正しくない。
というかその答えって存在するのか。
0110デフォルトの名無しさんNGNG
>>93は
「Windows上で、Cで書いたプログラムをCGIに使えるか」と聞いている
のだから、>>103の答で適切だ。
0111デフォルトの名無しさんNGNG
ネタにマジレスするの流行ってるの?
0112103NGNG
地道にマジレスしてればそのうち荒れなくなると思ったんだけどな…。
0113名無しさん@XEmacsNGNG
( ^ヮ^) < ふざけるんじゃねえよ! てめえの善人面を
      ふざけるんじゃねえよ! いつかはぶっとばしてやる!!
0114デフォルトの名無しさんNGNG
>>113
どこに善人がいる?
まあ、お前がクズであるのは一目でわかる。
0115デフォルトの名無しさんNGNG
(・∀・)
0116デフォルトの名無しさんNGNG
C をする時に気をつける事は何ですか?
0117デフォルトの名無しさんNGNG
はあ、しかしこのスレタイわかりにくいな。
C言語のことは って何だよ
0118デフォルトの名無しさんNGNG
template
0119デフォルトの名無しさんNGNG
>>117
性病感染。
0120デフォルトの名無しさんNGNG
まちげた。>>116だった。(・∀・)
0121デフォルトの名無しさんNGNG
メモリリーク。
0122デフォルトの名無しさんNGNG
近藤さんに穴が開いてないこと
0123デフォルトの名無しさんNGNG
>>110
93はWindowsとは一言も言っていない。
これからの100スレを使用してウィンドウスプログラムとは何かを考察しようじゃないか。

どうやらCで書けるらしいことと、CGIに利用できそうなことはわかるが・・・
そもそもウィンドウスとは何なのかからしてわれわれは何も知らないのだ。
0124デフォルトの名無しさんNGNG
風が薄いんだろ
0125デフォルトの名無しさんNGNG
プログラムをする際にassert()は使いますか?
0126デフォルトの名無しさんNGNG
プログラムをする際以外にassert()は使いません
0127デフォルトの名無しさんNGNG
>>123
ttp://www.google.com/search?q=%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%B9%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0

グーグルも知らない香具師が偉そうな口を叩くな
0128125NGNG
>>126
すいません。きちんと書きます。

assert()はあまりよくないという話しを聞いたんですが、ここの人たち
はassert()を実際に使いますか?
それとも使わないようにしていますか?
0129bloomNGNG

http://www.agemasukudasai.com/bloom/
0130デフォルトの名無しさんNGNG
>>128
どうよくないのかわかってないからそういうアホな質問が飛び出すんだよ。
漠然と「あれはいい」「あれはよくない」って覚えるんじゃなくて、
「なぜ」よくないかを知れ。
0131デフォルトの名無しさんNGNG
assert()つかいまくり。
(VCだからASSERT()だけど)
0132デフォルトの名無しさんNGNG
時々アプリのくせにassertionエラーでダイアログ出すやつあるよね
assertって絶対におきない条件書くのに、起きてるのってヘタレPGなんですかね
0133デフォルトの名無しさんNGNG
>>132
デバッグが充分じゃない。つーかNDEBUGつけんでリリースするのはかなりヘタレと思われ。
0134デフォルトの名無しさんNGNG
>>132
絶対に起きない条件て assert (1); とかでつか?
0135デフォルトの名無しさんNGNG
>>133
「うまくいかなくても平気なデバッグ時にチェックを行い、
うまくいかないと悲惨なことになる製品の段階でチェックを取り除くのは、
陸の上の練習でライフジャケットをつけ、
海に出るときにそれを外すようなものである。」
と偉い人が言っている。
0136デフォルトの名無しさんNGNG
ベータテストなんだよ、きっと
0137デフォルトの名無しさんNGNG
アサーションをリリース時に取り除く必要があるのは
アサーションにかかる実行時間が大きな影響を与える場合だけだろ。
単純な引数のチェックとか大抵のものはリリース時にも残しておいた方が
いいんじゃないのか?
0138デフォルトの名無しさんNGNG
printf覚えたんですが次は何を覚えたらよいでしょうか?
0139デフォルトの名無しさんNGNG
>>139 sprintf
0140デフォルトの名無しさんNGNG
>>138
本の買い方・選び方
0141デフォルトの名無しさんNGNG
>>138

>>139の無限ループについて考察せよ。
0142デフォルトの名無しさんNGNG
>>138
cout いっとけ。
0143デフォルトの名無しさんNGNG
system(const char *string)
0144デフォルトの名無しさんNGNG
> printf覚えた

果たして本当にそうかな?
0145デフォルトの名無しさんNGNG
おい、もう一つのスレの方がやたら濃くなってきてるぞ。
0146デフォルトの名無しさんNGNG
>>137
アサーションをエラーチェックに使う時点で間違ってる。
0147デフォルトの名無しさんNGNG
146 禿げ
0148デフォルトの名無しさんNGNG
147 パイパソ
0149デフォルトの名無しさんNGNG
>>146
それ以外に何に使うんだ ?
0150名無しさん@XEmacsNGNG
>>146
?
0151デフォルトの名無しさんNGNG
ごめん、146 禿げ同と書いたつもりだった・・・

>>149-150
エラーハンドリングとアサーションは別物だという事を理解してくれ。
0152デフォルトの名無しさんNGNG
>>149-150
assert マクロが何故リリースビルドで何もしないか理解しているか?
0153デフォルトの名無しさんNGNG
>>151
禿げ
0154デフォルトの名無しさんNGNG
>>151-152
エラーチェックとエラーハンドリングは別物ということを理解してるか ?
0155デフォルトの名無しさんNGNG
>>154
ネタですか?
0156デフォルトの名無しさんNGNG
>>155
理解できてない奴、一匹目。
0157デフォルトの名無しさんNGNG
あさしゃんを夜にする時点で間違っている。
0158デフォルトの名無しさんNGNG
>>157
あさしゃんは夜にできないだろ…
0159デフォルトの名無しさんNGNG
>>155
いいえ、シャリです。
0160デフォルトの名無しさんNGNG
>>157
夜にする あさしゃん って...。
0161デフォルトの名無しさんNGNG
>>151 >>152 >>154
知ったかぶらないでちゃんと説明しろ。
0162デフォルトの名無しさんNGNG
>>161
教えを乞う者の態度とは思えんが・・・。

エラーハンドリングは、プログラムの仕様だ。
プログラムの実行時に発生する可能性がある異常値をあらかじめ想定して、捕捉し、
それに応じた復帰/終了処理をする。

アサーションは、プログラムが仕様/意図通りに動いているかどうかを確かめるものだ。
エラーハンドリング漏れや論理エラー等の、プログラムの実行時に許容できない異常値を
捕捉する。
仕様/意図通りに動いている事が確認できればそれはもう必要無いので、リリースビルド
には含めない。

エラーハンドリングは仕様書に現われる、アサーションは現われない。
0163154NGNG
>>161
エラーチェック: エラー状態かテストすること。
エラーハンドリング: エラー状態時にしかるべき処理を行うこと。

ASSERT() が行うのは、エラーハンドリングの方。
だから、>>151 がなに言ってるか俺にはさっぱりわからん。
0164デフォルトの名無しさんNGNG
>>163
assert()は「しかるべき処理」は行わないだろ。
少なくともユーザから見た場合。
0165デフォルトの名無しさんNGNG
>>162
それで具体的にどういうものがエラーハンドリングになってどういうものがアサーションになるのだ?
0166名無しさん@XEmacsNGNG
>>162
なんでこの人はエラーチェックをエラーハンドリングに脳内変換してるの?
0167デフォルトの名無しさんNGNG
>>166
どのへんがそうなのか教えてくれないか?
0168デフォルトの名無しさんNGNG
>>162
ASSERT() マクロにも仕様と言うものがあることを知らんのか ?
ちなみに、リリースビルドでも同じような動作をする VERIFY() マクロもあるぞ。

>>164
プログラマから見たときの話に決まってるだろ。
元々発生しないと思っているんだからさ。
0169デフォルトの名無しさんNGNG
>>165
アサーションは、仕様通りに動いていれば本来必要の無いチェックをする。
例えば、リンクリストの意図しないリンク切れとか。
もともとアサーションはまともなデバッガが無い時代のものだから、今使う事は
あまり無いはず。

エラーハンドリングは、例えばファイルが開けなかったとか、実行時に起こり得る
ものをトラップする。
0170デフォルトの名無しさんNGNG
> ASSERT() マクロにも仕様と言うものがあることを知らんのか ?

は?
0171デフォルトの名無しさんNGNG
>>168
VERIFY() なんての C にあった?
0172165NGNG
俺がどちらを使うかはっきりしている場合をあげておく。

コンポーネントやライブラリなどの関数・メソッド内での
引数のチェックにはアサーションを使ってはならない。

コンポーネントやライブラリなどの関数・メソッドを呼び出す前の
引数のチェックにはアサーションを使う。
0173デフォルトの名無しさんNGNG
> アサーションは、仕様通りに動いていれば本来必要の無いチェックをする。

配列境界のチェックなんてのもあるな。
0174デフォルトの名無しさんNGNG
> コンポーネントやライブラリなどの関数・メソッドを呼び出す前の
> 引数のチェックにはアサーションを使う。

引数をチェックするという仕様がプログラムに求められているなら、その場合は
アサーションを使ってはならない。
0175名無しさん@XEmacsNGNG
この議論の原点って>>146だよね?
エラーハンドリングは>>151が勝手に持ち出した話だろ?
0176名無しさん@XEmacsNGNG
>>174
もう少しよく読んだら?
0177デフォルトの名無しさんNGNG
>>170
規格書ぐらい読めよ。どう言う処置をするかが書いてあるよ。

>>171
> VERIFY() なんての C にあった?
ごめんよ、ANSI-C にはなさそう。VC++ の方言のようだ。
0178デフォルトの名無しさんNGNG
>>172
理由は ?
0179デフォルトの名無しさんNGNG
つまり、アサーションってのはプログラム実行時にブレークして
「えっとこの時点ではこの変数はこうなっているはずだよなぁ」って
確認するような感じに使うってことでいい?
引数のチェックに使うのはもってのほかなんだね。
0180165NGNG
>>178
アサーション使ってリリース時にアサーションが消えている状態で
コンポーネントやライブラリが不正な引数で呼び出されたら困るだろ。
0181デフォルトの名無しさんNGNG
>>176
もう少しくわしく書こうか?
関数・メソッドを呼び出す引数をチェックするという仕様がプログラムに
求められているなら、その場合はアサーションを使ってはならない。

>>179
正解。
0182デフォルトの名無しさんNGNG
>>179
そりゃブレークポイント。
(そう言えば、>>169 も、「もともとアサーションはまともなデバッガが無い時代のものだから」とかほざいてたな...。こんな香具師ばかりかよ...。)

一応意図は >>162 の...
> アサーションは、プログラムが仕様/意図通りに動いているかどうかを確かめるものだ。
> エラーハンドリング漏れや論理エラー等の、プログラムの実行時に許容できない異常値を捕捉する。

で合ってると思う。(ただしここだけね。)
0183デフォルトの名無しさんNGNG
> コンポーネントやライブラリが不正な引数で呼び出されたら困るだろ。

そういう論理エラーはデバッグの段階で完全に取り除いとけ。
アサーションはそのためにある。
0184デフォルトの名無しさんNGNG
182 も、アサーションが何故リリースビルドで消えるか理解していない一人か・・・
0185名無しさん@XEmacsNGNG
>>181
>コンポーネントやライブラリなどの関数・メソッド内での
>引数のチェックにはアサーションを使ってはならない。
当然これが守られてる場合の話だろ?
2重にチェックする気?
0186デフォルトの名無しさんNGNG
>>179
禿同。何のために、デバッグしてんだよ。

でも、実際にそう言う状況があるから、>>135 みたいな話が出てくるんだろ。
0187デフォルトの名無しさんNGNG
>>185
すまん、あなたがどんな主張を持っていて、どのレスをどう解釈してそう逝っているのか
わかんなくなってきたよ。
0188186NGNG
>>186
すまん、>>179 じゃねーや。

>>183
> 禿同。何のために、デバッグしてんだよ。
> でも、実際にそう言う状況があるから、>>135 みたいな話が出てくるんだろ。

だったよ。
0189デフォルトの名無しさんNGNG
>>184
理由は ?

(あー、ウザイ。ちゃんと理由も一緒に書けよ。)
0190デフォルトの名無しさんNGNG
「完全にデバッグする」なんてできるわけがねぇだろアフォ(w
0191名無しさん@XEmacsNGNG
>>183
ライブラリ作る側の話でしょ?
ライブラリのユーザがライブラリ関数をおかしな引数で呼び出しても
暴走しないようにしとくのが普通じゃない?

>>187
>>172 とだいたい同じだと思う。
ライブラリ関数の中で、渡された引数をチェックするのにはassertは使わない。
ライブラリ関数に渡した引数がおかしな値になってないかを確認するのにはassertを使う。
0192デフォルトの名無しさんNGNG
>>189
論拠はこれ。

> 「もともとアサーションはまともなデバッガが無い時代のものだから」とか
> ほざいてたな...。こんな香具師ばかりかよ...。)
0193名無しさん@XEmacsNGNG
あ >>191 の最後
s/渡した/渡す/

てか実際はassertなんか使わないので>>192にも同意。
0194デフォルトの名無しさんNGNG
>>191
だから、呼ばれる側じゃなくて、呼ぶ側でちゃんとデバッグしておけって話だろう。
0195デフォルトの名無しさんNGNG
>>192
これがどうかしたか ? デバッガとアサーションって用途が違うぞ。
0196デフォルトの名無しさんNGNG
195 は、アサーションはデバッグのためにするものだという事を知らないのか?
0197デフォルトの名無しさんNGNG
>>194
だから呼ばれる側はアサーションを使わないでエラーにしろって。
動作が正しく行われるのをモニタリングするため使うのがアサーションで
呼ぶ側で追加でやる処理だろ。
0198デフォルトの名無しさんNGNG
0199デフォルトの名無しさんNGNG
んで、アサーションに引っかかるようなバグが
最終製品で残ってたとき、-DNDEBUGしてあると
何がうれしいんだ?
0200名無しさん@XEmacsNGNG
>>199
アサーションに引かかったらデバグするでしょ普通。。。
0201デフォルトの名無しさんNGNG
バグの究明が早くなる。
0202デフォルトの名無しさんNGNG
>>200
「全部バグが取りきれた」という保証は永遠に得られないだろ?
0203デフォルトの名無しさんNGNG
>>201
「遅くなる」の間違いだろ。
0204デフォルトの名無しさんNGNG
>>196
> 195 は、アサーションはデバッグのためにするものだという事を知らないのか?

お前アフォだろ ?

アサーションはデバッグのためにする。
デバッガもデバッグのために使う。

だから、デバッガがあればアサーションは要らないって言うのか ?

お前のデバッガは、引数の範囲とかをちゃんと理解して要所要所で、エラーチェックしてくれんのか ?
そんなデバッガがあるなら、俺も使いたいもんだよ。

>>197
状況による。呼ばれた側がいくらエラーを返していても呼び出し側が見てなきゃ何にもならない。
また、呼び出しが非常にたくさんあるなら、呼ばれた側でチェックする方が簡単。
0205名無しさん@XEmacsNGNG
>>202
そらそうだ。実際に製品として出回ってるソフトにもバグ残ってるのは
いくらでもあるよ。Windows2000も出荷時に6000ものバグ抱えてたって言うしね。
0206デフォルトの名無しさんNGNG
>>203
アサーション入れてもデバッグの助けにならないというなら
入れないほうがいいじゃん。
0207デフォルトの名無しさんNGNG
>>202
そこはそれ、豊富な経験・勘と.... 「日程」が背中を押してくれるんですよ。(w
0208デフォルトの名無しさんNGNG
>>138のホーアの言葉は、配列の添え字チェック
(Pascalだと、コンパイラオプションでon/offできるものが多かった)
の事だが、アサーションでもまあ同じ。
エラーハンドリングの話じゃないよ。
0209デフォルトの名無しさんNGNG
Windows のバグはアサーションで検知できる種類のものじゃないだろう・・・
0210デフォルトの名無しさんNGNG
うちではリリース版にもアサーション生かしてあるし、
デバッグ用シンボルつけてあるし、
コアダンプを保存するようにしてある。

Netscapeだと、「クォリティフィードバック」と呼んでいるし、
他の製品でもまあよくあるよね。
昔のMS-Cだと、よく「Compiler Internal Error」ってのを見たな。
0211デフォルトの名無しさんNGNG
>>204
> 状況による。呼ばれた側がいくらエラーを返していても呼び出し側が見てなきゃ何にもならない。
当たり前だ。呼び出し側にバグがあるんだから呼び出し側のチェック体制を強化しろよ。アサーションでも入れて。

> また、呼び出しが非常にたくさんあるなら、呼ばれた側でチェックする方が簡単。
簡単だからそっちでやるとかそういう問題じゃないだろ。
簡単だからという理由だけなら手抜きと一緒だぞ。
0212デフォルトの名無しさんNGNG
>>209
もちろん、すべてのバグがアサーションで検知できるわけではないが、
もともと誰もそんなことを主張してはいない。
0213デフォルトの名無しさんNGNG
>>211
呼び出される側にアサーション入れるのでは駄目なの?
0214デフォルトの名無しさんNGNG
> また、呼び出しが非常にたくさんあるなら、呼ばれた側でチェックする方が簡単。

アサーションは普通、どこで捕捉したかが重要だから呼び出し側でやるべきだと思うが・・・
0215デフォルトの名無しさんNGNG
>>212
(゚Д゚)ハァ?
じゃ、205 はどういう意味なの?
0216名無しさん@XEmacsNGNG
>>211
あのね。ライブラリとかだと呼び出す側が
厨房プログラマーだったりするかもしれないでしょ?
ほんとに分かんないのかな?それともネタ?
0217デフォルトの名無しさんNGNG
>>211
> 簡単だからという理由だけなら手抜きと一緒だぞ。

同じことが出来るんだったら簡単な方を選ぶよ。どこが手抜だ ?

1000個所から呼ばれてたら、1000個所にいちいち ASSERT() かますわけね。
はっきり言ってバカみたいだよ。
0218デフォルトの名無しさんNGNG
>>214
コアダンプの結果見れば、どこから呼び出されたかは分かるだろ。
Winじゃpost-motem debugってできないの?
0219デフォルトの名無しさんNGNG
>>213
もし呼び出され側がプログラム全体の呼び出される条件をすべてテストしており
これからの将来それが変更されないのならいいかもしれんね。
0220デフォルトの名無しさんNGNG
>>217
foo()の呼び出しをassert込みでマクロ定義すればよい。
0221デフォルトの名無しさんNGNG
>>217
同じことが出来るならね。だが同じことは出来ない。
0222デフォルトの名無しさんNGNG
ところで、この中で
「製品版でもアサーションは生かしておくべし」
に反対してるやつってまだいるの?
0223名無しさん@XEmacsNGNG
>>215
>>205は>>202に対するレス。
バグが残ってる可能性があるからといってassertを残しておいたってあまり意味ないってこと。
本当に最後まで見付からないようなバグはassertでは捉えられないんだから。
0224デフォルトの名無しさんNGNG
>>206
-DNDEBUGすると「アサーションは何も検査しなくなる」んだけど?
0225デフォルトの名無しさんNGNG
>>223
捉えられないとも限らないだろう。
「あまり」意味は無いかもしれないが、
取り除く意味はデバッグに関して言えば「全く」無いだろう。
0226デフォルトの名無しさんNGNG
>>223
ああ、理解した。
0227デフォルトの名無しさんNGNG
>>223
それがなぜassertをわざわざ取り除く理由になるんだ?
0228デフォルトの名無しさんNGNG
>>220
ネタ ? 悪いけど、呼ばれた側でテストしてんのとどこが違う ? (ソース/オブジェクトとか言わないでね。)
それともマジで、ライブラリ中で引っかかっ時に、どこから呼ばれたか見方がわからんの ?

>>221
何ができないのか言ってみ。
0229名無しさん@XEmacsNGNG
>>225
いちいちチェックしてたら速度が落ちるでしょうが。
VC++とかでもdebug用とrelease用でコンパイルオプション変えれるでしょ?(。。。よね?)
デバッグのことだけ考えればいいんならこんな区別必要ないでしょうが。
0230デフォルトの名無しさんNGNG
>>228
assertに引っかかったとき表示される行番号が違う。
0231デフォルトの名無しさんNGNG
>>229
だから、そもそも「リリース用でコンパイルオプションを変えるのが間違い」
というのが>>138の主張なのだが。
0232デフォルトの名無しさんNGNG
>>229
速度が落ちるなんて、せいぜい数十%だろ。
ハードの進歩で言って3か月分くらいか?
0233231NGNG
>>138じゃなくて
>>135ですた。
0234デフォルトの名無しさんNGNG
>>228
どんな環境でもコアダンプが利用できると主張したいわけね。
0235デフォルトの名無しさんNGNG
>>230
ぷぷっ、で、デバッグできないと...。
わかったわかった。お前は、一生そうしてな。
0236デフォルトの名無しさんNGNG

0237デフォルトの名無しさんNGNG
>>235
230じゃないけど、君の言うことがよく分からない。説明してくれる?
0238デフォルトの名無しさんNGNG
>>234
> どんな環境でもコアダンプが利用できると主張したいわけね。

まあ、できない環境もあるだろうね。
でもデバッガの環境下なら、呼び出し元ぐらいわからない ?
それもダメなら、しょうがないけどね。
0239デフォルトの名無しさんNGNG
実際、ネスケのQuality Feedback Agentが働く頻度を見れば、
出荷後でもアサーションに引っかかることはいくらでも
あると思うけど。
0240名無しさん@XEmacsNGNG
>>231
うーん私はそう思わない、としか言いようがないな。

>>232
同じ能力なら速度が早い方の製品を買うでしょ?

で、ライブラリ作る人間と使う人間は別(の可能性がある)ってのは
みんな分かってんのかなぁ?
0241デフォルトの名無しさんNGNG
Winでコアダンプみたいな死後デバッグやる方法ってある?
Dr. Watsonみたいのに頼るしかない?
0242デフォルトの名無しさんNGNG
>>237
>>238 にも書いたけど、普通のデバッグ環境なら、アサーションに引っかかった時に呼び出し元ぐらいはわかる仕組みはある。
デバッガの下にない時でも、Unix なら core, Windows ならデバッガのオンデマンド起動で呼び出し元がわかるはず。
組込みなんかのやや特殊な場合は、abort() とかでスタックダンプするとかが必要かもしれない。

と言うか、これぐらい理解してないとデバッグできないでしょ ?
0243デフォルトの名無しさんNGNG
>>240
135の主張をくつがえす充分な論拠をあなたは提供していないと
思います。アサーションを入れる場所にもよると思うけど、
私は数十%も速度が変わるとは思えない。せいぜい10%以下でしょう。

たとえ数十%速くなったとしても、アサーションが無い場合に
エラーであることさえ気づかず黙って誤動作するソフトにしてしまう
(そしてそのバグが永久に発見されない)ような品質の低下が、
その数十%に見合うとは思えない。
0244デフォルトの名無しさんNGNG
>>241
Win は、アサーションした時に「デバッグするか ?」と聞かれるから、「はい」と答えると VC++ が起動して、それでデバッグする。
(>>242 のオンデマンド起動)
0245デフォルトの名無しさんNGNG
>>240
アサーションの速度差なんて、体感できないと思う。
0246デフォルトの名無しさんNGNG
>>244
うーん。じゃあ客先環境にもVC++をインストールしといて、
「はい」と答えてもらうの?
0247デフォルトの名無しさんNGNG
>>243
概ね同意するが、

> (そしてそのバグが永久に発見されない)ような品質の低下

これには同意できない。あと、

> その数十%に見合うとは思えない。

ゲームアプリの場合は、0.1 % でも重要な事が多い。
0248デフォルトの名無しさんNGNG
>>243
それは、難しい問題。
逆にアサーションがぼこぼこ出るようなソフトウェアが今後売れるとも思えない。
永久に発見されないバグは、問題無しと考えこともできるよ。
0249デフォルトの名無しさんNGNG
>>246
その時は、DrWatson を使えばよろし。
0250名無しさん@XEmacsNGNG
>>243
上にも書いたとおり、製品版のソフトにassertで捉えられるバグなんて
ほとんど残ってない(ようにしとかないといけない)わけで、それ以外の
バグの方が圧倒的に多いから、必ずしもassertを残しといたからって
安全性が上がるってものでもない。
当然速度との兼ね合いはトレードオフの話になるから、速度なんて
どーでもいい製品なら残しといてもいいと思うけどね。
0251デフォルトの名無しさんNGNG
>>248
ネスケはぼこぼこ出るよね。(QFA)
他のアプリは、アサーションは出ないけど「一般保護例外」が出る(w
0252デフォルトの名無しさんNGNG
>>246
つーか、客先環境でアサーションが出ること自体が問題かと...。
0253デフォルトの名無しさんNGNG
速度なんて、ユーザのPCごとにちがうのに、何パーセントだの何だの
あほらしい。
0254デフォルトの名無しさんNGNG
確かにゲームにバグがあっても顧客のビジネスに影響が
あることは少ないが、ゲームで0.1%が重要なのはごく
一部の描画まわりだけだと思う。
0255デフォルトの名無しさんNGNG
>>250
>>252
ネスケはぼこぼこ出るよね。
他でも、「不正な処理」が出るソフトってそんなに珍しいか?

また、「assertが入ってればすぐ見つかったのに、
ないために原因が突き止められない不具合」ってのも
あると思うが。
0256デフォルトの名無しさんNGNG
ゲームで速度要求してるんなら、最低/推奨速度だの表示するだろう
そのスペックで動くモノであれば、文句言われないわけだし
0257デフォルトの名無しさんNGNG
>>255
> 他でも、「不正な処理」が出るソフトってそんなに珍しいか?

珍しくはないけど、だから良いってわけないだろ。
とりあえず、DrWatson 入ってりゃスタックダンプは取れるから、ライブラリ中でアサーションしても呼び出し元はわかる。
0258デフォルトの名無しさんNGNG
>>257
いや、だから「アサーション入れとけ」といいたいんだけど。
0259デフォルトの名無しさんNGNG
入れるか入れないかの判断は、どちらが正しいという事でも無いと思うがな
0260名無しさん@XEmacsNGNG
まぁassert残しといてバグがあるの客にバレるのが嫌
ってのもあるかもねw

>>254
最近の3Dものとかは計算部分のほうが大きいと思う。

あと、数%くらいで、って言ってる人いるけど、例えば1%でも違えば
100時間稼働したら1時間の違いが出る訳で、重要になってくる
ようなソフトもある。
0261デフォルトの名無しさんNGNG
ネスケの QFA は、アサーションじゃなくてエラーハンドリングじゃないのか?
0262デフォルトの名無しさんNGNG
>>260
まさか、時間のかかるループにアサーションしこんで遅くしようと考える人はいないでしょう?
どこに入れるとか、どこに入れてはいけないというくらい、プログラマならわかりますよね。
0263名無しさん@XEmacsNGNG
>>262
そんなこといちいち考えるんならassertじゃなくて
普通にエラーハンドリングしなさいな。
assert ってリリース時に取り除けるからいいんでしょうが。
0264デフォルトの名無しさんNGNG
>>261
でも、マクロで実装してるよ。エラーを解決して続行できるわけでもない。
assertと意図は同じ。
0265デフォルトの名無しさんNGNG
>>264
エラーハンドリングは必ずしも処理を続行させるためのものではない。
0266デフォルトの名無しさんNGNG
今だ!2ゲットォォォォ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
     ∧∧   )      (´⌒(´
  ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
        ̄ ̄  (´⌒(´⌒;;
      ズザーーーーーッ
0267デフォルトの名無しさんNGNG
マジレスすると、1+1 は 2 だぞ。
0268デフォルトの名無しさんNGNG
んなわけねーだろ
0269デフォルトの名無しさんNGNG
assert(1+1 == 2);
assert(>>267 == アフォ);
0270デフォルトの名無しさんNGNG
typedef struct String_tag
{
char *str;
int flag;
}String;
っていうString構造体があったとき、これを配列にして
String String_data[20];ってして
構造体メンバのstrにメモリを割り当てるときどうしたらいいんですか?
自分は
String_data[i].(*str) = malloc(-----)ってやったらgccタンに怒られました。
おねがいします。
0271デフォルトの名無しさんNGNG
>>270
String_data[i].str = (char*)malloc(バッファサイズ);
0272デフォルトの名無しさんNGNG
>>270
int *p;
*p = malloc(1);
とかやってそうなコードだな。
0273教えてください><NGNG
実数を入力し、それぞれ以下のように変換する

小数第3位以下を切り捨てる
小数部のみに変換
小数第2位を四捨五入して小数第1位までに変換
10の位を四捨五入して100の位までに変換

※出力はすべて、printf("%f\n", x)とすること
0274デフォルトの名無しさんNGNG
>>273
宿題丸ちなげかよ
0275デフォルトの名無しさんNGNG
>>273
スレ違い
0276デフォルトの名無しさんNGNG
>>273 の、
「小数部のみに変換」ってどうやるのか分からない。
これは「C言語のこと」として識者諸兄に聞いてみたい。
0277デフォルトの名無しさんNGNG
>>276
double a = 1.3;
a = a - (long)a;
0278デフォルトの名無しさんNGNG
http://pc3.2ch.net/test/read.cgi/tech/1038024989/332
0279デフォルトの名無しさんNGNG
0〜3までの値を取る変数に対して、
0または3を判定する良い方法ないでしょうか?
今こうやってます。
if (n == 0 || n == 3)
ビット演算とか使ったりもっとうまいやりかたがあったら教えてください。
0280デフォルトの名無しさんNGNG
>>279
そんなもので劇的に処理速度が上がることはないから気にするな。
トリッキーなコード書いてもしかたない。
0281名無しさん@XEmacsNGNG
>>279
if ( (n&1) ^ (n&2) )
0282名無しさん@XEmacsNGNG
ネタでミスったので師んできます。
0283デフォルトの名無しさんNGNG
>>278
だめじゃん、それ
0284デフォルトの名無しさんNGNG
>>279
if(n*n==3*n)
0285デフォルトの名無しさんNGNG
比較演算子のみの>>279が一番速いような気がする
0286デフォルトの名無しさんNGNG
>>284
if(n * (n - 3) == 0)
0287デフォルトの名無しさんNGNG
if(n&1==n&2)
0288デフォルトの名無しさんNGNG
>>287
それは駄目だろ。
if ((!!(n&1)) == (!!(n&2)))
か。
0289sumasoNGNG
if(n&1==n&2>>1)
0290デフォルトの名無しさんNGNG
ビットパターンが 00 または 11 だから
なんか上手い方法はある気はする。
0291デフォルトの名無しさんNGNG
if(!(n%3))
0292デフォルトの名無しさんNGNG
if((9 >> n) & 1)
0293デフォルトの名無しさんNGNG
>>292
そんなのがいきなりソースに出てきたらなにしてんのか絶対分からんと思う。
0294デフォルトの名無しさんNGNG
整数なら >>291で良くない?
例には ==0.0など小数で書かれていないし。
0295デフォルトの名無しさんNGNG
>>292
でもそれうまいね。0と3に限らず、
0〜(intのビット数)の数の任意の組み合わせを
一発でテストできる。
0296デフォルトの名無しさんNGNG
>>294
性能的にはむしろ退化しているし、なにしているのか直感的に分かりずらい。
結局279がいまんとこ最強だ。
0297デフォルトの名無しさんNGNG
if((0x09>>n)&1)
なら、さらに察しやすいかな?
0298279NGNG
すいません。みなさんありがとうございます。
nは整数で、intでもcharでもなんでもいいです。
0299デフォルトの名無しさんNGNG
>>297
ビットでかけるようになってたらもう少しわかりやすいけどね。
if((0b1001 >> n) & 0b0001)
0300名無しさん@XEmacsNGNG
>>294
割り算ってめちゃ遅いって聞いたことあるけど。。。
昔の話かな?
0301デフォルトの名無しさんNGNG
if((int)(n-(3/2.0)))
って、うまく動く?
0302デフォルトの名無しさんNGNG
加減算に比べれば遅いよ。
乗算は物量をぶち込めば1サイクルでなんとかできるけどナー。
0303デフォルトの名無しさんNGNG
>>302
いっている意味がよく分かりません。表現を変えてもう一度お願いします。
0304279NGNG
多分、アセンブラで条件ジャンプが1つになれば
そっちの方が速いんですよね。
>>292のと比較してみます。
0305デフォルトの名無しさんNGNG
以外と n&1 より n%2 の方が速い。
0306デフォルトの名無しさんNGNG
>>303

>>302は>>300へのレスですた。
0307デフォルトの名無しさんNGNG
>>305
漢字を間違ってる時点で信用に値しないですが何か?
0308デフォルトの名無しさんNGNG
実験してないが、計算量を考えると 279 が最も速いように思える。

>>305
大抵の処理系では除算は重いからよろしくナ。
0309デフォルトの名無しさんNGNG
>>305
なにを根拠に?
0310デフォルトの名無しさんNGNG
>>308
できれば除算の方が重くない処理系ってのをあげてくれ。
0311デフォルトの名無しさんNGNG
最適化すると (n%2) == 1 は (n&1) になるだろう。
どっちが速いもクソも…
0312デフォルトの名無しさんNGNG
>>311
いまさら言い訳ですか?w
0313279NGNG
まず、アセンブラ出力になおしてみました。
cl -O2 /FAs iftest.c
です。
nは volatile int n = 1;としました。

●if (n == 0 || n == 3)の場合
-----------------------------------
mov  edx, DWORD PTR _n$[esp+12]
test  edx, edx
je  SHORT $L53243
mov  edx, DWORD PTR _n$[esp+12]
cmp  edx, ecx
jne  SHORT $L53240
-----------------------------------

●if ((9 >> n) & 1)の場合
-----------------------------------
mov  edx, 9
mov  cl, BYTE PTR _n$[esp+12]
sar  edx, cl
test   dl, 1
je  SHORT $L53240
-----------------------------------
0314デフォルトの名無しさんNGNG
>>311
そういう最適化をするコンパイラを上げてくれ
0315デフォルトの名無しさんNGNG
>>310

>>308は「すべての」と断言はしなかっただけで
意味的には「すべての」と言いたかったものと思われ。
0316デフォルトの名無しさんNGNG
(´-`).。oO(なんで volatile 付ける必要があるんだろう。。。?)
0317279NGNG
なんかうちの環境(Win98)だとバラツキがあって
よくわからなかったので、テストソース載せておきます。

/*cl -O2 iftest.c winmm.lib */
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#pragma comment(lib, "winmm")

int main() {
  int i;
  int c = timeGetTime();
  volatile int n = 1;
  for (i = 0; i < 40000000; i++) {
#if 0 // 1
    if ((9 >> n) & 1)
      n = n;
#else
    if (n == 0 || n == 3)
      n = n;
#endif
  }
  printf("%d msec\n", timeGetTime() - c);
  return 0;
}
0318279NGNG
>>316
最適化で消えてしまうので・・
なにか良い方法があったらおねがいします。
0319デフォルトの名無しさんNGNG
>>313
その2つはあきらかに後者の方がはやい。
でも直感的になにをしているかが分かるのは前者。
後者を使うのならコメントは必須。
0320311NGNG
>最適化すると (n%2) == 1 は (n&1) になるだろう。

昔っからたいていのコンパイラはこの最適化をやってる。
strength reductionというやつだ。実際、今試したら
gcc 2.95.3でも if (n % 2) は
testb $1,8(%ebp)
je .L4
というコードになった。

ちなみに俺は305ではない。
0321デフォルトの名無しさんNGNG
>>318
ifの後の処理をn = n + 1とかもうちょっと意味のあることをすればきえないだろ。
n=nならあきらかに無駄な処理と判断して省かれるのはしかたがない。
0322デフォルトの名無しさんNGNG
>>318
別の関数にすれば良いんだよ。
0323デフォルトの名無しさんNGNG
>>317
PentiumIII-800MHz、VC6 で、
単純比較: 平均 350
ビット演算: 平均 400
0324311NGNG
あ、ちなみに俺は「一般には割り算のほうが遅い」というのは
理解してるからな。よろしく。
0325デフォルトの名無しさんNGNG
ちなみに俺も305ではない
0326305NGNG
今、実際に試したら全然遅かったです。ごめんちゃい。
昔それで驚いたことがあったのですが、勘違いだったみたいです。
0327デフォルトの名無しさんNGNG
311 がどう思っているかとかじゃなくて、305 の根拠が知りたいんだが。

>>318
それでも最適化で消える。
0328327NGNG
> それでも最適化で消える。

すまん、これは 322 宛て。
0329デフォルトの名無しさんNGNG
>>323
ちなみになにが350でなにが400なんだ?
クロック数か?
最適化されているのか?
VCは最適化しないと&の命令をちゃんと使ってくれないぞ。
0330デフォルトの名無しさんNGNG
あ、よかった、解決した。
0331デフォルトの名無しさんNGNG
消えたらマズくない?volatile だっつってんのに?
0332デフォルトの名無しさんNGNG
n==0 || n==3みたいに2つの比較だけなら単純比較でよいだろ。
もっと多いなら >>292 が良さげ。
要するにPascalのset型を自分でやるテクだね。
0333デフォルトの名無しさんNGNG
>>329
何がって、

> 単純比較: 平均 350
> ビット演算: 平均 400

ちゃんと書いておろうが。
何の数字かという意味なら、317 のソースの通り。(ミリ秒)
0334デフォルトの名無しさんNGNG
これでまた一歩・・・
0335デフォルトの名無しさんNGNG
volatile にしない方法を議論してるのに...、乗り遅れたな。>>331
0336デフォルトの名無しさんNGNG
>>327
おいおい。
void foo(int n)
{
if ((9 >> n) & 1)
...}

これでどうやって最適化で消えるんだ?
nに値を与えてないのに。
0337279NGNG
n = n+ 1にして測ってみたんですが、
結局差は良くわかりませんでした・・。
if (n==0 || n==3)
は、n==0が多い場合に速いのかな。
0338デフォルトの名無しさんNGNG
> VCは最適化しないと&の命令をちゃんと使ってくれないぞ。

どゆこと?
0339デフォルトの名無しさんNGNG
>>336
インライン展開したのち、無駄な処理と判断して消えて無くなる。
0340デフォルトの名無しさんNGNG
>>339
別ファイルにして分割コンパイルすりゃいいだろ。
そこまで説明しないとわからんか。
0341デフォルトの名無しさんNGNG
>>337
> if (n==0 || n==3)
> は、n==0が多い場合に速いのかな。

これは、正しい。詳細は短絡評価でググルべし。
0342デフォルトの名無しさんNGNG
>>339
それはおかしい。
呼び出している箇所ではインライン展開されるかもしれんが、
staticでないfooという関数自体のコードは残るだろう。
そうでないと、あとで他のファイルからfooが呼び出されたらどうする?
0343デフォルトの名無しさんNGNG
>>340
そんな面倒な事するくらいなら、比較前の n に rand() を代入する方を選ぶ。
0344デフォルトの名無しさんNGNG
>>318
n自体をvolatileにせずに、別のvolatile変数に代入すりゃいいだろ。
0345デフォルトの名無しさんNGNG
>>339はためしもせずに適当なことを言っている。
0346デフォルトの名無しさんNGNG
首ククルべし
0347デフォルトの名無しさんNGNG
>>342
オブジェクトファイルには foo の実体が書き出される。
ただし、それは main から呼ばれれていない。
0348デフォルトの名無しさんNGNG
>>343
fooのコードが消えてなくなるコンパイラが存在するのか?
証拠きぼん
0349デフォルトの名無しさんNGNG
>>347
それがどうした。
あたりまえだろ。
0350デフォルトの名無しさんNGNG
>>347
問題ないだろ。
見たいのはfooのコードなんだから。
で、どうだったよ?
0351デフォルトの名無しさんNGNG
>>348
あんたは証拠があればすべて信じるのか?
0352デフォルトの名無しさんNGNG
(´-`).。oO(アフォに限って素直に謝ろうとしないのなんでだろう?)
0353デフォルトの名無しさんNGNG
>>350
わからん奴やな。
foo が呼ばれないからテストにならないんだってば。
0354デフォルトの名無しさんNGNG
>>351
そうは言ってない。
* * お 前 の 言 う こ と は 証 拠 無 し で は
    信 じ ら れ ん * *
といっている。
0355デフォルトの名無しさんNGNG
>>348
> fooのコードが消えてなくなる
343 のどこにそんな事が書いてある?
0356デフォルトの名無しさんNGNG
>>353
わからんやっちゃな。
分割コンパイルすれば簡単にテストできるだろうが。
まあ、やり方知らないらしいから、しょうがないか。
0357デフォルトの名無しさんNGNG
>>354
そんなこと言っていないだろ。
どこで言ったんだ?
0358デフォルトの名無しさんNGNG
>>355

>>343が参照している>>340が参照している>>339に書いてある。
0359デフォルトの名無しさんNGNG
おまいら、もちつけ

     /\⌒ヽペタン
   /  /⌒)ノ ペタン
  ∧_∧ \ (( ∧_∧
 (; ´Д`))' ))(・∀・ ;)
 /  ⌒ノ ( ⌒ヽ⊂⌒ヽ
.(O   ノ ) ̄ ̄ ̄()__   )
 )_)_) (;;;;;;;;;;;;;;;;;;;)(_(
0360デフォルトの名無しさんNGNG
>>358
あんた、ひまそうでいいですね。
0361デフォルトの名無しさんNGNG

         ∧_∧
        ( ´∀`) バッチ来いや
        /,   つ
       (_(_, )
         しし'
0362デフォルトの名無しさんNGNG
>>360
逃げた(w
0363デフォルトの名無しさんNGNG
>>358
その事か。
それは 347 の意味だ。
0364デフォルトの名無しさんNGNG
>>363
逃げた(w
それのどこが「消えてなくなる」だYo!
0365デフォルトの名無しさんNGNG
何か、344 が一番よさそうだな。
rand() 呼ぶのもコストかかるし。
0366279NGNG
/*cl -O2 -DSHIFT iftest.c /Feiftestsh.exe winmm.lib
cl -O2 iftest.c /Feiftestnd.exe winmm.lib */
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "winmm")
int main() {
  int i, c = timeGetTime(), n = 0;
  srand(0);
  for (i = 0; i < 400000000; i++) {
#ifdef SHIFT
    if ((9 >> n) & 1)
      n = rand();
#else
    if (n == 0 || n == 3)
      n = rand();
#endif
    n = rand();
  }
  printf("%d msec\n", timeGetTime() - c);
  return 0;
}
0367279NGNG
これでテストした結果、

●シフトを使った版
>iftestsh
5917 msec

●||を使った版
>iftestnd
5425 msec
でした。
誤差は+-80msecのぐらいです。
下手に小細工しない方が速いのかな・・
0368デフォルトの名無しさんNGNG
>>364
謝ればいいのか?

   ご め ん ( ̄ー ̄)
0369デフォルトの名無しさんNGNG
Strength reductionも知らずにC言語のことは聞けとかほざく
知ったかさんが集まるスレはここでつか?
0370デフォルトの名無しさんNGNG
>>366
rand()のベンチマークか?
0371デフォルトの名無しさんNGNG
>>369
プ
0372デフォルトの名無しさんNGNG
>>365
volatileにしない場合と同じ結果だとなぜわかる?
0373デフォルトの名無しさんNGNG
>>369
(゚Д゚)ハァ?
0374デフォルトの名無しさんNGNG
>>367
シフトしてANDして比較する、
と
比較して ジャンプ または 比較して ジャンプだからね。
0375デフォルトの名無しさんNGNG
あのなー、キミらconstant foldingくらいは理解して
書いてるんだろうな。
0376デフォルトの名無しさんNGNG
>>372
n は非 volatile で、比較に使われるのは n だろ。
違くなる可能性があるとしたらどういう場合だ?
0377デフォルトの名無しさんNGNG
きみらは日本語を理解して書き込んだいるんだろうな?
0378デフォルトの名無しさんNGNG
> 書き込んだいるんだろうな

理解できません。
0379デフォルトの名無しさんNGNG
結論:if(!(n%3))が括弧(・∀・)ノイイ
0380デフォルトの名無しさんNGNG
338 がわかる奴、誰かいないか?
0381デフォルトの名無しさんNGNG
>>379
氏ね。
0382デフォルトの名無しさんNGNG
>>379
かわいそうに。自分で考えたのを誰も評価してくれなかったから自分で宣伝ですか?
あなたの努力は評価しますよ。次を期待しています。
0383279NGNG
あ、すいません間違えました。
n = rand();
のところを0〜3になる様に
n = rand()%4;
としたら、結果が変わりました。

>iftestnd
12055 msec

>iftestsh
11238 msec
です。数回測った誤差は+-80msecです。
やっぱりシフトの方が速い?
0384デフォルトの名無しさんNGNG
>>375
その言葉は今知ったが、要は rand() で OK という話だろ?
0385デフォルトの名無しさんNGNG
>>383
9 >> 132983891
とかやってたのか。
0386デフォルトの名無しさんNGNG
>>383
漏れは、

>iftestnd
660 msec

>iftestsh
680 msec

やっぱり単純比較の方が速いよ。
0387デフォルトの名無しさんNGNG
すまん、ループカウンタが増えてたのね。でも、

>iftestnd
6507 msec

>iftestsh
6861 msec

やっぱ変わらないよ。
0388デフォルトの名無しさんNGNG
>>386
同じことを100万回繰り返して平均をとりなさい。
0389デフォルトの名無しさんNGNG
>>388
おまいがやれ。
0390279NGNG
>>379
それも測りましたが、遅いみたいです。

●if(!(n%3))の場合
>iftestmo
24078 msec
0391デフォルトの名無しさんNGNG
結局、効果があるかどうか分からないから、読みやすい単純比較の方がいいという事だろ。
比較数が多くなってきたら、switch にすればテーブル化してくれる事が期待できる。
0392279NGNG
>>387
もういちど試しましたが、
うちでは結果は変わりませんでした。

>iftestmo
24078 msec

>iftestsh
11232 msec

>iftestnd
12004 msec
0393デフォルトの名無しさんNGNG
Pascalなら
if n in [0, 3] then ....
でいいよね。

Modula2のBITSET型もそんなんじゃなかったっけ。
CでBITSETを実現するマクロって書けるかな。
0394279NGNG
ちなみにPen!!!-1Ghz(997Mhz)です。
0395デフォルトの名無しさんNGNG
>>392
こうなった。gcc 2.95.3, Celeron 500MHz
$ ./iftestnd
9335664 usec
$ ./iftestsh
6483787 usec

#include <stdio.h>
#include <sys/time.h>

#ifdef SHIFT
#define COND(n) ((9 >> n) & 1)
#else
#define COND(n) (n == 0 || n == 3)
#endif

int main()
{
  int i, n;
  volatile v;
  struct timeval s, e;
  gettimeofday(&s, NULL);
  for (i = 0; i < 400000000; i++) {
    n = i % 4;
    if (COND(n)) v = i;
  }
  gettimeofday(&e, NULL);
  printf("%ld usec\n", (e.tv_sec - s.tv_sec) * 1000000 + e.tv_usec - s.tv_usec);
  return 0;
}
0396デフォルトの名無しさんNGNG
取りあえずなんちゃってベンチマーク。

1: 1188[ms]: 50000000, 50000000: n == 0 || n == 3
2: 1250[ms]: 75000000, 25000000: (n & 1) ^ (n & 2)
3: 1750[ms]: 50000000, 50000000: n * n == 3 * n
4: 1546[ms]: 50000000, 50000000: n * (n - 3) == 0
5: 1500[ms]: 25000000, 75000000: (n & 1) == (n & 2)
6: 1672[ms]: 50000000, 50000000: (!!(n & 1)) == (!!(n & 2))
7: 1719[ms]: 50000000, 50000000: (n & 1) == (n & 2) >> 1
8: 10344[ms]: 50000000, 50000000: !(n % 3)
9: 1500[ms]: 50000000, 50000000: (9 >> n) & 1
10: 1250[ms]: 50000000, 50000000: t[n]
11: 22734[ms]: 50000000, 50000000: (int)(n - (3 / 2.0))

10 の t[n] の t は、static const t[] = {1, 0, 0, 1}; となっている。
n は、ループカウンタの下位2ビット。
ループ回数は 100,000,000 回。
Pentium-II 400MHz + Windows2000 (SP3) + VC6: 最適化 = 実行速度。

やはり、素直な 1 が早い。割り算使う 8 と、浮動小数点演算を行う 11 を除いて、まあ似たり寄ったりだな。
0397395NGNG
gccだと-DSHIFTのときにはbt命令を使うので、比較分岐を二回繰り返すよりも
速いようだ。
0398デフォルトの名無しさんNGNG
>>393
bitset_t make_empty_bitset(size_t set_size);
bitset_t bitset_union(bitset_t, bitset_t);
bitset_t bitset_add(bitset_t, unsigned);
bool bitset_member(bitset_t, unsigned);
とか?

fd_setとかsigset_tとか、あちこちで似たようなのが出てくるから、
あっても良いかもね。
0399デフォルトの名無しさんNGNG
>>396
ソースはこちら。

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm")

#define Test(Expression) \
 nTrue = 0; \
 nFalse = 0; \
 Start = timeGetTime(); \
 for(Loop = 0; Loop < Max; Loop++){ \
  int n = Loop & 3; \
  if(Expression){ \
   nTrue++; \
  } else { \
   nFalse++; \
  } \
 } \
 printf("%d[ms]: %d, %d: %s\n", timeGetTime() - Start, nTrue, nFalse, #Expression);
}
0400デフォルトの名無しさんNGNG
>>399
続き...

int main(void)
{
 static const int Max = 100000000;
 int Start;
 int nTrue;
 int nFalse;
 int Loop;

 Test(n == 0 || n == 3);
 Test((n & 1) ^ (n & 2));
 Test(n * n == 3 * n);
 Test(n * (n - 3) == 0);
 Test((n & 1) == (n & 2));
 Test((!!(n & 1)) == (!!(n & 2)));
 Test((n & 1) == (n & 2) >> 1);
 Test(!(n % 3));
 Test((9 >> n) & 1);
 static const int t[] = {1, 0, 0, 1};
 Test(t[n]);
 Test((int)(n - (3 / 2.0)));

 _getch();
 return 0;
}
0401デフォルトの名無しさんNGNG
じゃあ、たぶん、比較する数が3以上だとやっぱり
bitsetが速そうだな。
0402279NGNG
ありがとうございます。
環境やコンパイラによってもだいぶ違うみたいですね。
色々と勉強になりました。
0403デフォルトの名無しさんNGNG
329 の

> VCは最適化しないと&の命令をちゃんと使ってくれないぞ。

が意味わからないし、気になるんだが、誰か解説してくれないか?
0404デフォルトの名無しさんNGNG
一旦CM入りまーす
↓
0405デフォルトの名無しさんNGNG
悩んでいる問題があります。

複数の番号のばらばらな順列を線形リストを使って並べ替えする
処理を考えています。

例えば8ビットカウンタなら
   253、254、255、0、1、2
と来たものはこの順番で格納したいのですが、
   250、251、253、252、254、
と来たものは昇順に、
   250、251、252、253、254
としたいのです。
前者と後者を区別するスマートな方法って無いでしょうかね?
0406デフォルトの名無しさんNGNG
>>405
日本語が良く分からない。

どういうデータが渡されて、出力は何?
0407デフォルトの名無しさんNGNG
>>405
0, 1, 3, ... , 254, 255, 2

とか

254, 0, 1, ... 255

とか来たら、どう並んで欲しいの ?
0408デフォルトの名無しさんNGNG
>>405
250、251、253、252、254、0、1、2

と来たらどうしたいんだ?
0409デフォルトの名無しさんNGNG
つーかまず、「来る」 とはどういう状態か定義してくれ。
0410デフォルトの名無しさんNGNG
>>405
自前の評価関数で255<0を真とするようなの作ればいいんでは?
ループさせるなら区別する必要ないし
させないならソートの基準が曖昧
0411デフォルトの名無しさんNGNG
>>405
if ( left>right+128 ) return leftよりrightの方が大きい(事にする)
else return leftとrightの比較結果そのまま
0412デフォルトの名無しさんNGNG
誰か!!「日本語のことは<1>」立てろ!!
0413デフォルトの名無しさんNGNG
サンプルは必ず。
A : max-min=サンプル数+1 
なの
必ずAなら255と0があればそれなりの処理をする。
そうでなければ、ちと情報がたりないな。
0414413NGNG
馬鹿言った逝ってくる。
0415デフォルトの名無しさんNGNG
>>405
リングバッファを使うのは?
0416405NGNG
あぁ日本語が…(鬱

具体例の方が手っ取りはヤイでしょうから、、、

やりたいのは
>>407さんの例でいうと
0, 1, 3, ... , 254, 255, 2
ときたら、この通り

254, 0, 1, ... 255
ときてもこの通り、

>>408
250、251、253、252、254、0、1、2
ときたら、
250, 251, 252, 253, 254, 0, 1, 2
となって欲しい




0417デフォルトの名無しさんNGNG
>>416
すまん…、分からない。
0418デフォルトの名無しさんNGNG
一番大きい数と一番小さい数の境目がどういう基準で選ばれるのか
よくわからん
漏れもリングバッファで済む問題だと思った
0419デフォルトの名無しさんNGNG
>>416
もっと解らなくなってきたぞ。
4、16、0、32、255、2、128、64、128、1
ときたらどうなるの
0420デフォルトの名無しさんNGNG
手っ取りは(・∀・)ヤイ!
0421デフォルトの名無しさんNGNG
>>416
つまり、411 の方法でいいんじゃないのか?
0422419NGNG
4、16、0、32、255、2、64、128、1
ね。
あと0の無いバージョンも追加。
4、16、32、255、2、64、128、1
0423デフォルトの名無しさんNGNG
わからン…
254, 0, 255, 1
だとどうなるんだ?
0424405NGNG
はい。
いまレスを読んでいるのですが、どうも>>411さんがやりたい事に一番合致
するようです。これをもとにもうちょっと考えて見ます。その前に日本語勉強してきます。
0425デフォルトの名無しさんNGNG
しかし

127 0 255 128 1 254

とか来たらどうするのかさっぱりわからんぞ
0426デフォルトの名無しさんNGNG
扱ってるデータがパケットとかじゃないことを祈っておこう
0427デフォルトの名無しさんNGNG
128を法としたりしたいのか?
0428デフォルトの名無しさんNGNG
個人的には>>410の方法が一番手っ取り早くて確実だと思う。
カウンタが一周した後の0は同じ0でも違う0だと評価できるような関数を作る。
0429これでいいんじゃ?NGNG
if( n[i]%256 == (n[i+1]+1)%256 )
{
int tmp=left;
left=right;
right=tmp;
}
0430429NGNG
ゴメン直前に、中途半端に
書き換えちゃった。
left=>n[i]
right=>n[i+1]
としておいて。
0431デフォルトの名無しさんNGNG
>>279
亀レス & 処理系依存だけど x86系なら
( ( n - 1 ) & ( n - 4 ) )
0432デフォルトの名無しさんNGNG
>>431
それ、遅そうに見えるけど。
0433デフォルトの名無しさんNGNG
あ!
ドピュッ
スマン逝ってしまった・・・
0434デフォルトの名無しさんNGNG
>>431
それなら
!((n-1)&(n-2))
のほうが分かりやすくないか?
0435デフォルトの名無しさんNGNG
>>434
(゚Д゚)ハァ?
0436デフォルトの名無しさんNGNG
n-2 の正体をあばけ!!
0437デフォルトの名無しさんNGNG
西へ進む >>481へ
東へ進む >>556へ
0438431NGNG
>>432
CLを使ったシフトよりは良いと思ったけど
レジスタの使う数が増えるから、その可能性も…
0439431NGNG
ちゃんとレスを全部読んで無かったけど
>>396の
(n & 1) ^ (n & 2)
の方が良かったね…
0440デフォルトの名無しさんNGNG
>>279
#include <stdio.h>
typedef void (*Func)(void);
void a(void){puts("a");}
void b(void){puts("b");}
void c(void){puts("c");}
void d(void){puts("d");}
Func func[] = {a, b, c, d};
int main(void)
{
int n;
scanf("%d", &n);
func[n&3]();
return 0;
}
ifじゃなくて関数ポインタで処理を分けるっていうのはどう?
0441デフォルトの名無しさんNGNG
>>439
それ、駄目ジャン。
0442431NGNG
って>>396じゃ駄目駄目じゃん…
首吊ってきます
0443デフォルトの名無しさんNGNG
>>440
そんな事するくらいなら switch 使え。
第一、それで異常値に対応できるのか?
0444デフォルトの名無しさんNGNG
ポテトチップスは結局うすしおが一番なんだよ。
0445デフォルトの名無しさんNGNG
442じゃ無いが
他のコードでも異常値に対応してないと思うが?
0446440NGNG
>>443
まあ少なくとも0から3の値以外の配列要素にはアクセスはしない。
それに、俺はただアイディアを出しただけだ。
0447デフォルトの名無しさんNGNG
0〜3以外の値が絶対来ないと家庭して、1bit目と2bitのANDとEXORをとり、
それらのORをとる。
0448デフォルトの名無しさんNGNG
なんだキチガイか。
0449デフォルトの名無しさんNGNG
>>445
一番シンプルな n == 0 || n == 3 は対応してますが何か?
0450デフォルトの名無しさんNGNG
>>447
式に汁
0451デフォルトの名無しさんNGNG
>>449
nが0か3のとき?
0〜3じゃないの?
0452デフォルトの名無しさんNGNG
異常値は4以上だろ?
それを判定してないのに
何で、それで対応した事になるんだ?
正常に動く事と、異常だけど動く事は別だろ?
0453デフォルトの名無しさんNGNG
>>453
(゚Д゚)ハァ?
n == 0 || n == 3 以外の場合に動いてしまっていいとでも言うのか?
0454デフォルトの名無しさんNGNG
>>452
一理あるけど279さんはそこまで求めていないような・・・
0455デフォルトの名無しさんNGNG
みんな、n==0||n==3って書いてるけど、n>=0&&n<=3じゃないの?
0456デフォルトの名無しさんNGNG
>>455
何を根拠に。
0457デフォルトの名無しさんNGNG
>>455
違うだろ。
0458455NGNG
ごめん・・・俺の読み違い・・・
0459デフォルトの名無しさんNGNG
>>453
nが0以上3以下って前提があるのに
それ以外の数を与えた場合は結果は当然不定に決まってるだろ?
0460デフォルトの名無しさんNGNG
>>459
安全側に倒すという事を覚えような。
0461デフォルトの名無しさんNGNG
どこにも n=1、2 の側の方が安全だとは書いてないな。
0462デフォルトの名無しさんNGNG
>>460
異常な数が与えられた時に
正常に動いて見える事が安全なのか?
0463デフォルトの名無しさんNGNG
問題の前提条件を疑ったってしょうがないと思うが…
まあ、飽きてネタを振ってるつもりなんだろうが。
0464デフォルトの名無しさんNGNG
ざっと流し読みしただけだけど、>>279 の一連のやつは
>>292 が秀逸だね
まぁすこしインチキっぽい気がしないでもないけど。

  int table[]={1,0,0,1};

  if( table[n] )

というのもありなのかな。ガイシュツならスマヌ
0465デフォルトの名無しさんNGNG
>>461
確かにそんな事はわからないが、異常値を 「if が成り立たない側」 つまり処理を
しない側に持っていく方が安全である事が多い。
0466デフォルトの名無しさんNGNG
やはりキチガイだったか。
0467デフォルトの名無しさんNGNG
>>464
がいしゅつ。
>>396
0468デフォルトの名無しさんNGNG
>>465
テキトウなコードを書いていただけません?
0469デフォルトの名無しさんNGNG
>>465
elseもあったら?
0470デフォルトの名無しさんNGNG
>>468
テキセツなコードを書いてもらえません?
0471デフォルトの名無しさんNGNG
>>468
>>271

>>469
その場合はどちらとも言えない。
0472471NGNG
> 271
ごめん、>>279 の間違い。
0473デフォルトの名無しさんNGNG
>>467
やはりそうだったか・・・
>>396 で10が1より遅いというのはどうかと思うが、まぁいいや
0474デフォルトの名無しさんNGNG
>>473
間接アドレッシングがどうして速いと思うんだ?
0475デフォルトの名無しさんNGNG
はっくしょん!!
0476デフォルトの名無しさんNGNG
http://senmen.tripod.co.jp/swf/mona/puha.swf?inputStr=%82%CD%82%C1%82%AD%82%B5%82%E5%82%F1%21%21
0477デフォルトの名無しさんNGNG
>>473
分岐予測が良かったんでないの?
0478デフォルトの名無しさんNGNG
>>279のはC前提みたいだけど、
アセンブラで書くと速くなる事ってない?
0479デフォルトの名無しさんNGNG
>>474
キャッシュにヒットすれば速いでしょう
まあ、ヒットしなければ、とても遅いが…
0480デフォルトの名無しさんNGNG
まぁないだろうな
0481デフォルトの名無しさんNGNG
>>478
このスレを何だと思ってるんですか?
0482デフォルトの名無しさんNGNG
>>481
何とも思ってませんが何か?
0483デフォルトの名無しさんNGNG
>>478
どうして速くなると思うんだ?
0484デフォルトの名無しさんNGNG
>>479
キャッシュとは言え、値をレジスタに拾う n==0 || n==3 より速い訳がなかろう。
0485デフォルトの名無しさんNGNG
この中でプロの方はいらっしゃいます?
0486デフォルトの名無しさんNGNG
(((unsigned int)n-1)>1)
はどうだ?
0487478NGNG
>483
C言語で直接使えない命令が、
アセンブラにあったりするかもしれないと思ったんで。
(MMXの飽和加算とか。)
0488デフォルトの名無しさんNGNG
>>483
特殊なCPUでnが3か0の時に真であると判定する
命令があれば速くなる
0489デフォルトの名無しさんNGNG
>>485
その質問には答えられません。
0490デフォルトの名無しさんNGNG
>>486
ひょっとして神出現?
0491デフォルトの名無しさんNGNG
>>487-488
なるほど。もっともだ。


で、あるの?
0492デフォルトの名無しさんNGNG
>>490
(゚Д゚)ハァ?
0493デフォルトの名無しさんNGNG
>>486
よさそうだな。
0494デフォルトの名無しさんNGNG
>>486
おお、明らかに速そうですな。
んで、うちの環境でテストしてみたら、

>>279
iftestnd 1904 msec
>>292
iftestsh 1828 msec
>>486
iftestun 1747 msec
でした。
結構差が出た。
0495デフォルトの名無しさんNGNG
(n == 0 || n == 3)
  test  esi, esi
  je   SHORT $L53243
  cmp  esi, 3
  jne  SHORT $L53242

((9 >> n) & 1)
  mov  eax, 9
  mov  ecx, esi
  sar  eax, cl
  test  al, 1
  je   SHORT $L53242

(((unsigned)n-1)>1)
  dec  esi
  cmp  esi, 1
  jbe  SHORT $L53243
0496デフォルトの名無しさんNGNG
>>491
普通に考えたらないがフラグに直接代入すれば
動くCPUもあるかもしれない (←適当)
0497デフォルトの名無しさんNGNG
(n & (n>>1))
0498デフォルトの名無しさんNGNG
載せ忘れ。

if( table[n] )
  mov   eax, DWORD PTR _table$[esp+esi*4+32]
  test  eax, eax
  je   SHORT $L53243

命令数は少ないが、この mov は実はやたら遅い。
0499デフォルトの名無しさんNGNG
>>497
n==0の場合動作しない。
0500デフォルトの名無しさんNGNG
>>497
n == 0 は?
0501デフォルトの名無しさんNGNG
ケコーン
0502デフォルトの名無しさんNGNG
>>496
「かも知れない」 じゃなくて、あるかどうか訊いているんだが。
0503デフォルトの名無しさんNGNG
>>497
駄目じゃん
0504デフォルトの名無しさんNGNG
!(n ^ (n>>1))
0505デフォルトの名無しさんNGNG
>>502
ここはCのスレ
0506デフォルトの名無しさんNGNG
>>504
(゚Д゚)ハァ?
n==3 以外の時全部誤動作するぞ。
0507506NGNG
あ、頭に ! 付いてるか。
でも、やっぱり n==3 の時誤動作するぞ。
0508デフォルトの名無しさんNGNG
>>507
ナ ゼ ?
0509デフォルトの名無しさんNGNG
>>496
は神ということで宜しいですか?
0510デフォルトの名無しさんNGNG
つーか、(((unsigned)n-1)>1) で dec しかしてない訳だから、それを超えるのは
難しいだろう。
0511デフォルトの名無しさんNGNG
>>496じゃない、>>486でした。
0512デフォルトの名無しさんNGNG
カミュ
0513デフォルトの名無しさんNGNG
すごいね。unsignedにするなんて思いつかんかった。
0514デフォルトの名無しさんNGNG
>>508
アフォですか?
0515デフォルトの名無しさんNGNG
>>514
ヴァカです。
0516デフォルトの名無しさんNGNG
素直に褒め称えよう。
0517デフォルトの名無しさんNGNG
ブラボー!!
0518デフォルトの名無しさんNGNG
このスレはめでたく終了いたしました。
0519デフォルトの名無しさんNGNG
いやしかし、bitsetライブラリはあると便利だと思うんだが、まじで。
0520デフォルトの名無しさんNGNG
誤爆ですか?
0521デフォルトの名無しさんNGNG
質問
Cで書いたユーザーのプログラムはなぜmain()から実行が始まるのですか?
0522デフォルトの名無しさんNGNG
そこにmain()があるから
0523デフォルトの名無しさんNGNG
ボトムアップ トップダウン
0524デフォルトの名無しさんNGNG
もうひとつのスレで 「main()からはじまるとは限らない」 とか書いている香具師が
いるな。
突っ込むべきか突っ込むべきでないか・・・。
0525デフォルトの名無しさんNGNG
>>521
ホスト環境の場合,リンクするときに実行開始点を指定せねばならない
オマエは大事な仕事を忘れてるのに翻訳環境に助けられていて気がついていないのだ
実行開始点をmainと指定すればmainから始まる,それだけのことだ
実際にはstartupが実行開始点になっていてstartupがmainを呼び出すようになっている

組み込みでもリセットハンドラで似たようなことをするが
そこではmainからというルール自体が存在しない
0526デフォルトの名無しさんNGNG
> mainからというルール自体が存在しない

単に規格外の挙動をしているだけで、main() からというルールは規格で明確に
定められている。
0527デフォルトの名無しさんNGNG
>>526
ISO/IEC9899:1999(E) 5.1.2.1 Freestanding environment
0528デフォルトの名無しさんNGNG
フリースタンディングがOSの上で動かないものを指すなら、OS自体もフリースタンディングになるの?
0529デフォルトの名無しさんNGNG
>>527
そんなんあったんか。初めて知った。ありがとう。
0530デフォルトの名無しさんNGNG
全くの私見だが
あの条文はあまり現実に即していない
OSの下で動くOSがあったり
mainから始まらないOS環境があったり
終了ステータスがどこの世界でも絶対にintだと断言していたり
etc...
0531デフォルトの名無しさんNGNG
>>527
それだとprintfですら、標準でなくなるんだったかな・・・
0532デフォルトの名無しさんNGNG
Cのソースでの関数名はアセンブラのソースではどのようになるのですか?
誰か教えてください。
0533デフォルトの名無しさんNGNG
>532
どのOS/コンパイラで?
0534デフォルトの名無しさんNGNG
<533
何でもいいのでお願いします。
0535デフォルトの名無しさんNGNG
コンパイラならふつうアセンブラコード吐いてくれるオプションか何かあるでしょ。
0536デフォルトの名無しさんNGNG
$ echo 'foo(){}' | gcc -x c - -S -o - | grep foo
.globl foo
    .type  foo,@function
foo:
    .size  foo,.Lfe1-foo

そのまんま。(Linux gcc 2.95.3)
0537デフォルトの名無しさんNGNG
うちの LSI-C試食版くらいかな、アンダーバーが付くのは、、、
0538デフォルトの名無しさんNGNG
試食版ばかり使わないで買ってやれよ・・・
0539デフォルトの名無しさんNGNG
必要になったら購入します。
0540デフォルトの名無しさんNGNG
MS 系はみんな付くよ、アンターバー。
0541デフォルトの名無しさんNGNG
おれはアンダーパーだしたことねーぞ。
0542デフォルトの名無しさんNGNG
(゚Д゚)ハァ?
0543デフォルトの名無しさんNGNG
おれはアベレージ100切るかも。
0544デフォルトの名無しさんNGNG
何の話だよ・・・
0545デフォルトの名無しさんNGNG
おれは黄色いほうが好き
0546デフォルトの名無しさんNGNG
かゆい。
0547デフォルトの名無しさんNGNG
だから何の話なんだよ・・・
0548デフォルトの名無しさんNGNG
あちらはリコーダーのスレ、こちらは・・・
0549デフォルトの名無しさんNGNG
あちらは利口だーのスレ、こちらは馬鹿だーのスレ
0550デフォルトの名無しさんNGNG
もすぃかしてこっちはネタスレ?
0551デフォルトの名無しさんNGNG
どっちもネタスレ
0552デフォルトの名無しさんNGNG
へ(゜∇、°)へ
0553デフォルトの名無しさんNGNG
誰か答えろよ。何の話なんだよ。気になるじゃねーか。
0554デフォルトの名無しさんNGNG
C# の話だろう?
0555デフォルトの名無しさんNGNG
アンダーパー アベレージ100 黄色いほう かゆい

C#???
0556デフォルトの名無しさんNGNG
>>537-555キチガイ警報
0557デフォルトの名無しさんNGNG
という訳でお前ら、漏れに罰金を支払え!!
0558デフォルトの名無しさんNGNG
>>557
えっ えと・・・ いくらほど?
0559デフォルトの名無しさんNGNG
一人 3 両。
0560デフォルトの名無しさんNGNG
>>559
車両で支払うのかよ!!!
0561デフォルトの名無しさんNGNG
おれはいつもオーバーパー
0562デフォルトの名無しさんNGNG
ものすんごくパー? 頭が?
0563デフォルトの名無しさんNGNG
お前ら!!
落ち着いてないでケンカしろ!!
0564デフォルトの名無しさんNGNG
>>563
そういうお前こそケンカしろ!!!
0565デフォルトの名無しさんNGNG
>>546
ごめんなさい、ゆるしてください。
0566デフォルトの名無しさんNGNG
C言語らしくケンカしやがれ貴方たち!!!
0567デフォルトの名無しさんNGNG
>>565
ごめんなさい、そういう俺こそゆるしてください。
0568デフォルトの名無しさんNGNG
つーか、「もう一つ」 の方で、(なぜか C++ の) ケンカが発生しています。
どうぞ、はちゃめちゃに騒いでください。
0569デフォルトの名無しさんNGNG
よーしはちゃめちゃに騒ぐぞー。

ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ
 ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ
ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ
 ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ
0570デフォルトの名無しさんNGNG
こっちで騒いでどないすんねん。
0571デフォルトの名無しさんNGNG
いーなー、こういうノリ好きだ。
嫌いなヤシも居るだろうけど。
0572デフォルトの名無しさんNGNG
あほらしすぎてチョトワラタw
0573デフォルトの名無しさんNGNG
ワラタすぎてチョトあほらしw
0574デフォルトの名無しさんNGNG
>>571
好きなのはどっちのノリだ?
たべるほうかつけるほうか?
0575デフォルトの名無しさんNGNG
ボーランドのデバッガ使ってるんですけど、配列の中身を楽に参照
する方法ないでしょうか?いちいちhoge[0]みたいにしていくの面倒
でたまりません。
0576デフォルトの名無しさんNGNG
>>576
食べる方。
韓国ノリとか大好き。
0577デフォルトの名無しさんNGNG
お、自己レスですね(・∀・)ニヤニヤ
0578デフォルトの名無しさんNGNG
>>575
ボーランドのデバッガにあるかどうかは知らんが、
大抵のデバッガにはメモリをダンプする機能があり、
そこに配列の先頭アドレスを入れてあげればいい。
0579デフォルトの名無しさんNGNG
自己ノリ
0580デフォルトの名無しさんNGNG
>>578
なるほど!
ありがとうございました。
0581デフォルトの名無しさんNGNG
質問したら最低半日待てよ。
0582デフォルトの名無しさんNGNG
>>581
すいませんでした。
0583デフォルトの名無しさんNGNG
待てっ!
0584デフォルトの名無しさんNGNG
やだ
0585デフォルトの名無しさんNGNG
童貞ですが何か?
0586デフォルトの名無しさんNGNG
中はダメっ!
0587デフォルトの名無しさんNGNG
赤ちゃんできちゃう!
0588デフォルトの名無しさんNGNG
>一行カキコ野郎
新手の荒らしですか?
0589デフォルトの名無しさんNGNG
いかにもCのスレだ(藁
0590デフォルトの名無しさんNGNG
カーボンについて語るスレはここですか?
0591デフォルトの名無しさんNGNG
ドについて騙るスレはここです。
0592デフォルトの名無しさんNGNG
C言語今から始めるんだけど、文句ある??ん?
0593デフォルトの名無しさんNGNG
const 付きで受けたchar型のポインタをfreeする時にWarning が出るんですが、
これって明示的にvoid型のポインタにキャストしなきゃいけないの?
警告が出るのは constだから?Warningは消せたのだけど、
理由が解らずに昨日から悩んでいます。

環境は、gcc/cygwin 3.1.1 です。


#include <stdlib.h>
char* foo(void){
char char *str = (char *)malloc(1);
return str;
}

int main(void){
const char *str = foo();
free(str); /* free((void *)str); だと ok */
str = NULL;
return EXIT_SUCCESS;
}
0594デフォルトの名無しさんNGNG
> 理由が解らずに昨日から悩んでいます。

んなもん、char * でやってみればすぐ解ると思うが。
というか、なんでconst付けんの?
0595脱字訂正NGNG
なんでconst付けんの?
↓
なんでconst付けてんの?
0596デフォルトの名無しさんNGNG
const の意味わかってる?
0597デフォルトの名無しさんNGNG
色々試して覚えていくもの!
0598デフォルトの名無しさんNGNG
ヾ(≧∇≦)/
0599デフォルトの名無しさんNGNG
C言語でのプログラミングスタイルについて意見を求む。
C++はダメだよ。Cしか使えないんで。

ファイルを開いて hoge() の処理する。そしてファイルから nバイト読み取
り uge() の処理する。
正常なら読み取ったバッファへのポインタを返し、エラーならNULLを返す。
そんな関数を作りたいとする。
言っとくけど宿題じゃないよ。(実際のプログラムはソケットを対象)

hoge()、uge() は正常なら 0以上の整数値を返し、エラーなら負値を返す。
プロトタイプはそれぞれ

int hoge(void);
int uge(void);

んで、実際に作った関数
0600599NGNG
char *openseek(const char *filename, int offset, int nbytes)
{
  FILE *fp;
  char *buff;

  if (TRUE) {
    fp = fopen(filename, "r");
    if (fp == NULL) {
      goto error_end;
    }

    if (hoge() < 0) {
      goto error_end;
    }

    buff = malloc(nbytes);
    if (buff == NULL) {
      goto error_end;
    }

    fread(buff, 1, nbytes, fp);

    if (uge() < 0) {
      goto error_end;
    }


    return buff;
  }
0601599NGNG
  else {
error_end:
    if (buff != NULL) {
      free(buff);
    }
    if (fp != NULL) {
      fclose(fp);
    }

    return NULL;
  }
}
0602599NGNG
エラー時は、free()とfclose()しなくちゃいけなくて、それを一箇所にまと
めたいな と思ったらこんなんなったけどどう?読みずらい?
0603599NGNG
関数名
×openseek
○openread
0604599NGNG
×return buff;
○fclose(fp); return buff;

鬱だ
0605デフォルトの名無しさんNGNG
あんま関係ないけど↑のhogeとかuseで例外起こったら
どうするのが適切?
0606599NGNG
×char *buff;
○char *buff = NULL;

あぁ〜もうーーー。スマン心中するよ。
0607599NGNG
>>605

Cなんで例外は無いんでつ。・°・(ノД`)・°・。
エラー発生時は、単にエラーか否かがわかればいいでつ。
(本物は、引数にエラーコードの格納先もあるんでつ)
0608599NGNG
なんか引数に int offset とかも残ってるし。
これ最初、ファイル開いてシークしてそんで...って処理を考えたのさ。
でもシークするのは別にいらないやってんでその部分は消したの。
でも引数の部分は残ったままだった。

ようはね、エラー時の処理として free()とかfclose()とかのなんらかのリソース
の開放が必要な場合、それらを一箇所にまとめようとしたら goto がけっこう
でてきて、それで他の人が読んだらどう思うかなって思ったの。

皆さんのお目を汚してゴメンナタイ。・°・(ノД`)・°・。
今日はもう帰りまつ。
0609デフォルトの名無しさんNGNG
>>608
別にgoto使って問題ないパターンだと思われ。
あんまり if (TRUE) {...} else なんてしないが。
0610デフォルトの名無しさんNGNG
こんなヒドいコードよく書けたなぁ.....
0611デフォルトの名無しさんNGNG
BASICみたい
0612デフォルトの名無しさんNGNG
freadについての質問なのですが、

FILE *fp;
float d;
int i;

for(i=0;i<3;i++){
  fread(&d,sizeof d, 1, fp);
  printf("%f\n", d);
}
簡潔に書いてしまいましたがこのような状態のときに、
ファイルに10 20 30と書いてあったとしたら
画面に10 20 30と表示されると書いてあったのですが(実際にも試しました)
いまいち理解できません。
freadをforで繰り返していますが、一回目10を読み込み、
二回目読み込むときには20を読み込むようになるのはなぜでしょう?
fgetcのように順番に次へ次へと読み込む関数なのでしょうか?
言ってることがよくわからなかったりアホなコトだったらすいません。
もしわかる方がいらっしゃいましたらご解答お願いします

0613599NGNG
帰宅しますた。
今夜はウドンを湯でまつ。

>>609 あんまり if (TRUE) {...} else なんてしないが。
最初は無かったんだけど、正常シーケンスの時の return を忘れてて、お!こりゃ
まずいじゃんってんで、正常シーケンス時はエラーシーケンスに入らないようにって
if else でくくったのです。でも確かに冗長な気がするので、はずしました。

>>610 こんなヒドいコードよく書けたなぁ
自分もなんかスッキリしてないので、是非スッキリ綺麗なコードをご教授ください。
お願いしまつ。
0614599NGNG
>>611 BASICみたい
すんまてん。

自分は基本的に、エラーになったらそこですぐ処理を終了する って書き方
なんですが、こいつの場合、

  hoge()では free()したらダメ。uge()では free()しないとダメ

で、なんか綺麗な書き方思い浮かばないんです。
是非、ご教授ください。
0615デフォルトの名無しさんNGNG
ホントに単純なことなんですけど、リンクってどうやるんですか?
0616デフォルトの名無しさんNGNG
>>614=599
単純に簡単化しただけだけど、どうかな?
char *openseek( const char *filename, int nbytes )
{
FILE *fp;
char *buff;

fp = fopen( filename, "r" );
if ( !fp || hoge() < 0 )
goto error_end;

buff = malloc( nbytes );
if ( !buff )
goto error_end;

fread( buff, 1, nbytes, fp );

if ( uge() < 0 )
goto error_end;

return buff;

error_end:
free( buff );
if ( !fp )
fclose( fp );
return NULL;
}
0617デフォルトの名無しさんNGNG
>>615
<a href="www.2ch.net">2ちゃんねる</a>
0618デフォルトの名無しさんNGNG
>>617
いや、そうじゃなくて(ネタだと思うけど)
インクルードは #include<******>
じゃ、リンクはどうやるんですか?
0619 ◆F52DmOxJlc NGNG
>>618
リンカにお願いする。
0620デフォルトの名無しさんNGNG
#include <stdio.h>
#define NUM 5
int main(void)
int test[NUM];
int num;
int i,j;
num=0;
printf("テストの点数を入力してください。\n")
for(i=0; i<NUM; i++){
scanf("%d",&test[i]);
if(test[i]>=70){
num++;
}
}
for(j=0;j<NUM;j++){
printf("%d番目の人の点数は%dです。\n",j+1,test[j]);
}
printf("70点以上の学生は%d人です。\n", num);
return 0;
}


問題集ですが答えを見ながら答えを出したのですが原因不明のエラーが15行目と18行目に出ます。どこがおかしいのでしょうか?
0621デフォルトの名無しさんNGNG
>>612
こういう事では?
#include <stdio.h>
void read_t(char* str)
{
static unsigned int i = 0;
printf("%c\n", *(str+i));
i++;
}
int main(void)
{
char* str = "ABCDE";
read_t(str);
read_t(str);
read_t(str);
read_t(str);
read_t(str);
return 0;
}
0622デフォルトの名無しさんNGNG
>>620
まずは、質問の方法がおかしいです。
エラーがでるなら、そのエラーくらい書きましょうや。
宿題なら、専用のスレがあるわけだし。

#include <stdio.h>
#define NUM 5
int main(void)
{
int test[NUM];
int num;
int i,j;
num=0;
printf("テストの点数を入力してください。\n");
for(i=0; i<NUM; i++){
scanf("%d",&test[i]);
if(test[i]>=70){
num++;
}
}
for(j=0;j<NUM;j++){
printf("%d番目の人の点数は%dです。\n",j+1,test[j]);
}
printf("70点以上の学生は%d人です。\n", num);
return 0;
}
0623デフォルトの名無しさんNGNG
>>612
何故読み取り位置が自動で動くか、という意味でしょうか?
freadをする前に、毎回fseekしなくてはいけない実装がお望みなのでしょうか。
0624612NGNG
>>621
それがfreadの中身(?)ってコトでしょうか?
>>623
>何故読み取り位置が自動で動くか、という意味でしょうか?
はい、そうなんです。

0625C初心者NGNG
>>599 >C言語でのプログラミングスタイルについて意見を求む。
「自分の場合だったらー」って理解していいっすね?
>>614 >で、なんか綺麗な書き方思い浮かばないんです。
自分も自身ないっすけど、、、取り合えず作ってみたっす。自分だったらこんな感じです。

char *openseek(const char *filename, int offset, int nbytes)
{
    FILE *fp;
    char *buff = NULL;
    char *exitselect( FILE **, char *, int ); /* 例外用の補助関数 */

    if( (fp = fopen( filename, "r" )) == NULL )
        return ( NULL );
    if( hoge() < 0 )
        return ( exitselect( &fp, buff, 1 ) );
    if( (buff = (char *)malloc( sizeof(char)*nbytes +1 )) == NULL )
        return ( exitselect( &fp, buff, 2 ) );
    fread( buff, 1, nbytes, fp );
    if( uge() < 0 )
        return ( exitselect( &fp, buff, 3 ) );
    return ( buff );
}

char *exitselect( FILE **fp, char *buff, int select )
{
    if( select == 3 )
        free ( buff );
    fclose( *fp );
    return ( NULL );
}
0626621NGNG
>>624
中身じゃなくて考え方ね。
0627デフォルトの名無しさんNGNG
どうすればレジスタを効率的に使えるようにできるのでしょうか?
0628デフォルトの名無しさんNGNG
>>627
良いコンパイラを使う。
0629デフォルトの名無しさんNGNG
>>599
フラグを使えは、こんな感じ...

char *openread(const char *filename, int offset, int nbytes)
{
 FILE *fp = NULL;
 char *buff = NULL;
 int Success = 0;

 fp = fopen(filename, "r");
 if (fp == NULL) goto Done;
 if (hoge() < 0) goto Done;
 buff = malloc(nbytes);
 if (buff == NULL) goto Done;
 fread(buff, 1, nbytes, fp);
 if (uge() < 0) goto Done;
 Success = 1;

Done:
 if (fp != NULL) fclose(fp);
 if (Sucess){
  return buff;
 } else {
  free(buff);
  return NULL;
 }
}

ところで、fread() のエラーチェックはいらないのか ?
0630デフォルトの名無しさんNGNG
>>625
ネタか ? 突込みどころ満載なんだが...。
0631593NGNG
>>594-596
返事ありがとう。
勿論、char * で警告無しに通るのは試して確認してました。

const をつけた理由は、
関数内で、mallocで確保した領域に値を代入して return
受け取り先では、そのポインタの指す領域を、 それ以降書き換えて欲しくない 場合
・・・といったケースを想定していました。

変更したくないのだからfreeでその領域を開放するときに警告されるのは
当然かな。とも思うのだけど、この const char * の指す領域を
警告出さずに、開放する方法ないかなと模索していました。

で、自分で見つけた解決策の一つが、
freeの引数に渡す時、void * にキャストするという方法。
でも、const char * の場合だけキャストする
というのも、なんかスッキリしません。

こういったケースをうまく収める定石ってないのでしょうか?


>>596
自分では解って使っているつもりだったんだけど、
// 勿論、テストでポインタの指す領域への代入で警告出るのも確認しました。
上記の様な場面での利用で、何か
勘違いしている点があれば、指摘お願いします。
0632デフォルトの名無しさんNGNG
>>627
インラインアセンブラについて、勉強スレ。
0633デフォルトの名無しさんNGNG
>>626
考え方もなにも、、、
たとえば、標準入力(たとえばキーボード)をfopenして、freadで読み取って、
次にfreadしても、前回の値が延々ときてもしょーもないし。
0634konnnaka?NGNG
#include <stdio.h>
main(){
printf("<html><body><a href=\"http://www.2ch.net\">2ch</a></body></html>");
return 0;
}
0635デフォルトの名無しさんNGNG
>>630
それでは突っ込んでください。
0636デフォルトの名無しさんNGNG
>>635
> if( (buff = (char *)malloc( sizeof(char)*nbytes +1 )) == NULL )

の +1 ってなんだ ?
0637デフォルトの名無しさんNGNG
>>636
\0専用!!
0638デフォルトの名無しさんNGNG
>>637
わけ分からん
0639デフォルトの名無しさんNGNG
  ワケ     ワカ     ラン
  ∧_∧   ∧_∧    ∧_∧
 ( ・∀・)  ( ・∀・)   ( ・∀・)
⊂ ⊂  )  ( U  つ  ⊂__へ つ
 < < <    ) ) )     (_)|
 (_(_)  (__)_)    彡(__)
0640デフォルトの名無しさんNGNG
  カツオ    ワカメ   タランチュラ
  ∧_∧   ∧_∧    ∧_∧
 ( ・∀・)  ( ・∀・)   ( ・∀・)
⊂ ⊂  )  ( U  つ  ⊂__へ つ
 < < <    ) ) )     (_)|
 (_(_)  (__)_)    彡(__)

0641デフォルトの名無しさんNGNG
  タワケ   ワカサマ   ゴランシン
  ∧_∧   ∧_∧    ∧_∧
 ( ・∀・)  ( ・∀・)   ( ・∀・)
⊂ ⊂  )  ( U  つ  ⊂__へ つ
 < < <    ) ) )     (_)|
 (_(_)  (__)_)    彡(__)
0642599NGNG
>>616
それだと、fopen() と hoge() の間に処理入れられないのがイヤン。


>>625
補助関数いいですね。
自分も終了処理用の関数を分けようかどうしようか悩みました。


>>629
フラグもいいかも。
fread()エラーチェック必要ですね。ご指摘ありがとう。
実際の処理では fread() ではないんですがちゃんとエラーチェックしないと
ね。


自分としては、goto による前方ジャンプがなんか構造化の点からイヤンな感
じなんですよ。
でもまぁ goto絶対イヤ ってわけじゃないんで、まぁいいかと思ったり。

とりあえずは、それほど規模の大きい関数ではないんで元の(if else を取っ
たやつ)で行こうかなと思いまつ。


さて、そろそろおやすみです。
0643デフォルトの名無しさんNGNG
●とにかく気が小さい(二言目には「世間」)
●ストレスを溜め込んでは、キレて関係ない人間を巻き添えにして暴れまくる(小心者のくせに短気)
●自尊心が異常に強く、自分が馬鹿にされると怒るくせに平気で他人を馬鹿にしようとする(ただし、相手を表面的・形式的にしか判断できず、実際にはたいてい、内面的・実質的に負けている)
●他人の忠告を受け入れない、反省できない、学習能力がない(自分の筋を無理にでも通そうとするため)
●「常識、常識」と口うるさいが、実はピントがズレまくっている(日本の常識は世界の非常識)
●権力、強者(警察、暴走族…etc)に弱く、弱者には威張り散らす(強い者に対してはへりくだり、弱いものに対してはいじめる)
●あら探しだけは名人級(例え10の長所があってもほめることをせず、たった1つの短所を見つけてはけなす)
●基本的に悲観主義でマイナス思考に支配されているため、性格がうっとうしい(根暗)
●一人では何もできない、女は連れションが大好き(群れでしか行動できないヘタレ)
●少数派を馬鹿にする、排斥する
●異質、異文化を排斥する(差別主義者)
●集団いじめのパイオニア&天才
●悪口、陰口が大好き(性格極悪)
●他人からどう見られているか、体裁をいつも気にしている(「世間体命」)
●DV夫が多い(世間体を気にするあまり)
●自分の感情をうまく表現できず、コミュニケーション能力に乏しい(同じことを何度も言う、知障)
●頑固で融通(応用)が利かず、表面上意気投合しているようで、腹の中は各自バラバラ(しかも考えていることは驚くほど幼稚)
●人を信じられず、疑い深い(自分自身裏表が激しいため、他人に対してもそう思う)
●自分は常に自己抑制しているもんだから、自由に見える人間に嫉妬し、徒党を組んで猛烈に足を引っ張ろうとする(ねたみが人一倍強い)
●おまけに執念深くしつこい(「一生恨みます」タイプ)
●自分に甘く他人に厳しい(自分のことは棚に上げて、まず他人を意識する・冷酷)
●要するに女々しい、あるいは女の腐ったみたいなやつが多い
0644デフォルトの名無しさんNGNG
>>643
これは何ですか?
0645デフォルトの名無しさんNGNG
>>643
誉め言葉と思って有難く受け取っておくよ。
0646デフォルトの名無しさんNGNG
>>643
コピペならコピペらしく全文載せろよ(w
0647C初心者NGNG
>>630 >ネタか ? 突込みどころ満載なんだが...。
一応ネタではないです。。。

>>637 ホローありがとうっす。

>>638 すみません。変てこなロジックで。。。

>>642 >補助関数いいですね。
ありがとうっす。
>でもまぁ goto絶対イヤ ってわけじゃないんで、まぁいいかと思ったり。
自分もgoto はそんなに嫌いじゃないです。

うーーん。しっかし、さむいっす。
自分もそろそろ寝ます。
0648デフォルトの名無しさんNGNG
>>647
>>637はフォローじゃないぞ。
バッファに読み込んだ後、終端に'\0'付けてないんだから、
そのコードでは何の意味も無い。理解してない証拠だね。

この手のエラーチェックは、例外使えない言語ではgotoが一番綺麗だと思う。
擬似コードで書くとこんな感じ。

 if (リソースA取得 == 失敗)
  goto 失敗A;
 if (リソースB取得 == 失敗)
  goto 失敗B;
 if (リソースC取得 == 失敗)
  goto 失敗C;

 リソースC開放;
失敗C:
 リソースB開放;
失敗B:
 リソースA開放;
失敗A:
 return;
0649デフォルトの名無しさんNGNG
>>599
暇つぶし・・・長くてごめん・・・
enum Err{FCLOSE, FREE};
char *err_end(void** p, unsigned flag)
{
if(*p != NULL){
switch(flag){
case FCLOSE:
fclose((FILE*)*p);
break;
case FREE:
free(*p);
break;
}
}
*p = NULL;
return NULL;
}
0650デフォルトの名無しさんNGNG
>>649の続き
char *openseek(const char *filename, int offset, unsigned nbytes)
{
FILE* fp = fopen(filename, "r");
if(fp == NULL)
return err_end((void**)&fp, FCLOSE);
if(hoge() < 0)
return err_end((void**)&fp, FCLOSE);
char* buff = (char*)malloc(nbytes);
if(buff == NULL)
return err_end((void**)&fp, FCLOSE);
if(fread(buff, 1, nbytes, fp) != nbytes){
err_end((void**)&fp, FCLOSE);
return err_end((void**)&buff, FREE);
}
if(uge() < 0){
err_end((void**)&fp, FCLOSE);
return err_end((void**)&buff, FREE);
}
return buff;
}
0651デフォルトの名無しさんNGNG
>>599
char *openseek(const char *filename, int nbytes)
{
  FILE *fp = fopen(filename, "r");
  char *buff = malloc(nbytes);
  if(fp && buff && fread(buff, 1, nbytes, fp) == nbytes)
  {
    fclose(fp);
    return buff;
  }
  buff && free(buff);
  fp && fclose(fp);
  return NULL;
}
0652651NGNG
651 は脊髄反射ですた。
hoge() とか入っとらん。
0653デフォルトの名無しさんNGNG
char *openseek(const char *filename, int nbytes)
{
  FILE *fp = fopen(filename, "r");
  if(fp && hoge() >= 0)
  {
    char *buff = malloc(nbytes);
    if(buff && fread(buff, 1, nbytes, fp) == nbytes && uge() >= 0)
    {
      fclose(fp);
      return buff;
    }
    buff && free(buff);
  }
  fp && fclose(fp);
  return NULL;
}
0654デフォルトの名無しさんNGNG
>>649-650 は、「goto を使った方が分かりやすい場合」 の例でつか?
0655デフォルトの名無しさんNGNG
>  buff && free(buff);
無用。free(NULL)は合法。
0656デフォルトの名無しさんNGNG
> 無用。free(NULL)は合法。

そーでない不確かな処理系がある。
0657デフォルトの名無しさんNGNG
char *p = openseek("text.txt",100);
なんかの処理
free(p);

なんかメモリリーク引き起こしそうな使い方だな。
0658デフォルトの名無しさんNGNG
>     buff && free(buff);
これってありなの?
0659デフォルトの名無しさんNGNG
>>656
どこにあるの?
0660658NGNG
なんか言い直した方が良さそうだ。

>     buff && free(buff);
free()の戻り値の型ってvoidなんだけど、
こういう書き方ってできるの?
0661デフォルトの名無しさんNGNG
できる!
0662658NGNG
gccではコンパイルは通った。
本当にできるみたい。
ムムム…
0663デフォルトの名無しさんNGNG
buf && (free(buf), 0);
0664デフォルトの名無しさんNGNG
buf && (free(buf), buf=NULL);
0665デフォルトの名無しさんNGNG
その gcc チョンボっぽいな。
2.95.1 は通らない。
0666658NGNG
>>665
stdlib.hのインクルード忘れてた。stdio.hは追加したのに…
うちのgccでもエラーになりました。
0667デフォルトの名無しさんNGNG
おいしいビッグマックが食べたい・・・
0668デフォルトの名無しさんNGNG
>>631
> こういったケースをうまく収める定石ってないのでしょうか?

ないと思う。

> で、自分で見つけた解決策の一つが、
> freeの引数に渡す時、void * にキャストするという方法。

それでいい。

または、場合によっては、書き換えて欲しくない処理の
ところだけを別の関数にして、その引数を const char *
で宣言して渡すのも有効な方法だね。
0669デフォルトの名無しさんNGNG
ふ
0670デフォルトの名無しさんNGNG
> // 勿論、テストでポインタの指す領域への代入で警告出るのも確認しました。

警告じゃなくてエラーになるハズなんだが・・・。
0671デフォルトの名無しさんNGNG
たとえば組み込み系のコンパイラで
const char hoge[] = ”abcdefg”;
とすると、ROMにデータが置かれて、ROMだから書き換えとかも不可なわけで。
キャストしようが何しようが、constを書き換えるのはアレかなと。
0672デフォルトの名無しさんNGNG
>>671
それはconstでなければ書き換え可。
hogeは配列だろ。
0673デフォルトの名無しさんNGNG
ハァ?
0674デフォルトの名無しさんNGNG
char hoge[] = "abcdefg"; と char *hoge = "abcdefg"; の区別は大丈夫か?

つーか、全角使うなよ・・・。
0675デフォルトの名無しさんNGNG
>>674
すんまそん、区別がつかない一人です。
違いを教えていただけないでしょうか?
0676デフォルトの名無しさんNGNG
>>674
671が書いてる前提と違ってきていますが
0677デフォルトの名無しさんNGNG
>>674
char hoge[] = ...
だとhogeは配列。hoge[i]に代入しても良い。
hogeには代入できない。
char *hoge = ...
だとhogeはポインタ変数。hoge[i]に代入するのは未定義動作。
hogeには代入してよい。
0678デフォルトの名無しさんNGNG
>>675
C FAQ。
「以下の二つの初期化の違いは。」
http://www.catnet.ne.jp/kouno/c_faq/c1.html#32
「でもchar a[]はchar *aと同じと聞いたことがあるが。」
http://www.catnet.ne.jp/kouno/c_faq/c6.html#2
役に立つから 1 度は通読する事をお奨めする。

>>676
671 の前提がそもそもおかしいという話なのだが。
0679675NGNG
>>678
ありがとうございました
今宵はぐっすり眠れそうです。
0680675NGNG
>>678
だからといって、前提をあっさりと無視しなくても・・・
0681デフォルトの名無しさんNGNG
>>680
無視と異議の区別は大丈夫か?
0682デフォルトの名無しさんNGNG
>671は>631の話の流れから書いたのだろうけれど。
constをキャストしてまで書き換えるなと言いたいだけでは?
0683デフォルトの名無しさんNGNG
辿るならちゃんと 593 まで辿れ。
const をキャストして書き換える話などではない。
0684デフォルトの名無しさんNGNG
ROM に格納される可能性のあるデータを書き換えてはいけないというのは、
const か否かと全然関係無いじゃん。
671 は const について勘違いしている?
0685デフォルトの名無しさんNGNG
見せかけの大人しさ(さいたま)に騙されるな!
埼玉県民の特徴

●とにかくさいたまが小さい(二言目には「さいたま」)
●さいたまを溜め込んでは、キレて関係ないさいたまを巻き添えにして暴れまくる(さいたまのくせに短気)
●さいたまがさいたまに強く、さいたまがさいたまにされると怒るくせにさいたまでさいたまをさいたまにしようとする(ただし、さいたまをさいたま的にしかさいたまできず、さいたまにはたいてい、さいたま的に負けている)
●さいたまの忠告を受け入れない、さいたまできない、さいたまがない(さいたまの筋をさいたまにでも通そうとするため)
●「さいたま、さいたま」と口うるさいが、実はさいたまがズレまくっている(さいたまの常識は世界の非常識)
●さいたま、さいたま(さいたま、さいたま…etc)に弱く、さいたまには威張り散らす(強い者に対してはへりくだり、弱いものに対してはいじめる)
●さいたま探しだけは名人級(例え10のさいたまがあってもほめることをせず、たった1つのさいたまを見つけてはけなす)
●基本的にさいたま主義でさいたま思考に支配されているため、さいたまがうっとうしい(さいたま)
●さいたまでは何もできない、さいたまは連れションが大好き(さいたまでしか行動できないヘタレ)
●他人からどう見られているか、さいたまをいつも気にしている(さいたま命)
●さいたま夫が多い(さいたまを気にするあまり)
●さいたまの感情をうまくさいたまできず、コミュニケーションさいたまに乏しい(同じことを何度も言う、さいたま)
●さいたまで融通(さいたま)が利かず、表面上意気投合しているようで、さいたまの中は各自バラバラ(しかも考えていることは驚くほどさいたま)
●さいたまを信じられず、疑い深い(さいたま自身裏表が激しいため、さいたまに対してもそう思う)
●さいたまは常に自己抑制しているもんだから、さいたまに見えるさいたまに嫉妬し、さいたまを組んで猛烈にさいたまを引っ張ろうとする(ねたみが人一倍強い)
●おまけにさいたま深くしつこい(「一生さいたま」タイプ)
●さいたまに甘くさいたまに厳しい(さいたまのことは棚に上げて、まずさいたまを意識する・さいたま)
●要するに女々しい、あるいはさいたまの腐ったみたいなやつが多い
0686デフォルトの名無しさんNGNG
通報しますた。
0687デフォルトの名無しさんNGNG
よくこんなくだらんことできるよなぁ(苦笑
0688デフォルトの名無しさんNGNG
ANCI Cで、動的に、二次元配列を使いたいのですが
どのようにしたら実現できるでしょうか?

mallocだと、だめなのかなぁ
0689デフォルトの名無しさんNGNG
freeでポインタだけしか渡していないので
mallocで確保したサイズが解放できるわけを教えてください。
0690デフォルトの名無しさんNGNG
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
  int x, y;
  int (*a)[16];
  a = (int (*)[16])malloc(sizeof(int) * 16 * 16);
  free(a);
  for(x = 0; x < 16; x++)
    for(y = 0; y < 16; y++)
      a[x][y] = x * 16 + y;
  for(x = 0; x < 16; x++)
    for(y = 0; y < 16; y++)
      printf("a[%d][%d] = %d\n", x, y, a[x][y]);
  getchar();
  return 0;
}
0691デフォルトの名無しさんNGNG
>>689
実装は処理系定義であり、いろいろな方法が考えられる。
ポピュラーな実装方法としては、malloc() が返すポインタよりも少し前の領域に
サイズを記録しておくとか、メモリ割り当ての管理テーブルを作成しておく等が
ある。
0692688NGNG
> 690

うぉっ、回答(゚д゚)ハヤー
激しく感謝

あとは、理解する頭を・・・
0693690NGNG
あ、free(a); 忘れ。(このサンプルでは影響少ないけど)

ちなみに、int (*)[16] 型だからね。int *[16] 型じゃないからね。

あと、16 は y の 16 であって x の 16 じゃない。
例えば三次元配列 int [12][34][56] へのポインタは int (*)[34][56]。
0694688NGNG
> 690

8行目の free(a); とは別に要るんですか?
0695デフォルトの名無しさんNGNG
>688
一次元を二次元風にするとかは、ださいんでしょうか
foo = malloc((max_x + 1) * (max_y + 1) * sizeof(bar));
foo[(x * max_y) + y] = 1024;
#なんか間違えてるかな
0696デフォルトの名無しさんNGNG
大抵は、malloc関数によってユーザに与えられたメモリのアドレスの定数ワード前にサイズとか色んな情報が入っている場合があります。

こんな感じ
-------------------
|サイズ等の管理情報|
------------------- <-このアドレスがmallocで返される
| |
| ユーザメモリ |
| |
| |
------------------- <-次のメモリブロック
|サイズ等の管理情報|
------------------- <-このアドレスがmallocで返される
| : |
:
:
0697デフォルトの名無しさんNGNG
OSが管理している、という一言で済むかな・・・
0698デフォルトの名無しさんNGNG
>>697
とは限らない。
0699デフォルトの名無しさんNGNG
>>695
何がやりたいの?

>>697-698
つーか、全部を OS に管理させている処理系は少ないぞ。
0700デフォルトの名無しさんNGNG
C99 PDF の翻訳スレって誰か立てないの?
0701593, 631NGNG
# >>593, >>594-596, >>631

>>668
なるほど、設計を変えることで対応できるんですね。
見直して見る価値がありそうです。ありがとう。

>>670
> // 勿論、テストでポインタの指す領域への代入で警告出るのも確認しました。
> 警告じゃなくてエラーになるハズなんだが・・・。
Warning: assignment of read-only location
で、一応コンパイルは通り、実行も出来ました。

>>631 で話したテストとは下記の様な場面を想定したテストでした。
この場合の const char* の指す場所は、mallocで確保した領域です。

// 普通に初期化せず、関数内で値を設定しているのは、
// 環境等によって異なる値を所得する必要があるため。テストでは省いています。
--------------------------------------------
#include <stdlib.h>
char *foo(void){
char *str = (char *)malloc(2);
if (str){ str[0]='a'; str[1]='\0'; }
return str;
}
int main(void){
const char *str = foo(); /* foo で設定した値を、これ以降書き換えたくない */
if (str) str[0]='b'; /* Warning */
free((void *)str);
return EXIT_SUCCESS;
}

// 誤解、解けたかな?
0702デフォルトの名無しさんNGNG
申し訳ありません。基本かもしれませんが、参考書に載ってないので教えて下さい。

#include <stdio.h>
int main(void)
{
char str[100];
int i,c;
c=0;
printf("文字列を入力してください。\n");
scanf("%s",str);
for(i=0;str[i]!='\0';i++){
c++;
}
printf("文字列の長さは%dです。\n",i);
return 0;
}



このコードのstr[i]!='\0'の!=hは非等価ですが'\0'の意味を教えて下さい。
0703デフォルトの名無しさんNGNG
本当に載ってないならその参考書を燃やしてもっとましな新しい参考書を買うよろし
0704デフォルトの名無しさんNGNG
>>701
> if (str) str[0]='b'; /* Warning */

Σ(゚д゚lll)
それおかしい。
C 規格外の動作をしている。
コンパイラは何?
0705デフォルトの名無しさんNGNG
http://science.2ch.net/test/read.cgi/future/1022864257/425

「このDVDは36時間以内に」消滅 007新作で実現

(CNN) 映画「007」シリーズではこれまで、ニセの指紋や毒入りペンといったスパイ用
の突飛な「新技術」が次々に発表されてきたが、22日に全米公開された最新作「ダイ・アナザー・デイ」
でもまた新たな技術が披露された。「36時間以内に消滅するDVD」だ。

このDVDは、映画の公開前に批評用として報道関係者に配られるもの。報道関係者が見たあと、
一般に出回ってコピーされたりするのを防ぐためニューヨークを本拠とする「フレックス・タイム」会社が
開発した新技術が採用された。
同社のC・E・シャノンさんは「化学のおかげ」としか言わないが、仕組みはこうだ。DVDの表面には
透明な樹脂が張ってあり、プレーヤーはそこを透過するレーザー光で信号を読み出す。ところが、新しい
DVDでは、樹脂に特殊な工夫があり、36時間程度で発熱・発火・発光―つまり爆発―するように
なっている。その結果、DVDは消滅するわけだ。

007のDVDには「包装を開いたあと、36時間以内に作品を鑑賞してください」と書いてある。シャノ
ンさんは「新技術はジェームズ・ボンドにぴったりでしょう」と話している。この技術は音楽CDや、ソフト
ウエアの収録したCD―ROMにも応用でき、フレックス・タイム社には商談の話が来ているという。
0706デフォルトの名無しさんNGNG
>>703
そんなこと言わないで教えて下さいよー。麻奈本ですけど。おかねないですよ。
0707デフォルトの名無しさんNGNG
>>705は【転送】また、騙された訳だが【完了】
0708 ◆F52DmOxJlc NGNG
>>702
ヌル文字
0709デフォルトの名無しさんNGNG
ぬる文字?
0710593, 631, 701NGNG
>>704
cygwin gcc3.1.1 です。
gcc -ansi -Wall foo.c でコンパイルしました。
何処辺りが規格外なの?


>>702
typo かなっ? // 数値は同じだけど。
> printf("文字列の長さは%dです。\n",i);
< printf("文字列の長さは%dです。\n",c);
0711 ◆F52DmOxJlc NGNG
http://www.google.co.jp/search?q=%83k%83%8B%95%B6%8E%9A+C%8C%BE%8C%EA&ie=Shift_JIS&hl=ja&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
お金たまったらマトモな本買ってね。
0712デフォルトの名無しさんNGNG
>>653-666
今更だが、
buff && free(buff), 0;
でOK
0713712NGNG
でも、見にくくなるだけだから、使わない方がベター
0714デフォルトの名無しさんNGNG
>>712
(゚Д゚)ハァ?
0715デフォルトの名無しさんNGNG
関数のポインタってどういうときに使うんですか?
0716デフォルトの名無しさんNGNG
おい・・・
またスレ立てたいだけ厨が出たぞ・・・。
http://pc3.2ch.net/test/read.cgi/tech/1039790146/l50
しかもあっちのスレ、まだ 900 も逝ってないのに。
0717デフォルトの名無しさんNGNG
>>715
qsort()
SetWindowsHookEx()
0718デフォルトの名無しさんNGNG
>>702
strcpy 等で、文字列をコピーするのに
何処が、文字列の終端なのか分からないと
何処までをコピーすれば良いか分かりませんよね?
つーわけで、その'\0'は、文字列の終端である事を表す文字です
0719デフォルトの名無しさんNGNG
>>714
buff && ( free(buff), 0 ) ;
カッコが抜けてた
首吊ってきます
0720デフォルトの名無しさんNGNG
constに代入?
0721デフォルトの名無しさんNGNG
>>715
使うと便利なとき
0722デフォルトの名無しさんNGNG
くだらねぇ。free(buf)でいいだろが。
C厨ならC厨らしく特殊な例外に対応するときはマクロでも使え。
0723デフォルトの名無しさんNGNG
722 に 0.8 票
0724デフォルトの名無しさんNGNG
>>717
ありがとうございます。ところで、
SetWindowsHookEx()ってなんですか?

>>721
便利なときって例えばどういうときでしょうか。
0725デフォルトの名無しさんNGNG
>>724
> 便利なときって例えばどういうときでしょうか。
C言語でオブジェクト指向プログラミングをする時などに使用します。
0726デフォルトの名無しさんNGNG
>>722
そのマクロで意味も無く使って見るのがベター
0727デフォルトの名無しさんNGNG
(゚Д゚)ハァ?
0728デフォルトの名無しさんNGNG
>>724
クイックソートのような補助関数を使いたい時や
配列化(特に多次元)したい時とか
0729デフォルトの名無しさんNGNG
>>725
ありがとうございます。ところで、
オブジェクト指向プログラミングが全く判らないので出直してきます。



質問があるときにはまたよろしくお願いします
0730デフォルトの名無しさんNGNG
>>727
#ifdef XXX
#define Free(s) ((s)&&(free(s),0))
#else
#define Free(s) free(s)
#endif
こうすれば、移植しやすいでしょう?
まぁ、普通にステートメントとifを使う方が見やすいけどね…
0731デフォルトの名無しさんNGNG
#ifdef XXX
#define free(s) ((s)&&(free(s),0))
#endif
0732デフォルトの名無しさんNGNG
>>731その",0"って何か意味あるの?
0733デフォルトの名無しさんNGNG
>>732
free() は vois 型だから、そのままだと && のオペランドにできないの。
どうせやるなら #define free(s) ((s)&&(free(s),s=0)) でもいい気がする。
0734訂正NGNG
> vois 型

void 型
0735デフォルトの名無しさんNGNG
なるほど。しかし名前が同じだと却って混乱を招いたりしない?このfreeはどっちのfreeだったかなとか。
0736デフォルトの名無しさんNGNG
(゚Д゚)ハァ?
0737デフォルトの名無しさんNGNG
>>731
ライブラリはマクロで定義されてる事もあるので…
まぁfreeがマクロになってる事はあまりないか
0738デフォルトの名無しさんNGNG
脳内スタックの容量は大丈夫ですか?
0739デフォルトの名無しさんNGNG
関数型のマクロは、引数を複数回評価した時に副作用があるので、その可能性が
あれば文書で警告されるはず。
free() にはそのような警告はないよ。
0740デフォルトの名無しさんNGNG
>>735
どっちって、特殊な環境で動くようにしてるだけだから
普通は間違えようにも間違えようがありません
0741デフォルトの名無しさんNGNG
hogeって日本語?
0742デフォルトの名無しさんNGNG
アメリカ人は foo とかかいてる気がするな。
0743デフォルトの名無しさんNGNG
hoge-hage, or hoge-page
foo-bar
0744デフォルトの名無しさんNGNG
>>739
それは、あなたの環境でfreeがマクロでは無いからです
で、>>730で移植しやすいと言ってるのだから
汎用性を考えるのなら、マクロの定義で
関数名で使われている名前は避けるべきではないかと…
0745デフォルトの名無しさんNGNG
>>744
(゚Д゚)ハ?
0746デフォルトの名無しさんNGNG
hogeって
ほげ〜。。。(ボーっとしている様)
っていう意味でいいの?
0747デフォルトの名無しさんNGNG
>>744
漏れの処理系にじゃなくて、規格に無いと逝ってるんだが。
ちなみに gets() はもろに警告されている。
0748デフォルトの名無しさんNGNG
>>744
730 が移植しやすいなんで誰も言っていない。
第一、free() を完全に置き換えたいのだから、別の名前の方が混乱する。
0749デフォルトの名無しさんNGNG
>>747
だから、その規格が、全ての標準ライブラリは
マクロか適当に実装して提供すればOKってなってない?
それとも、俺の勘違い?
0750デフォルトの名無しさんNGNG
foo bar baz
hoge hero moe
0751デフォルトの名無しさんNGNG
規格では、関数として実装しなければいけないものも
たくさんあると思う
0752デフォルトの名無しさんNGNG
ISO_IEC 9899_1999 の 7.1.3 Reserved identifiers の 項 4 に、
予約した識別子を #define したり #undef した場合の動作は未定義って
書いてあるナー・・・。
0753デフォルトの名無しさんNGNG
>>752
予約した識別子って、ライブラリ関数名と関係あるの?
0754デフォルトの名無しさんNGNG
>>753
予約語以外の、予約した識別子。
つまり、ライブラリ関数/変数、マクロの名前。
それぞれの解説文の中に埋まってて、一覧は無かった。
0755デフォルトの名無しさんNGNG
予約した識別子がライブラリ関数/変数、マクロの名前ということは誰が言ったんだ?
0756デフォルトの名無しさんNGNG
>>752
それはすごいな
大手メーカーのコンパイラがほぼ全てギルティだな
0757デフォルトの名無しさんNGNG
すいません教えてください。お願いします。
3つの配列のうち最小のやつを選びたいのですが、

minimum( Gx[i][j-1] , Gx[i-1][j] , Gx[i-1][j-1] );
としてminimumに渡したいのですが、

minimum' : 1 番目の引数を 'unsigned char' から
'int [][512]' に変換できません。

とエラーが出て上手く渡せません。どうしたらよいでしょうか。

ちなみに

#define X_SIZE 512
unsigned char Gx[X_SIZE][X_SIZE];

unsigned char minimum(unsigned char Gx1[X_SIZE][X_SIZE],
  unsigned char Gx2[X_SIZE][X_SIZE],
unsigned char Gx3[X_SIZE][X_SIZE]){
}

と、しているのですが・・・。
0758デフォルトの名無しさんNGNG
>>757
minimum の宣言がどうなってるんだろうねぇ。
0759デフォルトの名無しさんNGNG
>>757
マルチポストすんな
回線切って首吊って氏ね
0760デフォルトの名無しさんNGNG
教えてほしいんですけど、リンクってどうやるんですか?

リンカにお願いするとかは無しよ。
0761デフォルトの名無しさんNGNG
>>760
リンカ無しでリンクすんの?
0762デフォルトの名無しさんNGNG
>>760
//LKED EXEC PGM=IEWL,REGION=96K,PARM=(XREF,LET,LIST)
0763デフォルトの名無しさんNGNG
>>760?
0764デフォルトの名無しさんNGNG
リンカの内部動作を知りたいということ?
0765デフォルトの名無しさんNGNG
リンカタンの内部動作(´Д`;)ハァハァ
0766デフォルトの名無しさんNGNG
チチビンタリカ
0767デフォルトの名無しさんNGNG
#define MAX 21
double u[MAX][MAX], f[MAX][MAX];

void poisson_equation(u,f)
double u[MAX][MAX],f[MAX][MAX];
{
この部分で関数の定義間違っていますとメッセージが出るのですが、
どうしてなのか分かりません。どこがおかしいのでしょう?


{
0768デフォルトの名無しさんNGNG
>>767
void poisson_equation(double u[MAX][MAX],double f[MAX][MAX])
0769デフォルトの名無しさんNGNG
>>767
>> {
↓
}
0770デフォルトの名無しさんNGNG
>>767
関数の引数定義ではマクロは使えませんよ。
MAXを直接21と書き換えてしまってください。
0771767NGNG
>>770
わかりました。ありがとうございます。
0772デフォルトの名無しさんNGNG
>>768
void poisson_equation(double u[][MAX],double f[][MAX])
0773デフォルトの名無しさんNGNG
>>770
どこのコンパイラでそうなってるんだ?
0774デフォルトの名無しさんNGNG
>>770
お前適当なこと吹き込むなよ。
コンパイラとプリプロセッサの違い分かってる?
0775デフォルトの名無しさんNGNG
>>770
ま、まじっすか?
0776デフォルトの名無しさんNGNG
>>774
お前にはわかっているというのか?
0777デフォルトの名無しさんNGNG
>>776
わからないんだったら、ここで素直に聞いておいたほうがいいよ。
0778776NGNG
>>777
教えてくれ。
0779デフォルトの名無しさんNGNG
>>778
おもろいやつだなw

#で始まる命令はプリプロセッサが処理する。
コンパイラに渡されたソースではMAXという文字列ではなく21という数字になっている。
だからMAXを21に変えたところでコンパイルには何も影響が無い。
0780776NGNG
>>779
大体解った。

#define MAX yahoo

printf("MAX"); → printf("yahoo");

ってなってくれんだな。結構慎重に使わないとやばいな。
0781デフォルトの名無しさんNGNG
>>780
ネタなのか?
0782デフォルトの名無しさんNGNG
>>780
Cプリプロセッサはそういう挙動はしない。
0783デフォルトの名無しさんNGNG
ネタにきまってんじゃん
0784776NGNG
>>782
じゃあ、どう動くんだ?
0785デフォルトの名無しさんNGNG
>>784
$ cat hoge.txt

#define MAX yahoo

1. printf("MAX");
2. MAX
3. [MAX]
4. // MAX
5. /* MAX */


$ cpp --version
cpp (GCC) 3.2 20020927 (prerelease)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

0786結果NGNG

$ cpp hoge.txt

# 1 "hoge.txt"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "hoge.txt"


1. printf("MAX");
2. yahoo
3. [yahoo]
4.
5.
0787776NGNG
>>786
すまんが日本語で説明してくれ
0788デフォルトの名無しさんNGNG
>>787
>>785のhoge.txt にCプリプロセッサをかけると
>>786になる。

説明も何もそのままだ。
0789デフォルトの名無しさんNGNG
a[i++] = i;
は禿しく未定義なんでしょうか。
0790776NGNG
>>789
未定義だ
0791デフォルトの名無しさんNGNG
なんで!?
0792776NGNG
>>788
おまえも理解していないってことだな
0793デフォルトの名無しさんNGNG
C言語は仕様をどれだけ覚えているかを競って遊ぶ言語です。
0794デフォルトの名無しさんNGNG
>>792
ハァ。見りゃ分かるだろ。
Cプリプロセッサは文字列リテラルの中には関与しないんだよ。
0795776NGNG
>>794
根拠は?
0796903NGNG
>>794
まあ、ここまでくればネタか本当のアフォだろ >>776
無視しとこうよ。
0797デフォルトの名無しさんNGNG
>>776
よっぽど悔しかったんだね。プ
0798デフォルトの名無しさんNGNG
>>795
>>786を見ろ。

>>796
確信犯か、わざとやってるかのどっちかだな。
そうします。
0799デフォルトの名無しさんNGNG
>>795
C90およびC99。
0800デフォルトの名無しさんNGNG
>>795
800げっと。
0801デフォルトの名無しさんNGNG
>>794
文字列の連結は、関与と言えば関与のような…
0802デフォルトの名無しさんNGNG
>>780
それはK&Rのfirst editionではないか?
0803デフォルトの名無しさんNGNG
>>801
>>794「文字列リテラルの中」と書いてあるが?
#中という表現もどうかと思うが。
0804真面目に質問NGNG
すいません。質問します。

ソース
sprintf(qs,"Cookie: NAME=%s; MAIL=%s",UrlEncode("aaa"),UrlEncode("aaa"));

デバッグでqsに入っている文字列を見ると、
"フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフミケ"
となり、文字列が変換・代入されません。

どうして、こうなるのでしょうか?
すいません、初歩的な質問で・・・
0805デフォルトの名無しさんNGNG
>>804
それだけじゃわからん。前後でなにしているのか、どの段階でそうなっているのかかけ。
その関数実行後にそうなっているのか?
環境とコンパイラとデバッグ環境は・
0806デフォルトの名無しさんNGNG
( ´∀`)フフフフフフフフフフフ……(;゚Д゚)ミゲ!
0807真面目に質問NGNG
Windows XP
VisualC++6

ソース
char qs[100];
sprintf(qs,"Cookie: NAME=%s; MAIL=%s","aaa","aaa");

文字列の変換をしたいだけです。
結果として、qsには、「"Cookie: NAME=aaa; MAIL=aaa"」と入ってくれればOKです。
ただ、これだけです。関連しているのは。
MFCだと、CStringを使えば、簡単に文字列操作ができますが・・・。

どこに問題があるのでしょうか?
0808真面目に質問NGNG
>>807 の続き。
qsには"フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフミケ"
と代入されます。なぜでしょうか。
0809デフォルトの名無しさんNGNG
>>807
デバッガで矢印がsprintfの次までいった時点で見てるのか?
→sprintf(...)
ってときにみてもおかしなものが入っているのは当然だぞ。
0810デフォルトの名無しさんNGNG
んなアフォな
0811真面目に質問NGNG
>>809
いえ、その関数を実行した後です。
0812デフォルトの名無しさんNGNG
>>807
んなアフォな。何か隠してるだろ?
0813デフォルトの名無しさんNGNG
>>811
コンパイル時になんか警告でなかった?
0814真面目に質問NGNG
>>ALL
いえ、全くエラーはでません。
多分、何か、基本的な間違いをしているのだと思いますが・・。
それが、解らなくて・・。困ってます。(涙)
0815デフォルトの名無しさんNGNG
謎は全て解けた!
#define sprintf(a,b,c,d) strcpy(a, "フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフミケ")
こういうマクロが定義されていたんだ!
0816デフォルトの名無しさんNGNG
>>814

main() {
  char qs[100];
  sprintf(qs,"Cookie: NAME=%s; MAIL=%s","aaa","aaa");
  printf("%s",qs);
}
でもフフフフ…なのかい?
0817デフォルトの名無しさんNGNG
>>807
全コードを載せてくれ
0818デフォルトの名無しさんNGNG
>>814
807のソースをそのまま貼り付けてコンパイルして実行してもそうなるの?
そうならデバッガが壊れている。
そうでなければ変な結果になるソースのその部分の処理のまとまりをあげてくれなきゃ解決できない。
0819デフォルトの名無しさんNGNG
VC++だとフフフフフ…は良く見るよな。領域確保された時点でフ(コード忘れた)で埋まるんだよね。
0820デフォルトの名無しさんNGNG
>>819
デフォルトの初期化がフだと?
0821真面目に質問NGNG
>>816
やってみます。
0822デフォルトの名無しさんNGNG
C/C++の宿題なら私にやらせろ!
http://pc3.2ch.net/test/read.cgi/tech/1039772622/137
マルチに降格しました。
真面目に質問は放置でお願いします。
0823デフォルトの名無しさんNGNG
もう寝ようと思っていたのに変な質問あげやがって。
結果が気になるじゃねーか。
0824真面目に質問NGNG
>>816
main() {
  char qs[100];
  sprintf(qs,"Cookie: NAME=%s; MAIL=%s","aaa","aaa");
  printf("%s",qs);
}
だと、きちんと表示されました!!!!

何が違うのだろうか・・・???
0825デフォルトの名無しさんNGNG
>>824
だからソース上げろ。その処理が書いてある関数全体を。
0826真面目に質問NGNG
>>822
あれ?マルチはだめなんですか。すいません。
この掲示板は初心者なモンで。
皆様にはご迷惑をおかけしました。

で、VisualC++を再起動しなおして、ビルドしたら、きちんと表示されました。
何が原因でこうなったかは、わかりませんが、一応解決しました。

誠にすいませんでした。
今度から気をつけます。
0827真面目に質問NGNG
いまから、2CHにクッキーを転送して書き込もうとしているところなんですよ。

うまくいくかどうか、心配ですが、夜が明けるまでには、書き込みがうまくいくように、
必死でプログラミングしています。
0828デフォルトの名無しさんNGNG
http://cocoa.2ch.net/test/read.cgi/qa/1039870549/883

こいつ、ここの人でしょ?
うざいんですけど。
0829親切な人NGNG

ヤフーオークションで、凄い人気商品、発見!!!

プランテック製の「 RX-2000�V 」を改造済み
にした、アイティーエス製の「 RX-2000�V 」↓
http://user.auctions.yahoo.co.jp/jp/user/neo_uuronntya

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。

ヤフー ID の無い方は、下記のホームページから、
購入出来る様です↓
http://www.h5.dion.ne.jp/~gekitoku/#.2ch.net/
0830確かにうざいねNGNG
初心者の質問@2ch掲示板
もの凄い勢いで誰かが質問に答えるスレ3639
http://cocoa.2ch.net/test/read.cgi/qa/1039870549/811-
811 :JPS ◆XXXAXAQILI :02/12/15 00:53
友達いなそうw
↓
852 :JPS ◆XXXAXAQILI :02/12/15 00:57
死ね死ね団キモイ
860 :JPS ◆XXXAXAQILI :02/12/15 00:57
馬鹿は死ねw
↓
872 :JPS ◆XXXAXAQILI :02/12/15 00:58
屑w
↓
883 :JPS ◆XXXAXAQILI :02/12/15 00:59
おまえってゴミだねw
↓
902 :JPS ◆XXXAXAQILI :02/12/15 01:01
クズなんだから死ねw
↓
910 :JPS ◆XXXAXAQILI :02/12/15 01:02
ゴミ失せろw
↓
922 :JPS ◆XXXAXAQILI :02/12/15 01:03
糞虫w
↓
0831デフォルトの名無しさんNGNG
char str[4] = "2ch";

printf("%d",(unsigned int)sizeof(str));

なら上手く行くのに


char (*str)[4] = "2ch";

printf("%d",(unsigned int)sizeof(*str));

とやるとエラーが出るのはなぜでしょうか?
多次元配列がよくわからなくて色々やってたらふと疑問に思ったのですが・・・
0832デフォルトの名無しさんNGNG
>>819
VC++のデバッグビルドだと、全てのローカル変数を'ヘ'(0xcc)で初期化して、
ポインタとして触ったときにAccess Violationするようにしてるんじゃなかったか?
Win32だと0x80000000以降のアドレスはカーネル用で絶対触れないからね。

よーするに、初期化してない自動変数には何入ってるかわからん、ってことさヽ(´ー`)/

0833デフォルトの名無しさんNGNG
>char (*str)[4] = "2ch";
なんだこりゃ......
0834デフォルトの名無しさんNGNG
>>831
エラーって何よ?コンパイルエラー?
それくらいは書け阿呆
0835デフォルトの名無しさんNGNG
後者のstrは配列へのポインタ。文字列リテラルは配列ではない。
つーか、アラーメッセージ見た?
0836デフォルトの名無しさんNGNG
>>831
printf("%d",(unsigned int)sizeof(str));
で何が知りたいのかも気になるところだが.
0837デフォルトの名無しさんNGNG
>>835
アラーメッセージ.......ムスリムでつか?
0838デフォルトの名無しさんNGNG
>>833
サイズが4であるchar型の配列へのポインタだろ
0839デフォルトの名無しさんNGNG
無間に続く数列の値を入力として、平均値をとって返す関数
を考える。単純に、n番目に入力された値までの平均値

(A0 + A1 + A2 + ... An)/n

を計算しようとすると、分母も分子も32ビットの範囲をいずれ越えて
一回りしてしまうかも。何かいい方法ない?
0840デフォルトの名無しさんNGNG
>>838
んなこたぁ分かっとるわ!クソヴォケ!
0841デフォルトの名無しさんNGNG
64ビットでやろう。

てか、構造体つくって繰上りとか自分でなんとかしる。
0842デフォルトの名無しさんNGNG
>>837
最近流行りらしい<アラーメッセージ
最初見た時はめちゃワロタ。
0843デフォルトの名無しさんNGNG
>>838
良く読むと違う気が(w
0844デフォルトの名無しさんNGNG
アラー(゚д゚ )
0845デフォルトの名無しさんNGNG
>>839
束胃腸演算
0846デフォルトの名無しさんNGNG
束胃腸演算 ??
0847デフォルトの名無しさんNGNG
>>843
ということは>>840の立場って…
0848デフォルトの名無しさんNGNG
>>843
ん?何が違う?
0849デフォルトの名無しさんNGNG
面白くなって参りました
>>846
多倍長じゃないの?
0850デフォルトの名無しさんNGNG
>>847
吊られたってコトさ。
0851デフォルトの名無しさんNGNG
↓「釣れた」の予感?
0852デフォルトの名無しさんNGNG
漏れた
0853デフォルトの名無しさんNGNG
平均の取り方の工夫(層化平均にはこだわらない)でなんとかならない?
0854デフォルトの名無しさんNGNG
32ビットと限定するのは何故?
0855デフォルトの名無しさんNGNG
すいません!
s undeclared
というアラーメッセージが出ます!
やはりラマダンのときにパンをつまみ食いしたのが悪かったんでしょうか!?
0856831NGNG
>>835
今一度コンパイルし直したらただの警告が出てきますた。でちゃんと動きました。
さっきのエラーは一体なんだったんでしょうね。(←これについての突っ込みは無しということで)
お騒がせしました。

>>836
いえ、ただの遊びのつもりで

この板れすが速くてイイですね。
0857デフォルトの名無しさんNGNG
>>854
特に限定してるわけじゃありません。
64ビットでやれってのでもいいんだけど、それでもいずれ限界がくるから
別のスマートな方法ってないのかなと、、、
0858デフォルトの名無しさんNGNG
コンピュータが無限なんてあつかえねーんだよヴォケ
0859デフォルトの名無しさんNGNG
>>858
誰もそんなこと言ってねーよクァス
0860デフォルトの名無しさんNGNG
>>857
そんなこと言い出したらきりないでしょ。
最後には数値がビット表現で10TBを超えちゃう場合とかも考えるわけ?
0861デフォルトの名無しさんNGNG
>>855
吐けば消える。
今からでも遅くない。
やれ。
やるんだ。
0862デフォルトの名無しさんNGNG
メモリは有限だからいつかは限界がくるんだよ。
0863デフォルトの名無しさんNGNG
>>856
警告消したいならキャスト汁
char (*str)[4] = ( char(*)[4] )"2ch";
0864デフォルトの名無しさんNGNG
>>861
もううんちとして排出してしまいましたので、
うんちを取り返しておしりから入れて口から出したいと思います。
0865デフォルトの名無しさんNGNG
>>863
おまい, 分かってねーなw
0866デフォルトの名無しさんNGNG
(゚Д゚)ハァ?
0867デフォルトの名無しさんNGNG
>>860
たしかにそうかもですね。
>>841さんのいわれるように、繰り上がりとかのケアをするようにするかな。
0868デフォルトの名無しさんNGNG
>>856
そのコードで警告のみ・・・怪しいですな。
0869デフォルトの名無しさんNGNG
>>868
怪しいのはてめーだこのDQN原人
0870デフォルトの名無しさんNGNG
どうでもいいけどデリケートな部分って一体どこなの?
0871デフォルトの名無しさんNGNG
♪探し物はナンですか?
0872デフォルトの名無しさんNGNG
ねいちゃんのパンツ
0873デフォルトの名無しさんNGNG
>>865
(void *)の方が良かったか?
0874デフォルトの名無しさんNGNG
>>872
デリケートでデリシャス…
0875デフォルトの名無しさんNGNG
しみつき
0876デフォルトの名無しさんNGNG
キャストして済ませばいいという問題か否か。
0877デフォルトの名無しさんNGNG
char *(*_)(int (*(*a)(const void *, const void*))[5]) = (void *)"2ch";
0878デフォルトの名無しさんNGNG
>>856
char* str = "2ch"と同じことだろ。
0879865 NGNG
>>863
ごめん, おまいは合ってるわ. 正直すまんかった.
0880デフォルトの名無しさんNGNG
[5]
0881デフォルトの名無しさんNGNG




865 名前:デフォルトの名無しさん 投稿日:02/12/15 01:40
>>863
おまい, 分かってねーなw




0882デフォルトの名無しさんNGNG
>>876
こうしろってか?
char str[1][4] = { "2ch" } ;
char (*strp)[4] = str ;
わざわざ、こんな事しなくても分かってれば良いんじゃねぇか?
0883デフォルトの名無しさんNGNG
>>882
char str[4] = "2ch";
char (*strp)[4] = &str;

なぜこう書かない?
0884デフォルトの名無しさんNGNG
>>883
>>831で多次元配列が云々って言ってるから
0885デフォルトの名無しさんNGNG
>>883
プププ
0886883NGNG
>>884
おお、そうか!それは失礼。
でも>>831のコードは多次元配列ではないけどね。
0887デフォルトの名無しさんNGNG
>>886
なんで多次元配列でないの?
もっとも、本当は配列の配列だという意味ならその通りだけど。
0888デフォルトの名無しさんNGNG
配列へのポインタでしょ
どう見たって。
0889デフォルトの名無しさんNGNG
推測だが...
>>831氏が多次元配列で悩んでるっていうのは,

char ss[4][4]={ "1ch", "2ch", "3ch", "4ch"};
とかやりたいんはないのか?多分.
0890デフォルトの名無しさんNGNG
>>887
多次元配列が云々が無ければ配列へのポインタやね
0891デフォルトの名無しさんNGNG
あ、ごめん。
>>883のコードだと早とちりしてた。。
忘れてくれ。
0892デフォルトの名無しさんNGNG
>>887
キャストしていないのは置いといて・・・
>>831のコードは4バイト(俺の処理系では)の1次元配列の
先頭アドレスを格納する変数って意味では?

だから配列の配列ではない。
0893887,891NGNG
ちがう。>>882だ。
0894デフォルトの名無しさんNGNG
>>892
>>>831のコードは4バイト(俺の処理系では)の1次元配列の
揚げ足取られないようにしたつもりだろうが
どの処理系でも4Byteだ。
0895デフォルトの名無しさんNGNG
>>889
リモコン作るんですか?
0896デフォルトの名無しさんNGNG
>>894
釣りしてたんだろ?
0897デフォルトの名無しさんNGNG
つっこまれたら釣り扱いか。
0898デフォルトの名無しさんNGNG
>>892==894じゃねぇのか?
でアライメントが何たらかんたらって出てくるのを
期待してたんじゃ無かったのか?
0899デフォルトの名無しさんNGNG
(゚Д゚).......!?
0900831NGNG
情報が交錯してなんか混乱してきましたので、頭を冷やして自分を見つめ直してみます。
こんな夜中に大量にレス付けて下さってありがとうございます。
おまいら最高です。
(多次元配列云々は恐らく蛇足でした。脳内あぼんして下さい。)
0901デフォルトの名無しさんNGNG
何たらかんたらって何ぞ?
0902デフォルトの名無しさんNGNG
>>901
それは, , , あの, , , , つまり, , ,

あれだ.
0903デフォルトの名無しさんNGNG
そういうことか、分かった。
0904デフォルトの名無しさんNGNG
よっ、待ってましたっ!!
0905デフォルトの名無しさんNGNG
char s[][4] = {"2ch"};
char *s2[3] = (char (*)[3])&(((char *)*s)+1);
0906831NGNG
追伸
>>863氏のやり方で上手く行きました。
ただ、何故キャストすると上手く行くのかがよくわかってないのでもう少し考えてみます。
0907デフォルトの名無しさんNGNG
>>831
配列へのポインタは>>882や>>883の様にして使います
で警告が出る原因は
char cp[4] = "2ch" ;
int *ip = cp ;
で警告が出るのと同じ様に、左右の型が違うからです
まぁ、これで分からなかったら本でも読んで
もう一度ポインタについて勉強しなおして下さい
0908デフォルトの名無しさんNGNG
>>905への突っこみは誰も入れないのか
つーか、寝てるのか
0909デフォルトの名無しさんNGNG
飽きた
0910デフォルトの名無しさんNGNG
へーちょ
0911デフォルトの名無しさんNGNG
>>831
かなり冗長的だし余計混乱するかもしれませんが
これを実行して各初期値と結果を見比べれば少しは理解出来るかも
int main() {
char str1[4] = "012" ;
char *str2 = str1 ;
char str3[2][4] = { "345","678" } ;
char (*str4)[4] = str3 ;
char *str5 = str3[0] ;
int i = 1 ;
printf("(char*) str1 (string) %s\n", str1) ;
printf("(char*) str1 (char ) %c\n", *(*((char(*)[4])str1+0))) ;
printf("(char*) str1+i (string) %s\n", str1+i) ;
printf("(char*) str1+i (char ) %c\n", str1[i]) ;
printf("(char*) str2 (string) %s\n", str2) ;
printf("(char*) str2 (char ) %c\n", *(*((char(*)[4])str2+0))) ;
printf("(char*) str2+i (string) %s\n", str2+i) ;
printf("(char*) str2+i (char ) %c\n", *(str2+i)) ;
printf("(char(*)[4]) str3+i (string) %s\n", str3+i) ;
printf("(char(*)[4]) str3+i (char ) %c\n", *(*(str3+i))) ;
printf("(char*) *str3+i (string) %s\n", *str3+i) ;
printf("(char*) *str3+i (char ) %c\n", *(*str3+i)) ;
printf("(char(*)[4]) str4+i (string) %s\n", str4+i) ;
printf("(char(*)[4]) str4+i (char ) %c\n", *(*(str4+i))) ;
printf("(char*) *str4+i (string) %s\n", *str4+i) ;
printf("(char*) *str4+i (char ) %c\n", *(*str4+i)) ;
printf("(char*) str5 (string) %s\n", str5) ;
printf("(char(*)[4]) *str5+i (char ) %c\n", *(*((char(*)[4])str5+i))) ;
printf("(char*) str5+i (string) %s\n", str5+i) ;
printf("(char*) str5+i (char ) %c\n", *(str5+i)) ;
return 0 ;
}
0912デフォルトの名無しさんNGNG
delete noname00.c
0913831NGNG
>>907>>911氏
なんとなくわかってきました。ありがとうございます。
0914デフォルトの名無しさんNGNG
int a;
double b = 1.1;
a = b;
これに対してgccはwarningを出してくれません。
そのせいでバグってた、っての結構ある気がする。
0915デフォルトの名無しさんNGNG
>>911
pointer.c:17: warning: char format, different type arg (arg 2)
pointer.c:21: warning: char format, different type arg (arg 2)
printf("(char(*)[4]) str3+i (string) %s\n", str3+i) ;
printf("(char(*)[4]) str4+i (string) %s\n", str4+i) ;
ここでwarningがでます。
(str3+i)[0]
(str4+i)[0]
としたら出なくなりました。
0916デフォルトの名無しさんNGNG
>>911
pointer.c:17: warning: char format, different type arg (arg 2)
pointer.c:21: warning: char format, different type arg (arg 2)
printf("(char(*)[4]) str3+i (string) %s\n", str3+i) ;
printf("(char(*)[4]) str4+i (string) %s\n", str4+i) ;
ここでwarningがでます。
(str3+i)[0]
(str4+i)[0]
としたら出なくなりました。
0917デフォルトの名無しさんNGNG
連続投稿スマソ。
つーか規制しろよ。
0918デフォルトの名無しさんNGNG
char buf[100];
fprintf(stdin , "hello");
fread(stdin , buf , sizeof(buf) - 1);
ってしても読み込めません。これはできないのでしょうか?
ほかにいい方法はありますか?
0919デフォルトの名無しさんNGNG
>>918
> fprintf(stdin , "hello");

はぁ ? stdin ってなにもんかわかってるか ?

> ほかにいい方法はありますか?

一体何がしたいんだ ?
0920918NGNG
>>919
すみません。どういうもんなのでしょうか?
0921デフォルトの名無しさんNGNG
>>920
stdin: Standard Input, 標準入力
fprintf() は、出力する関数だから stdin は使えない。
0922918NGNG
>>921
なんとなくわかりました。
やりたかったのは、標準入力されたようにして、freadでその入力されたものを取り出したいと思ったのですが、
どういうふうにすればいいのでしょうか?
0923デフォルトの名無しさんNGNG
>>922
> やりたかったのは、標準入力されたようにして、freadでその入力されたものを取り出したいと思ったのですが、

自分で出力したものを、入力したいのか ? なんでまたそんなことを...。

まあ、良くわからんけど取りあえず適当なファイルに fprintf() して、それを fread() すれば ?
fopen()/fclose() とかについても調べた方が良いよ。
0924デフォルトの名無しさんNGNG
>>918
ungetc() のような事をさせたいんでしょうか…?
0925デフォルトの名無しさんNGNG
>>924
それにしては、先に出力してるしなぁ...。
unputc() みたいなことしたいのか ? ってどう言う状況だろう...。
0926デフォルトの名無しさんNGNG
まさか標準入力されたものをbuf[]に格納したいだけだとか
0927918NGNG
>>924
そういう感じです。
1文字じゃなくて文字列全体を戻して、
別の処理でそれをfreadやfgetcで取り出していきたいのですが、
どうすればいいのでしょうか?
0928デフォルトの名無しさんNGNG
>>927
別にストリームに戻さなくてもいいと思うぞ。

strcpy(buff, "hellow");

として、buff をその「別の処理」とやらに渡せばすむ話じゃないの ?
0929デフォルトの名無しさんNGNG
hellow

何語だ
0930デフォルトの名無しさんNGNG
節穴か? hello world の略じゃん
0931デフォルトの名無しさんNGNG
>>929
typo だ。気にするな。
取りあえず、"hellow" でググって見たら、28,100件もヒットしやがった。
全部が間違いではないだろうが、結構間違いやすい単語のようだ。

と、言い訳しとこう...。
0932918NGNG
>>928
戻したものを再び取り出すのに意味があるんです。
わけは聞かないでください。
何か方法はないでしょうか?
0933デフォルトの名無しさんNGNG
>>932
>戻したものを再び取り出すのに意味があるんです。
プログラムの組み方が間違ってると思われる
0934918NGNG
>>933
ごめんなさい。組み方に問題があるのは重々承知しています。
でもぼくにはどうしようもないんです。
できるかできないか教えていただけないでしょうか?
0935デフォルトの名無しさんNGNG
>>934
標準「入力」に「出力」できるわけないだろ?
0936デフォルトの名無しさんNGNG
>>934
標準入力じゃないと駄目なの?
例えば、一度標準入力から入力されたものを
他のファイル(入出力モード)に出力して
fseek等を駆使して適当にでっち上げるとか…
0937デフォルトの名無しさんNGNG
何がしたいのかさっぱり分からん。
根本的にとんでもなく間違ってる余寒。
0938918NGNG
>>936
呼び出さなければいけない関数のほうが標準入力から値をとってきているんです。
正直にいうとCGIで使われている関数を呼び出して処理しなければいけないんです。
getenvなどで取得する値は問題ないのですが、標準入力からも値をとってきている処理のために、
そこに値を入れておかないと処理がエラーで終了してしまいます。
なにかいい知恵はないでしょうか?
0939デフォルトの名無しさんNGNG
パイプを使う
0940デフォルトの名無しさんNGNG
そのCGIを変更しろ。つか晒せ。
0941デフォルトの名無しさんNGNG
>>918
仕様を書いてくれ
0942デフォルトの名無しさんNGNG
>>938
他のファイルに出力して
その関数にはstdinをfreopen()した物で動く事を期待してみるとか
つーか、その関数で標準入力から読み取ってるデータを
全てbufにコピーしておく方が良い
0943デフォルトの名無しさんNGNG
>>938
バイプを使うに++
0944デフォルトの名無しさんNGNG
>>938
そりゃパイプだろ
0945デフォルトの名無しさんNGNG
バイブを使うに--
0946デフォルトの名無しさんNGNG
うにー!
0947デフォルトの名無しさんNGNG
age
0948デフォルトの名無しさんNGNG
ファイルからある形式で書かれたデータを読み込むプログラム
を作成中ですが、如何せん下手糞です。そこで熟練プログラマは
どういう風に書いているのかな?と思いたって、ソースコードが
見れるところを探しているんですが、痒いところに手が届くような
自分が探しているのにマッチしたところが見つからないです。

どこか有名なところないでしょうか?C言語でCSV形式のファイル
を変換するようなプログラムを求めています。perlとかが主流み
たいでなかなか見つかりません。
0949デフォルトの名無しさんNGNG
sscanfで手っ取り早く・・・
0950デフォルトの名無しさんNGNG
>>948
ソースが汚くて下手だけどここなんかは?
↓
http://www.orchid.co.jp/computer/cschool/csv2.html
0951デフォルトの名無しさんNGNG
>>950
BASICみたいな書きかたしとるな…
0952デフォルトの名無しさんNGNG
>>948
http://www.cs.bell-labs.com/cm/cs/tpop/csvgetline2.c
0953デフォルトの名無しさんNGNG
なんだかんだいろいろあったがそろそろ次スレの季節だな。
まともなスレが立ちますように。
0954デフォルトの名無しさんNGNG
初心者ですが、>>952の日本語訳
プログラミング作法
http://www.ascii.co.jp/books/detail/4-7561/4-7561-3649-4.html
って手元にあっても損はないもんですか?

スレ違いでスマソ。
0955デフォルトの名無しさんNGNG
今ある偽スレを再利用しようよ。<次スレ
0956デフォルトの名無しさんNGNG
糞スレは所詮糞スレ。
駄目な奴は何をやっても駄目
0957デフォルトの名無しさんNGNG
このスレは950を超えました間もなく蛍の光が流れるでしょう。
0958デフォルトの名無しさんNGNG
>>955
またいらぬ荒らしの元になる気がしますが・・・。
0959デフォルトの名無しさんNGNG
蛍の光・・・saturn light
0960デフォルトの名無しさんNGNG
>>955
すでに削除依頼が出ているので、それを待ったほうがイイ。
0961デフォルトの名無しさんNGNG
削除人仕事遅せえ。無能。だから糞スレ立ちつづけるんだ。
0962デフォルトの名無しさんNGNG
47が2つ出来てるよ
0963デフォルトの名無しさんNGNG
新スレが立ちました。
速やかに移行ください
http://pc3.2ch.net/test/read.cgi/tech/1040048527/
0964デフォルトの名無しさんNGNG
>>963
乙・・・って偽スレじゃん。
0965デフォルトの名無しさんNGNG
じゃ、先に立った方の次スレ。

C言語なら、オレに聞け! 47
http://pc3.2ch.net/test/read.cgi/tech/1040048202/
0966デフォルトの名無しさんNGNG
宣言してから立てろよ。毎回乱立させんな。
0967 ◆F52DmOxJlc NGNG
賛否両論あったスレタイだったけど無事に終了しそうだね。
0968デフォルトの名無しさんNGNG
>>967
しかし、10日も持たないとは...。
0969 ◆F52DmOxJlc NGNG
>>968
スレの伸びはいいのにまともな質問が少なくて寂しいね。
やっぱ偽スレ乱立してるせいかな。
0970デフォルトの名無しさんNGNG
>>969
それは、このスレに限らず全般的な傾向だからなぁ...。
極秘に、「まともなプログラム技術板」でも作って欲しい...。
0971デフォルトの名無しさんNGNG
極秘すぎて誰も来ない罠
0972デフォルトの名無しさんNGNG
>>971
まあ、そうなんだよね。
まともだけど、あまり人の来ない掲示板か
ぐちゃぐちゃだけどにぎわってる掲示板...。
究極の選択。

それにしても、最近のぐちゃぐちゃさはちょっと行き過ぎかと。
0973デフォルトの名無しさんNGNG
ぐちゃぐちゃで、かつ人の来ない掲示板
0974デフォルトの名無しさんNGNG
>973
荒らしと変わらん罠
0975デフォルトの名無しさんNGNG
「まともなプログラム技術板」 って、具体的にどんな内容がいいと思うんだ?
0976あぼーんNGNG
あぼーん
0977デフォルトの名無しさんNGNG
>>973
WebProg板とか、ゲーム製作技術とか?w

まだム板はましだな、それと比べると。
0978デフォルトの名無しさんNGNG
char *s = "(゚Д゚)ハァ?";
s = s + s;

これを実行すると "(;´Д`) ハァハァ" になると聞いたのですが、なりません。
どうしてですか?
0979デフォルトの名無しさんNGNG
"(;´Д`) ハァハァ"にはなりません
"(´c_,` ) プッ"になりますよ
0980デフォルトの名無しさんNGNG
うーん、いまいちだったか
0981デフォルトの名無しさんNGNG
えっ!1に戻っちゃったのっ!
早く膿めないと
0982デフォルトの名無しさんNGNG
http://qb.2ch.net/test/read.cgi/saku2ch/1033032078/6
0983デフォルトの名無しさんNGNG
!= と || では優先順位はどちらが高いでしょうか?
0984デフォルトの名無しさんNGNG
みかちゃんの方が大事
0985デフォルトの名無しさんNGNG
!=
つーかリファレンス見れ
0986デフォルトの名無しさんNGNG
>>983
気分次第。
レス数が950を超えています。1000を超えると書き込みができなくなります。