■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part49
251 名前:デフォルトの名無しさん :2006/05/08(月) 16:53:56
>>153
亀レスだが、VC++6.0 を使っているなら、Greta の利用を検討してはどうか。
Boost.Expressive の作者が作ったもので、STL のアルゴリズムに似せた
デザイン。Microsoft のサイトでダウンロードできる。

http://research.microsoft.com/projects/greta/

252 名前:デフォルトの名無しさん :2006/05/08(月) 17:07:50
>>251
お前がぐれたのは、こういう物を使ったためだったのか。

253 名前:デフォルトの名無しさん :2006/05/08(月) 17:32:40
int main()
{
Damepo moudamepo;
moudamepo.mandokuse('A');
}

254 名前:デフォルトの名無しさん :2006/05/08(月) 20:32:35
え?C++って正規表現すらろくに標準装備されてないの?ショボw

255 名前:デフォルトの名無しさん :2006/05/08(月) 20:35:25

 .          ┌┬┬┬┐
  .―――――┴┴┴┴┴―――、       ______________
 || ̄ ̄ ̄||  ̄||| ̄ ̄ ̄|| | ̄ ̄ヽ     /
 || アヒャヒャ| |  ||| アヒャ || |_∧  ヽ   / では>>254
 ||(・∀・)_| |・∀||(・∀・)|| |  )  [ ] <  引き取らせていただきまーす
 ||_ ̄ ̄_|_|_/ | ̄ ̄ ̄.|| | ̄ ̄ ̄ ||  \_____________
  l O| ―-.|O゜| 東京精神病|.|院 ニニ .||
  |_  ̄口 ̄  l_l⌒l|____|.|l⌒l_||_|__|  ブロロ-‥‥
   `ー' ̄ ̄ ̄`ー'  `ー'   `ー'

256 名前:デフォルトの名無しさん :2006/05/08(月) 20:35:38
>>254
え?>>254は標準ライブラリしかろくに扱えないの?ショボw

257 名前:デフォルトの名無しさん :2006/05/08(月) 21:02:09
>>256
いちいち他人の作ったもん探して、自分のソフトに組み込むのが嫌なんだよ
ほんとショボいなC++は。他人にだっこしながらでないと開発できないなんて

258 名前:デフォルトの名無しさん :2006/05/08(月) 21:05:03
>>257
そういう考えは捨てた方がいいよ。


259 名前:デフォルトの名無しさん :2006/05/08(月) 21:07:16
今年のGWはやけに長いな

260 名前:デフォルトの名無しさん :2006/05/08(月) 21:10:12
>え?C++って正規表現すらろくに標準装備されてないの?ショボw

>ほんとショボいなC++は。他人にだっこしながらでないと開発できないなんて

261 名前:デフォルトの名無しさん :2006/05/08(月) 21:15:59
>>258
嫌だね。全部自分で作りたい
なんか、他人のもん使うってせこい感じで嫌
効率悪くても自分で作りたい
だからって、どのソフトでも標準である機能をわざわざ自分で作成するのも損した気がするし
やっぱ、C#かVBのほうがいいね

262 名前:デフォルトの名無しさん :2006/05/08(月) 21:22:42
C#の正規表現もVBの正規表現も他人が実装したもんじゃね?

263 名前:デフォルトの名無しさん :2006/05/08(月) 21:23:04
>>261
で、君が使っているコンパイラは「他人のもん」ではないのか?

264 名前:デフォルトの名無しさん :2006/05/08(月) 21:24:29
>>262
>>263
そんな屁理屈でしか言い返せないわけだw
図星だったなw

265 名前:デフォルトの名無しさん :2006/05/08(月) 21:26:49
で、boostが標準に取り込まれたらころっと態度を変えるのかね君は。

266 名前:デフォルトの名無しさん :2006/05/08(月) 21:29:56
>261
だったらコンパイラから自分で作れば?

267 名前:デフォルトの名無しさん :2006/05/08(月) 21:30:35
M$以外が作ったなんの保障もない糞ライブライリなんてイラネ

268 名前:デフォルトの名無しさん :2006/05/08(月) 21:31:18
>>266
だからって、どのソフトでも標準である機能をわざわざ自分で作成するのも損

日本語も理解できねーのかよカス

269 名前:デフォルトの名無しさん :2006/05/08(月) 21:33:12
けっきょく標準を策定した人間に対してはおんぶにだっこか

270 名前:デフォルトの名無しさん :2006/05/08(月) 21:34:01
おまいら釣られすぎ

271 名前:デフォルトの名無しさん :2006/05/08(月) 21:34:21
>>269
当たり前だろアホか

272 名前:デフォルトの名無しさん :2006/05/08(月) 21:35:01
今年はGW直後から5月病患者が大暴れだな。

273 名前:デフォルトの名無しさん :2006/05/08(月) 21:40:41
C++の盲点をついたら病気扱いかよw
都合の悪いこと言われるとみんな異常者か?
ほんと異常者のおまえらの思考はとんでもないなw

274 名前:デフォルトの名無しさん :2006/05/08(月) 21:46:34
正規表現が使えないくらいでオロオロすんな
FSMの練習だと思って作ればいいじゃんよ

・・ところで盲点って何?

275 名前:デフォルトの名無しさん :2006/05/08(月) 21:46:53
どこが盲点なんだ?C、C++と受け継がれる設計思想そのものだぞ。

276 名前:デフォルトの名無しさん :2006/05/08(月) 21:52:38
正規表現使いたいだけで>>251みたいな英語のサイト行かないとだめだし
てか、そんなものがあるかどうか知るすべなんてないし

それに比べてVBはLIKEがある。簡単
C#ならregexがある。簡単
C++は標準ではまともな関数がない
どうやってみ探せばいいかもわからない。
説明サイトもない。書籍もない。誰が好きこのんでC++なんかやるんだよ
時代錯誤もいいところ

277 名前:デフォルトの名無しさん :2006/05/08(月) 21:53:57
最初からそう言ってくれればよかったのに。
なかなか正しい意見だからC#勉強したほうがいいよ。

278 名前:デフォルトの名無しさん :2006/05/08(月) 22:00:41
>>276
そのとおりだ
C#とかJavaとかオススメ

279 名前:デフォルトの名無しさん :2006/05/08(月) 22:05:22
なに変な方向に盛り上がってんの?
「正規表現使いたいんなら正規表現ライブラリ使え」以上、終了。
じゃダメなんか?

280 名前:デフォルトの名無しさん :2006/05/08(月) 22:06:36
いいよ。

281 名前:デフォルトの名無しさん :2006/05/08(月) 22:07:37
>>279
そのライブラリはどこにあるんですか?

282 名前:デフォルトの名無しさん :2006/05/08(月) 22:08:46
全部自分で作りたいんじゃなかたのか

283 名前:デフォルトの名無しさん :2006/05/08(月) 22:09:21
自分でプログラミング言語つくれ

284 名前:デフォルトの名無しさん :2006/05/08(月) 22:09:23
boost等にあるよ
C++ 正規表現で検索すれば出てくるのに

285 名前:デフォルトの名無しさん :2006/05/08(月) 22:12:57
>>284
やっぱboostかよ
なんでVBに正規表現あるのに
C++にはないわけ?
C++使う奴は、VBじゃ文字列処理やポインタなど細かい処理ができないから
C++に来てるのに、正規表現もないってなんだそれ?
一体どういう奴を対象にしてんだよ!まったく
てか、どうせ、正規表現だけじゃなくて、ほかにもVBならあるのにC++にはない
関数とかが大量にあって、その度に、検索しまくって探しまくったりするんだろ?
あーめんどくせ

286 名前:デフォルトの名無しさん :2006/05/08(月) 22:16:54
そりゃお前がVBから始めたってだけの話だろ
愚痴ならチラシの裏かブログへ

287 名前:デフォルトの名無しさん :2006/05/08(月) 22:21:07
  ┏┳┳┓     ハイ.     ┏┳┳┓
┏┫┃┃┃池沼と遊ぶのは ┃┃┃┣┓
┃┃┃┃┣┓  ここまで ┏┫┃┃┃┃
┃      ┃┃┏━━━┓┃┃      ┃
┃ 池沼   ┣┫ . ・∀・ ┣┫. STOP!┃
┗━━━━┛┗┳━┳┛┗━━━━┛
            ┏┻┓┃
        ┏━┛  ┣┻┓
        ┗━━━┫  ┗━┓
.             ┗━━━┛


288 名前:デフォルトの名無しさん :2006/05/08(月) 22:24:48
スレが伸びてると思ったら・・・なんだこりゃ?

289 名前:デフォルトの名無しさん :2006/05/08(月) 22:27:22
また基地外か。

290 名前:デフォルトの名無しさん :2006/05/08(月) 22:40:12
いい加減↓行ってくれないか。
ttp://pc8.2ch.net/test/read.cgi/tech/1141400056/l50

291 名前:デフォルトの名無しさん :2006/05/09(火) 01:52:48
応用編:
 なんで C に複素数あるのに
 C++ や VB には(ry

 なんで x86 マシン語にはローテートあるのに
 C には(ry

まあなんつーか、これが所謂「ヴビチュウ」という生き物か。

292 名前:デフォルトの名無しさん :2006/05/09(火) 02:03:21
>>291
C++には複素数あるし、
ローテートも Intel C++ Complier とか使えば組み込み関数で提供されてるだろ。

293 名前:デフォルトの名無しさん :2006/05/09(火) 02:15:09
組み込み型としての複素数が無いってことだろう。
まあ、処理系独自に組み込み型の複素数作って、
complex はそれを inline で使ってるだけ・・・
な実装な処理系もあるけどね。

294 名前:デフォルトの名無しさん :2006/05/09(火) 02:15:14
忘れられた<complex>……。

295 名前:デフォルトの名無しさん :2006/05/09(火) 07:06:33
組み込み型かよ、Stop! 池沼だな。

296 名前:デフォルトの名無しさん :2006/05/09(火) 07:17:54
組み込み型なら専用の最適化がある可能性がある。

297 名前:デフォルトの名無しさん :2006/05/09(火) 08:22:37
VBに正規表現あったっけ?
.netの間違いじゃないか?
それならC++も同じですが

298 名前:デフォルトの名無しさん :2006/05/09(火) 08:24:46
http://msdn2.microsoft.com/ja-JP/library/4384yce9.aspx
C++ の正規表現
.NET Framework SDK で正規表現クラスを使用する

299 名前:デフォルトの名無しさん :2006/05/09(火) 08:59:09
>>276
>>281
VB や C# を話しにあげているなら、Visual Studio .NET 以降だろう。
なら、標準でついている ATL に正規表現ライブラリがくっついてる。
Microsoft 純正で、VCなら標準だ。文句ないだろ


300 名前:デフォルトの名無しさん :2006/05/09(火) 09:40:36
自分で標準化委員会でも立ち上げて、
自分が使いたいものについてはすべて標準ってことにしちゃえばいいじゃない

301 名前:デフォルトの名無しさん :2006/05/09(火) 14:17:45
組み込み型?ただでさえ基地外のように巨大な言語仕様になって
しまったC++なのに、まだ肥大化させるつもりかよ。

302 名前:デフォルトの名無しさん :2006/05/09(火) 14:25:24
おまえが基地外だから
基地外のように巨大に感じるだけ。

303 名前:デフォルトの名無しさん :2006/05/09(火) 14:37:39
組み込み型は別に多くないが、
言語仕様は大きいのはまあ大きい。
もっと大きなのもあるけど。

より良い言語を作ろうとすると
どうしても言語仕様がデカくなって、
それが為に理解できる人が減ってしまうのは
何か遣る瀬ないな。

304 名前:デフォルトの名無しさん :2006/05/09(火) 14:38:19
>>302
自己紹介乙。

305 名前:デフォルトの名無しさん :2006/05/09(火) 14:49:38
・馬鹿の一つ覚え
・ありきたり
という表現がぴったりくるな。

306 名前:デフォルトの名無しさん :2006/05/09(火) 15:03:31
RVOの時代に組み込み型で最適化とはね。
標準化委員会の方向とは完全な逆方向だな。

307 名前:デフォルトの名無しさん :2006/05/09(火) 15:29:27
「C++の言語仕様はさまざまな変更を経て複雑怪奇なものに〜」
ってよく聞くけどVBやJavaってそんなに楽なのか

308 名前:デフォルトの名無しさん :2006/05/09(火) 15:46:45
キーワードを無闇に使い回ししたせいで
文脈毎に意味が変わったりする、って点では複雑だが
まあコンパイラ開発者に比べたら利用者の流す汗と涙なんか
知れたものよね。

309 名前:デフォルトの名無しさん :2006/05/09(火) 15:54:57
>>307
・generic function系は、大抵適当な奴を選ぶ規則が複雑。
・Javaはinstance methodはvirtualのみ。
・templateの(部分)特殊化
・Cとの互換

310 名前:デフォルトの名無しさん :2006/05/09(火) 16:30:28
Javaはなぁ・・・あれを使うことによって楽になるのは馬鹿だけだから。
天才、凡人、馬鹿、すべての層の開発コストが抑えられる言語・環境ではなく、
C++では「馬鹿お断り」だった領域に、馬鹿でも加われるようになる言語・環境なんだよ。

喩えるなら、Javaの利便性は人工呼吸器みたいなもの。
それによって助かる人もいるけど、健常者なら苦もなくやれるところを手助けしてるだけ。
健常者にとっては、それ使って生活するのは何かとうざったい。

311 名前:デフォルトの名無しさん :2006/05/09(火) 16:35:06
Javaは多重継承がないのが耐えられない。
特殊化がないのも辛い。

312 名前:デフォルトの名無しさん :2006/05/09(火) 16:43:07
>>310
それじゃVB.netはICUか。

313 名前:デフォルトの名無しさん :2006/05/09(火) 17:31:36
多重継承禁止するなら mix-in は欲しいよね。

314 名前:デフォルトの名無しさん :2006/05/09(火) 18:36:47
言語の機能として欲しいね。自分で書くんじゃなくて。

315 名前:デフォルトの名無しさん :2006/05/09(火) 20:15:17
>>307
本格的なものをつくろうとするとそんなにラクでもない。
簡単なものを作る場合には C++ より楽なことが多い。

316 名前:デフォルトの名無しさん :2006/05/09(火) 22:31:06
全角文字列(2バイト文字)をあるデリミタで(2バイト文字)分解したいと思ってます。
C言語のstrtok()みたいなものです。C++にこのような機能を持った関数はありますか?
g++でコンパイルでき外部のライブラリは使わないという条件なのですが。


317 名前:デフォルトの名無しさん :2006/05/09(火) 22:32:46
>>316
ワイド文字へ変換してwcstokを使ったらどうか?

318 名前:デフォルトの名無しさん :2006/05/09(火) 22:34:13
wchar_t 使って wcstok とか?

319 名前:デフォルトの名無しさん :2006/05/09(火) 22:34:24
2バイトずつ文字を拾うイテレータをでっちあげて find する。

320 名前:デフォルトの名無しさん :2006/05/09(火) 22:36:58
>>317
ありがとうございます。それでできそうな感じです。
strtokを含めてC言語の機能みたいですがstringクラスみたいなC++クラス版は実装されてないんでしょうか?

321 名前:デフォルトの名無しさん :2006/05/09(火) 22:38:12
>>320 wstring

322 名前:デフォルトの名無しさん :2006/05/09(火) 22:41:07
ありがとうございます。
いろいろ手がかりができたので調べてみます。

323 名前:デフォルトの名無しさん :2006/05/09(火) 22:42:39
wcstok を wstring に使うのはマズいなぁ。
wstring 使うなら、
find したり substr するなりして拾う事になるかな。
俺はそうやって strtok みたいなのを自分で実装して使ってる。

324 名前:デフォルトの名無しさん :2006/05/09(火) 22:57:01
>>323
findでデリミタの場所探してsubstrでできそうですね

325 名前:sage :2006/05/09(火) 23:06:47
Cで正規表現なんてつかわないでしょ
とっかしたパーサかけ

326 名前:デフォルトの名無しさん :2006/05/09(火) 23:10:32
>>325
スレ違い。

327 名前:デフォルトの名無しさん :2006/05/09(火) 23:15:50
boost::tokenizerはどう?

328 名前:デフォルトの名無しさん :2006/05/09(火) 23:19:27
そっか。ここは boost アリなんだったな。

329 名前:デフォルトの名無しさん :2006/05/09(火) 23:21:41
このスレに標準C++限定などと言った縛りは無い。

330 名前:デフォルトの名無しさん :2006/05/09(火) 23:24:21
>>329
VC6という糞コンパイラについて語ろうか。

331 名前:デフォルトの名無しさん :2006/05/09(火) 23:24:24
でもライブラリ自体の話は専用のスレにどうぞ。
http://pc8.2ch.net/test/read.cgi/tech/1139266461/

332 名前:デフォルトの名無しさん :2006/05/09(火) 23:25:15
C スレは厳しいからな。
ちょっとビクビクしてしまう。

333 名前:デフォルトの名無しさん :2006/05/09(火) 23:29:55
>>331
まだ落ちていなかったのかw

334 名前:デフォルトの名無しさん :2006/05/10(水) 02:25:39
typedef struct S S;
struct T { S* S; };

VC++ 2005 Express の cl.exe (VC8?) だと通るこのコードが、
cygwin の gcc 3.4.4 ではエラーになりました。
> 2: error: declaration of `S*T::S'
> 1: error: changes meaning of `S' from `typedef struct S S'

gcc の言ってることはわからんでもないのですが、
規格としてはどっちなんでしょうか?( ill-formed? well-fromed? )

335 名前:デフォルトの名無しさん :2006/05/10(水) 02:34:45
レベルの低い質問すいませんが

"AABBAAACCCCAAADDDEEAAA"
このような文字列を処理するにはistringstreamwを使用すればいいことは解ったのですが
今何文字目を処理しているかを知るには自分で数えるしかないのでしょうか?また
先を読みをしたい場合はどうすればいいのでしょうか?

336 名前:デフォルトの名無しさん :2006/05/10(水) 02:43:13
>>335
文字列を処理するには string 使えばいいと思うんだけどね。

istream について、
何文字目ってのは tellg() とか gcount() とか使う。
読み出すには read() とか operator >> とか使う。

337 名前:334 :2006/05/10(水) 02:47:41
後付になりますが、 typedef 無しで
struct S;
struct T { S* S; };
としても同様の結果になりました。
ただ、実際の問題は C のソースを C++ に持ってきたときに
エラーになってしまうことがあるということなんで、ちょっと別件っぽいです。

S* S を struct S* S に変えると C でも2つの C++ コンパイラでも
どっちでも通るので、タイプ量をケチるための typedef struct S S を
辞めるべきなのかな?と迷ってます。

338 名前:335 :2006/05/10(水) 03:03:12
>>336
あ〜なるほどなるほど
ファイルから読み込んで、istreamにアタッチして読み込み
判別していくという感じになるのです。解りました。

もう1つ聞きたいのですがC++でこのような文字判別を行う場合
例えば'A'を判別するケースとして
C言語のようにif文無いし関数を用いて判断するべきなのか
それともoperator >>のような新しい演算子を作るべきなのでしょうか

339 名前:デフォルトの名無しさん :2006/05/10(水) 03:08:35
>>337
S* S; の2つ目の S で問題が発生してるようだ。
何でもかんでも同じ名前にするのはやめとけ。
S* s; で通る。

340 名前:デフォルトの名無しさん :2006/05/10(水) 03:23:16
VCだと、クラス名と変数名がかぶっても、できるみたいだな。
仕様を読んでみたら、typedefで意味を変えるな、とは書いてある気がする。

class Foo {} ;

typedef Foo Foo ; //OK
typedef int Foo ; //ERROR


でもこの問題は、typedefじゃない気がする。
どっちにしろ、名前がかぶるといいことはない。

Foo Foo ; //VCではOK
Foo & f = Foo ;

このコードは、VCでは、
変数 Foo と変数 fに対して、&演算子を適用し、変数 Fooを代入する意味になるらしい。
変数 Fooを参照する、Foo &型の変数 fにはならないらしい。


341 名前:デフォルトの名無しさん :2006/05/10(水) 03:29:47
>>338
string に読み込んで find() する。

342 名前:デフォルトの名無しさん :2006/05/10(水) 03:33:36
typedef struct S S; の2つの S は名前空間が違うから問題ない。
これはよく言われる事だから確実かと。

で、S* S; の2つの S は名前空間同じなんじゃないかな。
VC++ で通るのは処理系独自の拡張?

343 名前:335 :2006/05/10(水) 03:34:35
うーんそれだとちょっと意味が違ってきてしまいます
字句解析を将来するための事前勉強なので
findを連発するのはふさわしくないと思うのですがどうなのでしょうか

344 名前:デフォルトの名無しさん :2006/05/10(水) 03:39:20
>>343
最初に十分な情報を出さずに質問しておいて、答えが帰ってきた後に
自分の都合を小出しにして文句を垂れる。そんな人は嫌いです。

345 名前:335 :2006/05/10(水) 03:42:24
申し訳ございませんでした。

346 名前:デフォルトの名無しさん :2006/05/10(水) 03:42:40
 >VC++ で通るのは処理系独自の拡張?
単にチェックしてないだけなんじゃないかという、
大胆な予想を思いついてしまった。

347 名前:デフォルトの名無しさん :2006/05/10(水) 03:49:07
そういや struct T の内部だから、
S* S; の2つの S は名前空間違うな。
なら、通る方が正しいのか?

まあ、そう何度も同じ名前を使うべきじゃないと思うから、
S* s; の方がいいと思うがな。

348 名前:デフォルトの名無しさん :2006/05/10(水) 03:52:15
ドンブラコッコ、ウンコッコ

349 名前:334 :2006/05/10(水) 03:59:23
S という名前はサンプル用に作ったやつで、実際には全部小文字の名前が使われてたりします。
さらに問題のコードは移植元のソースなんであんまりいじりたくないんですけどね。

まぁ型名をそのまま変数名にしてるのが悪いのだとは思いますんで、今後気をつけることにします。

まだきっちり読みきっていませんが、こんなのを見つけました。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407
標準でもまだ確定していない部分に踏み込んでしまったようです。

Cとの互換性なんて初心者を釣るための餌だったのかと思えてきました。

350 名前:デフォルトの名無しさん :2006/05/10(水) 04:54:37
親クラスCMaterialがCMaterial型のポインタNextMaterialを持ってて、CMaterialを継承したCBlockクラスがあるとき、CMaterialのメソッドを使ってNextMaterialをCBlockとしてnewする方法ない?

351 名前:デフォルトの名無しさん :2006/05/10(水) 06:16:56
あるよ。

352 名前:デフォルトの名無しさん :2006/05/10(水) 08:45:20
>>334
typedef struct S S;
struct T { ::S* S; };


353 名前:デフォルトの名無しさん :2006/05/10(水) 08:53:28
>>352 「C のソースを C++ に持ってきた」(>>337)

354 名前:デフォルトの名無しさん :2006/05/10(水) 09:47:42
そんなことは読んでます。

355 名前:デフォルトの名無しさん :2006/05/10(水) 10:11:37
>>350
template < class T > class CMaterial {
  CMaterial* NextMaterial;
public:
  T* CreateNext() { return NextMaterial = new T; }
};
class CBlock : public CMaterial<CBlock> {};

/* または */

class CMaterial {
  CMaterial* NextMaterial;
protected:
  virtual CMaterial* Factory() const { return new CMaterial; }
public:
  CMaterial* CreateNext() { return NextMaterial = Factory(); }
};
class CBlock : public CMaterial<CBlock> {
protected:
  virtual CMaterial* Factory() const { return new CBlock; }
};

356 名前:デフォルトの名無しさん :2006/05/10(水) 10:13:34
ふたつめのCBlockの宣言は class CBlock : public CMaterial { … だorz

357 名前:デフォルトの名無しさん :2006/05/10(水) 12:40:34
>>355
ありがとう(_ _)
でもそれだと生成するオブジェクトがCMaterialならCMaterial、CBlockならCBlockしかNextMaterialに生成できないですよね?
CMaterial型のオブジェクトのNextMaterialにCBlockを生成するようなことはできないでしょうか。

358 名前:デフォルトの名無しさん :2006/05/10(水) 13:16:12
CMaterial *CMaterial::CreateNext()
{
return new CBlock;
}


359 名前:デフォルトの名無しさん :2006/05/11(木) 00:20:17
>>357
template < class T > CMaterial* CMaterial::CreateNext() {
  return NextMaterial = new T();
}

  CMaterial mate;
  CBlock blo = mate.CreateNext< CBlock >();

360 名前:デフォルトの名無しさん :2006/05/11(木) 00:20:51
template < class T > T* CMaterial::CreateNext() {

だった

361 名前:デフォルトの名無しさん :2006/05/11(木) 00:30:03
>>360 そうするとコンパイルとおらないだろ?

362 名前:デフォルトの名無しさん :2006/05/11(木) 03:27:02
>>359
そんな方法が!コンパイル通るならそれで行こうと思います。何度も有難う御座います。
>>361
まだ試してないのですがCMaterialの前にCBlockを先行宣言すればとおり・・・ませんか?

363 名前:デフォルトの名無しさん :2006/05/11(木) 04:52:36
>return NextMaterial = new T();

T *ret = newT();
NextMaterial = ret;
return ret;

364 名前:デフォルトの名無しさん :2006/05/11(木) 07:30:20
質問なんだが
C++でクラス図とコードを相互変換できるソフトとか知らないか?
できればフリーで。クラス図のモデリングが出来ればなおよし

365 名前:デフォルトの名無しさん :2006/05/11(木) 09:38:55
スレ違い

366 名前:デフォルトの名無しさん :2006/05/11(木) 09:49:25
スレ違いの指摘には誘導を併記したいところだ。
これは、ここらへん?

おまえらUMLのモデリングツール何つかってますか?
http://pc8.2ch.net/test/read.cgi/tech/1046441663/

367 名前:デフォルトの名無しさん :2006/05/11(木) 14:45:44
質問します。
STLのVECTORを用いた構造体の配列に関するプログラムで
typedef struct{
int a1,a2,b1,b2;
}Mat;
vector<Mat> Matrix;
void func(Mat *dat){
dat->b1 = 3; dat->b2 = 5;
}

void main(void){
int i;
for(i=0;i<10;i++){
a1 = 1*i; a2 = 2*i+3;
} //--------------------------★1
for(i=0;i<10;i++){
func(&Matrix[i]);
} //--------------------------★2
return;
}
とまぁこういうプログラムがあったとして(実際はもっと複雑な事やってるのですが)
★1の時にはしっかり値をセットできているのに、
★2の時にはVECTOR配列Matrixのメンバ値全てが-8123456といったヘンな値をとるようになってしまいました。
また、関数の引数をポインタではなく構造体そのものにすると(func(Mat dat)とし、"->"の代わりに"."を使う)途中で例外エラー
hoge.exe の 0x00424dd4 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x4b55c568 を読み込み中にアクセス違反が発生しました。
が発生します。
このような時にしっかり値を構造体配列にセットするにはどう修正すべきでしょうか。
御教授下さい。

368 名前:デフォルトの名無しさん :2006/05/11(木) 15:02:24
ファクトリ関数というのを作ろうとしています。
試しにVC++7で以下のようなコードを書いてみました。
今のところエラーも出ず、きちんと動いてるように見えるのですが
こんな書き方で問題ないのでしょうか(主に、メモリリークが起きないかどうか)

class Base{};
class Advance : public Base {};
// 戻り値なし・引数ありパターン
void createv( Base* &rp_a ){
 rp_a = new Advance;
}
// 戻り値あり・引数なしパターン
Base* createb(){
 return ( new Advance );
}

int main()
{
 // 基底クラス型ポインタ
 Base* p_b1;
 Base* p_b2;
 // オブジェクトを生成
 createv( p_b1 );
 p_b2 = createb();
 // オブジェクトを破棄
 delete p_b1; p_b1 = 0;
 delete p_b2; p_b2 = 0;
 return 0;
}


369 名前:デフォルトの名無しさん :2006/05/11(木) 15:02:40
>>367
値をセットするとかそういうところの問題ではありません。
vector は明示的に要素数を指定してあげなくてはなりません。
vectror<Mat> Matrix(10) とするか、main の頭でMatrix.resize(10) としてください。

基本知識が少し不安・・・

370 名前:デフォルトの名無しさん :2006/05/11(木) 15:04:21
>>367
>実際はもっと複雑な事やってるのですが
最低再現するプログラムを貼りましょう

- Matrixのサイズは0でいいの?
- ★1のa1,a2ってなに?


371 名前:デフォルトの名無しさん :2006/05/11(木) 15:08:54
>>368
Baseのデストラクタはvirtualにした方がいいよ
Advanceがそのままメンバ変数を持たなければ問題はないだろうけど
あるいは生のポインタじゃなくてboost::shared_ptr使うとか


372 名前:デフォルトの名無しさん :2006/05/11(木) 15:45:43
>>369
vectorは動的にサイズを変更できると聞いていますが、要素数は指定しなければいけないのでしょうか。
何しろ格納するデータ数が未定なので、STLを使ってみたのです。
先ほど、要素数を vector<Mat> Matrix(0); と指定して

for(i=0;i<10;i++){
Matrix.resize(i+1);
a1 = 1*i; a2 = 2*i+3;
} //--------------------------★1
のように行っても直りませんでした。
>>370
最低再現するプログラム…
OPENCVで画像を読み込んである行列計算をしてその結果を放り込むプログラムです。
計算部分はデバッグを行い、ウォッチで値を確認して動作は確認したため貼らなかっただけです。
再現したい部分は>>367に書いた通りです。

373 名前:デフォルトの名無しさん :2006/05/11(木) 15:49:58
Matrix.resize(10);
for(i=0;i<10;i++){
 Matrix[i].a1 = 1*i; Matrix[i].a2 = 2*i+3;
}
の写し間違いだよね?
人に質問できるレベルに達してないよ・・・

374 名前:デフォルトの名無しさん :2006/05/11(木) 15:52:51
>>373
すみません、その通りです。少々慌ててました。

375 名前:デフォルトの名無しさん :2006/05/11(木) 15:59:28
>>362
あのさ、>>359でいいなら(呼び出し側がNextMaterialにセットする型が分かってるなら)

CMaterial::SetNext(CMaterial* next) {
  NextMaterial = next;
}

mat.SetMaterial(new CBlock);

でいいじゃん…

376 名前:デフォルトの名無しさん :2006/05/11(木) 16:00:32
>>374
370は373と同じことを言ってるのに、372のようなレスをすることからも
かなり慌ててるのがわかる。

午後4時から研究室の発表とかいうのでなければ
まずはコーヒーでも飲んでくることをお勧めする。


377 名前:デフォルトの名無しさん :2006/05/11(木) 16:05:08
つーかさぁ、Matの一時変数に代入してpush_back()すればいいじゃん。

378 名前:デフォルトの名無しさん :2006/05/11(木) 16:09:29
…申し訳ありませんでした。本当の所を書きます。

void main(void){
int cnt=0;
char buf[256];
char *tp;
FILE *fp
FolderPath1 = "csvファイル1のパス"
FolderPath2 = "画像フォルダのパス"
fp = fopen(FolderPath1,"r");

while(!feof(fp)){
Matrix.resize(i+1);
fgets(buf,sizeof(buf),fp1);
tp = strtok(buf,",");
temp = atof(tp);
Matrix[i].a1 = temp;
Matrix.resize(i+1);
fgets(buf,sizeof(buf),fp1);
tp = strtok(NULL,",");
temp = atof(tp);
Matrix[i].a2 = temp;

cnt++; //ここでデータ件数をカウントする
}

379 名前:デフォルトの名無しさん :2006/05/11(木) 16:10:25
>>375
全然気づきませんでした

それが一番スマートで楽ですね。そうします。
皆様ありがとうございました。

380 名前:デフォルトの名無しさん :2006/05/11(木) 16:10:37
//main関数の続き
//画像データを格納

char imgpath[512];//画像のパス
char tempstr[32];//画像ファイル名
for( i=0 ; i<cnt ; i++ ){

//連番ファイル名の画像ファイルパスを作成する
sprintf( tempstr, "%05d.jpg", i+1 );
strcpy( imgpath, FolderPath );
strcat( imgpath, tempstr );
//格納処理
IplImage *image = cvLoadImage( imgpath, -1 );//読み込み
SetTex(image,&Block_Mat[i]); ←この関数の定義は次に書きます(main関数の前に定義してある)
}

381 名前:デフォルトの名無しさん :2006/05/11(木) 16:15:56
void SetTex(IplImage *img, BLOCK_IMAGE *dat)
{
int size = sizeof(dat->tex);//行列サイズ
size = sqrt((double)size);

CvSize r_size = cvSize( size, size );//リサイズ後の座標
IplImage *res_img = cvCreateImage( r_size, IPL_DEPTH_8U, 3 );//テクスチャ画像
cvResize( img, res_img, CV_INTER_CUBIC );

//テクスチャ作成
int w, h;
for (w=0;w<size;w++) {
for (h=0;h<size;h++) {
//青
if(0 <= res_img->imageData[h * res_img->widthStep + w * res_img->nChannels])
dat->tex[w][h][2] = (GLubyte) res_img->imageData[h * res_img->widthStep + w * res_img->nChannels];
else
dat->tex[w][h][2] = (GLubyte) (256 + res_img->imageData[h * res_img->widthStep + w * res_img->nChannels]);
//緑
if(0 <= res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 1])
dat->tex[w][h][1] = (GLubyte) res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 1];
else
dat->tex[w][h][1] = (GLubyte) (256 + res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 1]);
//赤
if(0 <= res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 2])
dat->tex[w][h][0] = (GLubyte) res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 2];
else
dat->tex[w][h][0] = (GLubyte) (256 + res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 2]);
}
}

}

382 名前:デフォルトの名無しさん :2006/05/11(木) 16:18:30
おいおい今度は丸投げかよw(ないよりはいいけど)

貼るのは「最低限の再現するプログラム」にしてくれよ
その最低限を探す過程で大抵は自己解決するんだからさ


383 名前:デフォルトの名無しさん :2006/05/11(木) 16:19:36
>>372
最低再現するプログラム
= コンパイルが通る完全なコードで、質問する実行時エラーが発生するコード
≠ 作成中のプログラム全体
必要十分な部分を抜き出すか、新たに同一の問題が起こるサンプルを書く。
その過程で、何が間違いか気づくことも多い。

要は、こういうことがしたいのか?
#include <iostream>
#include <vector>

struct matrix_t { int a1, a2, b1, b2; };
std::vector<matrix_t> matrixes;
void func(matrix_t& target) { target.b1 = 3; target.b2 = 5; }

int main() {
 for (int i = 0; i < 10; ++i) {
  matrix_t tmp;
  tmp.a1 = 1*i;
  tmp.a2 = 2*i+3;
  matrixes.push_back(tmp);
 }

 for (int i = 0; i < 10; ++i) {
  matrix_t& m = matrixes[i];
  func(m);
  std::cout << "[" << i << "] = (" << m.a1 << " " << m.a2 << " " << m.b1 << " " << m.b2 << ")" << std::endl;
 }

 return 0;
}


384 名前:デフォルトの名無しさん :2006/05/11(木) 16:19:59
すみません、>>378のMatrixはBlock_Matに置き換えてください。
//構造体BLOCK_IMAGE
typedef struct{
GLubyte tex[64][64][3];
double a1;
double a2;
double b1;
double b2;
}BLOCK_IMAGE;

385 名前:367 :2006/05/11(木) 16:25:34
皆様、お騒がせしました…
今一度頭を冷やした方がいいかもしれません。
整理して出直します…

386 名前:デフォルトの名無しさん :2006/05/11(木) 16:32:27
↓試したけどちゃんと動いたよ。本当に頭を冷やした方がいいかも。
#include <iostream>
#include <vector>
using namespace std;

typedef struct{
int a1,a2,b1,b2;
}Mat;

void func(Mat *dat){
dat->b1 = 3; dat->b2 = 5;
}

int main(void){
int i;
vector<Mat> Matrix;
Matrix.resize(10);
for(i=0;i<10;i++){
func(&Matrix[i]);
}
for(i=0;i<10;i++){
cout << Matrix[i].b1 << Matrix[i].b2;
}
return 0;
}

387 名前:367 :2006/05/11(木) 17:46:19
頭を冷やしてきました。一つ一つ値を追いかけていき、値の狂いだした場所を突き止めたところ
するとバグの起きていた場所が自分の想像していた場所とは違う場所にありました。
int size = sizeof(dat->tex);//行列サイズ
size = sqrt((double)size);
の部分で,sizeの値が構造体メンバのサイズではなく、構造体一個丸々のサイズが出力されていたことが全ての元凶でした。

間違っていると思われていた箇所は問題なく動いておりました…
自分のデバッグ力の無さを反省しながら首吊って死んできます

388 名前:383 :2006/05/11(木) 18:44:17
漏れのコードは闇に葬られたか('A`)

389 名前:デフォルトの名無しさん :2006/05/11(木) 21:45:12
すいません、終わったところで>>368お願いしてもいいですか・・・

390 名前:デフォルトの名無しさん :2006/05/11(木) 21:46:01
無い。以上。

391 名前:デフォルトの名無しさん :2006/05/11(木) 21:52:09
戻り値返す方はスマートポインタを返す様にすると
呼び出し側が戻り値を受けとらなくても安全かも
まぁその時点でバグなんだけど

392 名前:変なところで終わっているけど… :2006/05/11(木) 21:56:21
>>342
> typedef struct S S; の2つの S は名前空間が違うから問題ない。
> これはよく言われる事だから確実かと。

間違いです。
「C++設計と進化」の名前ルックアップのところが良くまとまっていると思います。

393 名前:デフォルトの名無しさん :2006/05/11(木) 22:13:57
本を嫁はすぐ可能な事ではないのでよろしくない。

C だとそうだけど C++ だと違うとかいう類いのものなのかな。

394 名前:デフォルトの名無しさん :2006/05/11(木) 22:31:02
おまいら頭悪スレ逝ってくれ

395 名前:デフォルトの名無しさん :2006/05/11(木) 22:33:41
2つの S は同じ名前空間にあるはずなんだけど、その宣言の後、
プログラムに現れた S がどっちを指すか、規格できっちり決まっていない。
っていうのが >>349 のリンク。

396 名前:デフォルトの名無しさん :2006/05/11(木) 22:34:41
なるほど。

397 名前:デフォルトの名無しさん :2006/05/11(木) 23:32:28
>>393
なぜだろう、ここで晒される本は全部持ってる。

398 名前:デフォルトの名無しさん :2006/05/11(木) 23:49:08
持ってても斜め読みするだけじゃ、糞のカスにもならない。

手垢がついてボロボロになる位にまで読まなきゃ。

399 名前:デフォルトの名無しさん :2006/05/11(木) 23:53:44
というかD&Eも読まずに何を言っているんだという感じだけどな。

400 名前:デフォルトの名無しさん :2006/05/12(金) 00:25:39
禿本は持ちすぎて手の汗でカバー中央がグズグズだ

401 名前:デフォルトの名無しさん :2006/05/12(金) 01:18:04
>>395
違うぞ。

>>334のケースは決まってる。駄目。
name lookupのthe reevaluation ruleってやつだ。

Mike Millerは、その新しいやり方(this approach)にしても、
やっぱり駄目じゃん(but doesn't eliminate the incompatibility with C)と言っている。



402 名前:デフォルトの名無しさん :2006/05/12(金) 01:23:14
mixiでkusakabeに聞けば良いんじゃね?
間違ってたら「ボケ」って言ってくれるよ。
正解は教えてくんないけどな

403 名前:395 :2006/05/12(金) 01:57:39
>>401
俺は >>334 が well-formed だなんて言ってないよ。
決まってないのは typedef struct S S の後に現れる S が
クラス名なのか typedef 名なのかってところ。

404 名前:335 :2006/05/12(金) 02:05:08
char * dataっていうの中身が"HOGEHOGEHOGE"だったとして

char *buf = data + 3;
char *result = new char[4];
memcpy(resutl, buf, 4);

こうすると、EHOGがresultにコピーされますがこのようなデータを
<list>や<vector>内に格納してitするのはまずいですよね?


;

405 名前:デフォルトの名無しさん :2006/05/12(金) 02:07:12
>>404
「このようなデータ」「itする」の意味がわからない。

406 名前:デフォルトの名無しさん :2006/05/12(金) 02:08:24
>>404 >>344
学習しない人も嫌いです。

407 名前:デフォルトの名無しさん :2006/05/12(金) 03:39:42
エスパー的には iterate するってことだとおも

408 名前:401 :2006/05/12(金) 08:36:43
>>403
ああ、そういうことね。スマン誤読した。

409 名前:デフォルトの名無しさん :2006/05/12(金) 09:00:15
>>335
何を言ってるのかさっぱりわからん。研究室の先輩にでも聞いたらどうだ?
memcpyの第一引数のスペルミスといい、お前本当にサンプルコードで試してるのか?

410 名前:デフォルトの名無しさん :2006/05/12(金) 09:03:52
書いてからエスパーが働いたが、もしかして、resultを、char*を要素にもつコンテナに格納してもいいかという質問か?
それなら問題はない。ただし、delete[]を忘れないこと。

411 名前:デフォルトの名無しさん :2006/05/12(金) 14:16:07
境界を出ると例外を投げてくれるiteratorってないですか?
std::list<int> li;
li.push_back(0);
std::list<int>::const_iterator it(li.end());
++it; // ここで例外を投げてほしい

412 名前:デフォルトの名無しさん :2006/05/12(金) 15:00:54
std::list<int> li;
li.push_back(0);
std::list<int>::const_iterator it(li.end());
*it; // end()ならここで投げる予感
++it;


413 名前:デフォルトの名無しさん :2006/05/12(金) 15:36:55
operator++()が呼ばれるたびに、毎回範囲内かどうかテストするってことか?
あんまりうれしい処理じゃないな。

++it;
if (it == li.end()) throw XXX;
とでも書けばいいんじゃないの。

414 名前:デフォルトの名無しさん :2006/05/12(金) 16:02:57
>>411
昔のプログラミング言語CLUみたいだな。

boost::iterator::iterator_facadeで、
std::list<int>::const_iteratorから生成すれば?
void increment()の中でcheckしてthrowするようにすればいい。
20行くらいで書ける。

415 名前:411 :2006/05/12(金) 18:46:03
やりたいことは何個か先の値を見て条件分岐することです。
例えば三個先の値を見て分岐する場合
std::list<T> li;
std::list<T>::const_iterator it(li.begin());
...
if (boost::next(it, 3)->getHoge() == ...) { // 3個先の要素のgetHoge()の値で分岐させたい
}
else {
}
こんな感じになるわけですが、boost::nextでイテレータが三回インクリメント
されるときに、[li.begin(), li.end())を超えてしまうと未定義の動作になってしまいます。
かといって、
if (++it != li.end() && ++it != end() && ++it != end() && it->getHoge() == ....) { ... } // @
とするのはソースが読みにくくなり、また書くのも面倒でしかも使いにくいと思ったわけです。
インクリメントごとに境界チェックするのは>>413さんと同じようにうれしくはないのですが、
@のコードよりはマシかなと思った次第です。他に方法があればいいのですが・・・

416 名前:デフォルトの名無しさん :2006/05/12(金) 18:48:30
>>415
ループ内で list<T>::iterator::next(3) なんてするくらいなら、
見た目は悪いけど 3つ先のiteratorも作って一緒に回した方が良いよ。

417 名前:デフォルトの名無しさん :2006/05/12(金) 18:49:07
ごめんなさい。
ループじゃないんですね。

418 名前:デフォルトの名無しさん :2006/05/12(金) 19:03:58
その目的で例外を使うのは得策じゃないなぁ。
正常動作中でも比較的頻繁に発生しそうじゃないか。
イテレータを3個進める関数を作るのが一番無難な希ガス。
#その関数の中は>415の(1)みたくなっちゃうけど。

419 名前:デフォルトの名無しさん :2006/05/12(金) 21:20:31
質問です。
参照とポインタの大きな違いは何ですか?
というか、参照>ポインタ なメリットってなんですか?
ポインタのように振舞える?ってことはポインタで十分補えるってことですよね?
使いどころがよくわかりません。
見た目の違い・・・?

420 名前:デフォルトの名無しさん :2006/05/12(金) 21:23:47
データベースのプログラム作ってみると分かるかもな

421 名前:デフォルトの名無しさん :2006/05/12(金) 21:41:47
>>419
歴史的に言えば、演算子オーバーロードをスマートに書くために実装された。
例えばユーザ定義クラスHoge同士を
Hoge a, b, c;
c = a + b;
と書けるようにするには
operator+(Hoge& lhs, Hoge& rhs);
が必要になる。
これをポインタでやろうとすると、
(つまり operator+(Hoge

422 名前:デフォルトの名無しさん :2006/05/12(金) 21:43:08
(´・ω・`)途中で送信しちまったい
operator+(Hoge *lhs, Hoge *rhs)
と実装してしまうと、
c = &a + &b;
と書かなければいけなくなるけれど、
Cでは &a + &b はポインタの加算であって、演算子オーバーロードと意味が被ってしまう。

423 名前:デフォルトの名無しさん :2006/05/12(金) 21:53:33
な、なるほど・・。
じゃぁ、オブジェクト指向にするために実装されたわけか・・・。
苦し紛れの friend 制約と似てる気がする。
ま、使っても使わなくてもどっちでもいいってことか。

データベースはちょっと作る機会が当分なさそうですな・・。

424 名前:デフォルトの名無しさん :2006/05/12(金) 21:56:08
>>419
メリットどうこうよりも、
中身が絶対無いとダメな場合は参照。
中身が無い事(NULL)もありうる場合はポインタ。
この2つで使い分けると良い。

とりあえずconst参照渡しから使い始めてみるのがいいかと。
ポインタを使う場合よりスッキリ書ける。

425 名前:デフォルトの名無しさん :2006/05/12(金) 21:56:56
>>423
その後色々使い方が出てきたけれどね。
例えば、「参照は必ず初期化されなければならない」という制約があるから、
引数のNULLチェックが必要なくなる。

void foo(int *p)
{
 if (p == 0) return; // 必要
 *p = 10;
}

void foo(int &p)
{
 p = 10; // 特殊な例外を除いて、NULLではない
}

など。
参照をムリに使う必要もないし、ポインタだけで済ませることもできるけど
オーバーロードの例のように、ポインタであることを意識させたくない場合や
参照を使った方が便利になる場合は参照を使えばいいかと。

426 名前:デフォルトの名無しさん :2006/05/12(金) 21:58:17
>>423
>じゃぁ、オブジェクト指向にするために実装されたわけか・・・。
オブジェクト指向とオペレーターオーバーロードは直接関係ない。
もうちょっとC++勉強すれば参照の良さがわかってくるよ。

427 名前:デフォルトの名無しさん :2006/05/12(金) 22:03:56
ことC++に関しては後から追加された機能が多いからな
そういう機能を「C++っぽいから」という理由で無理に使ってワケわからんプログラムを書くよりは
便利さを実感できるようになってから使った方がいい

428 名前:デフォルトの名無しさん :2006/05/12(金) 22:04:49
ふむ、にわかプログラマじゃちょっと難しい使い方ですね。
もっと、経験を積んで再度参照の使いどころを検証してみます。
ありがとうございました。

429 名前:デフォルトの名無しさん :2006/05/12(金) 22:11:38
VC++でプログラムしている学生です。
マインスイーパの画面を色を読み取って、
それをプログラムの中で行列にしたいのですが、
どういったコマンドを使えば良いのでしょうか?
・画面の読み取り方
・画像から行列データの変換の仕方など
教えてください。

430 名前:デフォルトの名無しさん :2006/05/12(金) 22:17:21
それってWindowsのAPI関係の話題じゃないのか?
そっち行った方が良くね?

431 名前:デフォルトの名無しさん :2006/05/12(金) 22:19:33
あ、すいません

432 名前:デフォルトの名無しさん :2006/05/12(金) 22:27:18
コンパイラ : Borland C++Compiler 5.5
IDE : BCC Developer

VBアプリからBCC Developerで作成したDLLを呼び出したいです。
VBのソースに書く装飾名が知りたいんですが、VC++がインストール
されている環境でないと知ることはできないのでしょうか。

433 名前:デフォルトの名無しさん :2006/05/12(金) 22:56:00
>>432
tlibでインポートライブラリからリストファイルを作成。

自作のDLLならextern "C"しとけば?

434 名前:デフォルトの名無しさん :2006/05/12(金) 23:01:43
>>432
tdump -ee

435 名前:デフォルトの名無しさん :2006/05/12(金) 23:37:36
質問です。
あるクラスで構造体BBOXを宣言しました。
そして、そのクラスの中で、
BBOX GetBox(void){
return m_bbox;
}
のようにボックスを返すメンバ関数を作りました。
そして、別のクラスで呼び出そうとしたところ、

BBOX box;
と変数を宣言したら定義されていないとされました。

BBOX構造体を宣言したクラスのヘッダファイルはインクルードしてあります。
なにが問題でしょうか?


436 名前:デフォルトの名無しさん :2006/05/12(金) 23:43:06
>BBOX構造体を宣言したクラスのヘッダファイルはインクルードしてあります。
「BBOX構造体を宣言したクラス」のヘッダファイルをインクルードしたんだな?
「BBOX構造体を宣言した」ヘッダファイルをインクルードしたわけじゃないんだな?

437 名前:デフォルトの名無しさん :2006/05/12(金) 23:46:42
>>436
そうです。
やはり、他のクラスでも使えるようにするには共通のヘッダで宣言するってことですか?
クラス内で宣言した場合はクラス内でしかつかえないのでしょうか?



438 名前:デフォルトの名無しさん :2006/05/12(金) 23:53:30
そのクラスの名前::BBOX box;

439 名前:デフォルトの名無しさん :2006/05/13(土) 00:04:36
>>438
解決しました。ありがとうございます

440 名前:デフォルトの名無しさん :2006/05/13(土) 01:36:42
>>419
この質問は昔からあるFAQだな…。

コピーコンストラクタとか、例外とか、深くわかってくると参照じゃないと非常に問題があることがわかってくるよ。
ていうかポインタってやつは言語仕様的にはマジ腐ってる。

でも参照も実は中途半端で、コンテナに突っ込んでおくとオブジェクトの生存期間の管理がややこしくなったりする。
生存期間、つまりdeleteするタイミングを任意にコントロールしたければ、腐っていてもポインタを使うしかない。

そんなわけでポインタも参照もなるべく使わず、C++/CLIのハンドル(^)を使うのが最強ってことで。

441 名前:デフォルトの名無しさん :2006/05/13(土) 01:38:24
>>440
C++ 使ってるんなら、実行速度を無視して最強を決めるんじゃない。

442 名前:デフォルトの名無しさん :2006/05/13(土) 01:47:09
>>419
参照は「初期化されずに使用されるポインタ」「(意図せずに)NULLを指すポインタ」
なんてのを排除しつつ見た目を多少整える程度の存在。

別の言い方をするなら、
指し示す先を「領域が確保され初期化されている既存オブジェクト(等)」に
限定したポインタのような存在。

443 名前:デフォルトの名無しさん :2006/05/13(土) 01:49:14
>>441
昔はC++は遅いってよく批判されたものだけどね。

10年前はマイナーな言語だったのに、今は詳しい人がこんなにいるってのが、
おじさんには驚きですよ。いい時代になったものだね。
誰にも理解されなかったあの頃が懐かしい。

C++/CLIのネイティブコンパイラが現れる時代もそんなに遠くないでしょ。
ネイティブでガベコレってのはD言語でもやってるしね。

444 名前:デフォルトの名無しさん :2006/05/13(土) 01:52:50
>>443
C++ のポインタが遅いとか、>>440 が書き込まれた時点で C++ のポインタの変わりに
C++/CLI のハンドルが使える(しかもそうすることを推奨)とか、
そういうことを本当に信じてますか?

初学者に適当なこと言って惑わすのって面白いですか?

445 名前:デフォルトの名無しさん :2006/05/13(土) 01:54:20
ポインタ演算はなんだかんだ言って高速でシンプルなイテレーションに使えるしな。
# ここで禿が言う「オブジェクト指向に過度に毒された人」はイテレータのクラスを作れ!とか言うんだろうが

446 名前:デフォルトの名無しさん :2006/05/13(土) 01:54:45
>>443
ところでガベコレってなんで必要なのかいまいちわからんな
スマートポインタ使ってれば必要なくね?


447 名前:デフォルトの名無しさん :2006/05/13(土) 02:05:18
>>446
D&Eの最新の邦訳を持っているなら、第-1章のxxviiiを参照するといいかも

448 名前:デフォルトの名無しさん :2006/05/13(土) 02:32:13
>>447
情報Thanks!
ということはガベコレにもいいことがあるだなぁ
今度見てみます


449 名前:デフォルトの名無しさん :2006/05/13(土) 02:44:27
>>446,448
http://www.kmonos.net/alang/d/garbage.html

450 名前:デフォルトの名無しさん :2006/05/13(土) 04:52:43
C++エキスパーツなおまいらから見てDってどうよ


451 名前:デフォルトの名無しさん :2006/05/13(土) 05:15:33
エキスパーツじゃないけど、C++にいくつかのライブラリとマクロを組み合わせれば
Dの優位性はあまり感じられない、というのが正直な感想。

DがC++に対して優位である証明として、次の比較があるけれど:

D vs その他の言語
http://www.kmonos.net/alang/d/comparison.html

C++のように、ライブラリでの実装を推奨したとすれば、上記の比較表はかなり違ったものになる。
この比較は、標準ライブラリでの実装を否定し、言語仕様に組み込むことを善とする考えに基づいている。
その理由として:

言語の機能 vs ライブラリによる実装
http://www.kmonos.net/alang/d/builtin.html

を挙げている。漏れには、これらの「利点」が、ライブラリでの実装を否定するほどのものではないように見える。
その他のDの機能も、C++でできることを、Dは少し簡易にできるというだけにしか見えない。

結論:C++で必要十分。

452 名前:デフォルトの名無しさん :2006/05/13(土) 10:04:52
>>446
シングルスレッドなプログラムならスマートポインタでほとんど大丈夫。
でもコンテナにポインタを入れるときに面倒なことがおきがち。

マルチスレッドで、オブジェクトをスレッド間でやり取りするなら、
ガベコレは非常に欲しい。かなり楽になるよ。

453 名前:デフォルトの名無しさん :2006/05/13(土) 10:44:27
>>450
Dの関数の入れ子やデリゲート、無名関数は欲しい。
でもtemplateはC++のがいい。これがあるから俺は他の言語へ移る気にならない。

454 名前:デフォルトの名無しさん :2006/05/13(土) 10:47:42
言語を作るための言語ができれば最強じゃね

>>419
関数に巨大な構造体を引数として渡す時に値渡しではなくconst参照で渡して
パフォーマンスアップ、以外の使い方見たこと無いけどね

455 名前:デフォルトの名無しさん :2006/05/13(土) 11:31:18
>454
> 関数に巨大な構造体を引数として渡す時に値渡しではなくconst参照で渡して
それはconstポインタでもできる
ってか,巨大な構造体を値渡しなんてCでもせんだろw

456 名前:デフォルトの名無しさん :2006/05/13(土) 12:29:29
相談ごと

VC6 で、
デバッグビルドではさくっと動くのに、
リリースビルドではさくっとこける。

て言う現象が起こったとき、
どこを疑えばいいのかどなたかご教授くださいお願いします orz

457 名前:デフォルトの名無しさん :2006/05/13(土) 12:38:43
変数の初期化

458 名前:335 :2006/05/13(土) 12:44:38
みんな細かいテクニックはどこから学んでるの?
EffectiveC++とか?

459 名前:456 :2006/05/13(土) 12:53:42
>>457
解決しました!
(初期化されてない関数へのポインタ変数を使ってたらしい)
ありがとうございました。


460 名前:デフォルトの名無しさん :2006/05/13(土) 15:15:36
>>455
参照ならポインタと違ってわざわざ呼ぶ側が&演算子を使う必要が無くなる。
こと構造体(やクラス)では値渡しだと非効率と言うコンピュータの勝手な都合だから、
そんなポインタを使っていることを意識させないほうがよろしい。

461 名前:デフォルトの名無しさん :2006/05/13(土) 15:31:29
コンピュータに都合なんかねえよ
応答速度やメモリ原価でイライラするのは結局人間の都合

462 名前:デフォルトの名無しさん :2006/05/13(土) 15:36:12
コンピュータの特性と言えばよかったのにね☆

463 名前:デフォルトの名無しさん :2006/05/13(土) 16:41:22
new をオーバーロードしたいのですがオーバーロードしたnewが呼ばれません…

class A
{
void* operator new(size_t t)
{
void* mem;
mem = malloc(t);
return mem;
}
}

class B : public A
{
int* i = new int;
}

464 名前:デフォルトの名無しさん :2006/05/13(土) 16:42:30
すみませんクラスBがあれですが気にしないでくださいorz

465 名前:デフォルトの名無しさん :2006/05/13(土) 16:46:51
>>463-464
頭脳が間抜けか?
それがよばれるのは、class A および class Bをnewしたときだ。

それがしたいなら、グローバルなnewをオーバーロードしなければならない。

void * operator new(size_t size, std::nothrow_t const &) throw()
{
  std::cout << "new called : " << size << std::endl ;
  return malloc(size) ;
}



466 名前:デフォルトの名無しさん :2006/05/13(土) 16:50:16
なるほど解りました、ありがとうございます。

467 名前:デフォルトの名無しさん :2006/05/13(土) 16:54:19
>>466
あと、std::nothrow_tを引数に取らないnewをオーバーロードするときは、ちゃんと例外を投げておくこと。
とくにグローバルなnewをオーバーロードしたいなら。

厳密にまったく同じ動作をしたいなら、さらにset_new_handlerをトリッキーに使う必要があるけど、
そこまでするかどうか状況によると思う。


468 名前:デフォルトの名無しさん :2006/05/13(土) 18:59:29
ありがとうございます。

もう1つ聞きたいのですが、
operator new[]の方をオーバーロードした時の中の処理は
malloc(size);でもいいのでしょうか?

469 名前:デフォルトの名無しさん :2006/05/13(土) 19:03:56
callocでないといけないとかと思ってたんですが、
すみません自己解決しました。

470 名前:デフォルトの名無しさん :2006/05/13(土) 19:49:33
>>468 >>467

471 名前:デフォルトの名無しさん :2006/05/13(土) 20:36:22
>>458
「細かいテクニック」って何のことだ?
その表現からは、「所詮は枝葉末節であり、仕事に関係しない・知らなくてもいい技法」というニュアンスを感じるが。
Effective C++では、設計・実装の「常識」は説明されているが、「小細工」の類は書かれていない。

472 名前:デフォルトの名無しさん :2006/05/13(土) 21:16:04
Effective C++に書かれてる内容は理解してて当然じゃないと仕事ふれないよな…

473 名前:デフォルトの名無しさん :2006/05/13(土) 21:27:39
std::string に pop_back がないのですが、どうすれば良いのでしょうか…?

474 名前:デフォルトの名無しさん :2006/05/13(土) 21:30:09
[end() - 1] じゃだめなん?size()も一減らさないとあかんの?

475 名前:デフォルトの名無しさん :2006/05/13(土) 21:32:51
>>473
> erase( size() - 1, 1 )
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#534

476 名前:デフォルトの名無しさん :2006/05/13(土) 21:32:57
>>473
っresize
っerase


477 名前:デフォルトの名無しさん :2006/05/14(日) 01:00:21
#include <iostream.h>
#include <malloc.h>
struct KATA{
int ab;
int cd;
};
int MyFunction(int x, struct KATA *y)
{
y = (struct KATA *)calloc(x, sizeof(struct KATA));
if(y == NULL){
return(1);
}

for(int i = 0;i <= x -1;i++){
y[i].ab = 2;
y[i].cd = 3;
}

return(0);
}


478 名前:デフォルトの名無しさん :2006/05/14(日) 01:00:48
void main()
{
struct KATA *y;
cout << "MyFunctionの戻り値 = " << MyFunction(2, y) << endl;


for(int i = 0;i <= 1;i++){
cout << "y[" << i << "].ab = " << y[i].ab << endl;
cout << "y[" << i << "].cd = " << y[i].cd << endl << endl;
}
}

関数に作りたい構造体の数と、構造体変数へのポインタを渡して、
関数の中で、領域を確保して値を格納して、格納した値をmainで参照
したいのですができません。これはできないものでしょうか。


479 名前:デフォルトの名無しさん :2006/05/14(日) 01:07:00
>>477-478
http://www.kouno.jp/home/c_faq/c4.html#8

あと、
× #include <iostream.h>
× #include <malloc.h>
× void main()

480 名前:デフォルトの名無しさん :2006/05/14(日) 01:23:34
△ × void main()

481 名前:デフォルトの名無しさん :2006/05/14(日) 01:34:41
>>480 何のつもりだ?

482 名前:デフォルトの名無しさん :2006/05/14(日) 01:36:48
>>478
int MyFunction(int x, struct KATA *&y)
それから、C++ では calloc より new とコンストラクタを使え

なお、479 は C++ スレで C の解説サイトへ誘導を試みてるアフォなんで (・∀・)ニヤニヤ しとけばいい
参照渡しやオブジェクトの初期化方法を差し置いて × と書いている理由も
おそらく根拠が C の仕様で、かなり重度に気が狂ってる模様

483 名前:デフォルトの名無しさん :2006/05/14(日) 01:36:51
>>480
馬鹿はスルーでお願い

484 名前:デフォルトの名無しさん :2006/05/14(日) 01:40:06
>>480
3.6.1 - Main function の 2 より。
"It shall have a return type of type int, but otherwise its type is implementation-defined."

485 名前:デフォルトの名無しさん :2006/05/14(日) 01:41:31
>>484
なるほど、お前が英文が読めないことはよくわかった

486 名前:デフォルトの名無しさん :2006/05/14(日) 01:42:34
>>482
479 の×の理由の根拠が C の仕様って、おまえも狂ってんじゃね?

487 名前:デフォルトの名無しさん :2006/05/14(日) 01:43:40
なになに? void main() が OK とか言ってるやつがいるの?

488 名前:デフォルトの名無しさん :2006/05/14(日) 01:44:19
>>486
main についてはそうかもね

489 名前:デフォルトの名無しさん :2006/05/14(日) 01:47:31
________.  |  ・・・「ひでもん」?
|||          | \____ __
|||          |  )\       ∨
|||    英  文.   <⌒ヽ ヽ
|||         \ ( ´ー`)    ∧∧
|||_________V(   丿V^  ●Д゚,,)
|,,|          |,,| ヽ (      と  ,)
              ノ )     |  |〜
            ∧          .し`J,,.
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
なんか、たった1行の英文が読めてない奴多いなー

490 名前:デフォルトの名無しさん :2006/05/14(日) 01:48:45
MTGで鍛えた英文力でも大丈夫だったぜ

491 名前:デフォルトの名無しさん :2006/05/14(日) 01:54:49
まあ欧米のネイティブど素人が読んでわかる文面でもないが・・・

492 名前:デフォルトの名無しさん :2006/05/14(日) 01:55:13
So if one's compiler's documentation happens to say anywhere
that main may have the return type void then
main may indeed have the return type void
and a program with void main() is a conforming program.

↓これをどう取るかで宗教論争

493 名前:デフォルトの名無しさん :2006/05/14(日) 02:00:15
禿の一声で論争終了。
http://www.research.att.com/~bs/bs_faq2.html#void-main

494 名前:デフォルトの名無しさん :2006/05/14(日) 02:05:55
禿の所有物みたいに思ってる化石がまだいたか

495 名前:デフォルトの名無しさん :2006/05/14(日) 02:08:47
>>494
必死だな。 ISO で決まってるんだからその指摘も的外れだが。
> See the ISO C++ standard 3.6.1[2] or the ISO C standard 5.1.2.2.1.

496 名前:デフォルトの名無しさん :2006/05/14(日) 02:09:30
>>495
>>484

497 名前:デフォルトの名無しさん :2006/05/14(日) 02:09:32
ISO の所有物みたいに思ってる化石がまだいたか

498 名前:デフォルトの名無しさん :2006/05/14(日) 02:11:22
>>496 なに?日本語に訳してほしいの?

499 名前:デフォルトの名無しさん :2006/05/14(日) 02:11:33
>>497
それならまだマシ
奴は ISO の文書が読めてない

500 名前:デフォルトの名無しさん :2006/05/14(日) 02:12:11
>>498
お前がだろ


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.