スレを勃てるまでもないC/C++の質問はここで 5
/^\_
,ィー‐ '⌒´ : : : : ヽ: `ヽ、
, :≦7: : : : : : : : : : : : : : :ヘ : : : \
/: : : /: : : : : : : : : : :∧: : : : :', : : : : :\
rー<⌒\_:_ /: : : : : : :/ : : : :} ',: : : : :}: : :ヽ: : : \
|: : : : l::..::..:ヽ/: :/ : : : :/ /⌒′│j: : : ト: : : ヘ \: :ヽ、
|: : : : |:::::::::::' : / : : : :│: : : / |:ハ : : |ハ: :l : |: : :ヘ
|: : : : |::::::::::i :│ : : : : { : : : ,イ气 リ ヘ : 心}: }: :|: : : :}
. /|: : : : }::::::::::| : | : : : : /l: : :/{::ヘ_∧ j/{rイ: | : h: : :′
' :|: : : : l::::::::::{: ∧: : : /:ヘ: 〈{ Y: : :} Y: |: / }: /
{.:::|: : : : |::::::::::W::{ : :/ : : :V ゞzソ \W ,j/
└┤: : : ヘ:___/⌒l: /: : : : :| " rー┐ }:ヘ
| i: : : : : ヘ ー {^W{: : : i: | { .__{ 厶/
>>1 乙!
| }: : : : : : { : : ヽ、_|: : : l: l / }
|八: : : :∧ヽ`゛<ム : : h:{ ____ , く: : :│
|{ }: : / ヽ{ }: : :|ヘヽ、 /} : 八 } : : |
. j/ ∧ : ト、\ ヽ\} |: /リ
/ ヘ: :l \ } ヽ. j/
/ ヽ{ ,ィー―ヘ \
/ー 、 f } /⌒} //}/⌒ヽ
/⌒ヽ、ヽ /^\ こヘ 〃 に⌒ /ヽ、
{⌒\ ヽ\{\ \}⌒ / { ,/ /∧
,,,..-‐‐‐-..,,,
/::::::::::::::::::::::::ヽ _,..-‐‐-..,,,
l::;;-‐‐-:;;::::::::::::ヽ//-‐,,__ /:::::::::::::::::::::ヽ
l:l ヽ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヽ
ヽ / :::::::::::::::::::::::::::::::::::::;-'^~~^'‐;;:l
~ヽ/ ::::::::::::::::::::::::::::::::ヽミ .ll
/ :::::::::::::::::::::::::::ヽ ,.ノ
/ ::::::::::::::::::::l'^~
‐/-,, (●), 、(●)、 ::::::::::::l フフフ、
>>1 さんおつかれ
l ~^'' ,,ノ(、_, )ヽ、,, :l
'''l^^~~~ `-=ニ=- ' -‐‐‐--l-
ヽ、 ,,,, `ニニ´ ~^'‐..,,_/
/ (:::::} ,,,, イ~'''
l: ~~ {:::::) ::l
l: ~~ l
l、 ,l>
/^‐-,,____,,,,,,,,..................,,,,,,,__,,,.--ヽ
~‐‐'~ ^'‐‐~
boost::shared_ptr< X > X::Add( boost::shared_ptr< X > x ) { vec.push_back( x ) ; return boost::shared_ptr< X >( x ) ; } int main(){ boost::shared_ptr< X > x1 ; boost::shared_ptr< X > x2 ; boost::shared_ptr< X > x3 ; x1->Add( x2 ) ; ※ x1->Add( x3 ) ; } とやりたいんだけど、これだと※の時点でx1の分が終わった時点で x1の参照カウントがゼロになってデリートされちゃいます。 Addの引数と戻り値はこのままでうまいことやる方法はありませんか?
それだけ見ると boost::shared_ptr< X > x1 ; にインスタンス入ってないだけみたいだけど?
boost::shared_ptr< X > x1(new X) ; とやると動くね
別に動作に不具合が生じるわけではないが、 boost::shared_ptr< X > x2(new X) ; boost::shared_ptr< X > x3(new X) ; もする必要はないのかね。 NULL を Add しても意味ないっしょ。 そして、NULL を Add しようとしても無視するかどうか考える必要もある。
boostするメリットって何?
>>9 う、質問が悪かった
boostを利用するメリットって何?
STLで止まってるんだけど俺
>>10 STLを始めとした標準関数・クラスにない機能がboostにはある。
12 :
4 :2008/12/29(月) 16:20:42
>>6 ,7
おっしゃるように全てnewします、すみません
14 :
13 :2008/12/29(月) 16:34:16
ググったけど 日本に馴染むには時間がかかるね
ワロス
日本人はやる気が無いからな。
エロス
テンプレートメタプログラミング mpl - テンプレートメタプログラミングのフレームワーク。 コンパイル時アルゴリズム、シーケンス、メタ関数クラス。 Aleksey Gurtovoy 作 static_assert - 静的アサート(コンパイル時アサート)。 John Maddock 作 type_traits - 型の基本的な特徴のためのテンプレート。 John Maddock, Steve Cleary, et al 作 プリプロセッサメタプログラミング preprocessor - 繰り返しと再帰を含むプリプロセッサメタプログラミングツール群。 Vesa Karvonen 作 並列プログラミング thread - 移植性のある C++ マルチスレッド。 William Kempf 作 数学と計算 math - 数学の領域での多くの貢献。様々な作者による。 conversion - 数学的、多相的、辞書的キャスト Dave Abrahams and Kevlin Henney 作 interval - 数字の範囲に対する通常の数学関数の拡張。Guillaume Melquiond, Herve Bronnimann, Sylvain Pion 作 integer - 汎整数型を簡単に扱うためのヘッダ。 math/common_factor - 最大公約数と最小公倍数。 Daryle Walker 作 math/octonion - 八元数。 Hubert Holin 作 math/quaterion - 四元数。 Hubert Holin 作 日本人作ってねーw
実行はできるのですが、表示がおかしいです。どうにかしてください。 #include <stdio.h> #define BEGIN { #define END } #define MAIN int main() #define PPP = #define STRINGNISURUUUU(x) #x #define STRINGNISURUUU(x) STRINGNISURUUUU(x) #define STRINGNISURUU(x) STRINGNISURUUU(x) #define PERSPECTIVE(x) STRINGNISURUU(x) #define PRINT(x) szFileName(PERSPECTIVE(x)) #define PAUSE getchar(); #define RET return 0; MAIN BEGIN int (*szFileName)() PPP printf; PRINT(パースペクティブ京都マン\n); PAUSE RET END
どうおかしいの
なにこの寒いコード
どういう意味ですか
>>19 こういうのは原則としてやめろ
エディタの補間機能が働かなくなるし
補間機能w
>こういうのは原則としてやめろ これは賛同できる >エディタの補間機能が働かなくなるし wwwwwwwwwwwwwwwwwwwwwwwwwwwwww
HOKANKINOU
その補間機能に痴漢機能はありますか
>>19 実行したら文字化けした
マジレスすると、"文字列"と#文字列は等価じゃない。
#の方はコードに日本語が混じることになるから、文字化けするよ。
うちは化けなかったがなあ
>>28 修正したら上手くいきました。ありがとうございます。
>>23 的外れな意見はいりません。私は「なぜ表示がおかしいのか」を聞いたのです。
>>29 コンパイラによるんじゃね?俺はBCCでやったら化けたよ。
なるほど。化けなかったのはVC++でした。
33 :
28 :2008/12/29(月) 18:44:36
あー、じゃあ
>>28 に書いたことは処理系依存ってことかな
つうかプリプロセス結果を確認すれよ
あれをどう修正したのか気になるw
修正しました #include <stdio.h> int main(void) { pritnf("パースペクティブ京都マン\n"); getchar(); return 0; }
>>37 お前馬鹿か、まだエラーが出るんだけど
WinMainが未解決だよ
エ デ ィ タ の 補 間 機 能
まじれすかよ
補間機能が働いたんだよ
これは補完機能のせいだよ
補間機能って便利なのか?
23 :デフォルトの名無しさん:2008/12/29(月) 18:24:20
>>19 こういうのは原則としてやめろ
エディタの補間機能が働かなくなるし
らしいよ
補完機能だな。
補間機能ww
ゼルゲノム
人類補間計画が発動したと聞いて
23 :デフォルトの名無しさん:2008/12/29(月) 18:24:20
>>19 こういうのは原則としてやめろ
エディタの補間機能が働かなくなるし
よく考えてみたら「補間」ってどういう意味だかわからねえ
それは
>>23 が知っているんじゃないか?
23 :デフォルトの名無しさん:2008/12/29(月) 18:24:20
>>19 こういうのは原則としてやめろ
エディタの補間機能が働かなくなるし
そんなに引っ張るネタか?
>>51 ( ) を書いたら、関数の引数の数に応じて適切な数のコンマが自動的に挿入されるとか。
23 :デフォルトの名無しさん:2008/12/29(月) 18:24:20
>>19 こういうのは原則としてやめろ
エディタの補間機能が働かなくなるし
>>37 #define pritnf printf
が抜けてる
修正しました #include <stdio.h> #define pritnf printf int main (void) {pritnf("パースペクティブ京都マン\n");getchar();return 0;}
なんか改行が変な感じに。。 #include <stdio.h> #define pritnf printf int main(void) { pritnf("パースペクティブ京都マン\n"); getchar(); return 0; }
>
>>57 ジサクジエン王国?
補完と補間の違いがそんなに気なるか?
明らかに不自然だけど
出た、「ジサクジエン」
>>62 気になるから貼っているとでも思っているのか
必死にレス貼ってる奴は何がしたいの?
そんなに貼ってほしいなら・・・
23 :デフォルトの名無しさん:2008/12/29(月) 18:24:20
>>19 こういうのは原則としてやめろ
エディタの補間機能が働かなくなるし
変なマクロを避ける主たる理由が補間機能(笑)ねぇ・・・
23 :デフォルトの名無しさん:2008/12/29(月) 18:24:20
>>19 こういうのは原則としてやめろ
エディタの補間機能が働かなくなるし
23 :デフォルトの名無しさん:2008/12/29(月) 18:24:20
>>19 こういうのは原則としてやめろ
エディタの補間機能が働かなくなるし
53 :デフォルトの名無しさん:2008/12/29(月) 21:46:50
そんなに引っ張るネタか?
62 :デフォルトの名無しさん:2008/12/29(月) 22:22:47
>>57 ジサクジエン王国?
補完と補間の違いがそんなに気なるか?
明らかに不自然だけど
65 :デフォルトの名無しさん:2008/12/29(月) 22:43:15
必死にレス貼ってる奴は何がしたいの?
こういうことですね、分かります
>>69 で、君は何が言いたいの?
何を知ってもらいたい?
さっぱりわからんから説明してくれ
23 :デフォルトの名無しさん:2008/12/29(月) 18:24:20
>>19 こういうのは原則としてやめろ
エディタの補間機能が働かなくなるし
53 :デフォルトの名無しさん:2008/12/29(月) 21:46:50
そんなに引っ張るネタか?
62 :デフォルトの名無しさん:2008/12/29(月) 22:22:47
>>57 ジサクジエン王国?
補完と補間の違いがそんなに気なるか?
明らかに不自然だけど
65 :デフォルトの名無しさん:2008/12/29(月) 22:43:15
必死にレス貼ってる奴は何がしたいの?
70 :デフォルトの名無しさん:2008/12/29(月) 23:13:33
>>69 で、君は何が言いたいの?
何を知ってもらいたい?
さっぱりわからんから説明してくれ
70 デフォルトの名無しさん[sage] 2008/12/29(月) 23:13:33
>>69 で、君は何が言いたいの?
何を知ってもらいたい?
さっぱりわからんから説明してくれ
71 デフォルトの名無しさん[sage] 2008/12/29(月) 23:20:58
23 :デフォルトの名無しさん:2008/12/29(月) 18:24:20
>>19 こういうのは原則としてやめろ
エディタの補間機能が働かなくなるし
53 :デフォルトの名無しさん:2008/12/29(月) 21:46:50
そんなに引っ張るネタか?
62 :デフォルトの名無しさん:2008/12/29(月) 22:22:47
>>57 ジサクジエン王国?
補完と補間の違いがそんなに気なるか?
明らかに不自然だけど
65 :デフォルトの名無しさん:2008/12/29(月) 22:43:15
必死にレス貼ってる奴は何がしたいの?
70 :デフォルトの名無しさん:2008/12/29(月) 23:13:33
>>69 で、君は何が言いたいの?
何を知ってもらいたい?
さっぱりわからんから説明してくれ
もういい加減にしてくれ・・・・・・・
72 :デフォルトの名無しさん:2008/12/29(月) 23:22:37
70 デフォルトの名無しさん[sage] 2008/12/29(月) 23:13:33
>>69 で、君は何が言いたいの?
何を知ってもらいたい?
さっぱりわからんから説明してくれ
71 デフォルトの名無しさん[sage] 2008/12/29(月) 23:20:58
23 :デフォルトの名無しさん:2008/12/29(月) 18:24:20
>>19 こういうのは原則としてやめろ
エディタの補間機能が働かなくなるし
53 :デフォルトの名無しさん:2008/12/29(月) 21:46:50
そんなに引っ張るネタか?
62 :デフォルトの名無しさん:2008/12/29(月) 22:22:47
>>57 ジサクジエン王国?
補完と補間の違いがそんなに気なるか?
明らかに不自然だけど
65 :デフォルトの名無しさん:2008/12/29(月) 22:43:15
必死にレス貼ってる奴は何がしたいの?
70 :デフォルトの名無しさん:2008/12/29(月) 23:13:33
>>69 で、君は何が言いたいの?
何を知ってもらいたい?
さっぱりわからんから説明してくれ
61 :デフォルトの名無しさん:2008/12/29(月) 22:15:32 > 61 :デフォルトの名無しさん:2008/12/29(月) 22:15:32 > 61 :デフォルトの名無しさん:2008/12/29(月) 22:15:32 > 61 :デフォルトの名無しさん:2008/12/29(月) 22:15:32 > 61 :デフォルトの名無しさん:2008/12/29(月) 22:15:32 >
/^\_
,ィー‐ '⌒´ : : : : ヽ: `ヽ、
, :≦7: : : : : : : : : : : : : : :ヘ : : : \
/: : : /: : : : : : : : : : :∧: : : : :', : : : : :\
rー<⌒\_:_ /: : : : : : :/ : : : :} ',: : : : :}: : :ヽ: : : \
|: : : : l::..::..:ヽ/: :/ : : : :/ /⌒′│j: : : ト: : : ヘ \: :ヽ、
|: : : : |:::::::::::' : / : : : :│: : : / |:ハ : : |ハ: :l : |: : :ヘ
|: : : : |::::::::::i :│ : : : : { : : : ,イ气 リ ヘ : 心}: }: :|: : : :}
. /|: : : : }::::::::::| : | : : : : /l: : :/{::ヘ_∧ j/{rイ: | : h: : :′
' :|: : : : l::::::::::{: ∧: : : /:ヘ: 〈{ Y: : :} Y: |: / }: /
{.:::|: : : : |::::::::::W::{ : :/ : : :V ゞzソ \W ,j/
└┤: : : ヘ:___/⌒l: /: : : : :| " rー┐ }:ヘ
| i: : : : : ヘ ー {^W{: : : i: | { .__{ 厶/
>>1 乙!
| }: : : : : : { : : ヽ、_|: : : l: l / }
|八: : : :∧ヽ`゛<ム : : h:{ ____ , く: : :│
|{ }: : / ヽ{ }: : :|ヘヽ、 /} : 八 } : : |
. j/ ∧ : ト、\ ヽ\} |: /リ
/ ヘ: :l \ } ヽ. j/
,,,..-‐‐‐-..,,,
/::::::::::::::::::::::::ヽ _,..-‐‐-..,,,
l::;;-‐‐-:;;::::::::::::ヽ//-‐,,__ /:::::::::::::::::::::ヽ
l:l ヽ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヽ
ヽ / :::::::::::::::::::::::::::::::::::::;-'^~~^'‐;;:l
~ヽ/ ::::::::::::::::::::::::::::::::ヽミ .ll
/ :::::::::::::::::::::::::::ヽ ,.ノ
/ ::::::::::::::::::::l'^~
‐/-,, (●), 、(●)、 ::::::::::::l
,,,..-‐‐‐-..,,, /::::::::::::::::::::::::ヽ _,..-‐‐-..,,, l::;;-‐‐-:;;::::::::::::ヽ//-‐,,__ /:::::::::::::::::::::ヽ l:l ヽ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ヽ ヽ / :::::::::::::::::::::::::::::::::::::;-'^~~^'‐;;:l ~ヽ/ ::::::::::::::::::::::::::::::::ヽミ .ll / :::::::::::::::::::::::::::ヽ ,.ノ / ::::::::::::::::::::l'^~ ‐/-,, (●), 、(●)、 ::::::::::::l そう…。そのまま飲み込んで。僕のエクスカリバー…
なんでだよw
printf("
>>77 ってなんか元ネタがあるの?\n");
scanf("ハム太郎だと思われ", &n);
while (1) cout << _T("これがBLというやつか") << endl;
ハム太郎ってBLものだっけ
#include <stdio.h> int sum(int,int); int main(void); { int ham; ham = sum(50,20); printf("%d\n",ham); printf("%d\n",ham + 20); return 0; } int sum(int mix,int max) { int num; num = (mix + max) / 2 * 3 -100; return num; } 6) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?) なにがちがうんじゃあああ
int main(void); ←!!!!!!!
そ・・そうか!!! サンクス!
STLにマルチスレッド 例外発生しまくりなんだけど なにかいいソースコード入力方法ない? デバック追跡機能追加ともいいのかな やっぱクリティカルセクション使わなければいけないのかな? 面倒くさいのよね
STLはスレッドアンセーフだからマルチスレッドでは使っちゃダメ 別のスレッドセーフに設計されたライブラリを使いなさい
>>88 クリティカルセクションで保護しても無理ですかね?
>>89 速度がガタ落ちになってもいいならそれでどうぞ
>>36 俺はそこで引き合いに出されている診断室を思い出したw
92 :
デフォルトの名無しさん :2008/12/30(火) 12:09:13
スマートポインターを7種類も8種類も作って、C++のコミュニティって馬鹿なの? これを用途によって間違わずに使い分けるより、new-deleteの対応付けをきっちりやる方が余程簡単だっつーのw ホント馬鹿だな。
プログラムの進捗状況をグラフみたいので表示したいんだが、 グラフィックスライブラリって何がいい? 今から勉強するんだが
プロジェクト管理ツール使ってみては
95 :
デフォルトの名無しさん :2008/12/30(火) 12:14:42
C++は標準のGCを備えない時代遅れのダメ言語 スマートポインタ(笑)を乱造する知的障害者が設計している
>>95 またお前か。スマートポインタの種類の数にやたら固執するね。
3つ以上は使いこなせなくて挫折したんだろ。
98 :
デフォルトの名無しさん :2008/12/30(火) 13:17:01
GCは良いことばかりではないよ。処理に時間食うし。 あと何度も使う配列はグローバルにすれば、再生成に時間食わない。
99 :
デフォルトの名無しさん :2008/12/30(火) 13:18:20
プログラム書く前に吟味してから作り出せばGC(に任せる処理)は無くせるだろ。
100 :
デフォルトの名無しさん :2008/12/30(火) 13:49:40
>>99 それならスマートポインタ(笑)もいらないだろ馬鹿
102 :
デフォルトの名無しさん :2008/12/30(火) 14:03:27
マジレスすると、 単純にnew delete の解放忘れで発生するバグと ごちゃごちゃしたスマートポインタの使い間違いによるバグと どっちが発生しやすいと思う? 後者の方が断然多いと思うのだが。
ゴチャゴチャしたスマートポインタって、たとえばどんな?
105 :
デフォルトの名無しさん :2008/12/30(火) 14:25:06
auto_ptr weak_ptr intrusive_ptr scoped_ptr
>>105 それをゴチャゴチャしていると感じるなら、単にそれはお前の勉強不足。
自分の勉強不足を棚に上げてよく言うよ
スマートポインタですら管理できないならC/C++はやめた方が・・・
108 :
デフォルトの名無しさん :2008/12/30(火) 14:33:19
>>106 で、new-deleteよりスマートポインタの方が問題が発生しにくいことについて、
お前の「勉強」の成果は述べないの?
>>108 人の事を気にする前に自分の能の無さを嘆けよw
110 :
デフォルトの名無しさん :2008/12/30(火) 14:39:43
new-deleteの方が、スマートポインタより問題が少ないという仮説を述べた。
それに対して
>>106 は勉強不足とか頓珍漢な事を言っている。
勉強不足と言うなら、どう勉強不足なのか具体的に説明しろ。
それが出来ないなら
>>106 は単なる馬鹿だ。話にならん。
>>110 うぜえんだよゴチャゴチャと
スマートポインタについて説明しだすと長くなる
勉強にも長い時間がかかるしな
お前の屁理屈に付き合ってる時間はない
仮説って・・・ 根拠もなく「俺は思うのだが」を仮説と呼ぶのか?
シチューの方が、カレーよりうまいという仮説を述べた。
それに対して
>>106 は食わず嫌いだとか頓珍漢な事を言っている。
食わず嫌いと言うのなら、どう食わず嫌いなのか具体的に説明しろ。
それが出来ないなら
>>106 は単なる馬鹿だ。話にならん。
114 :
デフォルトの名無しさん :2008/12/30(火) 15:10:05
GCもnewも使わず、STL一本でいけば良いと思うんだが。 そしたら自動変数と同じ使い方でしょ。
115 :
デフォルトの名無しさん :2008/12/30(火) 15:11:36
速度や安定性重視ならはじめに確保したメモリを使い回すのが良いし。 頻繁に動的確保するのは、速度と安定面でよくない。
116 :
デフォルトの名無しさん :2008/12/30(火) 15:15:46
STLを含めて動的確保は実測してみると速度が遅い。 C++の自動変数だと、あらかじめ確保した領域を、使い回すから、確保と解放が無くて良い。
>>116 自動変数はスタック領域だから、あらかじめ確保した領域を使いまわすってのは
ちょっと違うだろ
まぁ 「厳密にいえば間違ってはいない」 ってやつだろうが
ageてる釣り野郎に反応しちゃダメだってば
119 :
デフォルトの名無しさん :2008/12/30(火) 15:53:49
スタック領域 = あらかじめ確保した領域 必要なサイズがコンパイル時に決定されて、それを確保したらC++が管理して使い回す。
スマートポインタに迷ったらshared_ptr/array使っておけばいいじゃない。 循環参照?何それおいしいの? まあでもスマートポインタの乱立を許したのはC++の失策だったと思う。 auto_ptrの代わりにshared_ptrをC++98の時点で入れておけば少しは良くなったと思うんだけど。
>>108 こいつ頭おかしいな。
これで仕事とか勤まるのか?
>>121 こいつ頭おかしいな。
これで仕事とか勤まるのか?
自作自演くせえなあ
124 :
4 :2008/12/30(火) 16:30:05
4ですが、あまりのスルーされっぷりに泣きそうです
>>123 だってマジで頭おかしいもん。
new-deleteのほうが問題起きないって、証明どころか傍証をあげるとか
説明もいっさいなしで、
>>108 の頭の中では、いつのまにか証明済みっていうか
「事実」になちゃってるわけでしょ?
>>110 で、多少おかしいと思ったのか「仮説」って言い直してるけど、
自分から言い出したのに、相変わらず相手に反論しろって言ってるし。
127 :
デフォルトの名無しさん :2008/12/30(火) 16:50:11
new-deleteでは、newしたら必ずdeleteすることだけを覚えておけば問題が起きない。 スマートポインタは乱立するそれぞれのポインタの特性を覚えておかなければいけない。 例えば、shared_ptrを使うところをweak_ptr を使ったら死亡。 故に、new-deleteの方が問題起きない。 証明終
>>127 俺がいまいじってるソースは、異常ケースでreturnして、delete忘れてるってのが
何箇所もあるんだけど。
すげぇ真性のバカだな 証明終 とか書いちゃってもうみてらんない
注意してコーディングしてればなんとかなるってもんじゃないから、 あたらしい言語はGC採用してるんだろ。
132 :
デフォルトの名無しさん :2008/12/30(火) 16:59:13
つまり、C++は標準のGCを備えない時代遅れのダメ言語ってことだな。
もうそういう事でいいようぜぇ
悔しいが、反論できない、、
C++/CLIがあるじゃないか
Dみたいに、GCあって、スコープが外れたらデストラクタ(相当)が呼ばれるって 仕組みがあればいいけど、ま、C++ならスマートポインタでいいかな。
137 :
デフォルトの名無しさん :2008/12/30(火) 17:06:10
auto と同じ使い方だけで良いんだったらSTL使えばいいじゃん
GCはメモリに対してリークの心配がなくなるというだけであって、 それ以外のリソースには無力だぞ
>>130 反論できないからってごまかしてんじゃねーよカス
140 :
デフォルトの名無しさん :2008/12/30(火) 17:11:30
GCが標準装備だったら、高性能なハードでない場合に困るだろ。 組み込みとか 組み込みシステム - Wikipedia 具体例 家庭用電気機械器具 炊飯器、洗濯機、エアコンディショナー デジタルカメラ テレビ、ビデオデッキなどAV機器 ゲーム機、携帯電話などのデジタル家電 エレベーター 信号機 複写機 自動販売機 パチンコ機、パチスロ機、スロットマシン
世の中、参照カウントでGC付きって言っている言語処理系だってあるんだから、
C++でコーディングするときも常にshared_ptrを使えばいいんだよ。
>>127 の「newしたら必ずdeleteすること」を次のように言い換える。
new→newしてshared_ptrの構築
delete→reset()
128の問題は無くなるし、循環参照もnew-deleteで(手動でやれば)問題にならないならば、
shared_ptrでも手動でやれば問題ないはず。
性能とか組込とか知らんがなという前提で。
142 :
デフォルトの名無しさん :2008/12/30(火) 17:18:21
あんまり関数を分けると重くなるから良くないって聞いたことあるけど、それって 昔のCPUがしょぼしょぼの時の話しで今ではそれほど気にしなくていい? たまに数行づつで関数に分けてる人いるけどそのぐらいまでやっちゃっていいの?
144 :
デフォルトの名無しさん :2008/12/30(火) 17:22:38
>>143 程度によるが、最新のコンパイラを使っていれば差はたいしてでない。
分割したりオブジェクト指向にすることは、管理が楽になるという利点がある。
145 :
デフォルトの名無しさん :2008/12/30(火) 17:25:21
でも、再帰呼び出しは確実に遅くなるよ。ループに書き換えられるという再帰定理というのがあるので なるべく再帰呼び出しは使わない方が良い。
「早すぎる最適化は諸悪の根源」 実行性能が許容できないくらい悪くて、その原因が本当に 関数呼び出しのコストだと分かった時点で初めて そういう小手先の手段に出るものだ そんな関数の分け方くらいではまず間違いなく性能に何の影響もないと思うが
>>143 数行とか一行の関数を書くとか普通だから。
>>139 おまえは常に「覚えておいて」プログラム組んでろカス
>>145 意味が分からない。
「末尾再帰だったら、再帰でもいい」とかだったら意味が通じるけど。
(再帰だって、速度に問題なかったらふつーに使うわな。あたりまえだけど)
再帰はループに書き換えられるよ!って言ってるんだろう
151 :
デフォルトの名無しさん :2008/12/30(火) 17:35:07
関数呼び出しに、時間食ってるのでは? と予測してマクロ関数に書き換えてみたり するのだが、ほとんど差が出ないという経験から関数として\を使うマクロは使わないことにしている。
ありがとう。とりあえずガンガン関数に分けちゃって問題ないんだね これからはガンガン分けていくことにします
153 :
デフォルトの名無しさん :2008/12/30(火) 17:44:46
MS-BASICはガベージコレクション内蔵らしいね
>>143 数行の関数を作ってもOKだし推奨
関数の呼び出しのコストが問題になるのはループ内とかとにかく繰り返し多数呼び出される場合だね。そういう場合はinlineを使う。
仮想関数は少し重めだからループ内では要注意
最近のコンパイラはinlineの指定をしなくても勝手に判断してインライン展開をしてくれるから気にしないでいい。
>>153 ああ文字列の操作領域だろ
確か3Kバイトが標準で一杯になったらGCを走らせる
8ビットならではの世界だった
N88BASIC(86)はもう少し広いだろうが
突然マイコンが止まるあれだね
そうそう BASICで文字列を頻繁に操作していると時々止まった その謎が解けるまで(つまりはGCだという事を知るまで)時間がかかった
GC GCってゲームキューブじゃないのなw 何の騒ぎかわからんかったよ
>158 ゲーム関連板ならゲームキューブのことだろうけど ここはプログラム板だぞw ガベージコレクションに決まっておろう
どの言語を覚えればいいの・・? C言語ってだめなの??
161 :
デフォルトの名無しさん :2008/12/30(火) 19:09:13
Cでいいよ。C++でもいいけど。
C++ってCの付けたし見たいなものだよね・・?
CがC++の一部を抜き出したものだと思え
わかりました
>>162 いまや全くの別物のくせに、そういう偏見が間違っているとも言えない微妙な関係。
166 :
デフォルトの名無しさん :2008/12/30(火) 19:37:27
まあ、質問スレを共通にされるくらいだから、同じようなものだ
167 :
デフォルトの名無しさん :2008/12/30(火) 20:50:04
結論としては、shared_ptr以外は不要ってことで、おk?
>>167 他のスマートポインタも使い方憶えればいいんじゃない?
169 :
デフォルトの名無しさん :2008/12/30(火) 20:55:54
struct shiken_in test; memset(&test,0,sizeof(test)); このような文があるのですが、 &testがさす意味はなんなのでしょうか? &がつく意味がよくわからないのです
アドレスです
171 :
デフォルトの名無しさん :2008/12/30(火) 21:02:39
>>168 覚えたとしても、それらを使い間違わないようにビクビクしながら使うよりは、
単純にshared_ptr使った方が、バグが少ない堅いコーディングができると思うけど。
172 :
デフォルトの名無しさん :2008/12/30(火) 21:07:19
>>170 ポインタの宣言がなくてもアドレスは使用可なのでしょうか
ていうか、子の場合アドレスで指定する意味はなんでしょうか?
173 :
デフォルトの名無しさん :2008/12/30(火) 21:10:39
コピーを避けるためです。
174 :
デフォルトの名無しさん :2008/12/30(火) 21:30:52
ポインタならコピーをされる?
ポインタなら、ポインタだけ渡せばいいからデータ自体はコピーされない
>>167 自ら使うのはshared_ptrだけでもいい。次期標準にも入る。
入るおかげで、C++0xでは、標準に入っていないのは無視してOKと言えるようになるんだが。
例えば、
>>105 で挙げられているintrusive_ptrは知っていても大多数が使ったことないだろう(俺もだ)。
scoped_ptrはauto_ptrとまとめてunique_ptrになる。
#びくびくせず自信を持って使えるならweak_ptrも使ってほしい。
177 :
169 :2008/12/30(火) 21:51:30
ますますよくわからなくなってきた まず、構造体を宣言して sizeof(test)でなにをかえすんだろうか testの中身は宣言だけしてるだけで、実際何もはいってない?いや、0ならはいってるのかな で、memsetでそのtestのアドレスの先頭からだけど、testのアドレスの中身じゃなくて、アドレスの 先頭から0で埋めるとかおかしくないのかな。アドレスであってアドレスが差す値じゃないから。
memsetは、アドレスが指す領域を指定した値で埋める関数だよ
sizeof testはsizeof (struct shiken_in)と同じと決まっている。 memsetにはアドレスを渡すけど、 memsetが0で埋めるのは、アドレスが差す値。
変数じゃなくて、変数の「場所」を渡してる memsetはその「場所」をみてそこをsizeof(test)バイト分0で埋めてる
>>171 まあ、でも、そこまで難しいものでもないし。
182 :
169 :2008/12/30(火) 22:20:36
実際、sizeof(test)は何バイトになるのでしょうか?
わかりません
184 :
デフォルトの名無しさん :2008/12/30(火) 22:26:41
>>182 testの型による。
testはどう宣言してるの?
185 :
169 :2008/12/30(火) 22:40:44
struct shiken_in test;
>>184 はい、このように宣言しております
やべぇちょっと笑ってしまった
structなんだからstruct shiken_in がなんなのか探せ
そもそも shiken_in が分かったところで アラインメントの設定が分からんとサイズは分からんだろ。
>182 shiken_in のサイズになる。 具体的には環境による。
190 :
169 :2008/12/30(火) 23:05:34
sockaddr_in すみません、正確にはこういう構造体です 中身はかいてません。sizeofしたら何バイトになるのかな?
sizeof すればいいじゃん。
だから構造体のメンバの内容とアライメントの2つの情報がないと誰にも答えられないんだってば。 そして理屈抜きでサイズだけ知りたいなら5行くらいのソースを書いてsizeofを見るのが一番早い。
typedef struct DADADADADADADA { char p[1024]; } CDDB; CDDB cddb; int main(void) { return cddb; }
194 :
デフォルトの名無しさん :2008/12/30(火) 23:28:33
printf("sizeof(struct sokaddr_in)=%d\n", sizeof(struct sockaddr_in));
printf("%d\n", sizeof(printf));
196 :
デフォルトの名無しさん :2008/12/31(水) 12:48:14
>>140 言語が標準GCを備えることと、GCが言語の使用と不可分でシステムに組み込まれることとは別だろ。
「高性能なハード」とやらの場合には、GCを組み込んで
「高性能なハード」でない場合には、GCを組み込まず手動のメモリ管理を使用してシステムを構築すればいい。
C++はマルチパラダイム言語とやらを標榜するくらいだから、それくらい普通にするだろ。
それなのに何故標準GCを提供しないのか意味不明。
きっと言語設計者およびその取り巻きはバカなんだろうな。
ということにしたいのですね
198 :
デフォルトの名無しさん :2008/12/31(水) 12:58:24
したいのではなく、事実なのです。
>>196 高性能なハードでない場合には手動のメモリ管理を使用してってwwwwwwww
その辺が自動化できればGCを導入するのに必要な苦労がいないし、GCもいらないじゃんwwww
バカかこいつは
ということにしたいのですね
201 :
デフォルトの名無しさん :2008/12/31(水) 12:59:29
>>196 GCの有無で言語仕様が大きく変わるんだよ。
GCが必要な人はGCを持つ言語を使えばいい。GCが不要な人はGCがない言語を使えばいい。
203 :
デフォルトの名無しさん :2008/12/31(水) 13:04:28
>>202 変わるのではなく、パラダイムが追加されればいいんだろ。
GCが必要な人はC++をGCを持つ言語として使えばいい。GCが不要な人はC++をGCがない言語として使えばいい。
C++はそういうことが得意な言語じゃないのか?
204 :
デフォルトの名無しさん :2008/12/31(水) 13:05:56
C++はgcがない言語
>>203 パラダイムという言葉を使わずに、C++にGCを実装するのに必要なことは何か言ってごらん。
ゲームキューブで議論するスレだったのか
C++/CLI使えばいいじゃん
>>203 一方C++はスマートポインタを実装した。
一方STL野郎は独自のアルゴリズムを実装した
210 :
デフォルトの名無しさん :2008/12/31(水) 15:00:21
>>205 先ず、お前の勘違いを訂正する。
実装するのはC++にではなく、C++の処理系に対して。
C++の処理系にGCを実装するのに必要なことは
GCの設計/コーディング/デバグ
それ以前に、C++の言語仕様にGCの仕様を追加する必要がある。
お手軽に付け外しができる機能とでも思ってるのか
212 :
デフォルトの名無しさん :2008/12/31(水) 15:09:38
日本語でおk
214 :
205 :2008/12/31(水) 15:36:48
215 :
デフォルトの名無しさん :2008/12/31(水) 15:39:09
C++0x
素晴らしいオセロゲームを作りたいんですが・・・ 作れるようになるまでに、どれくらいかかるんでしょうか?
自分が出来を素晴らしいと思えるようになるまで。
219 :
デフォルトの名無しさん :2008/12/31(水) 17:32:14
3ヶ月くらい
23 :デフォルトの名無しさん:2008/12/29(月) 18:24:20
>>19 こういうのは原則としてやめろ
エディタの補間機能が働かなくなるし
>>217 素晴らしいの意味によるし、経験にも依るでしょ。
強いという意味なら自分で考えるならそれなりに解析が必要。
見栄えという意味ならお絵描き/画像作りが必要。
どれくらいって聞いてるのに、グダグダうるせーっつーの。 お前らは期間を示せばいいんだよ。前提があるなら前提も示せっつーの。
>>223 わざわざ答えてもらってるのに失礼じゃないですか
そういうレスはやめてください
223 :デフォルトの名無しさん:2008/12/31(水) 18:03:39 どれくらいって聞いてるのに、グダグダうるせーっつーの。 お前らは期間を示せばいいんだよ。前提があるなら前提も示せっつーの。
223 :デフォルトの名無しさん:2008/12/31(水) 18:03:39 どれくらいって聞いてるのに、グダグダうるせーっつーの。 お前らは期間を示せばいいんだよ。前提があるなら前提も示せっつーの。
>>222 C言語を学ぶだけではなく、絵もうまくなる必要があるってことですね!
223 :デフォルトの名無しさん:2008/12/31(水) 18:03:39 どれくらいって聞いてるのに、グダグダうるせーっつーの。 お前らは期間を示せばいいんだよ。前提があるなら前提も示せっつーの。
223 :デフォルトの名無しさん:2008/12/31(水) 18:03:39 どれくらいって聞いてるのに、グダグダうるせーっつーの。 お前らは期間を示せばいいんだよ。前提があるなら前提も示せっつーの。
223 :デフォルトの名無しさん:2008/12/31(水) 18:03:39 どれくらいって聞いてるのに、グダグダうるせーっつーの。 お前らは期間を示せばいいんだよ。前提があるなら前提も示せっつーの。
>>223 期間 : 5か月くらい
前提 : 俺が作るとして
223 :デフォルトの名無しさん:2008/12/31(水) 18:03:39 どれくらいって聞いてるのに、グダグダうるせーっつーの。 お前らは期間を示せばいいんだよ。前提があるなら前提も示せっつーの。
223 :デフォルトの名無しさん:2008/12/31(水) 18:03:39 どれくらいって聞いてるのに、グダグダうるせーっつーの。 お前らは期間を示せばいいんだよ。前提があるなら前提も示せっつーの。
なんか、新しいスレになってから荒れてるね
223 :デフォルトの名無しさん:2008/12/31(水) 18:03:39 どれくらいって聞いてるのに、グダグダうるせーっつーの。 お前らは期間を示せばいいんだよ。前提があるなら前提も示せっつーの。
だめだ・・・僕にはプログラミングなんて・・無理かもしれない・・
なぜ?具体的に。
・・いま苦Cで文字列を扱う方法してるんですけど・・ そこで少し分厚い壁に当たってしまいました・・ こんなしょっぱなから壁にぶつかるようじゃ、俺にC言語習得なんて無理なんじゃないか・・? って考えてます・・
全然具体的じゃないきがするなぁ プログラムでつまづくのは別にいいけど「良い質問/相談」を持ちかけるのはやっぱり必要だとオモ あ、あけましておめでとう
>>241 web で勉強してるの?個人的には本一冊買った方が良いと思うなぁ。
あと、論理的思考能力とやる気さえあればプログラミングはできるよ。
あけましておめでとうございます
>>243 よし!本を買うことにします
>>241 俺もWEBで勉強した
で、した感想
本買ったほうが100倍速いぞw
やはり、特に用途がないものを学ぶのは辛いもの。 勉強でやってるなら、とりあえず作ってみて 必要になったら、Webなり2chで聞くなりした方が絶対覚えが早いよ。
gets()は絶対に使ってはならない ↑実際どうなの
実際そのとおり。fgetsで何も困らない。
使うべきではない、が正しいと思う。 バッファオーバーフローで、PCがハック(今ではクラックの方が正しいか)されたいのであれば、使えばいい。 1988年にfingerdを襲った悲劇の教訓からそう語り継がれているんだよ。
やっぱそうか 1つくらいいいところあるかなと思ったけど、いいとこないな
251 :
デフォルトの名無しさん :2009/01/01(木) 13:15:35
list< orekurasu > data; data
252 :
デフォルトの名無しさん :2009/01/01(木) 13:19:38
list< orekurasu > data; として dataにデータを入れて、リストで3連続するもののうち、 前後の二つと中央のデータにある違いがある場合、真ん中のデータを削除したいのですが、 remove_ifと叙述関数(プレディケート)を使って作れますか? 叙述関数では各要素毎にしか比較できませんか?
253 :
デフォルトの名無しさん :2009/01/01(木) 13:20:58
まとめるとremove_ifで、一つ前と一つ後ろのデータを参照して削除可能かということです。
254 :
デフォルトの名無しさん :2009/01/01(木) 13:23:26
無理なら、別に良いです。 remove_ifなしで書けば済むので。
無理じゃね? そもそも、範囲が違う (remove_ifは要素全部、3連続比較は(本質的には)要素数-2個の範囲)
比較を削除前の列に対して行うかどうかって話もあるし単純には無理だろう。 A B C D E で B を削除するとして C に対する比較は B C D なのか A C D なのか、とか。
257 :
デフォルトの名無しさん :2009/01/01(木) 14:41:09
誤爆してきた死ね おすすめのC++入門サイトを教えてください。 Cは未経験です
AやBからはじめるとよいお
259 :
【148円】 【大吉】 :2009/01/01(木) 15:21:22
お年玉がほしい。
まずCをやったほうがいい。でないと死ぬ。 もし、正しい理解とかどうでもいいから速攻でC++が使えないと困るみたいな 状況だったら素直に質問にそう書いた方がいい。 (叩かれるかもしれないけど)
べつにC++からでいいよ。 C++やってる連中が自分がCから入ったから、それがいいって思い込んでるだけ。
C++やってるうちにCもできるようになると思う
むしろC++からの方が分かりやすいよね。 C は初っ端から printf とか scanf とか面倒くさいし (C++は桁数指定とかしないのであればフォーマット指定の必要がない)、 関数に変数の値を変更してもらうのにもポインタなんぞが必要になるし(C++なら参照で良い)、 Cから始める方がややこしいと言わざるを得ない。
265 :
デフォルトの名無しさん :2009/01/01(木) 16:32:29
STLから始めるのが初心者向き で生産的
char で文字列操作とか面倒くさいし(絶対バッファオーバーフローさせやがる)、 std::string 使わせた方がいいね。
させやがる、ねぇ・・・
既存のクラス使うだけなら、C++で入門もいいだろうね
補間機能
挫折して挫折して挫折して そこでSTLですよ (゚∀゚)神のキターですよ
STLなんて自分で実装してからその存在に気づいた
マルチスレッドで開放のタイミングで困っているんだが GCが組み込まれるなら待とうかなぁ・・・ でも自前で組んだ方が速いのよね
>>272 boost::shared_ptrがマジお勧め。
boost(笑)
>264 問題は多くのサイトがC++でなくベターCから入門することくらいか
ガチ規格準拠でANSI-Cでもやれば、C++との明確な違いが分かると思うのだが、いかがなさいましたか、お客様
>>275 プログラムのプの字も知らない人に
いきなりオブジェクト指向を語っても
どうなのかなあと思わなくもない。
明日、本を買いに行くついでに漫画を立ち読みをしようと思います。 で・・・やはり、Cから始めたほうがいいのでしょうか? それともC++からでいいのでしょうか?
新人にいきなりC++を教えてるけど問題ないよ。
ってかPCについてある程度の知識が必要だが、そこは大丈夫なのだろうか
プログラミングの学習では、早い時期から文字列の操作は避けては通れないと思う そのためには、Cだといきなりポインタを理解しなくてはならず厄介。 C++は文字列クラスがあるから、そのあたりは緩やかに学べると思う。
>277 いやさ、オブジェクト指向以前に C++なら例えば配列は初心者の扱うモノじゃないのに 何故かvectorより出て来たりさ 酷いのは#include <stdio>から始まったりとかね それはほとんどC言語でしょって話
それはひどいな!
>>282 最近は iostream から始めるのも多いんじゃない?
ちょっとかじりかけの中級者に限って、オブジェクト指向が何か特別な高尚で高度なものだと思ってしまいがち。 プログラムのプの字からオブジェクト指向で何ら問題ない。
と、ちょっとかじりかけの中級者が申しております。
世の多くの人は驚くくらい抽象思考が苦手なもんだ。 本当に驚くほどに。
>>288 どうなさいましたか?
上級者なら、スルーができように。
俺も C++ で始めた方が楽だと思うな。 ただ、C っぽい教科書が多いのは問題だね。 今やはじめから STL どんどん使った方が良い。
オブジェクト指向を特別視するのは、オブジェクト指向を理解していない人間
286 :デフォルトの名無しさん:2009/01/01(木) 22:24:38
ちょっとかじりかけの中級者に限って、オブジェクト指向が何か特別な高尚で高度なものだと思ってしまいがち。
プログラムのプの字からオブジェクト指向で何ら問題ない。
↓
煽られる
↓
288 :デフォルトの名無しさん:2009/01/01(木) 22:26:15
>>287 死ね
↓
叩かれる
↓
295 :デフォルトの名無しさん:2009/01/01(木) 22:33:48
>>290 >>291 >>294 涙拭けよw
みんな死ね
またこの流れか
C++でポインタを習う際、何故みんなは「〇〇型へのポインタ」よりも「代入した変数のアドレス」を意識してしまうんだろうか・・・ アドレスの値が印象的なのか・・・
崇高なオブジェクト指向が実は初歩的な概念であることを明らかにされた初心者が暴走し始めたな
ここで関数型信者の一言 ↓
288 :デフォルトの名無しさん:2009/01/01(木) 22:26:15
>>287 死ね
とりあえず黙れ
とか言ってみる
オブジェクト指向は便利だけど実際必要かって言われると必要ないよ。 別に無くてもいい。 現にみんながOCaml使うときオブジェクト指向的な部分ってあんまり使わないでしょ。 まずはHaskellやってMonadに慣れといたほうが後々色々と応用が効くからそっちのほうがいいよ。
なにについて揉めてるんだ?
誰も必要だとは言ってないし。
こいつ病気だな。
315 :デフォルトの名無しさん:2009/01/01(木) 23:11:36 こいつ病気だな。
贈るほどでもない言葉 ↓
printf("俺様はプログラマーの卵だ!!");
これは酷い
↑ 贈るほどでもない言葉
#define loop while(1)
C++はオブジェクト指向でいい
全角
だから何?
だから何?
なんか病気のコピペ厨が張り付いているんですけど
だから何?
c++にするべきかな
するべき。
だから何?
壊れたラジオみたいだな
壊れかけ、ではなくて?
そう。壊れてる
センスない・・・
あきらめるな
>284 iostream、stringについては随分普及してきたと思う でもvectorやsstream、fstream辺りは入門サイトだとなかなか出てこなくね? この辺りが使えないと、配列やCライブラリを使わなきゃいけない場面が多くなる 個人的にはclass定義より詳細な文法より先に標準ライブラリやSTLの使い方だと思う 初っ端からSTL連発くらいのがC++初心者には良くないか?
>>332 学生さんだね。
社会に出ればわかるけど冤罪も罪のうち、疑わしきは罰するってのは法治国家の不文律だよ。
まぁ、とにかく動かしたいんだっていうならそっちのが早いだろうさ
>>337 その「入門サイト」とやらが、たまたま「class定義より詳細な文法より先に標準ライブラリやSTLの使い方」で「初っ端からSTL連発」なんだろ?
「初心者」がきちんとC++を学びたいなら、そんなわけのわからないサイトではなく、定評のある書籍や教育コースを受講した方がいいと思うけどね。
341 :
デフォルトの名無しさん :2009/01/02(金) 12:11:34
>>340 STLが、C++基本的構造(クラスなど)より先にあって
STLを実装するために、C++の基本構造が作られたんだ。
日本語を勉強するのに、文法的な構造から始めるか、
会話から始めるかという違いだろう。
342 :
デフォルトの名無しさん :2009/01/02(金) 12:21:35
STLのアーキテクチャの多くはアレクサンドル・ステパノフという一人の人物の手によって作られた。
1979年に彼はジェネリックプログラミングの初期アイデアを練り始め、そしてソフトウェア開発に革命をもたらす可能性を探究し始めた。
当時はジェネリックプログラミングを実際にサポートしているプログラミング言語がまだなかった。
1987年までにステパノフとマッサーはジェネリックプログラミングの研究成果としてAdaのリスト処理ライブラリを開発してリリースしていた。
しかしながらAdaは軍需産業以外ではあまり普及しておらず、
C++は当時まだ言語として未成熟ではあったものの(テンプレートはまだなく後から実装された)
より広く普及してジェネリックプログラミングの良好なサポートが提供される可能性が高いと考えられた。
ベル研究所のアンドリュー・コーニグがこの動きを察知して、1993年11月のANSI/ISOのC++標準化委員会に
アイデアを提出するように求めるようなことがもしなければ、この作業は間違いなく、さしあたっては研究プロジェクトとして、
あるいはヒューレット・パッカード研究所のプロプライエタリなライブラリとして継続されたであろう。
提案は委員会で全面的に賛同を得て、すぐさま1994年3月のミーティングでのコーニグからの正式なリクエストへとつながった。
Standard Template Library - Wikipediaの抜粋
http://ja.wikipedia.org/wiki/Standard_Template_Library
>>341 は、「STLを実装するため」に追加された機能だけが、「C++の基本構造」とでもいいたいのだろうか。
アホか。
344 :
デフォルトの名無しさん :2009/01/02(金) 12:52:10
STLとC++の開発が始まったのは調べたら1979年らしい。 これらは別々の人たち、場所で開発されていて、STLを実装するために C++の開発に大きな影響を与えたこととおもうが。
らしい。 おもうが。
聞きかじりと妄想だけで断言口調のやつ、多いな。
これからC++を始めるならOOPを基本とすべき。
今さら入門書って思うレベルだけどAccelerrated C++を読んでみたい。
ぜひどうぞ
ア、、アク、アクセ・・・ 俺には無理だった・・・
>348 その本はまさに「配列より先にvector」の本やね
vector は vector で、 < > って何なのとか、2次元配列はどうやってつくるのとか、 面倒臭い事もあるので、 vector を先にやった方がいいと言える程手軽な物でもない。 at を使わないと境界チェックもしてくれないし。 動的配列より先に vector ってのなら構わんがね。
354 :
デフォルトの名無しさん :2009/01/02(金) 15:41:03
C++では、 Cのcontainer_of()相当のことは標準で出来ないでしょうか?
カプセル化を前提とするC++で そういうものが必要になる事自体設計がおかしいと思われる。 もちろん標準でそんなことはできない。
クラスの継承がそれに相当すると主張するのは無茶すぎますかね?
買いに行ったけど売ってなかった・・・(´;ω;) DVDコピーとかの本ばっか。
359 :
デフォルトの名無しさん :2009/01/02(金) 16:16:43
>>355 ,356
返答ありがとうございます。
継承使えばいいのかとも考えたのですが、
継承ではクラス内にlistを3個とか複数持たせる
ことは出来ないと考えました。
クラス内にlistを複数持つという設計が良くない
のかもしれませんが、代替案が浮かびません。
list と何か関係あるのか?
>>356 煽りとかじゃなく純粋に質問。
それどういう意味?
362 :
デフォルトの名無しさん :2009/01/02(金) 16:26:14
>>360 説明不足すいません。
Cでは、構造体内にlistを複数持たせておいても
それぞれのlistについてcontainer_of()を使えば、
包含する構造体は求まるので、
それと同等のことをC++で行う方法を考えていました。
#include <iostream.h> int main() { cout<<"こんにちわ。"<<endl; return 0; } include ファイルを開けません。'iostream.h': No such file or directory
364 :
363 :2009/01/02(金) 16:46:19
自己解決しました。
>>361 listを継承したクラスで, listにアップキャストしてリストを作る
それをダウンキャストしたら得られるだろ?
listっていってもSTLのではないぞ
C++のコンパイラはやはり Borland C++Compiler でよろしいのでしょうか
無料版の方だったら今時ありえない、よした方がいい
>>362 複数なら継承ではなく包含させればいい。
そして、listにそれを所有するオブジェクトへのポインタまたは参照を持たせる。
>>366 対応している規格がが古いからお勧めできない。VC++2088 expressを薦める
container_of()相当で聞いてるんだから リンク用のポインタ以外もたないlistなんじゃねーの? 持たせてもいいんだろーか?
ググってみたけど、container_ofって危険じゃないか? 引数を間違えて、構造体のメンバじゃない変数を与えてもコンパイルエラーにならないんじゃない?
373 :
デフォルトの名無しさん :2009/01/02(金) 17:38:27
>>368 ,370
ありがとうございます。
とりあえずSTLのlistを使うことを考えていたのですが、
自前で作るかSTLのlistを継承したリストを
作ってそいつにポインタ持たせればいいということですね。
>>373 なにか恐ろしい事をやろうとしているように見える。
STL のクラスは継承する事を全艇に作ってないので
基本的には継承しちゃだめ。
そもそも、list からそれを持ってるクラスをとってこようとしている時点でおかしい。
list を持っているクラスを通して list を扱うのが基本だ。
>>373 listとポインタを所有するクラスを作ろう
376 :
デフォルトの名無しさん :2009/01/02(金) 19:53:32
$ cat c_sizeof.c #include <stdio.h> int main(void) { printf("sizeof(\'\\x80\') == %d\n", sizeof('\x80')); return 0; } /* EOF */ $ gcc -Wall -std=c99 -o c_sizeof c_sizeof.c $ ./c_sizeof sizeof('\x80') == 4 $ cat cxx_sizeof.cxx #include <iostream> int main() { std::cout << "sizeof(\'\\x80\') == " << sizeof('\x80') << std::endl; return 0; } // EOF $ g++ -Wall -o cxx_sizeof cxx_sizeof.cxx $ ./cxx_sizeof sizeof('\x80') == 1 なぜ、C言語ではシングルクォートが、4 Bytesであり、C++では、1 Byteなのですか。
>>376 Cではint型で
C++ではchar型だからです
C++でのオーバーロードとかの兼ね合いだろうね
1バイトって256種類のパターンを表現できるんだっけ
普通はそう Cにおいては絶対ではないが
cher型は嫌いです
ちーあ?
>>377 ありがとうございます。そういうことだったんですね。
C言語とC++は、こういう細かいところでも違うんですね。
なぁ、チーフって何だ?
牛肉だろ
ロベール先生にお世話になることにしました
386 :
デフォルトの名無しさん :2009/01/03(土) 03:20:44
2chが終わるってのも、思い込みすぎかも。まぁ、2chは巨大になったことだし もし消滅するなら、また別の人がサーバーを運営するだろうね。 手法などは、既に2chのを参考にすれば済むことだし、著作権だの 知的財産権だの、抵触せずに似たものはいくらでも作れるし。
IP記録を始めたときも、終わったというやつは大勢いたが、今まで生き残っている。 少なくともユーザに見限られるということはないだろうとは言える。
389 :
デフォルトの名無しさん :2009/01/03(土) 03:37:26
国内しかも個人が代表に見える格好だと 裁判とか税金とかうるさいから、 スケープゴートとして海外企業に移したんでしょ。 ひろゆきとしては譲渡していいことずくめだろ
390 :
デフォルトの名無しさん :2009/01/03(土) 03:44:35
大雑把に言って、内容は不特定多数の人が書き込んで出来上がっているし、 その不特定多数が消滅しない限り、やはり何かしらこういったコミュニティーは 継続するだろうしね。運営者も費用も必要だが。掲示板そのものに スタイルはいくつかあれど、誰でもやれることだし。ただ、一生をそんなことに ささげるだけの覚悟はあるかい?
つーか、ガンガン機能追加するわけでもないしね。 運用するだけじゃん。こんな掲示板 アウトソースすればよろし レスは1000までって制限も永遠と変わんないしw
複雑な機能なんていらん 掲示板として書き込み/読み込みというシンプルな機能だけで十分 肥大化して良い事なんて無いってのはC++でもいえる
2ちゃんねらーらしくもない話してるな スルーしろよ
394 :
デフォルトの名無しさん :2009/01/03(土) 11:03:58
protected private継承の違いについて
int i,j; i=0; while(j=10-i++) ってのはありでつか?
ありだけど、キミが期待した通りかはわからん。
えぇ、変数って2個いっぺんに宣言できるの!? ってかありなんじゃない
>>395 おそらく"ってのはありでつか?"がエラーになる
文法上問題は無いが、何か気持ちは悪い。
>>395 の話がCの宿題スレでよく分からん議論になってる
少なくとも、読むときには困るコードだな
>>401 おそらく
>>395 が向こうで代入式!代入式!ってファビョってる奴だと思う。
追い詰められてこっちに助けを求めてきたんだろ。
printfでも入れてコンパイル&動かせばいいだけじゃん > ファビオジニオール
なるほど、宿題スレか。 宿題の回答としてはまずいと思うけどな。 わけもわからず写して動作聞かれたら困るべ。
>>403 お前がコンパイラが通すから良しといっている基地外だというこは分かったから、
いつまでも必死にファビョってなさいw
本人登場w
>>403 見えない敵と必死に戦う低レベル講師乙。コードを客観的に考えるのと、
主観ばかりで意見する相手に対して、罵詈雑言で返すだけの無能は
黙っていた方が墓穴を掘らなくて済むぞw
>>408 お前の発言が主観ではなくなんだと言うのだ
408は自己紹介としては良く出来てると思うぜ。
ん?
>>408 の日本語がよく分からんのだが、
"コードを客観的に考え"てるのが誰で
"主観ばかりで意見する"のが誰で
"罵詈雑言で返すだけの無能"が誰だって?
>>395 は、くせぇくせぇ、○ンコの臭いがぷんぷんすんぜ、こりゃ〜生っ粋のクソースだ。
間違いねぇ、クソ麻呂のクソースだぜ、ぷぷぷw
マジレスするとgccだとコンパイル通らないよ 警告: 真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします だってさ
あっ、一応警告だけでコンパイルも実行もできた。 j=10 i=1 j=9 i=2 j=8 i=3 j=7 i=4 j=6 i=5 j=5 i=6 j=4 i=7 j=3 i=8 j=2 i=9 j=1 i=10
>>414 そりゃ、警告だ
コンパイルエラーじゃない
警告をエラーにするオプションを立てればエラーにはなる。一応。
質問です. ・ソース #include <windows.h> #include <time.h> #include <stdio.h> typedef struct { time_t time; WORD namesum; BYTE name[254]; } HEADER1; typedef struct { time_t time; WORD namesum; // BYTE name[254]; } HEADER2; main() { BYTE name[254]; printf("HEADER1 = %d\n", sizeof(HEADER1)); printf("HEADER2 = %d\n", sizeof(HEADER2)); printf("name[254] = %d\n", sizeof(name)); printf("HEADER2 + name[254] = %d\n", sizeof(HEADER2) + sizeof(name)); } ・実行結果 HEADER1 = 260 HEADER2 = 8 name[254] = 254 HEADER2 + name[254] = 262 HEADER2 + name[254]はなんで260にならずに262になったのでしょうか?
関係ない部分を削ってから質問した方がいいよ
420 :
419 :2009/01/03(土) 14:44:54
↑ 「ソースコードの」、関係ない部分を
ソースは全部あげたほうがいいだろ。 どこが「関係ない部分」かわかるくらいなら自分で問題解決できるって。
>>418 HEADER2 + name[254] = 8 + 254 = 262
ってそのまんだだと思うが
423 :
419 :2009/01/03(土) 14:47:48
で、ソースを見たが、8 + 254 はどう考えても 262
足し算w
425 :
419 :2009/01/03(土) 14:48:48
>>421 まぁそうか・・・HEADER1はどう考えても関係ないんだが。スマソ
なんで260になると思ったのか説明して欲しい。
>>418 の頭の中のバグを直すのは難しいw
消防からやりなおせってとこか
パディングの話だろ。
>422 HEADER2はHEADER1のname[254]をコメントアウトしているので HEADER2 + name[254] = HEADER1に何でならないのかと思いまして.
それぞれ全く無関係だから。
パディングとかアラインメントとかでググれ
いやいや、型の定義は (おまえの疑問とは) 関係ないよ。 printfで出力された値を見れば、ただ足し算するだけ。 定義のところに疑問があるなら、疑問を持つべきは最後のprintf文じゃないでしょ?
435 :
418 :2009/01/03(土) 14:54:25
パディングでぐぐったら答えが出てきました.初めて知ったよ. みなさんありがとう.
お前は代入式ってファビョってりゃいいんだよw
パディングやアラインメントならsizeof(HEADER2)の値が6じゃないのを疑問に思うのが普通じゃね?
数字だけ言うんだもん、足し算の問題だと思うわ 結局日本語で理解できなかったよ
>>434 まぁ解決したからいいいけど、2個目のprintfでHEADER2のサイズが HEADER1 - 256
になってない時点で疑問に思うべきだってことだよ
441 :
デフォルトの名無しさん :2009/01/03(土) 15:20:54
>>436 きもいぃ〜〜〜〜はいっ、きっ、もっ、いっ、キモイ!きっ、もっ、いっ、キモイ!
キモイィ〜〜〜〜
なんか頭のおかしい基地外が、自分の不備を指摘されてファビョってまつねw あのwhile文の中は、条件式が適切なのに、代入式で済ませているなんて、 プログラマー失格だろ。コンパイラが警告しているのに、アホ過ぎ。黙ってろよ、ド素人w
簡単な質問で申し訳ないのですが visual stdio 2005 無償版でデバッグ開始してみたところ 「0x0040115d でハンドルされていない例外が発生しました: 0xC0000094: Integer division by zero」 というメッセージがでて実行中に強制終了してしまいました。 これってどうすればいいんでしょうか・・・?
444 :
デフォルトの名無しさん :2009/01/03(土) 15:30:39
Linuxでは代入が正解だ。 オープンソースも知らない素人は黙っとけよ。 恥ずかしい奴だな。
なんか一匹、年明け早々、必死に基地外っぷりを発揮していますね(^ー^)v アァ〜〜キモッキモッ、きっと鏡を見ると、キモイ面が映っているんでしょうね。 現実に目を向けようぜ、こんな文字列ばかりのスレじゃなくて、さ?
446 :
デフォルトの名無しさん :2009/01/03(土) 15:33:00
代入式でも条件式でも「式」でありさえすればなんでもいいのがCの仕様。 バカが条件式限定だと思い込んで恥をさらしてファビョりまくってるのが現状。
パディングって、詰め物だっけ コンパイラの最適化って、害悪だと思う
最適化がなかったら困ったことになると思うが。
>>443 デバッグ開始してるなら、中断とか継続とか出ると思う。
中断すれば該当行にカーソルが行く。
その行で割り算してて、割る数が0なんだろう。
変数にマウスカーソルあてると数値見えたりもする。
454 :
デフォルトの名無しさん :2009/01/03(土) 15:37:56
>>443 visual stdioなんか使うからだろ。
gcc使え。
gccなら0除算OKだ。
いまどき0除算もできないコンパイラなんてM$製くらいだ。
これだからドザは駄目なんだよ。
パディングってワード間隔でデータを区切って 実行速度を速める為の手法だっけ
>>442 式は値を持つんだから、なんの問題も無いだろ。
警告がいやなら、while ((j=0-i++)) とでもすればいい。
なにも知らないド素人は黙ってろよw
>>444 これって乱数で過去レスを切り貼りするスクリプトでしょ。
やたらからんでくる愚かものがいるなw さすが、言語スレ いつまでも、こんな言語仕様のスレみてるのなんて学生ばっかだっつーの
みんな親切だな。 英和辞書引け、でいいのに。
>>455 基本的にはそうだが、
アラインメントされてないと
データを読めない CPU もある。
ビットフィールドってので、 手動でやる場合もある
学生や初心者が見るスレだからこそ、間違った知識は叩かれねばならない。
466 :
デフォルトの名無しさん :2009/01/03(土) 15:44:34
>>463 visual stdioが破壊されるってことだろ。
素直にオープンソース使えって。
無理するな。
>>458 おいっ、絡まれてまともにレス出来ないなら、お前がレスしなきゃ良くね?
だってここ、誰もお前個人を特定、指定してレスを求めているわけじゃないんだが
言うからには自分の発言に責任を持っているんだろうな?
ほれ、鏡を見ろよ。醜い酷い面が映っただろ?誰だよそれ?
そう、お・ま・え・だよ?分かる?それが現実。自分が見たものはどうこう言うくせに
自分で自分を見られる唯一の手段、何か姿を映し出すものを見た時
己の醜さを目の当たりにするのさ。今のあんたみたく。
あんたの発言、第三者から見れば、きんもぉ〜★だぜ?
自身thisのアドレスをprintするメソッドを持つクラスを作成して 以下のようにvectorに追加する前のインスタンス とvector内のインスタンスでprint()を実行したのですが、 addr=0x804b008 addr=0x804b018 と別のアドレスになります。 同じになると思っていたのですが、 これはvectorに登録する時点でインスタンスが コピーされていると考えればいいのでしょうか? またその場合オーバーヘ%8
#include <iostream> #include <vector> using namespace std; class MyClass { public: MyClass() {}; ~MyClass() {}; void print() { cout << "addr=" << this <<endl; } }; int main(int ac, char *av[]) { vector<MyClass> vec; MyClass *my = new MyClass(); vec.push_back(*my); my->print(); vec.at(0).print(); delete my; return 0; }
471 :
469 :2009/01/03(土) 16:24:46
>またその場合オーバーヘ%8 以降の続き またその場合オーバーヘッドが気になるんですが、 皆さんどう対処してらっしゃいますか? お願いします。
当然コピーが発生する。 ただ、 vector<MyClass*> vec; vec.push_back(my); みたいにアドレスをコピーする分には インスタンスのコピーは発生しない。 ただ、メモリ管理を自分でしないといけなくなってしまう。 boost::ptr_vector を使うという手もある。
vectorは、メモリを確保してplacement newという機構とコピーコンストラクタ で初期化される (記憶があいまいなのでちょっと違うかも) で、言うとおりコピーはされる。ポインタのコピーに比べれば 効率は悪いけど、実際そんな小さなことが問題になることはほとんどない。 よっぽどでかいデータ構造をソートしまくるとかでない限り。
コピーのコストより、 コピーコンストラクタの実装がマズくて 問題が発生しないかチェックする方が重要だったりするよね。
いいよいいよー、そうやって自分を否定する者を否定し続けてなさい。 それぞ、井の中の蛙、大海を知らずと言ったものだ。視野が狭いんだよ、 ファビョっている基地外は。もちっとグローバルに、客観的に物事を見な。 自分が思ったことが全て正しい、そんなことを思っているのは、お子ちゃままで。 大人の世界は、いくら自分がそう思っても、現実は、事実とは違っていることなんて いくらでもあると気づく。実行して見て、コードが間違っていないと思っていても もっと効率が良いものが存在するだの、自分で考えたのに、後でおかしいと気づくことなんて いくらでもある。ただ・・・ while(代入式) は不適切だ。
>>475 「いいよいいよー、そうやって自分を否定する者を否定し続けてなさい。
それぞ、井の中の蛙、大海を知らずと言ったものだ。視野が狭いんだよ、
ファビョっている基地外は。もちっとグローバルに、客観的に物事を見な。
自分が思ったことが全て正しい、そんなことを思っているのは、お子ちゃままで。
大人の世界は、いくら自分がそう思っても、現実は、事実とは違っていることなんて
いくらでもあると気づく。実行して見て、コードが間違っていないと思っていても
もっと効率が良いものが存在するだの、自分で考えたのに、後でおかしいと気づくことなんて
いくらでもある。」
ここまでそっくりそのままお前に返すよwww
477 :
469 :2009/01/03(土) 16:59:01
>>472 ,473,474
ありがとうございます。
ポインタを使うのがしっくり来そうです
Cの規格に沿った構文解析器でも作ってみたら? while(代入式)が不適切だろうがなんだろうが正しいんだから。
>>478 コンパイルできて規格合致であることは誰も否定していない。
>>479 まぁ確かに。
言いたかったのは、そこまで熱くならんでもいいんじゃね?ってこと。
>>480 478みたいな書き方だとまた話を蒸し返されそうな雰囲気だから勘弁してくれ。
while文の条件は条件式にするってのは良い心がけだと思うよ。 linuxなんかでは値があるものは何でもってくらい条件にしちゃうので、 経験積んだらそういうソースにも慣れると良い
条件式ではなく比較式と言ってくれ。
比較するとは限らんぜ
式・・・それは愛・・・・・・
>>485 そゆこと言ってるから、論理値をリテラルと比較する莫迦が後を絶たない。
お前、リテラルの意味分かってないだろ
>>489 if(hoge()!=0)...
とか?
あるいは、if((x<y)!=0)...
ということだろうか?
(is_hoge() == true) == trueのことだろ。
>>492 真理値型の無い言語だぞ?
巣に帰れよ。
リテラルってほらあれだ 前屈みになって腕を横に挙げるやつ
ボケがわかりにくい上につまんねーよw
どどんまい?
>>493 処理できた件数を返す関数hogeの場合、#define TRUE -1に対して、
if(hoge()){・・・}
if(hoge()==TRUE){・・・}
とか。
左辺が右辺より大きいとき と 左辺が右辺以上の時 って何が違うんでしょうか? >これと>=を使い分けたりすることってあるのでしょうか?
>>499 ちゅうがっこう から やりなおせば
わかると おもいます。
>>500 それいぜんに にぽーんごの もんだいかと
おもわれまっしゅる
ヾヽ\ヾ\ //// // \丶\\ //// |・\ _____ /・> /// / ̄ ̄ ̄ ̄\,, ミ\.\ヽ|||liiiii||/ /./彡 //// |・\ /_____/・> /\.\|||iii||l//彡 ノ( ミ \.\ヽ|||liiiii||/ /./ノ( / / (,-、 ,:‐、 ) \ ⌒ヽ \.\|||iii||l// | ⌒ .|/ ─////─ ヽ | |(,-、 ,:‐、 ) 6 l |. ////── | .| \\\ . ////Vヽ ,-′ ////'VVVヽ | l ////ェ∧/_ /ヽ . //// γ l / / //// |/\/ l ^ //// i∧ェェェ∧/ / / //// | |//// l━━(t)━━━━┥
>>499 左辺==右辺の時に真になるか偽になるかの違い。
必要に応じて>と>=のふさわしい方を使う。
xが12より大きいとき xが12以上の時 より・・以上・・そこにある違い・・それが問題ってことですよね?
面白い釣りだなあ。
>>503 x >= 10 == x > 10
は偽になるってことでしょうか?
さんすうのきょうかしょをよんでね
>>506 x==10のときだけ偽、それ以外は真。
優先順位は大丈夫か?
申し訳ございません
>>508 そ・・そうか!!
やっと理解できました!!!!
x < 10は10もは含まれないってことですよね!?
だから
int a;
cin>>a;
if("x < 10"){
cout<<”真"<<endl;
はxが10より小さいってことで
つまり10と入力しても偽になるわけだ!!!!!!!!!
while ("テュルー") はどうなりますか?
無限ループ
突っ込みどころ満載w
・・・??
while("forever") ってしない?
しない
ちょ、それ古典w
俺も面白いと思った。 while("無限ループ") { /* なんか */ } まあ、しないけど
524 :
デフォルトの名無しさん :2009/01/03(土) 23:46:13
while(j=10-i++) を書いた奴が指摘されて、まだファビョってるのか? 基地外だろ、こいつ。指摘した方が言ってもいないことを思っているとか言い出すし。
whileの括弧の中が条件式でなければ駄目とは言っていないし、変数を用いて 0か否かで繰り返し条件を指定することもかのうだが、あの式は紛れもなく 代入式で、jの値を使うにしては、不適切だとコンパイラも指摘しているのだが・・・
プw
いやぁがんばってるね
while(*dst++=*src++);
>>525 >while文の括弧の中は、
>本来は条件式が入るんだが、それは代入だろ。例え括弧で代入式を括っても、
>それに対して条件式にあう措置をとるべき。
最近よく喧嘩するね
テュルー
冬休みだからしかたない
出た、「冬休み」
536 :
デフォルトの名無しさん :2009/01/04(日) 00:37:35
connect(sock,( struct sockaddr * ) &echoservaddr, sizeof(echoservadr)) この文の * が意味することがまったくわかりません *の後に文字もないのですが、ポインタとしてありえなくないでしょうか?
ポインタ型でキャストしてるだけ
人はなぜ
>>534 のような発言をするのか。
それは「私は子供ではない」と誇示したいからである。
では、「私は大人だ」と主張する人間が「大人」なのだろうか。
答えは否、断じて否である。
で?
540 :
536 :2009/01/04(日) 00:57:57
つまり&echoservaddr構造体のポインタを sockaddr構造体のポインタとしてあつかうってことでしょうか? まったく何をしているか理解できないのですが
>>540 その通りの事をやっている。
sockaddr_in 構造体を sockaddr 構造体であるかのように
無理矢理見なして渡している。
sockaddr_in 構造体と sockaddr 構造体はサイズが同じで、
かつ、こうやってキャストしてもいいと問題ないとされている。
connect()の第2引数はstruct sockddr *型(struct sockddr型へのポインタ)を取る。 そこで、&echoservaddr(echoservaddrのアドレス)をstruct sockddr *型(struct sockddr型へのポインタ)へキャストしている。
544 :
536 :2009/01/04(日) 01:03:51
>>542 見なす理由がわからないのです。
sockaddr_inのほうが入ってる情報というか入力する情報は多いし
その情報はconnectする際に必要だと思います。
なのに、何故必要な情報がすべてあひってないsockaddr構造体とみなすのかがよくわかりません
546 :
536 :2009/01/04(日) 01:08:58
必要な理由がわからないのです。 ていうか、入れてしまっては前述した疑問がわいてしまって
理由は、connect()がそういう仕様だから。 connect()を作った人間がそういう風に作ったから。
>必要な理由がわからないのです。 なんというか……
>>544 総称的な型として sockaddr を用意して、
connect は sockaddr* を受け取る汎用的な形にしておいて、
より詳細な構造体として sockaddr_in を用意し、
それをキャストして渡す、という風になってんじゃないのかね。
場合によっては sockaddr_in 以外のものも作るつもりだった、
あるいは将来作れるように、そういう風にしてんじゃない?
void* でいいような気もするけど、
それだと何でもキャスト無しに渡せちゃうから、
渡していい構造体なのかどうか注意して指定させるように、
キャスト無しでは渡せないようにしているんだと思う。
まあ、全部推測だけどね。
550 :
536 :2009/01/04(日) 01:13:40
つまりsockaddr_in 構造体の中にある入力したアドレスに接続するわけですよね。 しかしsockaaddr構造体にはアドレスがない。それなのに、sockaddr構造体とみなしてしまっては、 アドレスないから接続できなくないのでは?ということです。
っていうか、全部が全部 現状が正しい前提で理由を付けなくてもいいと思うけど。 頭いいひとにありがちだよね。
後の改造のために凝った事やって、 結局改造なんてしなかった、 ってこともよくある話で。 互換性のために、とかもよくある話。
>>546 int connect(int sockfd, const void *addr, socklen_t addrlen);
なら、キャストする必要はないが、connect の第二引数が struct sockaddr である以上、
キャストする必要がある。
ここではキャストする型が重要なのではなく、socket作成時に指定したプロトコルファイミリーが重要。
プロトコルファミリーごとにconnectに必要な情報量は異なり、
kernelでもプロトコルファミリーごとに呼ばれるconnecが異なる。
kernelではaddrlen分ユーザー空間からメモリをコピーし、
所望の処理を行うので、struct sockaddr が重要なのではない。
555 :
536 :2009/01/04(日) 01:26:58
>>554 socketでAF_INETを指定しているのですが、
この場合だとIPv4でconnectしてるということでは?
>>555 そう。
sockaddr_inを使うのはsockaddrを使うより便利だから。
IPv4を使う場合でもsockaddrにアドレスを設定してもいいよ。でも面倒だよ。
ともかく、connect()が必要とするのはsockaddr_inではなくsockaddrなの。
/usr/include/sys/socket.h にstruct sockaddrとstruct sockaddr_inの定義があるから見比べてみてよ。
>>550 sockaddrとしてもsa_familyが読み取れる。
そこがAF_INETならsockaddr_inにキャストしてアドレスを読み取るという風になっている。
ほかのAF_*にも対応するsockaddr_*が存在しうるという仕組み。
>>549 そういうことなんだろうけど、IPv6を収めるには小さすぎたのが惜しかった。
どうせサイズ渡してんだし、 sockaddr::sa_family だけでよかった気もする。
559 :
536 :2009/01/04(日) 01:42:07
struct sockaddr { u_short sa_family; char sa_data[14]; }; sockaaddr構造体はこのようになっているが、何も入力していない struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; inのほうはこのようになっていて、アドレスはポートやファミリーは入力している。 で、このinの方を struct sockaddr { u_short sa_family; char sa_data[14]; }; これとして扱う。しかし、ここにはアドレスが入っていない。 だとしたら、どうやってサーバーに接続する?という疑問がわきます。 けれど、inに入力したファミリーがsockaaddrに引き継がれて、 sockaddrのファミリがわかって、そこからまた、inの構造体を参照?するのでしょうか どうやって参照するかがまた謎ですが
560 :
536 :2009/01/04(日) 01:44:22
>sockaddrとしてもsa_familyが読み取れる。 >そこがAF_INETならsockaddr_inにキャストしてアドレスを読み取るという風になっている。 これだと、sockaaddrをキャストしてもsockaaddrにはポートやアドレス入力してなければ 読み取れないのでは?
4.2BSDのsockaddrはsa_lenは無くて、sa_familyだけだった。
IPv4として使う場合、 アドレスファミリをAF_INETにして sockaddr_inにアドレス詰めて connect()に渡すときはsockaddrにキャストして connect()の内部ではsockaddr_inとしてアドレスを読み出す。
>>561 それが合理的だな。
>>560 sockaddr_in を渡すのなら
sa_family に AF_INET を入れないといけないし、
sa_family に AF_INET を入れるのなら
渡す物は sockaddr_in でなくてはいけない。
それ以外の使い方して変になっても
それはそんな変な使い方をした人が悪い。
>>560 入力してなければ読み取れないが、入力するためにsockaddr_inにしてポートやアドレスを入力するんだろ?
キャストしてもメモリの内容は変わらない。
echoservaddr.sin_family = AF_INET; echoservaddr.sin_port = xxx; echoservaddr.sin_port = yyy; connect(sock,( struct sockaddr * ) &echoservaddr, sizeof(echoservadr)) ――connectの中 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { if (addr->sa_family == AF_INET) { const const struct sockaddr *addr_in = (const const struct sockaddr *)addr; だいたいこんな感じのはず。 ここでaddr_in->sin_portを読めばxxxだし、addr_in->sin_addrからはもちろんyyyが読み取れる。
566 :
536 :2009/01/04(日) 01:58:56
>connect()に渡すときはsockaddrにキャストして >connect()の内部ではsockaddr_inとしてアドレスを読み出す。 つまり、connectに渡す情報は、空の struct sockaddr { u_short sa_family; char sa_data[14]; }; これであって、特に決まりで中に何も入力されてなくても意味はない。 で、内部でどこのアドレスに接続するか処理するのが、 struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; この入力しておいたinの方。ってことでいいのでしょうか。 inをsockaddrにキャストしても入力しておいた値で共通する変数名とかないですもんね だからキャストしても??
空じゃなくてアドレス等を入力したものをsockaddrとみなして渡してる。 (( struct sockaddr * ) &echoservaddr)->sa_data[2]〜[5]とか見れば納得するのかな?
>>566 connectに渡しているのは構造体のアドレス。内容は渡していない。
#include <stdio.h> void print_bytewise(const unsigned char *buf, size_t size) { size_t i; for (i = 0; i < size; i++) { printf("%02X ", buf[i]); } putchar('\n'); } int main(void) { int n = 0x12345678; print_bytewise((const unsigned char*)&n, sizeof n); return 0; } これとやってる事は本質的に同じ。
570 :
536 :2009/01/04(日) 02:13:08
>>567 struct sockaddr_in {
u_short sa_family;
char sa_data[14];
[0]short sin_family;
[1]unsigned short sin_port
[2]struct in_addr sin_addr
[3]char sin_zero[8];
};
つまり、イメージ的にはこうなのかな?
こう。 sa_family ⇔ sin_family (2 バイト) sa_data[0]〜sa_data[1] ⇔ sin_port (2 バイト) sa_data[2]〜sa_data[5] ⇔ sin_addr (4 バイト) sa_data[6]〜sa_data[13] ⇔ sin_zero (8 バイト)
connect(2)ってだいたいこんな感じで使うだろ。
struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_port = htons(80),
.sin_addr = {
.s_addr = inet_aton("192.168.1.1")
}
};
connect(skfd, (struct sockaddr *)&addr, sizeof(addr);
>>536 はなにか勘違いしてる気がしてならない。
573 :
536 :2009/01/04(日) 02:34:31
>>571 お!
もしかして
sockaddr_inは、計16バイトでその情報はsockaddrに全て対応する
sa_family はsinfamilyに
sa_data[14]には残りの14バイトのアドレスが格納されるということになってるのかな
だとすると、どちらかの構造体だけ入力しとけばいいってのも納得できるのですが
これでいいのでしょうか?
>>573 いままでの回答全て無駄っぽい。
sockaddrはアドレスファミリーから見れば関係ないんだって。
例えばUNIX ドメインソケットなら sockaddr_un だし、
IPv4なら sockaddr_in がconnectには必要。
ただ、歴史的背景かなにかはしらないが、connect(2)のインターフェースが
「void *」ではなく、「sockaddr *」になってるってだけ。
575 :
536 :2009/01/04(日) 02:56:41
>>574 つまり
>>571 ではないと?
ますますわけわかんなくなってきた
struct sockaddr* をキャストの型として &echoservaddrするってのがよくわからないのかなぁ
&echoservaddrには
>>572 にかいてあるようなin構造体のアドレスが入力ずみではあるけど
それをキャストすると、どう扱われるってのがよくわかんないかも
いや、本当にみなさんに色々教えてもらっているのに理解がたりなくて申し訳ないです。
キャストとかsockaaddrとかぐぐってるけど、いまいち理解できない・・・
577 :
536 :2009/01/04(日) 03:11:36
>>576 すみません。まったくわかりません。
const unsigned char*)&n
char型(nの値が格納されている)アドレスへのポインタ
なんかもうわかりません
ま、深夜だし思う存分続けてくれたまえ
>>577 典型的な「ポインタを理解していない」状態だね。
まあ、初心者は大抵一度は通る道だ。
ポインタを理解するのは簡単だ。メモリを理解すれば良い。ただそれだけだ。
変数とかの中身はメモリに置かれている。
メモリは1バイト単位に分割されていて、それぞれのバイトに住所が割り振られている。
[0番地][1番地][2番地]・・・
でも、例えば int とかのサイズは1バイトではない。現在は4バイトが主流だね。
こういうのは、メモリ上の連続した領域を占有することになる。
そして、int 型の変数(例えば
>>569 の n)に & をつけると、
この連続した4バイトの領域の先頭のバイトの住所が取得できる。
[----------------------- int n ------------------------]
[12938100番地][12938101番地][12938102番地][12938103番地] (住所は一例)
↑
先頭 &n == 12938100番地
でも、別にこの4バイトの領域を int の値と見なさなくてはいけないわけではない。
例えば勝手に char 4要素の配列だと見なしても構わないわけだ。
[-- char [0] --][-- char [1] --][-- char [2] --][-- char [3] --]
[12938100番地][12938101番地][12938102番地][12938103番地]
んで、この char 4要素の配列の先頭要素の住所もやっぱり12938100番地なわけだ。
こういう解釈の変更を行っているのが、
(const char*)&n みたいなキャストになるわけだ。
ポインタってのは2つの属性から構成されている。 1つはメモリ上の占有している領域の先頭の住所(アドレス)と、 そしてそのアドレスにある値を「何の型の値だと見なすか」だ。 ある変数のポインタは、変数に & をつけることで得られる。 変数に & を付ける事によって得られるポインタの型は、 元の変数の型に * をつけた形で表現する。 ポインタは基本的にただアドレスなんつー単なる値を保持するだけのもんなので、 ポインタを保持する変数なんかも作る事ができる。 例えばこんな感じだ。 int *p = &n; 変数 p は n のアドレス、例えば12938100番地などといったような値を保持しているわけだ。 んでさらに、p は int* という型なわけだが、 この int って部分は、12938100番地から始まる領域を int 型の値だと見なすよ、って意味を持っている。 これを char 型の値だと見なしたい場合は、char* にキャストしてしまえばいい。 char *c = (char*)p; これで、やっぱり変数 c には p に入れられていた領域と同じ場所を指すアドレスが入れられるわけだけど、 c の型は char* なんで、その領域を char 型の値だと見なすようになるわけだ。 この話の int と char を sockaddr_in と sockaddr に置き換えれば、 connect に関する話も分かるはず。
ポインタ……それは恋だ!
582 :
デフォルトの名無しさん :2009/01/04(日) 03:48:03
ボイン太、それはAVだ!
残念ながらボッシュートで〜す
ってか、ぶっちゃけお前らの一番好きなC89基本型ってなんなの
int 異論は認めない
unsigned long int
size_t 異論 は 色ん なものがあるだろうから認める
char ちゃ〜
size_tって中身はint?
符号なしのint型が一般的らしい。time_tとかも。
grepすりゃすぐ判るかと
俺は断然 bool
し、bool……?
いやいやいや void*
√とかはC言語で使えないのでしょうか・・? 特殊相対性理論における時間の遅れ、運動してる物体の速度を入力することによって 運動してる物体の時間の刻みを出すプログラムを作りたのですが、・・C言語で√は使えないのでしょうか・・?
>>598 確かに特殊相対論は中学生でも理解できるが、お前は別の勉強をした方がいいよ
#include <math.h>
あえて俺はLPVOIDと書く
603 :
536 :2009/01/04(日) 10:55:21
>>580 丁寧にありがとうございます。
しかによくわからない点があります。
>変数に & を付ける事によって得られるポインタの型は、
>元の変数の型に * をつけた形で表現する。
つまりこれで先ほどの例だと
int n; という宣言が先に必ずある
int *p = &n; その上で、元の変数の型はint n よりint型であることがわかっているので
p の型はintにしないといけない。よって、nのアドレスが格納されているpは、
(元の変数の型)intに*をつけて int *pとあらわすということですよね。
しかしよくわからないのですが、p = &n; とint *p = &nの違いがわかりません
前者はpにはnのアドレスの値が入っている。
後者はpにはnのアドレスの値が入っているのではないのでしょうか?
前者だと先にint p; と宣言しておけばp はint型になるのでは?
604 :
536 :2009/01/04(日) 10:57:59
あと、もう1点ですが >char *c = (char*)p; int *p = &n; としたのなら、 char*c = (char*)*p もしくはchar*c = (char)*p となるのではないのでしょうか?
二段ダブルベット
606 :
536 :2009/01/04(日) 11:10:16
すみません、もうひとつ 先ほどの例の場合 int型をchar型にする利点というか意味がわからないのですが サイズが異なる構造体をキャストしたら中身が全然違うのに型を変えるとか想像がつきません
>>603 >>580 ではないけど、
その日本語だと君がどこまで理解できたのかが分からない
材料は揃ってるようだから、手を動かしたほうがいいよ。
問題の値をそれぞれprintf()してどうなったか、
試すくらいはしてから再度の質問はするものだ
型宣言の *と 演算子の*を混同している・・・・?
C言語でおk
>p の型はintにしないといけない。よって、nのアドレスが格納されているpは、 p の型は int へのポインタ型。 >しかしよくわからないのですが、p = &n; とint *p = &nの違いがわかりません >前者だと先にint p; と宣言しておけばp はint型になるのでは? int *p; と宣言してあれば両者はほぼ同じ。 int* っていうのは「int へのポインタ」っていう「型」だってのは OK? ポインタと元の型はきちんと区別するべき。 >int *p = &n; としたのなら、 >char*c = (char*)*p もしくはchar*c = (char)*p となるのではないのでしょうか? c は char へのポインタ型。p は int へのポインタ型。*p は int 型。 (char*)*p だと int 型を char へのポインタという型に変換している(c と型は一致するが普通意味を持たない)。 (char)*p だと int 型を char 型へ変換している(c と型が違うのでコンパイルできない)。 >int型をchar型にする利点というか意味がわからないのですが >サイズが異なる構造体をキャストしたら中身が全然違うのに型を変えるとか想像がつきません int へのポインタ型を char へのポインタ型にしても大抵メリットはない。 sockaddr 型と sockaddr_in 型は >571 の通り sa_family の部分は共通しているので >557 の通り sockaddr へのポインタ型を経由して sa_family を読み出し、AF_INET だったら実は sockaddr_in を指していたんだとして キャストしてきちんと読み出すことができる。 つまり関数の引数の型としては sockaddr へのポインタ型としてまとめておいて、実際には sa_family に応じて 正しい型にキャストして使うことができる。
611 :
536 :2009/01/04(日) 11:33:40
int へのポインタ型。ってのがよくわからないのですが 一つのプログラムでintを宣言する変数なんてたくさんでてくるとおもうのですが、 この場合、intへのポイントとはどうなるのでしょうか?
>536 キャストもポインタもないこのコードは理解できる? sockaddr, sockaddr_in, connect() についても本質的にはこのコードみたいなことをしている(type が sa_family)。 #include <stdio.h> struct Any { enum { CHAR, INT, DOUBLE } type; union { char c; int n; double d; } u; }; void print(struct Any a) { if(a.type == CHAR) printf("%c\n", a.u.c); if(a.type == INT) printf("%d\n", a.u.n); if(a.type == DOUBLE) printf("%f\n", a.u.d); } int main(void) { struct A a; a.type = CHAR; a.u.c = '>'; print(a); a.type = INT; a.u.n = 536; print(a); return 0; } もっとも共用体が分かるなら最初っから理解できているような気もするけど。 分からなかったら余計混乱する気がするんで無視してくれ。
>611 >一つのプログラムでintを宣言する変数なんてたくさんでてくるとおもうのですが、 >この場合、intへのポイントとはどうなるのでしょうか? そうだね。だから色んな場所を指せるし、指し直したりできる。 char c1; char c2; int n; char *p; /* どこも指してない */ p = &c1; /* c1 のアドレスを指す */ p = &c2; /* c2 のアドレスを指す */ p = (char*)&n; /* n は char型じゃないけどキャストして無理矢理 n の(先頭)アドレスを指す */
麻雀は分かるか? 二盃口は七対子と見た目は同じだよね。 |二|二|三|三|四|四|七|七|八|八|九|九|發|發| |萬|萬|萬|萬|萬|萬|索|索|索|索|索|索| | | これを一盃口を1かたまりで解釈すると二盃口と解釈できるし、 |二|二|三|三|四|四| |七|七|八|八|九|九| |發|發| |萬|萬|萬|萬|萬|萬| |索|索|索|索|索|索| | | | 全部対子で解釈すると七対子と解釈できる。 |二|二| |三|三| |四|四| |七|七| |八|八| |九|九| |發|發| |萬|萬| |萬|萬| |萬|萬| |索|索| |索|索| |索|索| | | | そして、別に役とか関係無しに単に牌が 14 個並んでいるだけだと解釈することもできる。 |二| |二| |三| |三| |四| |四| |七| |七| |八| |八| |九| |九| |發| |發| |萬| |萬| |萬| |萬| |萬| |萬| |索| |索| |索| |索| |索| |索| | | | |
ここで、1つの牌を1バイトと考え、 対子を2バイトの toitsu_t 型で、 一盃口を6バイトの ipeko_t 型で表せるとする。 役とは関係無しにただ牌が 14 個並んでいると解釈している時は手牌を char tehai[14]; というただの char 配列で眺めているのに相当する。 二盃口と解釈している時は手牌を struct ryanpeko_t { ipeko_t ipeko[2]; toitsu_t toitsu; }; という構造体だと見なして解釈しているのに相当する。 七対子と解釈している時は手牌を struct chitoitsu_t { toitsu_t toitsu[7]; }; という構造体だと見なして解釈しているのに相当する。
#include <iostream> using namespace std; #include <math.h> void atai(); int main() { cout<<"こんにちわ。"<< endl; atai(); return 0; } void atai() { double v;/*v=物体の速さ*/ double undou;/*運動する物体の時間の刻み*/ double c = 108000000;/*光の速さ*/ cout<<"物体の速さ入力:(km)"; cin>>v; double ruto; ruto = sqrt(1 / (1.0000000 - (v/c) * (v/c))); undou = ruto; cout<<"物体の時間の刻み"<<undou<<endl; cout<<"静止している物体が1年間すごしている間"<<endl; cout<<"運動している物体は"<<1 / ruto<<"年間過ごしてる"<<endl; } 光の速さより大きい数字を入力すると-1.#INDと、表示されます・・
役が成り立っているか脳内で判定してると思うが、 まあそういう役が成り立っているかを判定する関数があるとする。 int check_toitsu(const toitsu_t *toitsu); /* ちゃんと対子として成り立っていれば 1 を、そうでなければ 0 を返す */ int check_ipeko(const ipeko_t *ipeko); /* ちゃんと一盃口として成り立っていれば 1 を、そうでなければ 0 を返す */ これを使って ryanpeko_t 型の値が本当に二盃口として成り立っているのかをチェックする関数を作ると、こうなって、 int check_ryanpeko(const ryanpeko_t *ryanpeko) { return check_ipeko(&ryanpeko->ipeko[0]) && check_ipeko(&ryanpeko->ipeko[1]) && check_toitsu(&ryanpeko->toitsu); } chitoitsu_t 型の値が本当に七対子として成り立っているのかをチェックする関数を作ると、こうなる。 int check_chitoitsu(const chitoitsu_t *chitoitsu) { int i; for (i = 0; i < 7; i++) if (!check_toitsu(chitoitsu->toitsu[i])) return 0; return 1; } んで、手牌 tehai をこのチェック関数に渡すには、こんな感じになるわけだ。 if (check_ryanpeko((const ryanpeko_t*)&tehai)) puts("二盃口として解釈可能です"); if (check_chitoitsu((const chitoitsu_t*)&tehai)) puts("七対子として解釈可能です");
とりあえず、「速さ」の単位は「km」じゃないよ。 ローレンツ変換の前に学ぶことがあると思うんだ。。
すげーな、この流れは ポインタFAQ用のテンプレとして、是非利用すべきだ まったく読んでないけど
>>616 #include <complex.h>
年速じゃないの?
626 :
536 :2009/01/04(日) 12:32:34
>>610 sockaddrのほうはsa_family
inのほうはsin_family
共通してないきがするのですが、
キャストしても別に扱われるのでは?
fopen_sとfclose関数を用いてファイルの読み書きするプログラムを作成しているのですが、 ファイルを新規に作成し書き込む場合に、 すでに同名のファイルが存在する場合や、ディレクトリーに書き込めない場合に エラーを返すようにするにはどうすればよいでしょうか?
>>624 c = 108000000なんで時速kmになってる
char mem[sizeof(sockaddr)]; struct sockaddr *sad = (struct sockaddr *)mem; struct sockaddr_in *sadi = (struct sockaddr_in *)mem; とすると、 sad->sa_familyは、memの0バイト目からsizeof(u_short)バイト sadi->sin_familyは、memの0バイト目からsizeof(short)バイト の領域をその値とする。 呼び方が違うだけで、同じデータ。
そもそも長さと速さの単位の違いを分かっているのだろうか。
631 :
536 :2009/01/04(日) 12:50:08
てことは、つまりsockaadr_inにあった各変数がキャストした型にあてはめられる? struct sockaddrn{ u_short sa_family = sin_family; char sa_data[2]; = short sin_port; char sa_data[4]; = in_addr sin_addr; char sa_data[4]; = sin_zero[8]; }; こういうことになるということでしょうか? あと、sizeof(sockaddr)をするとなんでsockaddr_inのサイズもわかるのかわかりません。 これは、sockaddrとsockaddr_inの構造体のサイズが同じだから 別にsizeof(sockaddr_in)でもいいということかな
こんな教えて君に付き合うなんて おまえよっぽど暇なんだな Cの入門書でも読んどけって、話はそれからだ で済むと思うんだが
にゃ〜ん
634 :
536 :2009/01/04(日) 12:52:18
>>617 麻雀はわからないのですが、*ryanpeko はどこをさしているのでしょうか?
修正 #include <iostream> using namespace std; #include <math.h> void atai(); int main() { cout<<"こんにちわ。"<< endl; atai(); return 0; } void atai() { double v;/*v=物体の速さ*/ double undou;/*運動する物体の時間の刻み*/ double c = 1080000000;/*光の速さ*/ cout<<"物体の速さ入力:(km/h)"; cin>>v; if(1 <= v && v <= 1080000000 ){ double ruto; ruto = sqrt(1 / (1.0000000 - (v/c) * (v/c))); undou = ruto; cout<<"物体の時間の刻み"<<undou<<endl; cout<<"静止している物体が1年間すごしている間"<<endl; cout<<"運動している物体は"<<1 / ruto<<"年間過ごしてる"<<endl; } else{ cout<<"光の速さを超えることはできません"<<endl;} }
>>631 connect()のソース読めよ
話はそれからだ
>>627 100% 完全な方法はないと思う。
1. "r" で開いて、開けたら fclose してエラーを返す。
2. "w+" で開いて、開けなかったらエラーを返す。
3. ファイルサイズが 0 でなければ fclose してエラーを返す。
4. "w" で freopen_s する。
がまだましな方法だとは思うが、
1 と 2 の僅かな間にサイズ 0 のファイルを作られたらチェックから漏れる。
>>631 まあそんなところだ。
sizeof に関しては、sizeof (sockaddr) は危険。
sockaddr_in を渡しているのだから、sizeof (sockaddr_in) にすべき。
>>636 vが光速より大きいと、v/cが1より大きくなる。そうすると(v/c) * (v/c)が1より大きくなる。
そうすると1.0000000 - (v/c) * (v/c)が負になる。そうすると1 / (1.0000000 - (v/c) * (v/c))が負になる。
そうするとsqrt()の引数が負になって定義域エラーになる。
641 :
536 :2009/01/04(日) 13:02:42
なるほど。
>>631 みたいな感じなのですか。
これだとなんとか理解できます。こんなめんどくさいことするのはconnectの決まりだからというわけですね。
>>641 IP以外のプロトコルのアドレスも扱えるようにしてるんじゃないかな
>>641 ,642
おや、話が半日前に戻ったぞw
進歩がないスレだな
>>643 while(代入式)の人ですね?分かります
while君と教えて君が出現するとスレが無駄に進む
>>645 無駄だと思うならこのスレに来るなよ馬鹿
いや進めよう、いざ進め さあ、次の質問カマーーン!?
648 :
536 :2009/01/04(日) 13:27:41
char c1; char c2; int n; char *p; /* どこも指してない */ p = (char*)&n; /* n は char型じゃないけどキャストして無理矢理 n の(先頭)アドレスを指す */ よく考えたらpはchar *pと宣言しているからpはchar型じゃないか だったら キャストなんてしなくてもいいんじゃないの? char *p p = &n; で
while君もcast解らん君も
自ら試すということをしないところに共通点が。
>>644 オレはレベルの低い質問については回答側だよ。
どっちも実験しようとすれば5分で結果出るじゃん。
初心者歓迎のスレは別にあるのにこのスレの存在意義が
わかんね。
>>648 ここでそんなことしても意味ないから。
コンパイラへの明確な指示と人間の可読性を考えて
ソースは書くんだよ。
> char *p
> p = &n;
それコンパイル通してみた?
gccなら-Wallつけて、コンパイラがどう言うかちゃんと
向き合いながら勉強しなよ。
>>648 &nはint*型だから。
それを代入する先の変数pはそれとは異なるchar*型。
そのため、キャストして&nをchar*型にしてやらないといけない。
教えたがりが殺到してわけわからなくなってるな。
つーか、最近の2chは微温くなったもんだな。 俺の若いころは、ちょっとバカな質問すると 逝ってよし! 半年ROMれ とか言われたもんだが
ここは、二番目にバカな質問を受け付けるハコだからな。 一番は、宿題スレ
>>654 thx
本当だ
初心者歓迎C/C++室の方がレベルが高いw
宿題スレにだけは足を踏み入れる気がしない。
宿題スレだってピンからキリまでだよ。 アホも多いけどレベル高い人もちゃんといる。
>>649 > 自ら試す
コンパイラが通せば正しいとは限らないんだが・・・
それを指摘されてファビョったキチガイですね?分かります。
もう秋田
>>658 正しい場合でもそれと分からないやつにはな・・・
配列のサイズを指定せず、配列に数値を格納して行く度に 配列のサイズを増やしていく方法がわかりません 言語はC++です このような事は可能なのでしょうか、また出来るなら どのようにすればいいのかご教示願います
>>662 std::vector か std::deque 使え。
STLのvectorでresize()を使うのはいかがでしょうか?
push_back や insert でいいだろ
668 :
662 :2009/01/04(日) 15:07:08
皆さんありがとうございました これで詰んでた課題が進めそうです
iStudy BB for IT Skills C言語プログラミング基礎 パーフェクトP
>>670 今回だけは勘弁してやるから、URLの縮め方をここに書け
>>673 そうやって法則性を見つける努力を怠るからダメなんだよ。
>>674 そんな無意味な煽りを書く暇があったら、さっさとやり方を書け
俺なんのために付属されたんだろう・・・orz
>>675 そんな無意味な煽りを書く暇があったら、さっさとやり方を考えろ
暇な奴って怖いなまで読んだ
>>677 やり方は考えるものではなく、存在するものだ
解っているなら、さっさと書け
>>679 やり方は存在するものではなく、考えるものだ
解らないなら、さっさと考えろ
よーしパパがんばって教えちゃうぞー って仕事の電話が すまん今はダメのようだ
よーしパパがんばってID出しちゃうぞー☆
質問に答えない、無意味な質問スレッド 死ね
教えて欲しいなら下手に出ろよw
下手に出ても教えないけどな。 見りゃすぐ解る事を教える事ほど害悪なことは無い。
ワカラン → 教えろカス → 嫌 → 氏ね 小学生ですね わかります
692 :
デフォルトの名無しさん :2009/01/04(日) 16:05:54
void error(char * errormessage) { perror(errormessage); exit(1); } error("エラーです") これを実行するとエラーです と表示されますよね でも、 void mputs(char *p) { while(*p); printf("&c", *p); p++; } printf("\n"); } mputs("エラーです”); 前者と後者では表示される文字は同じですよね。 後者だと変数pが指定する領域を1バイトのchar型として、読み取るので1文字ずつループしていってますよね でも前者だとそのようなループがないのに、1バイトのchar型として一度に全部の文字を表示しているって おかしくないでしょうか?
>>692 先ず、Cでは文字列をどう表わすか知ってる?
>>692 void perror( const char *string );
文字列の先頭のアドレスを指定します
何の問題もありません
>>692 char *aiueo = "あいうえお";
myprint(aiueo);
void myprint(char *str)
{
printf("%s\n", str);
}
何かおかしい?
697 :
デフォルトの名無しさん :2009/01/04(日) 16:19:26
>>697 それでは、逆にポインタを使わなければどうなるのでしょうか?
699 :
デフォルトの名無しさん :2009/01/04(日) 16:21:48
>>698 ポインタ使う場合は、下記の文になる
使わないとできない
void mputs(char *p)
{
while(*p);
printf("&c", *p);
p++;
}
printf("\n");
}
mputs("エラーです”);
string aiueo("あいうえお"); myprint(aiueo); void myprint(string str) { cout << str << endl; }
701 :
デフォルトの名無しさん :2009/01/04(日) 16:38:39
char *aiueo = "あいうえお"; myprint(aiueo); void myprint(char *str) { printf("%s\n", str); } 変数aieuoに文字列 あいうえお を代入 char[0]にあ char[1]にい char[2]にう を入れる。 つまり、aiueoが指すアドレス領域はすべてchar型だと で、aiueoを指定するとchar[0]のアドレスが得られる。 そのアドレスを引数にして関数に渡す。渡された関数でも同じことをし str配列の中身を全て表示する ということでしょうか
702 :
デフォルトの名無しさん :2009/01/04(日) 16:40:35
だとしたら、こんな文でするよりそっちでしたほうがいいってことですよね こんな文は使い道ないということかな void mputs(char *p) { while(*p); printf("&c", *p); p++; } printf("\n"); } mputs("エラーです”);
>>701 システムがメモリーを確保して、そこに"あいうえお"と言う文字列定数を配置。
その先頭アドレスをchar型へのポインタ変数aiueoに代入。
aiueoが示すのは"あいうえお"の先頭だけ。
ただし、コンパイラはaiueoを使うときには、char単位に操作することを知っている。(char *と宣言したから)
704 :
デフォルトの名無しさん :2009/01/04(日) 16:48:13
なんでaiueoには先頭アドレスしかはいってないのに void myprint(char *str) { printf("%s\n", str); } これで、全部表示されるかがわかりません。 引数としてmyprintに渡すのは先頭アドレス。 その先頭アドレスをchar *str でどう処理しているのでしょうか?
こういうので、ネットでいちいち質問してたら効率悪すぎるよ。 適当な入門書でも読んでみたら?
707 :
デフォルトの名無しさん :2009/01/04(日) 17:00:04
ダメだ全然わからない なんでポインタの文字を一気に表示できるんだ
708 :
デフォルトの名無しさん :2009/01/04(日) 17:00:21
そういうもんだって深く考えずに受け入れることも大事。
>>707 ポインタの指してるとことから連続で並んでるからだろ。
712 :
デフォルトの名無しさん :2009/01/04(日) 17:04:41
なんで、*strじゃなくてstr
過去を振り返っては駄目です
>>658 俺はwhile君じゃないよ。回答側と言っている
お前はここ来るまえに日本語からやりなおせ
宿題スレと統合したら? 結局、皆さんのおかげで課題が進みそうってw
宿題スレは課題丸投げ用
宿題テンプレも埋めるのが面倒臭いから、こっちに投げてんだろ。 テンプレ強制になっても、他に飛び火するだけ。
文字列を作成すると自動的に末尾に\0が付加される char *str = "あいうえお" とすると 正確には あいうえお\0となっている ので先頭の str[0] のアドレスさえ分かっていれば \0がくるか0がくるまで その内容は何かしらの意味を持った文字列だと認識する 自分でもやってるだろ? デバッカで char *str = "あいうえお"; の内容を見てみれば分かる
>>719 わかりました。
\0が出てくるまでが文字列ということですね。
ウィンドウに貼り付けたプッシュボタンのWM_NCHITTESTメッセージをキャッチするには サブクラス化するしかないのでしょうか?
そうだね。
今リスト構造やってるんですが、ポインタが非常に分かりづらい; どなたかおすすめのポインタ解説サイト知ってましたら 教えていただけないでしょうか
小数点のより右の数字だけを取る方法はないでしょうか? x * y =200.1となったら0.1にしてしまうような
z = x * y; z = z - (int)z;
trunc
>726 の方法だとzがintの範囲をオーバーフローしてるときにおかしくなるね
それと負の数も考えて、floorつかえばいいさ
floorじゃだめか負の数
modf使えよカス
倍精度でも仮数部が52bitだから 64bit整数型使えば精度的に大丈夫のはず
だから0方向切り捨てなんだからtrunc一発で終わりなんだって
クラスは分かったけど配列クラスで詰んだ… 他にも同じような人いそうだな… またこれが使えるようになった人ってのはやっぱり テキスト熟読してやっとの事で理解出来たんだろうか
>735 「配列クラス」というのは何のことだ vector等のことか、それともオブジェクトの配列なのか
grwinで三角形を任意の角度回転させて表示するってのを作ってるんですが 三角形の中心を求めて原点に置き、回転させる方法が分かりません・・ どなたかご教授おねがいしまう
>>737 教授なんかできるか。
1. ググれない事情がある。
2. それらしい解説ページは見つけたが、言葉の意味が解らない。
3. 意味は解るが、コードに落とせない。
どれだ?
>>737 三角形の中心って外心?
重心なら簡単なんだけど。
高校の数学の教科書でも見直せばいいんじゃね?
普通に考えて慣性モーメントが最低の軸、つまり重心を通る軸じゃね?
なるほど。 でも軸なの? 重心を中心にして点対称に回転させるんじゃないの? ともかく「三角形の中心」を決めないと。 内心?外心?垂心?重心?傍心?
中心が決まったら、あとは「アフィン変換」「回転行列」「クォータニオン」辺りで。
>>737 >三角形の中心
中心は5つほどありますが、どれになさいますか
傍心は中心じゃないだろw
>>746 三角形の中心(さんかくけいのちゅうしん)とは、任意の三角形から一意的に求めることができる点の総称である。単に心または芯とも呼ばれる。
「五心」と呼ばれる点(内心・外心・重心・垂心・傍心)が一般的に広く知られている。
748 :
デフォルトの名無しさん :2009/01/05(月) 00:59:00
下の例のような文字列や小数などが入り混じったchar型の変数の配列があります。 これから小数だけを取り出してファイル出力したいのですが、何かいい方法はあるでしょうか? char name[0]=frame char name[1]=0.123 ←取り出したい char name[2]=23 char name[3]=1.234 ←取り出したい
まるちうぜえ
>文字列や小数などが入り混じったchar型の変数の配列
取り出す前に、どうやって入れたのか知りたい
そうだな 小数入れる前に構造体にしてフラグ立てとけよカス
for(int i = 0; i < 4; i++){ if(name[i].isFloat()) name[i].toFile(); }
規格書高ぇ・・・
755 :
デフォルトの名無しさん :2009/01/05(月) 06:54:50
Unicode対応プログラムの作成練習してるけどしょっぱなからつまずいた… #include<stdio.h> #include<tchar.h> #define _UNICODE #define UNICODE int main(void){ TCHAR uni[]=_T("UnicodeTest"); printf("%s\n",uni); return 0; } 上記のコードを実行するとUしか出力されません。原因はUの2バイト目が00なので ヌル文字と勘違いしてしまうからだと予想しますがforで回すしか回避方法はないのでしょうか?
つ wprintf
TCHAR 使うんなら _tprintf だろ・・・。 それに、_UNICODE を定義するのなら tchar.h をインクルードする前っつーか、 プロジェクトファイルの設定をいじれ。 _MBCS が定義されてるかもしんないし、混乱の原因になる。
(^ー゚)テヘッ
か わ い い
>>754 X3010なら俺の上でアンアン言ってるぜ
それ規格書じゃなくて魔導書じゃね?
インデックスか
vs2003を使っている者です。 ヘッダで構造体を struct fff{ double a; double b; double c; double d; double e; double f; double g; double h; double i; double j; }; struct fff ggg[2]={ {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0} }; こういった形で宣言・初期化しているのですが、 double型のメンバの数を11個以上に増やすと、この構造体と全く関係のない処理でおかしな動きをしてしまうのです。 例えば、プログラム内で全く使われない、double型のメンバ数11以上の構造体を作ったとしても、どこかの演算に影響を及ぼしてしまうようです。 これは一つの構造体の大きさに上限があるということなのでしょうか? また、これを解決し、多くのメンバを持つ構造体を宣言する方法などがあれば教えてください。
>>763 >ヘッダで構造体を宣言・初期化している
「そのヘッダをいろんなファイルで読み込んでいる」に500ガバス
766 :
デフォルトの名無しさん :2009/01/05(月) 21:02:01
レイテンシ
>>763 メンバ数の上限がそんなに低いところにあるとは考えられない。何か勘違いをしていると思われ。
問題の再現する最小限のソースを貼りたまえ。
769 :
デフォルトの名無しさん :2009/01/05(月) 21:08:49
0x0040とは一体どういう意味なのでしょうか? 0xがつくから16進数かと思ってたけど違いますよね? あとif文で、 変数 & 0x0040 == 0 とかいった文がありますが これはどういう意味なのでしょうか? この場合、変数には絶対0x0040のような値がはいるということでしょうか また==0 で何を判定しているのでしょうか? よろしくお願いいたします。
テキストファイルを読み込み、行数を数えるプログラムを作れ(C言語) との課題が出ました。 テキストファイルを読み込み配列(構造体で定義)に格納するところまでできたのですが 行数をカウントするプログラムがうまくいきません。 現在 char *strText(構造体で定義) for (Count = 0; Count < TextVol(構造体で定義); i++) { if (strText[Count] == 0x0D) EnterCount++; } という感じです。 これだと 「abc□ d□ ef□ g」 (□==改行) という行は3行とカウントされてしまいます。(希望は4行) ちなみにテキストファイルを読み込む関数と、カウントする関数は別で作れといわれています。 どうすれば最後
> 0xがつくから16進数かと思ってたけど違いますよね? まず、どうしてそう思うのか説明してくれ
772 :
770 :2009/01/05(月) 21:12:06
とぎれてしまいました どうすれば最後の行が空でない場合カウントさせることができるでしょう?
774 :
770 :2009/01/05(月) 21:22:28
>>773 その場合、
「abc□
d□
ef□
g□
」
を5行とカウントしてしまいます。
空白行はカウントせずに最終行が空白行じゃない場合のみカウントさせたいのですが、いい方法はありませんか?
>>769 0x0040は16進数で、10進数にすると64
>この場合、変数には絶対0x0040のような値がはいるということでしょうか
何も入りません
>また==0 で何を判定しているのでしょうか?
>よろしくお願いいたします。
面倒だからいやだ、以上
>>775 文字コード あるいは アスキーコード
でググってみ
>>765 >>768 先程いろいろ弄っていたら何故かこのバグが起きなくなってしまいました。
再現することすらできなくなってしまいました。
昨晩からずっと悩まされていた問題だったのに何故なんでしょう・・・
でもメンバ数を増やしただけで全く関係ないような演算におかしな結果が出たのは確かなんですよ
何はともあれ解決したので良かったです。助言ありがとうございました。
>>773 行頭の1文字目が改行かどうかも判断したら良いんじゃね
ちょっと疑問なのは、最終行じゃなくて途中に空行があったらどうするつもり?
>>774 最終行が空と言うか、改行で終わってるだけだから、
それを判定すれば・・・
>>776 ただのビットフラグの判定がどう関係するんだ?
781 :
770 :2009/01/05(月) 21:37:58
>>778 すみません TextVol はテキストファイルの大きさなので、
ただいまのカタチですと「行の先頭」との比較ができません。
途中の空白行がカウントされるのは問題ありません。
>>779 現在ですと
「abc□
d□
ef□
g□
」
が4行
「abc□
d□
ef□
g」
が3行とカウントされてしまうのでソコをなおしたいです。
>>780 すまん、0x0040だけみて文字の判定かと思った。
>>781 改行文字の次の文字が、次の行の先頭だよ
784 :
769 :2009/01/05(月) 21:50:51
すみません、お願いします・・・
>>781 ファイルの終端に改行文字が何文字連続してるか数えれば、
最後に空白行が何行あるかわかる
>>781 そのforを抜けた後にcount番目の文字が改行文字でなければ1行増やす。
787 :
785 :2009/01/05(月) 22:01:18
言葉足りなかった 改行文字の数+1で空白行も含めた行数が分かる。 そこから最後の空白行だけ引けばいい んで最後に空白行が何行あるかは785
お前ら、Cの演算子の優先順記憶してるの?
>>784 まず2進数⇔10進数⇔16進数の変換ができるようになれ
そしたら「C言語 ビットシフト」でぐぐれ
ビットシフトじゃなくてビットフラグ
>>788 時々一覧を見るよ。
基本的には、括弧とかで確実にするよ。
>>788 可読性を上げるためにも括弧をつかいます
年初にあたり優先順記憶しようと思ったけど、サンプル数0/3(自分含む)という事で 無理そうだから止めたっと。
795 :
デフォルトの名無しさん :2009/01/05(月) 22:34:22
0x0001 & 0x1000 これの値は0 なのか、それとも0000000000000000 なのでしょうか? また、同じく 0x1000 & 0x1000 の値は、0001000000000000なのか 1000000000000 どちらなのでしょうか?
796 :
763 :2009/01/05(月) 22:44:31
>>763 ,777ですが、結局また同じ問題が発生してしまいました。
今度は具体的に説明させてください。
今、ピンボールのプログラムをdirectX3Dを使って作っております。
下の構造体はある障害物の座標を表すもので、ヘッダに記述されているものです。
struct circle{
float x0;
float y0;
float x1;
float y1;
double angle;
float r;
float centx;
float centy;
}circle[]={
{-10,0,10,0,PI,0,0,0,0}
{0,0,0,0,0,0,0,0}
};
この中に新しくdouble qwerty(変数名は適当)を作ります。
そしてこの初期化部分でqwertyに0を代入します。
すると、「特定の壁の当たり判定が消えてボールがすり抜ける」という事態が起きてしまいます。
その壁の当たり判定というのはこの構造体とは全く関係のないものです。
次にdouble qwertyのdoubleをintに変えてみます。
すると、先程のバグは起きなくなります。
また、この上記の文をコピーして、構造体の名前を適当なものに変えます。
そして同様にdouble型のメンバを増やすと同じバグが発生してしまいます。プログラムで一切使われていない構造体なのにも関わらずです。
以上のことから考えると、構造体の大きさが原因で、「ある一定以上の大きさの構造体を宣言するとバグが発生する」ということになっているのではないかと思われます。
いったいこれはどういうことなのでしょうか?全く見当がつきません。
>>795 君には早すぎるってのがわからんかな
ここで説明したところで理解できないよ
0と0000000000000000は同じ
0001000000000000と1000000000000も同じ
どっちも同じじゃん。 普段 10 進数で 123 とか 372 とか言ってるけど、 それより上の桁は、実際には全て 0 で埋められているけど 単に省略して表現しているに過ぎない。
>>796 無関係の配列やポインタを扱っている部分で
バグにより適切な領域を越えた所へと書き込んだり読み込んだりしている部分があり、
その領域がたまたま qwerty のあたりにあったんだろう。
そのあたりの値が常に 0 で初期化されている時のみ
たまたま変な事が起きているんだろう。
>「ある一定以上の大きさの構造体を宣言するとバグが発生する」
のではなく、
>「バグ持ちだが、qwerty がないとそれが目に見える形で現れない」
だけに過ぎない。
>>796 circle[0]の初期化で、構造体の要素数をこえてしまってるけど、
初期化でミスってない?
つか、これってコンパイルできてるの?
801 :
763 :2009/01/05(月) 23:05:40
>>799 ということは、この構造体に問題があるのではなく、
「当たり判定が消えてしまう特定の壁」の方にあるということなのでしょうか。
>適切な領域を越えた所へと書き込んだり読み込んだりしている部分
適切な領域を越えたところを弄ってしまうというのは例えばどのような処理をしたときに起こるんですか?
>>800 宣言部分と初期化部分を分離して
struct circle circle[2]={
{-10,0,10,0,PI,0,0,0,0},
{0,0,0,0,0,0,0,0}
};
としても結果は同じでした。
>>796 の記述でもコンパイルはできてます。
>>796 だからオーバーフローしてんじゃねぇの?
それから、ヘッダでグローバル変数を宣言するのは勝手だが、externを使うような機構にしろ。
そんで何度も初期化されるような記述はやめろ。
DirectXとか以前に、C言語の基本だぞ。
>>801 >ということは、この構造体に問題があるのではなく、
>「当たり判定が消えてしまう特定の壁」の方にあるということなのでしょうか。
その可能性もあるが、そうでない可能性もある。
バッファオーバーフローは全く予期しない所に影響を与えうるからな。
>適切な領域を越えたところを弄ってしまうというのは例えばどのような処理をしたときに起こるんですか?
int n[10];
if (n[100] == 0) {
n[1000] = 9;
}
int a;
n[a] = 10;
>>801 いや、言いたいのは
circleの要素はx0〜centyの8個でしょ
でも
circle[0]の初期化で9個の値を入れてるってこと
適当に今サンプルコード書いただけなんじゃね? 普通要素多かったらコンパイル通らんだろ。
バグとか以前の問題だな。
>>802 これが何度も初期化されるような記述だということがまずわかっていませんでした。
externでやってみます。
>>803 ありがとうございます。
ソースを確認してみます。
>>804 すいません、いろいろ弄っている途中だったのでコピペミスってしまいました
ちゃんと8個の値で初期化しても駄目でした。
809 :
802 :2009/01/05(月) 23:24:35
>>808 言い方がきつかったが、要は構造体を定義したヘッダファイル内でその変数も宣言・初期化するってことは、
そのヘッダファイルを読み込んだソースファイルの各々について宣言・初期化が行われるだろ?
ヘッダでそういう書き方をしてるってことは、そういうことが起こっているんじゃないかって思ったわけ。
断定的に書いちゃったけど、自分で確かめてみて。
>>809 なるほど。確かめてみます。
助言ありがとうございました。
811 :
763 :2009/01/06(火) 00:24:28
原因が見つかりました。 宣言した配列の大きさ以上の領域を弄っていたようです。 そこを直したところ解決しました。 みなさんありがとうございました。助かりました。
812 :
デフォルトの名無しさん :2009/01/06(火) 00:43:17
こちらで質問させて頂きます。 5年ほど、ACCESSのVBAでOracleやMySQLのDB操作を行い、 生産管理ツールなどを作成してきました。 そろそろ、C言語にも手を出してみようと思い、現在 C++Bilderか、VC++のどちらにしようか迷っています。 やりたいことは、ACCESSで言うフォーム上からDBのデータを表示したり、 進捗を入力したりしたいと思っています。 雑な質問で恐縮なのですが、C++Bilder2009とVC++では どちらがとっつきやすいでしょうか?
814 :
813 :2009/01/06(火) 00:50:55
>>813 Bilder?
Builderのことだな。
815 :
812 :2009/01/06(火) 00:59:41
すいません。Builderでしたね。。。 確かに、SQLServer使ってるわけでもないので、 VC++である必要もなさそうですね。
「プログラマーは報酬さえ得ることが出来ればどんな事でもするって言うのか!」
>>820 実は表紙だけで、中身は普通のJIS X3010なんだろ?
そっちのほうがよっぽどほしいわww
なんでC言語なんて覚えてんだろ・・?
2chブラウザ作りたいんですが、 他の2chブラウザって、書き込み処理とかは、ここのフォームを偽装して作ってるんですか?
826 :
825 :2009/01/06(火) 12:48:43
>>826 基本、そんな感じ。それにプラスするとしたら、画像表示、検索、あぼん、コテ管理、DAT管理、書き込み管理と言ったところか。
書き込みフォームは偽装するよりもオリジナルで作った方が使い易いと思われ。
あー、Cookieの管理とか板トップ表示なんかも必要か。
暇でライブラリでも作ろうかと思ってるんで何かお題ください
>>829 Cでスパイダーツール書くのに使えるヤツ
スパイダーツールって何?
なるほど あんまり興味ないけど作って見ます
834 :
デフォルトの名無しさん :2009/01/06(火) 22:25:03
デバッグ作業でよく発見する間違いってどんなのでしょうか?
>>834 コーディング段階で発見できない間違いの殆ど全て。
836 :
デフォルトの名無しさん :2009/01/06(火) 22:42:28
どういうのが発見できないのでしょうか?
というか全部発見しようとするのがデバッグってもんじゃないかww
仕様の誤解釈、typo、不注意、思い込み、&c...
デバッガのバグとかも
>>834 配列とかポインタでアクセスしたらいけないところにアクセスしてるのが多い
841 :
デフォルトの名無しさん :2009/01/07(水) 01:35:17
C++(gcc4.1.2使っています)で、 下記のJAVAのように、 メソッド内で同一クラス内のメソッドを利用するにはどうしたらよいのでしょうか。 public class Greeting { public void sayHello() { this.hello(); } private void hello() { System.out.println("Hello"); } }
this->hello();}
843 :
デフォルトの名無しさん :2009/01/07(水) 01:43:30
質問です( VC++ 2008EE ) クラステンプレート使用時、staticなconstメンバ変数の定義でエラーになってしまいます。 <ヘッダー> template <typename T> class samp{ private: T number; static const double db; public: ... void disp() const { std::cout << "db = " << db << std::endl; } }; <cpp> template <typename T> const double samp<T>::db = 1.35; このクラスのオブジェクトを生成して disp() をコールすると db の外部参照が未解決と出てしまいます。 どう修正すべきでしょうか?
定義が無いもの、定義書けばいいだろ
VS2008で問題出ないけどなあ、それ。
847 :
844 :2009/01/07(水) 11:00:00
>>845 <cpp>での定義の事でしょうか?
const double samp<int>::db = 1.35;
const double samp<char>::db = 1.35;
とかやれば通るんですがテンプレートの意味ないですよね・・・
>>846 マジですか?!
クラスの宣言と定義だけなら通るんですが、main にて
samp<int> smp;
smp.disp(); // ここでエラー
になってしまいます
const double samp<T>::db = 1.35; で通るけどな、EEとProの違い?SP1だけど。
スターチックなメンバ変数は外で定義する必要があるにょ
851 :
849 :2009/01/07(水) 12:43:05
>>847 一応書いとくけど、通ったというのは
samp<float> hage;
hage.disp();
samp<int> *hoge = new samp<int>();
hoge->disp();
delete hoge;
で実行してのことだからな。
852 :
844 :2009/01/07(水) 13:04:33
ああ・・・ 解決しました template の場合、ヘッダで定義しないとまずい事を失念しておりました。 cppファイルでなく、ヘッダで template <typename T> const double Samp<T>::db = 1.35; と定義する事で解決しました。 お騒がせいたしましたm(_ _)m
そんなんじゃまた聞きにきそうだな
じゃあ次の質問↓
質問です。(C言語) float *y,nb; y = &nb; printf("実数を入力\n"); scanf("%f",&y) printf("%f",*y); と書いたらセグメンテーション違反と言われてしまったのですが、恥ずかしながら何故そうなのか解りません。 ご教示お願いします。
訂正。 float *y,nb; y = &nb; printf("実数を入力\n"); scanf("%f",&y); printf("%f",*y);
>>855 - scanf("%f",&y);
+ scanf("%f",y);
>>855 を訂正します。
×セグメンテーション違反と言われてしまったのですが〜
○入力した値が表示されないのですが〜
何度もすみません。。
860 :
855 :2009/01/07(水) 15:24:22
ナニを勃てるまでもない↓画像
ロベール先生、いつもお世話になっております。
それはどうも。
「はてな」ってwikipediaのパクリなんだな
#include <iostream> using namespace std; void rensyuu(); int main() { rensyuu(); return 0; } void rensyuu() { int tensuu[] = { 12,78,100,43,56,87,29,60,43,52, 51,67,89,03,50,68,99,94,81,10, 22,55 }; int i; for(i = 0; i < 22; i++ ); { cout<<"出席番号"<<i<<"は"<<tensuu[i]<<"点です"<<endl; } } エラーとかは出ませんが 出席番号22は-858993460点です と、なってしまいます・・・ 自分が思うようになってくれません どこが間違っているんでしょう・・・???
867 :
デフォルトの名無しさん :2009/01/07(水) 19:51:49
ひとつのプロジェクトファイルに 複数のソースファイルがあります。 main.c ├sub.c inter.c └ter2.c みたいにあったとして、これをコンパイルするとひとつの実行ファイルになります。 どういう風にコードを組めば、ひとつの実行ファイルとしてコンパイルされるのでしょうか? 簡単なCのソースファイルしか書いたことなく何百行や何個もあるファイルからなるプログラムを作ったことないので よくわからないので、よろしくおねがいします。
>>867 なんで一つの実行ファイルになってるのか理解できないってことか?
>>866 自分で数えるからいけない。
int i;
for(i = 0; i < 22; i++ );
を
for (int i = 0; i < sizeof(tensuu) / sizeof(* tensuu); ++i)
に変えてご覧。
871 :
デフォルトの名無しさん :2009/01/07(水) 20:12:13
>>868 はい、そうです。
普通は1つのファイルをコンパイルしたらひとつの実行ファイルですよね。
普通はっていうか、Cを学び始めたころ思うには。
2つ3つのファイルになってコンパイルすると1つの実行ファイルになりますよね。(そう設定したらとは思いますが)
これらのファイルはお互いに参照?してるから自動的に一つの実行ファイルになるのかな?
main関数を含むファイルを中心にしてひとつの実行ファイルを仕上げるのでしょうか?
>871 一応、main.cで他のファイルを全て #include "xxxx.c" すれば動くことには動くよ。 ただ最終的には分割コンパイルに慣れるべきだな。 各ファイルに対応するヘッダファイルを書くことになる。 覚えることが多いので詳しくは分割コンパイルで調べてくれ。
>>871 >これらのファイルはお互いに参照?してるから自動的に一つの実行ファイルになるのかな?
VisualC++みたいな統合環境だと、プロジェクトの設定や登録されたソースなどから
コンパイラやリンカへの指示を自動でしてくれる。
自分でするなら、必要なソースをコンパイルし、それらと適切なライブラリをリンカに渡して実行ファイルに纏め上げる。
874 :
デフォルトの名無しさん :2009/01/07(水) 20:51:52
>>872 大きなというか複数にわたるソースをみたことありますが、
見たやつはincludeはしてなかった気がします。
includeでもmainプログラムにそのファイルを取り込むってことだけど
その場合はファイルを結合っていう感じではなく、一部分をmainを取り込むみたいな感じですよね
875 :
デフォルトの名無しさん :2009/01/07(水) 21:24:50
extern と static ではまる 特に static マジでヤバイ static にふたつの意味がある 全然関係ないのに同じ static で書くから 初心者は混乱しまくる超やばい
>>874 include 無くてもリンクすればひとつになる
プロトタイプ宣言がありさえすればいい
で、プロトタイプ宣言を全部の *.c ファイルに書くのが面倒だから 共通のはまとめて *.h に書いて include するようになったんだと
878 :
デフォルトの名無しさん :2009/01/07(水) 21:29:14
何をプロトタイプ宣言すればよいのでしょうか? 互いに関連性のないソースでもひとつになるということかな だったら1つにしてしまったら、どっちかは機能しないのでは
hoge.c -------- int hoge(int hoge){ return hoge; } -------- fuga.c -------- int hoge(int); int main(){ printf("%d", hoge(123)); } -------- これで include なしでリンクすると fuga.exe ひとつだけにできる
880 :
デフォルトの名無しさん :2009/01/07(水) 21:38:40
>>878 >何をプロトタイプ宣言すればよいのでしょうか?
共通に使いたいもの
>互いに関連性のないソースでもひとつになるということかな
互いに関連性のないソースをひとつにする意味があるのか?
(強いて言えばライブラリ作るとそうなることがあるけどその場合でも無関係のはあまり混ぜない)
>だったら1つにしてしまったら、どっちかは機能しないのでは
両方のソースで static になってるとそれぞれがそれぞれのソース内でのみ機能する
>>875 だからC++は無名名前空間を取り入れたんだな。
>>875 ポインタよりやばい罠
ポインタで躓くなんて言ってる香具師はたいしたことない
>>875 スコープの方は別の単語にして欲しいよなぁ。(externの対義語はinternか?)
なんでこうなんだろ。
ローカルな静的変数にするという意味で共通してるっしょ。
>>883 勉強不足なだけだ
あれは別にスコープのためにあるんじゃない
886 :
デフォルトの名無しさん :2009/01/07(水) 23:57:39
「extern つけたもの」 と 「extern つけないもの」 だけで充分な気がするのですが ここに「static つけたもの」が入ってくると訳がわかりません スコープのため意外になにがあるんでしょう
hoge.c -------- int hoge=10; -------- fuga.c -------- extern int hoge; -------- hage.c -------- int hoge; -------- hige.c -------- static int hoge=20; -------- main.c -------- extern int hoge; int main(){ printf("%d", hoge); } --------
hoge.c -------- int hoge=10; -------- fuga.c -------- extern int hoge; -------- hage.c -------- int hoge; -------- main.c -------- static int hoge=20; extern int hoge; int main(){ printf("%d", hoge); } --------
>>886 普通は外部に公開するので
むしろ extern なんてものの方がいらんだろ。
実際関数では extern なんてものは使わない。
変数は、宣言と定義を区別できないので extern が必要になるが。
static グローバル変数と static ローカル変数って同じようなものだろ? 関数外に書かれたらファイルスコープで、 ブロック内に書かれたらブロックスコープになるだけで。
だからスコープのためにあるんじゃない 実体を静的に解決するためにstaticがある 結果的に外部から実行時参照が出来なくなるだけ
getlineを利用したプログラムなんだけど、コンパイラ時にエラーが出る (.text+0x9a):undefined reference to `_getline' collect2: ld returned 1 exit status 上のような警告が出て通らない。環境はCygwinでgcc3.4.4 libc 4.6.27以降にgetlineが入ってるみたいなんだけど、その情報をどう利用していいのかわからん インストールのパッケージにありそうだと思って探したけどそれらしき物が見つからず途方にくれてる includeし忘れとかそういう初歩的なミスはしてないつもり。 助けてください><
>>892 それだけの情報ではぼくもわかりません><
せめてソースを晒してください><
894 :
デフォルトの名無しさん :2009/01/08(木) 07:00:14
一つのCのソースファイルにて<stdio.h>などをインクルードしますよね #include<stdio.h> main{ printf.... } みたいに 実際これをコンパイルするとなると、ライブラリ?も関係してくるのでしょうか? stdio.hにかかれているものをライブラリからとりこんでくる? 開発環境のソフトつかってると、ソースファイルやヘッダファイルとは別にライブラリファイルも用意されてて コンパイルするみたいなのですが、このときのライブラリファイルがよくわかりません。 普通にソースファイル単体をgccなりでコンパイルするとこのライブラリってファイルがないので疑問におもいました
標準関数は、特に指定しなくてもリンクされるようになっていることが多い。 有名な例外は、unix系の場合のmathライブラリ。
>>892 -lナントカでライブラリを指定してちょうだいということ。
RAII てなんて読んでる? 上司がずっと「レイ」って言ってて何の事だかわからんかった 俺は「ライィー」て読んでるけど・・・
しょーもない質問で申し訳ありません Visual studio 2008を使っていますが 構成プロパティにC/C++の項目がでません どうしたら出ますか?
C/C++のプロジェクトを作る
900 :
デフォルトの名無しさん :2009/01/08(木) 11:56:24
えーと、言葉が足りなかったようなので補足説明させていただきます ファイル→新規作成→プロジェクト→Visual C++→ Win32 コンソールアプリケーション→次へ→ コンソールアプリケーションと空のオブジェクトにチェックを入れる この状態でコード書いて構成プロパティ見ても 構成プロパティにC/C++の項目が出ないんです どなたか出す方法よろしくお願いします
>>901 プロジェクトに新規追加でcppファイル入れたら出るよ
904 :
892 :2009/01/08(木) 13:28:17
$ gcc hoge.c -lc /usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../libc.a(d000681.o):(.text+0x0): multi ple definition of `_atexit' /usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../i686-pc-mingw32/lib/crt2.o:crt1.c :(.text+0x2c0): first defined here collect2: ld returned 1 exit status getlineのエラーは出なくなったけど、今度はこんなエラーが出ちゃった ソースを添付して聞く事は出来ればしたくないんだけど ひょっとしてこういうエラーってソースが無いと原因をつきとめようがない? コンパイラアセンブルは出来るけどリンクが出来ない状態だから、ライブラリの問題なのかなーと。
905 :
デフォルトの名無しさん :2009/01/08(木) 14:28:31
ソース出せ 出せないときは出せない部分を削ってエラーだけが起こるソース出せ 削ってるうちにエラー消えるんなら出せない部分が原因
g++ hoge.c で治ったりする
>>904 ふつうは -lc を指定する必要はないので、環境がなにか変なことになっている予感。
char word[10][30]; という配列があり、現在配列には word[0]:cabos word[1]:banana word[2]:apple といった文字列が入ってるとします。 ここで、指定した番号の要素を消して配列を詰めるにはどうすればいいのでしょうか? for文を駆使してみましたが、いまいち上手くいきません。(無くなった最後の要素には何を入れればいいのかわからない) あと、この配列をアルファベット順に並び替える方法もしりたいです。
>>無くなった最後の要素には何を入れればいいのかわからない 何もしなくていい。あるいは \0 を入れるとか自分で決めなさい。 >>あと、この配列をアルファベット順に並び替える方法もしりたいです。 ソートしなさい
>>909 memmoveとか使うといいみたいですけど、
クラシックにやってみます
n番目を削除するとして for (i = n + 1; i < sizeof word / sizeof word[0]; ++i) { strcpy(word[i - 1], word[i]); } ソートはこれでいいだろとりあえず qsort(word, sizeof word / sizeof word[0], sizeof word[0], (int(*)(const void *, const void *))strcmp);
最後の要素(n=9)を削除すると、領域外をアクセスしちゃうよ(^o^ )
static void print_ascending_list(char word[][WORD_SIZ_MAX + 1], int n) { int i,j; char tmpword[1][WORD_SIZ_MAX + 1]; n--; for(i=0; i<=n; i++){ strcpy(tmpword[0], word[i]); for(j=i; j<=n; j++){ if(tmpword[0][0] > word[j][0]){ strcpy(tmpword[0], word[j]); } } printf("%2d:%s\n", i+1, tmpword[0]); } } ソートについて、こんなプログラムを作ったのですが、 これだと同じ単語を何度も出力しちゃうし、よくよく考えたら二文字以降の比較をしていないんですよね、、 どうにかできませんかね?
strcmp
915 :
デフォルトの名無しさん :2009/01/08(木) 22:06:45
0x1000 のアドレスが10000になるみたいなのですが、どうしてでしでしょうか? 0x10は10バイトという意味があるのでしょうか? また、buf[10000]は、どのメモリアドレスまで格納できるという意味になりますか?
意味不明
917 :
デフォルトの名無しさん :2009/01/08(木) 22:13:16
0x1000や0x3EFFとかいったものは何を指すのでしょうか? また、0x33や0x3F といったものも。 0x22FF | 0xFF01 など これはメモリアドレスなのか、10進数になるのか、それとも両方になるのか また、buf[10000]と確保したメモリアドレス?には、どれだけのメモリアドレス範囲が入るのでしょうか? たとえば0x44000000〜0xFF0000000とか
>0x って何? 16進数の接頭辞 > | OR 演算子 >メモリアドレスなのか ただの数値。 ポインタ型にキャストすればアドレスと解釈できはするが。 >buf[10000] と〜 buf の要素の型のサイズ×10000
>>917 0x は16進数であることを明示するプレフィックス。
よって、0x1000 とか 0x3EFF はただの数字。
| は論理和をとる演算子。
0x22FF | 0xFF01 == 0xFFFF
buf[10000] と確保したものが、実際に確保されるアドレスは基本的に実行時に決まる。
範囲としては buf の型のサイズ * 10000
920 :
デフォルトの名無しさん :2009/01/08(木) 22:28:01
>>919 ありがとうございます。よくわからないのですが
アドレスとして0x1000 を指定したら10000らしいのですが、これはなんのことでしょうか?
また、0xはメモリのアドレスにはならないのでしょうか?
>>920 >アドレスとして0x1000 を指定したら10000らしいのですが、これはなんのことでしょうか?
どこでそんな話を聞いたんだ?
配列の中身ってオチじゃ?
16ビット環境のセグメントレジスタの話なら分かるが・・・。
924 :
デフォルトの名無しさん :2009/01/08(木) 23:13:34
>>923 セグメントレジスタならどうやってありえる?
925 :
デフォルトの名無しさん :2009/01/08(木) 23:13:57
でもメモリアドレスって0xからはじまってますよね あれはなんででしょうか?
>>924 10000が0x10000の間違いだというのなら、ね。
>920 0x1000のアドレスにあるのがたまたま10000だっただけ。 理由なんて誰にも判らん。 0xのついた16進数だろうが普通の10進数だろうがアドレスになりうる。 だが直値でアドレスを指定する意味は メモリの解析を行いたい時を除いてほとんど無い。
928 :
デフォルトの名無しさん :2009/01/08(木) 23:51:53
>>927 直値?直値で指定する方法とは?
でもあらかじめ決められた領域にデータを書き込む場合は値をいれますよね?
その時に、0x....といれるような
メモリマップ?とかみると0x00000〜0x100000の領域は○○をとか
0x200000〜020001000 とかには○○のプログラムに使う領域の計算値をとか
こういう場合はメモリ範囲指定しますよね
このような場合は、どうやって指定するのでしょうか?
>>928 なにやらすっとこどっこいな勘違いをしている気がするので具体例を出しなさい。
通常、C/C++でメモリアドレスを指定するようなプログラミングは行なわないからね。
>>930 組み込み・ファームではやるだろ・・・常考。
それ、通常じゃない。
デバッガとかICEとかの使い方を教えてほしいんじゃないの?
今の C の業務での組み込み率がどれだけ高いか。
935 :
デフォルトの名無しさん :2009/01/09(金) 00:03:25
組み込みです。
組み込みだとその場しのぎのコード書いてたら、そのうち頭ぶっ飛ぶよ。
937 :
デフォルトの名無しさん :2009/01/09(金) 00:12:20
どういう風に書けばよいのでしょうか? アドレス指定がよくわかりません 0xつけて指定するのですよね 10000の範囲を指定するにはどうすればよいのかな
メモリの内容を確認してる時点で何もわかってないって事がバレてるってこと。
10000って何だよ・・・。 10進数なのか16進数なのかはっきりしてくれ。
そういう機器固有の話を聞ける人間は周りにいないのか?
なんにしてもソースも出せない、用語の使い分けもさっぱりじゃ エスパーじゃないかぎり無理
機器固有の話を聞ける人間がいないっていうより、マニュアルも読まない(理解できない)?
マニュアルの前にアセンブラとポインタの本を読んでくれ。 あと16進について勉強汁。
947 :
デフォルトの名無しさん :2009/01/09(金) 00:22:55
file_nameという文字列に入っているファイル名をls の引数にしてOSで実行したい場合どうすればいいですか? system("ls -l file"); このfileの部分を変数で実行するイメージなんですが。
>>947 sprintf の後 system。
まあ、system よりはもっと安全な
OS 依存の関数を使った方が良いと思うが。
system は危険。
>>947 sprintfでsystemの引数にする文字列を作るんだ。
>>947 sprintf()その他で文字列を組み立てれば宜しい。
例えばこんな感じ。
void func(const char * fileName)
{
char buf[1000];
sprintf(buf, "ls -l %.990s", fileName);
system(buf);
}
>>947 "; rm -rf /"
みたいな入力がこないように十分気をつけて。
おー。 それじゃ、"ls -l '%s'"にしとく方が無難か。
954 :
デフォルトの名無しさん :2009/01/09(金) 00:35:32
>>953 まだまだ青いぜ
".'; rm -rf /;echo 'bang!"
質問なのですがC言語で簡単に作れるゲームにはどんなものがありますか? 例えばドット避けやタイピングゲームなど
じゃんけん
数当てゲーム C言語に限らず、ユーザ入力の可能な言語なら簡単かと
100マス計算をするプログラムを書いてください。 プログラムがランダムに出題し、人間が100個の マスに回答を入力し、確認ボタンを押すと 全問正解なら回答にかかった時間を表示して終了。 間違った場合は間違った場所にカーソルが止まり、 別の値が入力されるまで待ちます。 横10個、縦10個の数字は各々11〜99までの乱数、 演算は +,-,x のみでよいです。 よろしくおねがいします。
丸投げする気なら宿題スレ行け。
961 :
デフォルトの名無しさん :2009/01/09(金) 03:06:13
描画の実装について質問です。 各クラスごとに描画関数を持たせると仕様変更したときに対応が大変なのですが、 分離するアイディアが出てきません。 おとなしく全部書き換えたほうがいいのでしょうか? class Object { protected: int x, y; int width, height; public: void Draw()=0; }; class Character : public Object { public: void Draw() { // 描画処理 // これだと仕様変更があった場合に対応するのが大変なのですが、今一いいアイディアが出てきません。 } };
>>958 なるほど、では数当てゲームでも作ろうかな。
じゃあ0から100の間で数を10回以内で当てる条件で作ろうと思うんだが
ヒントってどういうのがある?
〜以上〜以下です、とか偶数奇数の区別、素数など以外で
>>869 ほれた。
直接の原因に言及することなく、かつ今後トラブルが起こらないための
手法を伝える、すばらしいテクニックだと思った。
i++を++iに変えたのはただの趣味だろうからそこはいただけないけど、
これも直接の原因から目をそらすためのものだったのかな。
複数行に渡っていればきっとコピペするだろうと予想したのだろうか、とか
妄想がとまらん。
>>963 STLのiteratorを使いこなせるようになれば、i++と++iの違いがわかり、
++iを使うようになる。
intならどっちでも構わないが。
そうでもない
>>964 iteratorつかうとインクリメントのみの文においてi++と++iに差が出るんだ?
>>967 operator ++関数の戻り値は、前置++なら*thisへの参照を返せば済むが、
後置++だと、インクリメント前の値の複製を返さなければならない。
戻り値を使っていないことが明らかでも、可能ならこのインスタンスの複製を作る処理を
消し去れるほど高度な最適化のできるコンパイラが無いため。
>962 とりあえずは 「入力→もっと(大きい/小さい)です」の繰り返しから作ってみては 後でいくらでも拡張していけば良い
970 :
デフォルトの名無しさん :2009/01/09(金) 06:44:19
0x0B00〜1AFF の取る範囲が0x1000になるのは何故なのでしょうか?
>>961 さすがにそれだけの情報でうまい分離方法考えろとか言われても無理
>>970 0〜9の取る範囲は10通り
0〜99の取る範囲は100通り
100〜199の取る範囲は100通り
m〜nの取る範囲は(n - m) + 1通り
973 :
961 :2009/01/09(金) 11:21:36
>>971 すみません。構成は以下のようになっています。
enum MapInfo { MapInfo_Map1, ..., MapInfo_MapNum };
enum Map1CharInfo { Map1CharInfo_Character, ..., Map1CharInfo_CharNum };
class Map {
public:
void Draw()=0;
};
class Map1 : public Map {
private:
Object* obj[Map1CharInfo_CharNum];
public:
Map1() {
// マップ上の全オブジェクトの作成
}
void Draw() {
// マップ上の全オブジェクトの描画
obj->Draw();
}
};
class Master {
private:
MapInfo scene;
Map* map;
public:
void Draw() {
map->Draw();
}
};
純粋仮想にせず、継承元に共通描画ルーチンを入れておけばいいんじゃないの? 構成があったところで具体性がないから勝手にしろとしか言えない。
975 :
デフォルトの名無しさん :2009/01/09(金) 11:51:19
グローバル。・・・きたあああああああああああああ
アホな方法、すすめんな、馬鹿、・・・きたあああああああああああああ
女性に忌み嫌われる人生を送ってきたモテない浪人生。 ある日、大好きなSM系のDVDを抱えて帰路についていた彼は、美しい女性とぶつかってしまう。 なんとその女は、力が足りなくて天界に帰れなくなっていた天使だった。 主人公は、力を得るための性行為を提案、渋る彼女を口先で丸め込み承諾させる。 こうして、清らかな天使さまを自分だけの性奴隷にするために、犯し続ける日々が始まるのだった。
C#は触ったことさえないけど、 > 3. 演算子から返される値を x の評価によって得られる場所に格納します。 これがC++でいうところのリファレンスなら新しいオブジェクトを作っていないんじゃないかな。
>>980 C#は呼び出し側で退避するので、戻り値を使っていない場合は最適化できるんじゃないか?
ダメな例を見てもらえれば分かるんだけど、 オーバーライド処理内で毎回オブジェクトを作らないとダメっぽくないですか? C++で後置演算子をオーバーライドする時はそんなのしなくて良いらしいのに。(というのが元々の話です)
あああ前置のまちがいです
あぁ、なるほど。MS得意の「余計なことして複雑にする」だね。w
余計な 物など 無いよねぇ〜♪
987 :
892 :2009/01/09(金) 17:10:20
ccでコンパイラしたら普通にいけました(理由はよくわかってないんですが) 質問に答えてくれた方ありがとうございました Cygwinってgccとcc同じようなもんだと思ってた…
で、お前らRAIIてなんて読んでる?
あーるえーあいあい
らいい
ラ・ツーだろjk 新手のモビルスーツみたいでイイ
らき・すた
>>987 --
$ la /usr/bin/{g,}cc
lrwxrwxrwx 1 Yew Users 7 Jun 10 2007 /usr/bin/cc -> gcc.exe
-rwxr-x---+ 1 Yew Users 94741 Dec 18 2006 /usr/bin/gcc
--
どう見ても、中身は同じです。
# 内部でargv[0]見て動作変えてるかどうかはしらね。
># 内部でargv[0]見て動作変えてるかどうかはしらね。 一番重要な部分が分からんなら書くなと
だからそのキモイ、ナンバーサイン野郎は放置しろってw
>>995 ナンバーサインってなんですか?
ところで最近宿題スレに書かなくなったんですね。さびしいです。
釣りとかどうでもいいが # がナンバーサインだ。
998 :
デフォルトの名無しさん :2009/01/10(土) 13:10:52
999 :
デフォルトの名無しさん :2009/01/10(土) 13:13:21
#がナンバーサインなんだが?宿題スレにも書き込んでいるが、
誰と勘違いしているんだろうね、こいつは?w
>>996
1000 :
デフォルトの名無しさん :2009/01/10(土) 13:14:48
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。