C言語のことは<46>

このエントリーをはてなブックマークに追加
1激しく未定義とする
まず問題を冷静に吟味して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/
2デフォルトの名無しさん:02/12/08 15:25
【コンパイラ】
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
このスレは冗談で作られたニセスレです。ageないようにお願いします。

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

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


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




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

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

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

とやってもダメです。色々調べましたが分かりません。
お願いします。
釣られてたまるか。
このスレは終わりです。
37に釣られないようご注意下さい。
>>39
もう俺は荒らしに負けたよ。
ここが本スレでいいよ。
もしまともな新スレ立てても荒らされて終わりさ。
荒らし本人は正義のつもりなんだろうな。
>>40
それがお前の作戦か?
このスレは糞すれ。放置決定。
>>41
じゃお前はどうしようってんだ。
新しく立てるんなら1の案でも出してみろ。
>>43
図星だからって熱くなってんじゃねーよ。
>>41
はあ?お前リアルで氏ねよ。むかつくな。
>>44
お前頭弱過ぎ。小学校からやり直せ
荒らしてんのお前じゃねーの?

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

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


本スレ争いなんてくだらなすぎ。
もうちょっと大人な解決ができないのだろうか。
#それだけプログラマの年齢が下がってきているということか…。
61デフォルトの名無しさん:02/12/08 20:30
なんでまたそんな構造体をつくりたいんだろう。
>>58
ありがとうございます!!
>>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使うとちょっと楽できる。
>>60
> あぁ,すまん。読み間違えてた。
いや、プロポーショナルフォントだってのを忘れてた。

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

いちおう、その時にはC言語質問所<43>というのが
まだ生きていた(実は「質問所」の最初のスレなので、<43>はおかしい)が、
なぜか<44>を飛ばして<45>という番号を付けやがった。
>>70
別にタイトルなぞどっちでも良いのだが、
「重複スレ排除」というルールに従うべきだろう。
いっそ重複スレは次の予約スレってことに。
77デフォルトの名無しさん:02/12/08 22:42
どこできけばいいかわからないのでここでききます。
IntelのCPUでINT3の命令ってなににつかうのでしょうか?
マニュアル読んでも意味がよくわかりません。
解説お願いします。
>>77すくなくともここで聞く事では無いな。マニュアル読んでも意味が分からないと言うのはちゃんと読んでない証拠。
>>74
粘着キモッ
8077:02/12/08 22:55
>>78
ではあなたはマニュアルを読むと全て理解できるというのですか?
81デフォルトの名無しさん:02/12/08 22:56
>>78
君より分かってるけどね。
8277:02/12/08 23:04
>>81
口ではなんとでもいえますよね。
83デフォルトの名無しさん:02/12/08 23:05
>>77
breakpoint
84ヽ(´ー`)ノ:02/12/08 23:06
このスレは殺伐系ですね。
>>77
アセンブラスレで訊け。
86デフォルトの名無しさん:02/12/08 23:16
>>84
ここはののしりあうためのスレだと思ったのですが
>>80-81
最低限、日本語の読解力は必要。
>>87
すぐ日本語云々だな。そういうのつまらん。
質問しに来た人に親切にしましょうよ。
まあ、このスレを壊したいと未だにがんばる粘着な人もいるんでしょうが。
C言語と関係ない質問に対する反応は未定義です。
>>90
うぜーよ、クズが。
ニヤニヤ(・∀・)>>91
93デフォルトの名無しさん:02/12/09 00:11
質問です。
C言語で作ったウィンドウスプログラムをCGIで出来ますか?
>>93
ネタはもういい。
>>93
(゚Д゚)ハァ?
CGIでWindowsプログラムを作るのか?
Pythonでつくった開発環境みたいなものもあるしな。
はいはい
>>97
テメーは黙れ。
( ´,_ゝ`)
100デフォルトの名無しさん:02/12/09 00:28
100
ごめんなさい。
102デフォルトの名無しさん:02/12/09 00:31
C?
>>93
マジレスするとWindowsでサーバ立ててそこで動くCGIをCで作ることは可能。
>>103
ここは日本語の出来ないやつが来るところじゃないぞ
XEmacsはC言語質問所の1らしい。
放置の方向で。
>>103の書いていることは正しい。
>>105
脳みそ落ちてますよ?( ´,_ゝ`)

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

どうやらCで書けるらしいことと、CGIに利用できそうなことはわかるが・・・
そもそもウィンドウスとは何なのかからしてわれわれは何も知らないのだ。
風が薄いんだろ
125デフォルトの名無しさん:02/12/09 08:49
プログラムをする際にassert()は使いますか?
プログラムをする際以外にassert()は使いません
128125:02/12/09 09:08
>>126
すいません。きちんと書きます。

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

>>139の無限ループについて考察せよ。
>>138
cout いっとけ。
system(const char *string)
> printf覚えた

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

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

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

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

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

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

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

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

は?
>>168
VERIFY() なんての C にあった?
172165:02/12/10 01:12
俺がどちらを使うかはっきりしている場合をあげておく。

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

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

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

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

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

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

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

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

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

でも、実際にそう言う状況があるから、>>135 みたいな話が出てくるんだろ。
>>185
すまん、あなたがどんな主張を持っていて、どのレスをどう解釈してそう逝っているのか
わかんなくなってきたよ。
188186:02/12/10 01:33
>>186
すまん、>>179 じゃねーや。

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

だったよ。
>>184
理由は ?

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

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

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

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

お前アフォだろ ?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

※出力はすべて、printf("%f\n", x)とすること
>>273
宿題丸ちなげかよ
>>273
スレ違い
276デフォルトの名無しさん:02/12/10 22:30
>>273 の、
「小数部のみに変換」ってどうやるのか分からない。
これは「C言語のこと」として識者諸兄に聞いてみたい。
277デフォルトの名無しさん:02/12/10 22:39
>>276
double a = 1.3;
a = a - (long)a;
279デフォルトの名無しさん:02/12/10 22:43
0〜3までの値を取る変数に対して、
0または3を判定する良い方法ないでしょうか?
今こうやってます。
if (n == 0 || n == 3)
ビット演算とか使ったりもっとうまいやりかたがあったら教えてください。
280デフォルトの名無しさん:02/12/10 22:46
>>279
そんなもので劇的に処理速度が上がることはないから気にするな。
トリッキーなコード書いてもしかたない。
>>279
if ( (n&1) ^ (n&2) )
ネタでミスったので師んできます。
283デフォルトの名無しさん:02/12/10 22:51
>>278
だめじゃん、それ
>>279
if(n*n==3*n)
比較演算子のみの>>279が一番速いような気がする
286デフォルトの名無しさん:02/12/10 22:57
>>284
if(n * (n - 3) == 0)
if(n&1==n&2)
>>287
それは駄目だろ。
if ((!!(n&1)) == (!!(n&2)))
か。
289sumaso:02/12/10 23:02
if(n&1==n&2>>1)
ビットパターンが 00 または 11 だから
なんか上手い方法はある気はする。
if(!(n%3))
if((9 >> n) & 1)
293デフォルトの名無しさん:02/12/10 23:09
>>292
そんなのがいきなりソースに出てきたらなにしてんのか絶対分からんと思う。
整数なら >>291で良くない?
例には ==0.0など小数で書かれていないし。
>>292
でもそれうまいね。0と3に限らず、
0〜(intのビット数)の数の任意の組み合わせを
一発でテストできる。
296デフォルトの名無しさん:02/12/10 23:13
>>294
性能的にはむしろ退化しているし、なにしているのか直感的に分かりずらい。
結局279がいまんとこ最強だ。
if((0x09>>n)&1)
なら、さらに察しやすいかな?
298279:02/12/10 23:15
すいません。みなさんありがとうございます。
nは整数で、intでもcharでもなんでもいいです。
299デフォルトの名無しさん:02/12/10 23:18
>>297
ビットでかけるようになってたらもう少しわかりやすいけどね。
if((0b1001 >> n) & 0b0001)
>>294
割り算ってめちゃ遅いって聞いたことあるけど。。。
昔の話かな?
if((int)(n-(3/2.0)))
って、うまく動く?
加減算に比べれば遅いよ。
乗算は物量をぶち込めば1サイクルでなんとかできるけどナー。
303デフォルトの名無しさん:02/12/10 23:23
>>302
いっている意味がよく分かりません。表現を変えてもう一度お願いします。
304279:02/12/10 23:23
多分、アセンブラで条件ジャンプが1つになれば
そっちの方が速いんですよね。
>>292のと比較してみます。
以外と n&1 より n%2 の方が速い。
>>303

>>302>>300へのレスですた。
>>305
漢字を間違ってる時点で信用に値しないですが何か?
実験してないが、計算量を考えると 279 が最も速いように思える。

>>305
大抵の処理系では除算は重いからよろしくナ。
309デフォルトの名無しさん:02/12/10 23:33
>>305
なにを根拠に?
310デフォルトの名無しさん:02/12/10 23:35
>>308
できれば除算の方が重くない処理系ってのをあげてくれ。
最適化すると (n%2) == 1 は (n&1) になるだろう。
どっちが速いもクソも…
>>311
いまさら言い訳ですか?w
313279:02/12/10 23:36
まず、アセンブラ出力になおしてみました。
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
-----------------------------------
314デフォルトの名無しさん:02/12/10 23:37
>>311
そういう最適化をするコンパイラを上げてくれ
>>310

>>308は「すべての」と断言はしなかっただけで
意味的には「すべての」と言いたかったものと思われ。
(´-`).。oO(なんで volatile 付ける必要があるんだろう。。。?)
317279:02/12/10 23:40
なんかうちの環境(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;
}
318279:02/12/10 23:41
>>316
最適化で消えてしまうので・・
なにか良い方法があったらおねがいします。
319デフォルトの名無しさん:02/12/10 23:41
>>313
その2つはあきらかに後者の方がはやい。
でも直感的になにをしているかが分かるのは前者。
後者を使うのならコメントは必須。
320311:02/12/10 23:43
>最適化すると (n%2) == 1 は (n&1) になるだろう。

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

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

>>318
それでも最適化で消える。
328327:02/12/10 23:48
> それでも最適化で消える。

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

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

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

これでどうやって最適化で消えるんだ?
nに値を与えてないのに。
337279:02/12/10 23:51
n = n+ 1にして測ってみたんですが、
結局差は良くわかりませんでした・・。
if (n==0 || n==3)
は、n==0が多い場合に速いのかな。
> VCは最適化しないと&の命令をちゃんと使ってくれないぞ。

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

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

>>343が参照している>>340が参照している>>339に書いてある。
おまいら、もちつけ

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

         ∧_∧
        ( ´∀`) バッチ来いや
        /,   つ
       (_(_, )
         しし'
>>360
逃げた(w
>>358
その事か。
それは 347 の意味だ。
>>363
逃げた(w
それのどこが「消えてなくなる」だYo!
何か、344 が一番よさそうだな。
rand() 呼ぶのもコストかかるし。
366279:02/12/11 00:08
/*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;
}
367279:02/12/11 00:08
これでテストした結果、

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

●||を使った版
>iftestnd
5425 msec
でした。
誤差は+-80msecのぐらいです。
下手に小細工しない方が速いのかな・・
>>364
謝ればいいのか?

   ご め ん ( ̄ー ̄)
Strength reductionも知らずにC言語のことは聞けとかほざく
知ったかさんが集まるスレはここでつか?
>>366
rand()のベンチマークか?
>>369
プ
>>365
volatileにしない場合と同じ結果だとなぜわかる?
>>369
(゚Д゚)ハァ?
374デフォルトの名無しさん:02/12/11 00:11
>>367
シフトしてANDして比較する、

比較して ジャンプ または 比較して ジャンプだからね。
あのなー、キミらconstant foldingくらいは理解して
書いてるんだろうな。
>>372
n は非 volatile で、比較に使われるのは n だろ。
違くなる可能性があるとしたらどういう場合だ?
377デフォルトの名無しさん:02/12/11 00:13
きみらは日本語を理解して書き込んだいるんだろうな?
> 書き込んだいるんだろうな

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

>iftestnd
12055 msec

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

>iftestnd
660 msec

>iftestsh
680 msec

やっぱり単純比較の方が速いよ。
すまん、ループカウンタが増えてたのね。でも、

>iftestnd
6507 msec

>iftestsh
6861 msec

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

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

>iftestmo
24078 msec

>iftestsh
11232 msec

>iftestnd
12004 msec
Pascalなら
if n in [0, 3] then ....
でいいよね。

Modula2のBITSET型もそんなんじゃなかったっけ。
CでBITSETを実現するマクロって書けるかな。
394279:02/12/11 00:28
ちなみにPen!!!-1Ghz(997Mhz)です。
>>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;
}
取りあえずなんちゃってベンチマーク。

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 を除いて、まあ似たり寄ったりだな。
397395:02/12/11 00:32
gccだと-DSHIFTのときにはbt命令を使うので、比較分岐を二回繰り返すよりも
速いようだ。
>>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とか、あちこちで似たようなのが出てくるから、
あっても良いかもね。
>>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);
}
>>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;
}
じゃあ、たぶん、比較する数が3以上だとやっぱり
bitsetが速そうだな。
402279:02/12/11 00:49
ありがとうございます。
環境やコンパイラによってもだいぶ違うみたいですね。
色々と勉強になりました。
329 の

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

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

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

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

どういうデータが渡されて、出力は何?
>>405
0, 1, 3, ... , 254, 255, 2

とか

254, 0, 1, ... 255

とか来たら、どう並んで欲しいの ?
>>405
250、251、253、252、254、0、1、2

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

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

やりたいのは
>>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
となって欲しい




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

127 0 255 128 1 254

とか来たらどうするのかさっぱりわからんぞ
扱ってるデータがパケットとかじゃないことを祈っておこう
128を法としたりしたいのか?
個人的には>>410の方法が一番手っ取り早くて確実だと思う。
カウンタが一周した後の0は同じ0でも違う0だと評価できるような関数を作る。
429これでいいんじゃ?:02/12/11 01:48
if( n[i]%256 == (n[i+1]+1)%256 )
{
int tmp=left;
left=right;
right=tmp;
}
430429:02/12/11 01:50
ゴメン直前に、中途半端に
書き換えちゃった。
left=>n[i]
right=>n[i+1]
としておいて。
431デフォルトの名無しさん:02/12/11 01:52
>>279
亀レス & 処理系依存だけど x86系なら
( ( n - 1 ) & ( n - 4 ) )
>>431
それ、遅そうに見えるけど。
あ!
ドピュッ
スマン逝ってしまった・・・
>>431
それなら
!((n-1)&(n-2))
のほうが分かりやすくないか?
>>434
(゚Д゚)ハァ?
n-2 の正体をあばけ!!
西へ進む >>481
東へ進む >>556
438431:02/12/11 02:08
>>432
CLを使ったシフトよりは良いと思ったけど
レジスタの使う数が増えるから、その可能性も…
439431:02/12/11 02:13
ちゃんとレスを全部読んで無かったけど
>>396
(n & 1) ^ (n & 2)
の方が良かったね…
440デフォルトの名無しさん:02/12/11 02:17
>>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じゃなくて関数ポインタで処理を分けるっていうのはどう?
>>439
それ、駄目ジャン。
442431:02/12/11 02:19
って>>396じゃ駄目駄目じゃん…
首吊ってきます
>>440
そんな事するくらいなら switch 使え。
第一、それで異常値に対応できるのか?
ポテトチップスは結局うすしおが一番なんだよ。
442じゃ無いが
他のコードでも異常値に対応してないと思うが?
446440:02/12/11 02:40
>>443
まあ少なくとも0から3の値以外の配列要素にはアクセスはしない。
それに、俺はただアイディアを出しただけだ。
0〜3以外の値が絶対来ないと家庭して、1bit目と2bitのANDとEXORをとり、
それらのORをとる。
なんだキチガイか。
>>445
一番シンプルな n == 0 || n == 3 は対応してますが何か?
>>447
式に汁
451デフォルトの名無しさん:02/12/11 02:49
>>449
nが0か3のとき?
0〜3じゃないの?
異常値は4以上だろ?
それを判定してないのに
何で、それで対応した事になるんだ?
正常に動く事と、異常だけど動く事は別だろ?
>>453
(゚Д゚)ハァ?
n == 0 || n == 3 以外の場合に動いてしまっていいとでも言うのか?
454デフォルトの名無しさん:02/12/11 02:56
>>452
一理あるけど279さんはそこまで求めていないような・・・
455デフォルトの名無しさん:02/12/11 02:58
みんな、n==0||n==3って書いてるけど、n>=0&&n<=3じゃないの?
>>455
何を根拠に。
>>455
違うだろ。
458455:02/12/11 03:02
ごめん・・・俺の読み違い・・・
>>453
nが0以上3以下って前提があるのに
それ以外の数を与えた場合は結果は当然不定に決まってるだろ?
>>459
安全側に倒すという事を覚えような。
どこにも n=1、2 の側の方が安全だとは書いてないな。
>>460
異常な数が与えられた時に
正常に動いて見える事が安全なのか?
問題の前提条件を疑ったってしょうがないと思うが…
まあ、飽きてネタを振ってるつもりなんだろうが。
ざっと流し読みしただけだけど、>>279 の一連のやつは
>>292 が秀逸だね
まぁすこしインチキっぽい気がしないでもないけど。

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

  if( table[n] )

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

>>469
その場合はどちらとも言えない。
472471:02/12/11 03:20
> 271
ごめん、>>279 の間違い。
>>467
やはりそうだったか・・・
>>396 で10が1より遅いというのはどうかと思うが、まぁいいや
>>473
間接アドレッシングがどうして速いと思うんだ?
はっくしょん!!
>>473
分岐予測が良かったんでないの?
>>279のはC前提みたいだけど、
アセンブラで書くと速くなる事ってない?
>>474
キャッシュにヒットすれば速いでしょう
まあ、ヒットしなければ、とても遅いが…
まぁないだろうな
>>478
このスレを何だと思ってるんですか?
>>481
何とも思ってませんが何か?
>>478
どうして速くなると思うんだ?
>>479
キャッシュとは言え、値をレジスタに拾う n==0 || n==3 より速い訳がなかろう。
485デフォルトの名無しさん:02/12/11 03:37
この中でプロの方はいらっしゃいます?
(((unsigned int)n-1)>1)
はどうだ?
487478:02/12/11 03:38
>483
C言語で直接使えない命令が、
アセンブラにあったりするかもしれないと思ったんで。
(MMXの飽和加算とか。)
>>483
特殊なCPUでnが3か0の時に真であると判定する
命令があれば速くなる
>>485
その質問には答えられません。
>>486
ひょっとして神出現?
>>487-488
なるほど。もっともだ。


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

>>279
iftestnd 1904 msec
>>292
iftestsh 1828 msec
>>486
iftestun 1747 msec
でした。
結構差が出た。
(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
>>491
普通に考えたらないがフラグに直接代入すれば
動くCPUもあるかもしれない (←適当)
(n & (n>>1))
載せ忘れ。

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

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

組み込みでもリセットハンドラで似たようなことをするが
そこではmainからというルール自体が存在しない
> mainからというルール自体が存在しない

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

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

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

ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ
 ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ
ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ
 ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ ハチャ メチャ
こっちで騒いでどないすんねん。
いーなー、こういうノリ好きだ。
嫌いなヤシも居るだろうけど。
あほらしすぎてチョトワラタw
ワラタすぎてチョトあほらしw
>>571
好きなのはどっちのノリだ?
たべるほうかつけるほうか?
575デフォルトの名無しさん:02/12/11 22:55
ボーランドのデバッガ使ってるんですけど、配列の中身を楽に参照
する方法ないでしょうか?いちいちhoge[0]みたいにしていくの面倒
でたまりません。
>>576
食べる方。
韓国ノリとか大好き。
577デフォルトの名無しさん:02/12/11 22:58
お、自己レスですね(・∀・)ニヤニヤ
>>575
ボーランドのデバッガにあるかどうかは知らんが、
大抵のデバッガにはメモリをダンプする機能があり、
そこに配列の先頭アドレスを入れてあげればいい。
自己ノリ
>>578
なるほど!
ありがとうございました。
質問したら最低半日待てよ。
>>581
すいませんでした。
待てっ!
やだ
童貞ですが何か?
中はダメっ!
赤ちゃんできちゃう!
>一行カキコ野郎
新手の荒らしですか?
いかにもCのスレだ(藁
カーボンについて語るスレはここですか?
ドについて騙るスレはここです。
592デフォルトの名無しさん:02/12/12 11:13
C言語今から始めるんだけど、文句ある??ん?
593デフォルトの名無しさん:02/12/12 11:16
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;
}
> 理由が解らずに昨日から悩んでいます。

んなもん、char * でやってみればすぐ解ると思うが。
というか、なんでconst付けんの?
595脱字訂正:02/12/12 11:27
なんでconst付けんの?

なんでconst付けてんの?
const の意味わかってる?
597デフォルトの名無しさん:02/12/12 16:56
色々試して覚えていくもの!
598デフォルトの名無しさん:02/12/12 16:58
ヾ(≧∇≦)/
599デフォルトの名無しさん:02/12/12 18:40
C言語でのプログラミングスタイルについて意見を求む。
C++はダメだよ。Cしか使えないんで。

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

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

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

んで、実際に作った関数
600599:02/12/12 18:41
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;
  }
601599:02/12/12 18:41
  else {
error_end:
    if (buff != NULL) {
      free(buff);
    }
    if (fp != NULL) {
      fclose(fp);
    }

    return NULL;
  }
}
602599:02/12/12 18:41
エラー時は、free()とfclose()しなくちゃいけなくて、それを一箇所にまと
めたいな と思ったらこんなんなったけどどう?読みずらい?
603599:02/12/12 18:43
関数名
×openseek
○openread
604599:02/12/12 18:45
×return buff;
○fclose(fp); return buff;

鬱だ
あんま関係ないけど↑のhogeとかuseで例外起こったら
どうするのが適切?
606599:02/12/12 18:47
×char *buff;
○char *buff = NULL;

あぁ〜もうーーー。スマン心中するよ。
607599:02/12/12 18:51
>>605

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

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

皆さんのお目を汚してゴメンナタイ。・°・(ノД`)・°・。
今日はもう帰りまつ。
>>608
別にgoto使って問題ないパターンだと思われ。
あんまり if (TRUE) {...} else なんてしないが。
こんなヒドいコードよく書けたなぁ.....
BASICみたい
612デフォルトの名無しさん:02/12/12 20:46
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のように順番に次へ次へと読み込む関数なのでしょうか?
言ってることがよくわからなかったりアホなコトだったらすいません。
もしわかる方がいらっしゃいましたらご解答お願いします

613599:02/12/12 20:51
帰宅しますた。
今夜はウドンを湯でまつ。

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

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

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

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

で、なんか綺麗な書き方思い浮かばないんです。
是非、ご教授ください。
ホントに単純なことなんですけど、リンクってどうやるんですか?
>>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;
}
>>615
<a href="www.2ch.net">2ちゃんねる</a>
>>617
いや、そうじゃなくて(ネタだと思うけど)
インクルードは #include<******>
じゃ、リンクはどうやるんですか?
619 ◆F52DmOxJlc :02/12/12 21:35
>>618
リンカにお願いする。
620デフォルトの名無しさん:02/12/12 22:02
#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行目に出ます。どこがおかしいのでしょうか?
621デフォルトの名無しさん:02/12/12 22:11
>>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;
}
>>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;
}
>>612
何故読み取り位置が自動で動くか、という意味でしょうか?
freadをする前に、毎回fseekしなくてはいけない実装がお望みなのでしょうか。
624612:02/12/12 22:31
>>621
それがfreadの中身(?)ってコトでしょうか?
>>623
>何故読み取り位置が自動で動くか、という意味でしょうか?
はい、そうなんです。

625C初心者:02/12/12 22:32
>>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 );
}
626621:02/12/12 22:37
>>624
中身じゃなくて考え方ね。
627デフォルトの名無しさん:02/12/12 22:38
どうすればレジスタを効率的に使えるようにできるのでしょうか?
>>627
良いコンパイラを使う。
>>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() のエラーチェックはいらないのか ?
>>625
ネタか ? 突込みどころ満載なんだが...。
631593:02/12/12 22:48
>>594-596
返事ありがとう。
勿論、char * で警告無しに通るのは試して確認してました。

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

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

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

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


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

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

  タワケ   ワカサマ   ゴランシン
  ∧_∧   ∧_∧    ∧_∧
 ( ・∀・)  ( ・∀・)   ( ・∀・)
⊂ ⊂  )  ( U  つ  ⊂__へ つ
 < < <    ) ) )     (_)|
 (_(_)  (__)_)    彡(__)
642599:02/12/12 23:58
>>616
それだと、fopen() と hoge() の間に処理入れられないのがイヤン。


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


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


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

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


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

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

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

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

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

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

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

 リソースC開放;
失敗C:
 リソースB開放;
失敗B:
 リソースA開放;
失敗A:
 return;
649デフォルトの名無しさん:02/12/13 02:02
>>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;
}
650デフォルトの名無しさん:02/12/13 02:03
>>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;
}
>>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;
}
652651:02/12/13 02:33
651 は脊髄反射ですた。
hoge() とか入っとらん。
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;
}
>>649-650 は、「goto を使った方が分かりやすい場合」 の例でつか?
>  buff && free(buff);
無用。free(NULL)は合法。
> 無用。free(NULL)は合法。

そーでない不確かな処理系がある。
char *p = openseek("text.txt",100);
なんかの処理
free(p);

なんかメモリリーク引き起こしそうな使い方だな。
>     buff && free(buff);
これってありなの?
>>656
どこにあるの?
660658:02/12/13 03:30
なんか言い直した方が良さそうだ。

>     buff && free(buff);
free()の戻り値の型ってvoidなんだけど、
こういう書き方ってできるの?
できる!
662658:02/12/13 03:44
gccではコンパイルは通った。
本当にできるみたい。
ムムム…
buf && (free(buf), 0);
buf && (free(buf), buf=NULL);
その gcc チョンボっぽいな。
2.95.1 は通らない。
666658:02/12/13 04:24
>>665
stdlib.hのインクルード忘れてた。stdio.hは追加したのに…
うちのgccでもエラーになりました。
おいしいビッグマックが食べたい・・・
>>631
> こういったケースをうまく収める定石ってないのでしょうか?

ないと思う。

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

それでいい。

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

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

つーか、全角使うなよ・・・。
>>674
すんまそん、区別がつかない一人です。
違いを教えていただけないでしょうか?
>>674
671が書いてる前提と違ってきていますが
>>674
char hoge[] = ...
だとhogeは配列。hoge[i]に代入しても良い。
hogeには代入できない。
char *hoge = ...
だとhogeはポインタ変数。hoge[i]に代入するのは未定義動作。
hogeには代入してよい。
>>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 の前提がそもそもおかしいという話なのだが。
679675:02/12/13 13:19
>>678
ありがとうございました
今宵はぐっすり眠れそうです。
680675:02/12/13 13:37
>>678
だからといって、前提をあっさりと無視しなくても・・・
>>680
無視と異議の区別は大丈夫か?
>671は>631の話の流れから書いたのだろうけれど。
constをキャストしてまで書き換えるなと言いたいだけでは?
辿るならちゃんと 593 まで辿れ。
const をキャストして書き換える話などではない。
ROM に格納される可能性のあるデータを書き換えてはいけないというのは、
const か否かと全然関係無いじゃん。
671 は const について勘違いしている?
685デフォルトの名無しさん:02/12/13 14:59
見せかけの大人しさ(さいたま)に騙されるな!
埼玉県民の特徴

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

mallocだと、だめなのかなぁ
689デフォルトの名無しさん:02/12/13 15:46
freeでポインタだけしか渡していないので
mallocで確保したサイズが解放できるわけを教えてください。
#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;
}
>>689
実装は処理系定義であり、いろいろな方法が考えられる。
ポピュラーな実装方法としては、malloc() が返すポインタよりも少し前の領域に
サイズを記録しておくとか、メモリ割り当ての管理テーブルを作成しておく等が
ある。
692688:02/12/13 15:55
> 690

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

あとは、理解する頭を・・・
693690:02/12/13 15:55
あ、free(a); 忘れ。(このサンプルでは影響少ないけど)

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

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

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

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

>>697-698
つーか、全部を OS に管理させている処理系は少ないぞ。
C99 PDF の翻訳スレって誰か立てないの?
701593, 631:02/12/13 22:37
# >>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;
}

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

#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'の意味を教えて下さい。
本当に載ってないならその参考書を燃やしてもっとましな新しい参考書を買うよろし
>>701
> if (str) str[0]='b'; /* Warning */

Σ(゚д゚lll)
それおかしい。
C 規格外の動作をしている。
コンパイラは何?
705デフォルトの名無しさん:02/12/13 23:12
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にも応用でき、フレックス・タイム社には商談の話が来ているという。
706デフォルトの名無しさん:02/12/13 23:14
>>703
そんなこと言わないで教えて下さいよー。麻奈本ですけど。おかねないですよ。
>>705は【転送】また、騙された訳だが【完了】
708 ◆F52DmOxJlc :02/12/13 23:17
>>702
ヌル文字
709デフォルトの名無しさん:02/12/13 23:18
ぬる文字?
710593, 631, 701:02/12/13 23:24
>>704
cygwin gcc3.1.1 です。
gcc -ansi -Wall foo.c でコンパイルしました。
何処辺りが規格外なの?


>>702
typo かなっ? // 数値は同じだけど。
> printf("文字列の長さは%dです。\n",i);
< printf("文字列の長さは%dです。\n",c);
711 ◆F52DmOxJlc :02/12/13 23:25
>>653-666
今更だが、
buff && free(buff), 0;
でOK
713712:02/12/13 23:40
でも、見にくくなるだけだから、使わない方がベター
>>712
(゚Д゚)ハァ?
715デフォルトの名無しさん:02/12/13 23:53
関数のポインタってどういうときに使うんですか?
おい・・・
またスレ立てたいだけ厨が出たぞ・・・。
http://pc3.2ch.net/test/read.cgi/tech/1039790146/l50
しかもあっちのスレ、まだ 900 も逝ってないのに。
>>715
qsort()
SetWindowsHookEx()
>>702
strcpy 等で、文字列をコピーするのに
何処が、文字列の終端なのか分からないと
何処までをコピーすれば良いか分かりませんよね?
つーわけで、その'\0'は、文字列の終端である事を表す文字です
>>714
buff && ( free(buff), 0 ) ;
カッコが抜けてた
首吊ってきます
constに代入?
>>715
使うと便利なとき
くだらねぇ。free(buf)でいいだろが。
C厨ならC厨らしく特殊な例外に対応するときはマクロでも使え。
722 に 0.8 票
>>717
ありがとうございます。ところで、
SetWindowsHookEx()ってなんですか?

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



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

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

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

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

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


{
>>767
void poisson_equation(double u[MAX][MAX],double f[MAX][MAX])
>>767
>> {

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

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

#define MAX yahoo

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

ってなってくれんだな。結構慎重に使わないとやばいな。
>>780
ネタなのか?
>>780
Cプリプロセッサはそういう挙動はしない。
ネタにきまってんじゃん
784776:02/12/14 22:06
>>782
じゃあ、どう動くんだ?
>>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.

786結果:02/12/14 22:12

$ cpp hoge.txt

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


1. printf("MAX");
2. yahoo
3. [yahoo]
4.
5.
787776:02/12/14 22:13
>>786
すまんが日本語で説明してくれ
>>787
>>785のhoge.txt にCプリプロセッサをかけると
>>786になる。

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

>>796
確信犯か、わざとやってるかのどっちかだな。
そうします。
>>795
C90およびC99。
>>795
800げっと。
>>794
文字列の連結は、関与と言えば関与のような…
>>780
それはK&Rのfirst editionではないか?
>>801
>>794「文字列リテラルの中」と書いてあるが?
#中という表現もどうかと思うが。
804真面目に質問:02/12/15 00:22
すいません。質問します。

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

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

どうして、こうなるのでしょうか?
すいません、初歩的な質問で・・・
805デフォルトの名無しさん:02/12/15 00:27
>>804
それだけじゃわからん。前後でなにしているのか、どの段階でそうなっているのかかけ。
その関数実行後にそうなっているのか?
環境とコンパイラとデバッグ環境は・
( ´∀`)フフフフフフフフフフフ……(;゚Д゚)ミゲ!
807真面目に質問:02/12/15 00:33
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を使えば、簡単に文字列操作ができますが・・・。

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

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

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

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

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

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

こいつ、ここの人でしょ?
うざいんですけど。
829親切な人:02/12/15 01:03

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

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

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

ヤフー ID の無い方は、下記のホームページから、
購入出来る様です↓
http://www.h5.dion.ne.jp/~gekitoku/#.2ch.net/
830確かにうざいね:02/12/15 01:16
初心者の質問@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
char str[4] = "2ch";

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

なら上手く行くのに


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

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

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

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

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

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

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

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

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

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




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




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

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

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

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

あれだ.
そういうことか、分かった。
よっ、待ってましたっ!!
905デフォルトの名無しさん:02/12/15 03:07
char s[][4] = {"2ch"};
char *s2[3] = (char (*)[3])&(((char *)*s)+1);
906831:02/12/15 03:12
追伸
>>863氏のやり方で上手く行きました。
ただ、何故キャストすると上手く行くのかがよくわかってないのでもう少し考えてみます。
>>831
配列へのポインタは>>882>>883の様にして使います
で警告が出る原因は
char cp[4] = "2ch" ;
int *ip = cp ;
で警告が出るのと同じ様に、左右の型が違うからです
まぁ、これで分からなかったら本でも読んで
もう一度ポインタについて勉強しなおして下さい
>>905への突っこみは誰も入れないのか
つーか、寝てるのか
飽きた
へーちょ
>>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 ;
}
delete noname00.c
913831:02/12/15 15:40
>>907>>911
なんとなくわかってきました。ありがとうございます。
int a;
double b = 1.1;
a = b;
これに対してgccはwarningを出してくれません。
そのせいでバグってた、っての結構ある気がする。
>>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]
としたら出なくなりました。
>>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]
としたら出なくなりました。
連続投稿スマソ。
つーか規制しろよ。
918デフォルトの名無しさん:02/12/15 20:16
char buf[100];
fprintf(stdin , "hello");
fread(stdin , buf , sizeof(buf) - 1);
ってしても読み込めません。これはできないのでしょうか?
ほかにいい方法はありますか?
>>918
> fprintf(stdin , "hello");

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

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

一体何がしたいんだ ?
920918:02/12/15 20:33
>>919
すみません。どういうもんなのでしょうか?
>>920
stdin: Standard Input, 標準入力
fprintf() は、出力する関数だから stdin は使えない。
922918:02/12/15 21:08
>>921
なんとなくわかりました。
やりたかったのは、標準入力されたようにして、freadでその入力されたものを取り出したいと思ったのですが、
どういうふうにすればいいのでしょうか?
>>922
> やりたかったのは、標準入力されたようにして、freadでその入力されたものを取り出したいと思ったのですが、

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

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

strcpy(buff, "hellow");

として、buff をその「別の処理」とやらに渡せばすむ話じゃないの ?
hellow

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

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

どこか有名なところないでしょうか?C言語でCSV形式のファイル
を変換するようなプログラムを求めています。perlとかが主流み
たいでなかなか見つかりません。
sscanfで手っ取り早く・・・
>>948
ソースが汚くて下手だけどここなんかは?

http://www.orchid.co.jp/computer/cschool/csv2.html
>>950
BASICみたいな書きかたしとるな…
なんだかんだいろいろあったがそろそろ次スレの季節だな。
まともなスレが立ちますように。
954デフォルトの名無しさん:02/12/16 23:06
初心者ですが、>>952の日本語訳
プログラミング作法
http://www.ascii.co.jp/books/detail/4-7561/4-7561-3649-4.html
って手元にあっても損はないもんですか?

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

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

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

まだム板はましだな、それと比べると。
char *s = "(゚Д゚)ハァ?";
s = s + s;

これを実行すると "(;´Д`) ハァハァ" になると聞いたのですが、なりません。
どうしてですか?
"(;´Д`) ハァハァ"にはなりません
"(´c_,` ) プッ"になりますよ
うーん、いまいちだったか
981デフォルトの名無しさん:02/12/19 22:15
えっ!1に戻っちゃったのっ!
早く膿めないと
982デフォルトの名無しさん:02/12/19 23:31
983デフォルトの名無しさん:02/12/19 23:35
!= と || では優先順位はどちらが高いでしょうか?
みかちゃんの方が大事
!=
つーかリファレンス見れ
>>983
気分次第。