C++相談室 part56 ..
[2ch|▼Menu]
321:デフォルトの名無しさん
07/08/14 23:19:43
明示的な解放が必要ってことは
static HogeClass *s = new HogeClass;
return s;
とかするのか?

322:デフォルトの名無しさん
07/08/14 23:25:57
Modern C++ Design読め。

言語に頼れるのならば任せるのがベターだろうと思うよ。
それができない(例外的な)ケースのときだろうね。明示的に実装することを考えるのは


323:デフォルトの名無しさん
07/08/15 02:20:59
mallocしたメモリは確実に解放しますか?

私は、解放します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。

324:デフォルトの名無しさん
07/08/15 03:29:48
だからModern C++ Design読めって。そもそもmallocなんか使わないよ。
ローカル関数内のstaticオブジェクトを使うのが簡単じゃない?

325:デフォルトの名無しさん
07/08/15 04:20:38
「リソースは解放する」「順序は守る」「両方」やらなくちゃならないのがのC++のつらいところだな。

326:デフォルトの名無しさん
07/08/15 05:39:13
シングルトンの解放に関する話は結構ややこしいからな。
Modern C++ Design 読め、で済ますしかない。

327:デフォルトの名無しさん
07/08/15 07:29:15
機械翻訳のような妙な日本語。

328:デフォルトの名無しさん
07/08/15 08:00:51
>>323
C++でmalloc()使う方がどうかしている。

329:デフォルトの名無しさん
07/08/15 08:43:20
>>324>>328
有名な「malloc/free論争」と同じ
不毛な議論だということを述べているのだと思うが

330:デフォルトの名無しさん
07/08/15 08:46:56
不毛も何も、C++ならnew/deleteがあるのだからmalloc()なんて使わないだろって話だが。
そんなに毛が欲しければCを使っていればいいだけのことだ。

331:デフォルトの名無しさん
07/08/15 09:25:19
論点はmallocかnewか、ではなく
newしたものは必ずdeleteする必要があるか、という点なのだけど。

「mallocではなくnew」などというのは、本質を外れた揚げ足取りに過ぎないと
気が付いているんだろうけど、引っ込みがつかないんだろうね。

332:デフォルトの名無しさん
07/08/15 09:33:22
相手が呆れて去っていきさえすれば勝ちだから、そりゃあ頑張るさ。

「勝者とは強い者のことを言うのではない、戦場に最後まで立っていた者のことを言う」
と、妖魔司教ザボエラ様も仰ってる。

333:デフォルトの名無しさん
07/08/15 09:48:46
deleteするか否かは時と場合による。

334:デフォルトの名無しさん
07/08/15 10:04:49
placement new なら delete しない代わりにデストラクタ呼ぶ、という話か?

335:デフォルトの名無しさん
07/08/15 10:34:09
時と場合で移り気なの

336:デフォルトの名無しさん
07/08/15 10:34:36
スマートポインタ使えよ
RAIIの原則に従っておけば何も考えなくていいんだから

337:デフォルトの名無しさん
07/08/15 10:41:01
newしたらdeleteするのは当たり前だが、mallocしたものはfreeしないと言うこともあるかも知らん。

338:デフォルトの名無しさん
07/08/15 11:10:57
あーあ、mallocやっちゃった。スレタイ読めない馬鹿発見。

339:デフォルトの名無しさん
07/08/15 11:13:18
というのは、レスが読めてない馬鹿の言うことなんだけどね、この場合。

340:デフォルトの名無しさん
07/08/15 11:20:33
delete はデストラクタ呼ぶから、free とは問題が別だよという話だろう。

341:デフォルトの名無しさん
07/08/15 12:09:46
newしたメモリは確実に解放しますか?

私は、解放します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。

342:デフォルトの名無しさん
07/08/15 12:15:10
あーあ、newやっちゃった。スレタイ読めない馬鹿発見。

343:デフォルトの名無しさん
07/08/15 12:31:17
ティンコティンコティンコ

344:デフォルトの名無しさん
07/08/15 12:38:33
デストラクタでOSが自動でやる以上に何か意味のある仕事をするんなら
勿論deleteすべきだろうな

345:デフォルトの名無しさん
07/08/15 12:48:37
RAIIとかリソース所有の概念を知らないやつが混ってるな。
C++必須の概念のはずなのに、知らないやつってホント多いよな。


346:デフォルトの名無しさん
07/08/15 12:52:51
>>345
決め付けは良くないですyo

347:デフォルトの名無しさん
07/08/15 12:53:03
解放しないとデバッガがメモリリークを報告しまくってうっとうしい

348:デフォルトの名無しさん
07/08/15 12:53:52
>>347
それはデバッガがクソ

349:デフォルトの名無しさん
07/08/15 13:01:34
いずれにせよnewしたメモリは全部スマートポインタに突っ込むのが常識だろ。
今時手動deleteとかありえねえ

350:デフォルトの名無しさん
07/08/15 13:04:15
今時ガベコレも無い言語なんて時代遅れもはなはだしい

351:デフォルトの名無しさん
07/08/15 13:25:50
ライブラリでいくらでも実装できるLispとC++は最高、ということですね?

352:デフォルトの名無しさん
07/08/15 13:40:39
スマートポインタが万能だとでも思ってるんだろうか

353:デフォルトの名無しさん
07/08/15 13:42:58
RAIIあれば大抵は処理できるよ。 >350
ガベコレも結局無限リソース(メモリ)しか上手く処理できないしな……


354:デフォルトの名無しさん
07/08/15 13:44:47
循環参照があっただけでおしまいじゃん

355:デフォルトの名無しさん
07/08/15 14:01:29
シングルトンどうしが循環参照してても解放すべきです。
私はそう考えます。

356:デフォルトの名無しさん
07/08/15 14:29:38
おまえいいこと言うな

357:デフォルトの名無しさん
07/08/15 14:48:33
>354
ちゃんとリソース所有権を考えれば循環参照はめったにおこらない。
まあ、考えるのが面倒だからガベコレに頼りたくなるんだけどね。

>355
どういう状況だよ。シングルトンわかってないだろ。


358:デフォルトの名無しさん
07/08/15 14:49:34
>>355
そんなシングルトンが存在すること自体、設計が変だと思わないか

359:デフォルトの名無しさん
07/08/15 14:51:45
寝具るddd

360:デフォルトの名無しさん
07/08/15 14:57:57
>>357-358
可哀相なくらい行間が読めないコンビだな。

361:デフォルトの名無しさん
07/08/15 15:35:05
読む気ねぇ。ここはマ板じゃねぇし。なんで技術的な部分以外を気にしなきゃいかんのかね?
いい加減夏厨相手にするのも飽きたなぁ

362:デフォルトの名無しさん
07/08/15 15:51:47
馬鹿を晒すぐらいなら書かなきゃいいのに

363:デフォルトの名無しさん
07/08/15 15:54:14
行間なんてものは要するに書き漏らしただけ
ちゃんと伝えたきゃ書け

364:デフォルトの名無しさん
07/08/15 15:56:26
行間っつーか、ギャグだろ。

365:デフォルトの名無しさん
07/08/16 06:38:10
>>361
日本語でコミュニケーションする能力が
技術的な部分と両輪で機能してない間抜けなぞ問題外。

366:デフォルトの名無しさん
07/08/16 14:56:08
(゚ー゚*)ダッコ♪

367:デフォルトの名無しさん
07/08/16 15:29:53
reddit 経由「透過的プログラマ指向ガベコレ for C++」
URLリンク(www.open-std.org)

Boehm らによる言語機能としてのガベコレ提案。ちょっと期待。

368:デフォルトの名無しさん
07/08/16 18:15:46
class SUBCLASS {
public:
   LPSTR& operator[](LPCSTR);
};

class SUPERCLASS{
public:
   SUBCLASS *subclass;
};


SUPERCLASS aaa;

int main()
{
   aaa.subclass = new SUBCLASS(hogehoge);
   return aaa.subclass["bbb"];
}

わけあってmapが使えないので上のようにしているのですが
「error C2107: ポインタでない式に、添字が使われました。」
というエラーが出てしまいます

どのようにすれば解決できますでしょうか?
開発環境はVS2005です
よろしくお願いします

369:デフォルトの名無しさん
07/08/16 18:30:39
あんまり真面目に読んでないけど、とりあえずこうじゃね?
 return (*aaa.subclass)["bbb"]; 

370:368
07/08/16 18:44:26
>>369
どうもー
やってみましたがだめでした

371:デフォルトの名無しさん
07/08/16 18:53:11
>>370
エラーメッセージが変わっただろ。ちゃんとその辺を書けよ。
で、戻り値の型がLPSTRなんだから、らreturn文で呼ばずに単独で呼んでみな。

372:368
07/08/16 19:00:40
>>371
うーんエラーメッセージは変化なしです

373:デフォルトの名無しさん
07/08/16 19:06:17
aaa.subclass->operator[]("bbb")

374:368
07/08/16 19:08:45
>>373
コンパイル通りました
ありがとうございました

375:デフォルトの名無しさん
07/08/16 19:11:26
意味があるかは知らんが、(*aaa.subclass)["bbb"] でコンパイルは通るぞ。

376:デフォルトの名無しさん
07/08/16 19:11:34
>>373
俺もそうだと思ったけど、関数形式で呼ぶのがなんか嫌だから書かなかった
なんか解決策ないかね

377:371
07/08/16 19:13:21
>>372
そうか? 前者は引き数が合わなくて関数が見つからないが、後者は戻り値の型が合わなくてエラーになると思うのだが。
つーか、なんでまたmain()のreturnなんかで試すんだ? >371の後半は読んでないのか?

378:376
07/08/16 19:13:31
ああそうか、違和感の理由が分かった。
連想配列にしたくて添え字をオーバーロードしているはずなのに
opreator[]で呼んだら意味を成さなくなっちゃうからだ。

379:376
07/08/16 19:15:59
つうことで解決案

subclassをカプセル化して、参照越しにoperator[]を呼ぶ

380:デフォルトの名無しさん
07/08/16 19:23:44
(*aaa.subclass)["bbb"] でコンパイル通らず、
aaa.subclass->operator[]("bbb") でコンパイル通るってあり得ないと思うんだが。

381:368
07/08/16 19:28:22
>>375
あわわ間違って(*aaa.subclass["bbb"])としちゃってたようです

>>377
エラー部分だけ抜き出そうとして型違いのreturnになってました、ごめんなさい…

>>379
単語の意味がわかってないので検索してやってみます、ありがとうございました

382:デフォルトの名無しさん
07/08/16 19:35:38
でもなんでchar *じゃなくて、char * &なんだろう。
constでないということは、こういうことがやりたいんだろうか。


(*aaa.subclass)[''bbb"] = new char[10] ;

いや、ひょっとしたらこういうことがしたいのか

char * & ptr = (*aaa.subclass)[''bbb"] ;
ptr = static_cast<char *>( realloc(ptr) ) ;

383:デフォルトの名無しさん
07/08/16 20:59:50
class Base
{
public:
Base(int n) {}
};
class Derived : Base
{
public:
Derived(int n) {}
};
これがどうしてダメで、Base::Base()が必要なのか教えてください。

384:デフォルトの名無しさん
07/08/16 21:06:38
親クラスに n を渡すなら、それをちゃんと書かなきゃいけない。

public:
Derived(int n) :Base(n) {}

385:デフォルトの名無しさん
07/08/16 21:06:53
はい?

386:デフォルトの名無しさん
07/08/16 21:07:27
>>383
その例のDerived のコンストラクタは結局 Derived(int n) : Base() {} の省略形だから

387:デフォルトの名無しさん
07/08/16 21:21:45
そのnは親に渡さずに別に使うnかもしれないし。

388:デフォルトの名無しさん
07/08/16 23:12:17
>>383
Derived クラスのインスタンスを生成するときに
Base クラスのコンストラクタを呼び出すからなんだと思います。
コンストラクタを定義していないときはデフォルトコンストラクタが呼び出されるけど
定義してると定義されたものを呼び出すから
この場合は引数のいらないコンストラクタを定義するか
Derived クラスのコンストラクタで
Derived(int n) : base(100) {}
みたいに Base(int n) を呼び出して
引数を渡さないとだめだと思うんです。

初心者なんで間違ってるかもしれません。


っていうか STL 難しすぎでうっ!

389:デフォルトの名無しさん
07/08/16 23:20:25
Baseのコンストラクタにデフォルト値を書いておくのもいいかも

っていうか STL 関係ねー

390:デフォルトの名無しさん
07/08/17 00:01:01
>>388
>っていうか STL 難しすぎでうっ!
でうっ?

391:デフォルトの名無しさん
07/08/17 00:20:57
唐突にこれを思い出した
URLリンク(www.karakuri-box.com)

392:デフォルトの名無しさん
07/08/17 00:41:05
すいません。釣りではありません。
C++ってどんな局面で使うんですか?
WinアプリならC#使ったほうが圧倒的に楽


393:デフォルトの名無しさん
07/08/17 01:00:07
脳みそ沸かしたいとき

394:デフォルトの名無しさん
07/08/17 01:24:19
Cで先頭アドレスと要素数がわかってるのですが
ForループじゃなくてC++のiteratorに変換してくれるtemplateとかないんですか?

ない場合どのiterator継承すればいいんでしょうか

395:デフォルトの名無しさん
07/08/17 01:40:46
T*head; size_t element;が既知なんでそ?
なら、&head[0]〜&head[element]がiteratorの要件を満たしてくれるでそ?

396:デフォルトの名無しさん
07/08/17 01:48:01
>>392
楽かどうかなら C# が楽だろうが、
C# は Windows にしか優しくないし、
速度も C++ に劣るし、
そういうのが必要な時には C++ が圧倒的有利。

397:デフォルトの名無しさん
07/08/17 02:19:58
速度が必要になるようなミッションクリティカルな場面に出会ったことがない
最近は全部C#。

398:デフォルトの名無しさん
07/08/17 02:21:20
サーバーアプリだとC#?ハァ?

399:デフォルトの名無しさん
07/08/17 02:38:29


400:デフォルトの名無しさん
07/08/17 03:59:53
つかここ#かんけーねーし

401:デフォルトの名無しさん
07/08/17 05:58:45
>>392
C#を実装するのに使います

402:デフォルトの名無しさん
07/08/17 12:37:18
>>401が良い事言った

403:デフォルトの名無しさん
07/08/17 21:16:42
なぜ想像力がデスクトップとサーバー位にしか働かないんだ
プログラムが必要な場面はいろいろあるぞ

404:デフォルトの名無しさん
07/08/17 21:39:47
class CFUNC a;
の2次元配列を動的に確保する場面があって、
CFUNC ***pppa;
として使いたいですが、
pppa = new CFUNC**[y_len];
でまずy要素を確保して
pppa[0] = new CFUNC*[x_len];
各y要素のx要素を確保して
pppa[y][x] = new CFUNC();
で、各要素をインスタンス化して
(*(pppa[y][x])).hoge();
みたいに使おうと思うのですが、このpppaを破棄する場合に
deleteはどう書いたらいいのかわからなくなってしまいました。。。どなかたpppaをdeketeしてもらえませんか?
ちなみによくしらないのですが、delete[]ってなんで配列の要素数がわかるんですか?


405:デフォルトの名無しさん
07/08/17 22:15:50
typedef CFUNC*** PPPCFUNC
typedef CFUNC** PPCFUNC
typedef CFUNC* PCFUNC
と整理してやると

PPPCFUNC pppa = new PPCFUNC[y_len]
pppa[0] = new PCFUNC[x_len]
pppa[y][x] = new CFUNC
になるんで
deleteとdelete[]で困る局面はなくなると思ってみたり

要素数は実装によるけどもコンパイル時には決められないからどっかで一元管理してんでないすか多分
俺はそうする

406:デフォルトの名無しさん
07/08/17 22:53:53
VC++では先頭の手前に要素数が格納されてた希ガス

407:404
07/08/17 22:59:04
なるほど、typedefを忘れてました。
ではこれで確保したpppaはdelete[] pppaで破棄できるんですねっ!
要素数は、
int pppa_len_y;
int *pppa_len_x = new int[ pppa_len_y ];
でnew時に一緒に初期化しています。
もっと手軽な方法ありますか?


408:404
07/08/17 23:02:44
>406
それじゃぁmallocするときに、必要size+1とってfreeのときにそれ利用してるんですねぇ。
ってことは要素数を保持しなくても、ポインタの手前の要素数使えってこと?
ちなみにc++の規定ですか?処理系依存ですか?

409:デフォルトの名無しさん
07/08/17 23:17:52
処理系依存。

410:404
07/08/18 00:17:58
>>405
PPPCFUNC pppa = new PPCFUNC[y_len];
でnewしようとすると、PPFUNC*からPPPFUNCに変換できません
と怒られてしまいました。
PPPCFUNC pppa = (PPPFUNC)( new PPCFUNC[y_len] );
でキャストして大丈夫なのでしょうか?

411:404
07/08/18 00:36:14
すいません、勘違いです。typedefミスってました。OTL

412:383
07/08/18 11:08:57
>>384-389
ありがとうございました。よくわかりました。

最近C++を勉強しているのですが、Java育ちのゆとり世代なものでスパルタさにガクブルものです。
class Foo
{
private:
char* s_;
public:
Foo(char* str) : s_(new char[strlen(str)+1]) { strcpy(s_, str); }
~Foo() { delete[] s; }
};
int main()
{
Foo a("foobar");
Foo b = a;
}
この程度で落ちるってのがすごすぎです(なぜ落ちるのかはちゃんとわかりますが・・・)。

413:デフォルトの名無しさん
07/08/18 11:24:18
>>412
生でnewを使うからそういう羽目になる。
std::stringを使うなり、std::vectorを使えばいい。
せめて、スマートポインタを使え。

414:デフォルトの名無しさん
07/08/18 11:34:02
コピーコンストラクタや代入演算子をちゃんと書かないから・・

415:デフォルトの名無しさん
07/08/18 12:19:01
C++を使う時は、リソースの所有権を常に意識する必要がありますな。
RAIIはちゃんと勉強しといたほうが良いよ

416:デフォルトの名無しさん
07/08/18 12:37:37
そうだな、コピーコンストラクタと代入演算子は常に書くべき。

417:デフォルトの名無しさん
07/08/18 12:40:35
Java→C++とか死亡ルートじゃね?
Java→C→C++って回るべきだと思うんだが

418:デフォルトの名無しさん
07/08/18 13:32:09
GC付きC++って選択肢もあるんでないの(w

419:デフォルトの名無しさん
07/08/18 14:17:34
Javaなんか使うから頭が馬鹿になるんだよ。
GC付きの言語を使うと変な癖が付く。

420:デフォルトの名無しさん
07/08/18 15:08:22
時代に逆行している人

421:デフォルトの名無しさん
07/08/18 16:59:23
>>417
自分はC#→C→Java→C++ってやってきたけどおk?

422:デフォルトの名無しさん
07/08/18 17:03:18
コンストラクタで例外を投げるクラスがあり、
そのクラスをstaticに使ってるんですが、
この場合、どのように例外をキャッチすればいいのでしょうか?

class Throw{ public: Throw(){ throw 1; } };
class TestClass{
static Throw throw;
};

こんな感じです。

423:デフォルトの名無しさん
07/08/18 17:12:19
>>422
コンストラクタの中でキャッチするか、プログラムが死ぬか。

424:デフォルトの名無しさん
07/08/18 17:36:05
>422
staticをやめる

425:デフォルトの名無しさん
07/08/19 13:25:57
教えてください。

たとえば
int i = 100, *ip;
double d = 123.456, *dp;
ip = &i;
dp = &d;
char *s = "abcdefg";

cout << ip << " " << dp << " " << s << endl;

このようなコードで int型やダブル型のポインタを cout で出力すると
アドレスが表示されるのに char型のポインタだと
文字列が表示されるのがいまいちよくわからなかったんですが
ずっと勉強してきてふと思ったんです。
cout で演算子オーバーロードでそうなるようにされてるのかなと。
で定義されているコードを探そうと思ったんですけど
なんかごちゃごちゃしててよくわかりません。
もし予想が当たってるならどのファイル見ればいいかでしょうか?

426:デフォルトの名無しさん
07/08/19 13:54:49
>>425
basic_ostream っていうクラステンプレートに対して定義されている。
char もテンプレート引数になってるからちょっと探しにくいだろうね。
ヘッダ ostream に対応するファイルで定義されているはず。

ごちゃごちゃしたヘッダを読むのがいやなら >>2 から規格のドラフトでも見るといい。

427:デフォルトの名無しさん
07/08/19 17:00:46
教えてください。

428:デフォルトの名無しさん
07/08/19 17:31:07
何をだ

429:デフォルトの名無しさん
07/08/19 18:41:48
>>428
事故解決すますた

430:デフォルトの名無しさん
07/08/19 21:20:33
>>426
ありがとうございます。
ファイル見てみたんですけど
今の僕にはまだ難しくてよくわかんないんで規格もみたんですけど
いまいちわからなくて
検索してたら説明されてるページをみつけました。
URLリンク(www.io.nara-su.ac.jp)

これですっきりしました。

431:デフォルトの名無しさん
07/08/20 15:44:57
質問です。
下のクラス図のようなクラスを実装したいのですが、DataClassのように、二つ(以上)で共有しているクラスは、コード上でどのように書いたらいいのでしょう?
DataClassのインスタンスをグローバルな領域で作るしかないのでしょうか?

クラス図
URLリンク(enjoi.blogdns.net)

とりあえず書いてみたコード
class DataClass{
private:
  int data;
public:
  void setData(int newData);
  int getData();
};
class ClassB
{
public:
  bool DoSomething();
};
class ClassA
{
private:
  ClassB classb;
};


432:デフォルトの名無しさん
07/08/20 16:18:28
状況次第じゃね。

どっちかに持たせて、もう片方にも渡せるようにすることもあるし、
動的に確保して、A, B の両方のスマートポインタに入れとくこともあるし、
A を所有するクラスに持たせて、そっから渡すようにすることもあるし、
シングルトンにしてグローバルな領域に置くこともあるし、

433:デフォルトの名無しさん
07/08/20 16:18:28
そんなに文句あるんならnamespace使うなりClassAとClassBを統合するなりすれば?

434:デフォルトの名無しさん
07/08/20 16:20:59
初心者だからよくわかんないんですけど
DataClass をメンバとして持つんですか?
ClassA と DataClass の関係って必要なんですか?
ClassB経由で十分なんじゃないでしょうか?

435:デフォルトの名無しさん
07/08/20 16:23:07
関連のあるABのオブジェクトが同じDataClassオブジェクトと関連を持つかどうかは示されていない。
むしろ同じオブジェクトではないと考えるほうが自然。

436:デフォルトの名無しさん
07/08/20 16:28:10
A, B, DataClassを保持する親クラスParentを作っておいて、A, Bのインスタンス生成時にParentへのポインタを渡し、
各インスタンスはParentへのポインタを通してDataClassへとアクセスする。

437:デフォルトの名無しさん
07/08/20 16:30:25
B に入れといて、B を通して操作する。

438:デフォルトの名無しさん
07/08/20 16:35:13
多重継承はやめとけ。実世界でも親の種が違う生き物は短命だ。

439:デフォルトの名無しさん
07/08/20 16:36:43
どこに多重継承が出てくるんだ?

440:デフォルトの名無しさん
07/08/20 16:59:47
あの矢印は関連。サブクラスは白抜き三角矢印。

441:デフォルトの名無しさん
07/08/20 17:56:47
たくさんのご回答ありがとうございました。

複数の方法論に、そもそも設計の段階でご意見まで、たくさんいただきまして、ありがとうございます。

少し数があるので、それぞれについて吟味して、決めた際にまた改めてのお礼がてらご報告にきたいと思います。
ありがとうございました。

442:デフォルトの名無しさん
07/08/21 09:33:29
>改めてのお礼がてらご報告にきたいと思います。
しなくていいよ。

443:デフォルトの名無しさん
07/08/23 00:48:57
stringstring を途中で空にすることはできるでしょうか?

444:デフォルトの名無しさん
07/08/23 00:56:17
std::stringstream?

445:デフォルトの名無しさん
07/08/23 01:27:07
なんだこのバグは
URLリンク(support.microsoft.com)
>>443
stringstream.str("");

446:デフォルトの名無しさん
07/08/23 02:00:38
>>445
鬱になった
やはりSTLportを入れて使(ry

447:デフォルトの名無しさん
07/08/23 02:10:08
std::coutで、時々アドレスのような文字列("0xABCDEF12"みたいな)が出力されたり、
std::wcoutで何も出力されなかったりして困ってたんだけど、445が原因?
でもVS2005 Proだから違うか

448:デフォルトの名無しさん
07/08/23 02:34:28
>>447
coutにwchar_t*食らわしたり、localeを適切に設定せずに日本語文字列食わしてるならお前が悪いだけ。

449:印字ケータ
07/08/23 14:31:20
バイナリエディタでファイルを開くと

保存してある漢字の"日"という文字は16進数で93 FAと表示されてますが、

コレを読込んで、配列に入れると-109と-6となります。

16進数で表示させたいので、変換する方法を教えてください。

お願いします。

450:デフォルトの名無しさん
07/08/23 14:35:18
unsignedにキャストすればいいんじゃね。

451:デフォルトの名無しさん
07/08/23 14:40:35
93 FA を2進数であらわすと
1001 0011 1111 1010
10010011 を符号付き10進数であらわすと
-109
11111010 を符号付き10進数であらわすと
00000110
-6

そのまま16進にすれば同じ
気にしないで突き進め

char を intにするなら符号拡張がおきるので>>450のとおりunsigned にしとけばいい

452:印字ケータ
07/08/23 14:42:15
>>450

返答ありがとうございます。

早速やってみましたが、変換後に4294967187というデカイ数値になりました。

ちなみに、unsignedの変数にキャストして代入してみました。

もしかして私のやり方が間違ってますか。



453:デフォルトの名無しさん
07/08/23 14:54:41
4294967187 ってのは16進に直すと ffffff93
93 はマイナスだから、そのままint にもってくと 符号拡張するんだよ
unsigned にキャストってどこでどうやったの?
unsigned な変数に入れてやってみ。

454:デフォルトの名無しさん
07/08/23 14:56:17
符号拡張されてるんだろう
10010011→11111111111111111111111110010011

455:デフォルトの名無しさん
07/08/23 15:04:05
char ch = 93;
int n = (unsigned char)ch;

456:デフォルトの名無しさん
07/08/23 18:34:31
>>445
Dinkum版stringの短文字列最適化がアダになったな。
実装としては面白くて好きなんだがな。

457:デフォルトの名無しさん
07/08/23 22:36:57
2005SP1で直ってるっぽいが

458:デフォルトの名無しさん
07/08/30 08:15:51
vector< struct X > Func_A();
vectorとかコレクションを返す関数って効率悪い?

459:デフォルトの名無しさん
07/08/30 08:30:10
>>458
コンテナを参照で受け取ったほうがいいんじゃないか?

460:デフォルトの名無しさん
07/08/30 08:44:11
そこでRVOに期待、右辺値参照にもっと期待。

461:sage
07/08/30 10:25:41
>>459
参照で受け取るっていうのは
void Func_A( vector< struct X >& );
か、
vector< struct X >& Func_A();
ってことですか?
とりあえず上の参照を引数にする方でやってみます

462:デフォルトの名無しさん
07/08/30 11:47:47
vector< struct X >& Func_A();
はどっかに所有者用意しなきゃいけないから色々と面倒じゃね?

基本はauto_ptr戻しだと思うけど。


463:デフォルトの名無しさん
07/08/30 23:55:27
いや、たぶん void Func_A(std::vector<struct X>& arg) のことだろう。

仕様と実装を混同するのはよくないが、実際には多くのコンパイラにおいて
「構造体(class)を返す関数」は、暗黙の引数(返り値へのポインタ)を受け取って、
そこに書き込んで返しているわけだから。

で、return直前にインスタンスを生成する以外の場合、つまり
ローカル変数としてvectorを宣言していろいろ操作しそれを返す場合
おそらくRVOされる可能性も低いんじゃないね。知らないけど。

464:デフォルトの名無しさん
07/08/31 00:49:22
>>463
よくある戻り値用のポインタが指しているのは確保されただけで
まだコンストラクタが走ってない領域ね。引数で受け取る場合は
必ず構築済みのインスタンスを指すんで、仕様的にも違いがある。

最後の場合は「可能性が低い」じゃなくて RVO は不可能。

465:デフォルトの名無しさん
07/08/31 00:52:15
>>464
Named RVOはVC8がやってるらしいですぜ

URLリンク(msdn2.microsoft.com)(vs.80).aspx

466:デフォルトの名無しさん
07/08/31 00:55:03
ずっと前の gcc に付いてたのに削除されたな。あれは仕様的に
何か問題があったんだろうか?

467:デフォルトの名無しさん
07/08/31 01:09:49
URLリンク(gcc.gnu.org)
コンパイラが勝手にやるようになったから文法からは削除されただけみたい。

468:464
07/08/31 01:23:50
いろんな変数返されたとき困るじゃん、とか思ってたけど、そうじゃないときには
働くのね。ふーん。

469:デフォルトの名無しさん
07/08/31 01:35:07
引数が同じで戻り値が違う型の関数を定義する方法って知らないですか?
できればクラスのメンバ関数でやりたいです
まえにWebで見かけたんだけど見つからなかったorz


470:デフォルトの名無しさん
07/08/31 01:48:21
>>469
引数の型が同じなら関数を呼び分けることができないから、基本的に無理だろう。
戻り値の型を基底クラスのポインタにして、異なる型の派生クラスのオブジェクトの
ポインタを返すとかじゃダメ?

471:デフォルトの名無しさん
07/08/31 03:13:32
>>469
こんな感じ?

struct A {
 template <typename T> T foo(int);
};

void bar() {
 A a;
 char c = a.foo<char>(0);
 short s = a.foo<short>(1);
 // ...
}


472:デフォルトの名無しさん
07/08/31 14:55:28
浮動小数点の小数点以下を簡単に取る方法ってないですか?

473:デフォルトの名無しさん
07/08/31 15:13:39
f - floor(f)

474:デフォルトの名無しさん
07/08/31 16:14:22
>>472
modf
>>473は負数のとき正しくない

475:デフォルトの名無しさん
07/08/31 17:35:42
f = f - (float)((int)f);
とかじゃ駄目?

476:デフォルトの名無しさん
07/08/31 18:59:33
f > -1 ? f - floor(f) : aaaaaaaaa

477:デフォルトの名無しさん
07/08/31 19:19:41
>>475
もともと整数部分がint範囲を超えてる場合があるので、
intにキャストするのはまずいと思われ。

478:デフォルトの名無しさん
07/08/31 23:01:01
まさにそのための trunc (truncf) という関数があるんだが、
調べてみたらこれは C99 で定義されてるらしいから C++ では普通使えないな

とはいえ持ってる処理系に存在するかどうかは調べてみたらどうよ

479:デフォルトの名無しさん
07/08/31 23:31:14
unsigned longにキャストは駄目なのか

480:デフォルトの名無しさん
07/09/01 00:05:17
fmod(f, 1.0)

481:469
07/09/01 00:26:15
>>470,471
レスdクスです、
自分が見てたのは、こんなのでした
素直に名前を変えます...

struct testFunc {
int n, m;
testFunc(int _n, int _m = 1) { n = _n; m = _m; }
testFunc(int _n, double _m) { n = _n; m = 10; }
operator int() { return n * m * 2; };
operator double() { return n * m * 3.0; };
};

void main() {
int a = testFunc(5);
double b = testFunc(5);
int c = testFunc(5, 5);
double d = testFunc(5, 5);
int e = testFunc(5, 5.0);
double f = testFunc(5, 5.0);
}

もう少し探したらそれらしいのが見つかりました
URLリンク(homepage2.nifty.com)
やりたかったことはこんな感じ↓
URLリンク(anond.hatelabo.jp)


482:デフォルトの名無しさん
07/09/02 00:02:07
vector<char> v;

for (int i=0; i<v.size(); i++)
{
  .....
}

というコードの i<v.size() で
> warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
という警告が出るんですが、
こういうときは unsigned i=0 にして
きっちり警告を消してしまうもんなんでしょうか?


483:デフォルトの名無しさん
07/09/02 00:07:42
うん
警告も消すのが良い作法

484:デフォルトの名無しさん
07/09/02 00:11:18
>>482
unsigned でも警告は消えるけど、v.size()のリターン値と同じ型を使うのが普通。

485:デフォルトの名無しさん
07/09/02 00:12:08
これが規格厨を黙らせる、完璧に正しい方法。

for ( vector<char>::size_type i = 0 ; i < v.size() ; ++i )

486:デフォルトの名無しさん
07/09/02 00:16:44
そこでautoとか未来を先走るわけですよ。カモンC++0x

487:デフォルトの名無しさん
07/09/02 00:23:34
>>486
でもこの場合どうやるんだろう。
そもそも>>482はstd名前空間のvectorではないから、自前実装の俺様vectorである可能性もあるんだよね。
ひょっとしたら、size_typeなど定義されていないかもしれない。

こういうことできるの?

decltype( v.size() ) i ;

sizeofに関数を渡すと、戻り値の型のサイズになるから、
decltypeだと戻り値の型になってくれるんだろうか。

なんてことをふと考えてしまった。
どうなるの? 教えてハゲな人。

488:デフォルトの名無しさん
07/09/02 00:27:02
さすがにバカ過ぎるだろ

489:486
07/09/02 00:30:15
すまん、脳内フィルターで485のループがイテレータに見えていた。
for (auto i = v.begin(); i != v.end(); ++i)

490:デフォルトの名無しさん
07/09/02 00:40:25
>>483-489
なるほど。さんくすです。

>> 484
やっぱりそうですよね。
安易に型決めるんじゃなくてちゃんと考えるべき何ですよね。

>> 485
感動しました。



491:デフォルトの名無しさん
07/09/02 01:34:22
何でイテレータ使わないの? >482
i++使う意味も判らん……

492:デフォルトの名無しさん
07/09/02 01:50:17
482じゃないが、iの値自体が処理に絡む場合はイテレータ使えんだろ

for (int i = 0; i < v.size(); i++) v[i] = i;

みたいな。

493:デフォルトの名無しさん
07/09/02 01:59:53
>>491
初心者だからだろ。
そのくらいわかれよ。

494:デフォルトの名無しさん
07/09/02 08:40:18
>>487
できるよ。

495:デフォルトの名無しさん
07/09/02 12:06:53
>>491
そうですね。イテレータでもいけそうですね。
今はサンプルプログラム打ちながら勉強してるんで
そこまでは思いつきませんでした。

>>492
ブロック内部でローカル変数作れば解決できそうですね。

またひとつ勉強になりました。
ありがとうございます。


496:デフォルトの名無しさん
07/09/02 13:35:18
>>495
そうそう、ループはイテレータで書くのが癖になると、内部でint idx = it - vec.begin()みたいなのを書くのも癖になる。

497:デフォルトの名無しさん
07/09/02 13:47:29
C++に限ったことではないですけど、Map型とList型って似て非なる物だといいますけど、いざって時にList→MapにしたりMap→Listにしたりする時は
どうすればよいのでしょう。効率的に考えて

498:デフォルトの名無しさん
07/09/02 13:50:09
どういう変換をしたいのかサパーリ
似て非なるっていうか、ListとMapは別物じゃ?

499:デフォルトの名無しさん
07/09/02 13:55:44
>>498
変換というか、Map型を継承しているクラスがList型で取り出せたりその逆も・・・出来る感じの事。
説明下手ですまそ。

500:デフォルトの名無しさん
07/09/02 13:57:46
std::map<a,b> を std::list< std::pair<a,b> >にコピーする話なら、
std::copy(map.begin(), map.end(), std::back_inserter( list ) )
でいけるんじゃね?効率なら知らん。

501:デフォルトの名無しさん
07/09/02 14:26:23
list.assign(map.begin(), map.end()) だろ。

502:デフォルトの名無しさん
07/09/02 14:42:28
>>499
っ アダプタパターン

503:デフォルトの名無しさん
07/09/03 01:48:49
クラステンプレートに関して質問させてください、
template <class T>
class hoger {
  public:
    typedef T hogeT;

    struct fuga {
    } m_fuga;
}

main()
{
  hoger<int> Hoge;
  hoger<型>::fuga &Fuga = Hoge.m_fuga;
}

みたいなことをやろうとしたんですが、hoger内の構造体とかを
(長くなってしまうので)ローカル変数で参照作って使いたいとき
hoger::fuga &ではなくhoger<型>::fuga &とする必要があると思うのですが
hoger<Hoge.hogeT>::fuga みたいに、Hogerオブジェクトからその型の情報は
得られないのでしょうか?
こういう情報(Hogeはintを指定して作成したということ)は外で持っておくしかないのでしょうか。
よろしくお願いします。

504:デフォルトの名無しさん
07/09/03 01:53:00
>>503
うん。
何回も書くようなら typedef しとく。

505:デフォルトの名無しさん
07/09/03 02:01:24
>>500-502
ありがとうございます。もう少し勉強してみます。

506:デフォルトの名無しさん
07/09/03 02:03:57
現状だとtemplateに逃げるしかないな。

507:503
07/09/03 13:52:09
遅レスですみません、回答ありがとうございました。
>>506
なるほど、やっぱそうするしかないのですね・・
とりあえずはHoge.m_fuga.foo
みたいに全部書いて指定することにしました。

こういうのってテンプレートの仕様上仕方の無いことなんですかねぇ。
ヘッダにしか書けないのもそうだけど、非テンプレートコードと比べて
可読性が下がるのは、テンプレートの勉強を始めた自分にとっては
しょんぼり来てしまう(´・ω・`)
ともあれどうもありがとうございました。

508:デフォルトの名無しさん
07/09/03 14:09:43
ここも将来的には auto で解決するところかな。

509:デフォルトの名無しさん
07/09/03 20:01:18
どうでもいいけどC++0x::autoって従来のCのautoと被らね?><<>

510:デフォルトの名無しさん
07/09/03 20:10:05
C++ソースとCソースが混在していてCソース側にautoがあった場合ってこと?
オブジェクト単位でコンパイル分ければいい
終わり

511:デフォルトの名無しさん
07/09/03 20:26:45
いまさら誰がautoなんて使ってるんだ?

512:デフォルトの名無しさん
07/09/03 20:33:24
俺だよワリオだよ

513:デフォルトの名無しさん
07/09/03 22:17:40
>>509
暗黙のintは廃止されたから、
現在のC++での「auto x;」はコンパイルエラー。
「auto int x;」と書かないといけない。

514:デフォルトの名無しさん
07/09/03 22:20:45
>509
C++ 的には(C99もそうなったけど)宣言時の int の省略が認められないから一意に解釈可能なはず。
C89 での auto i; と同じ意味を持たせるなら auto int i; と書く必要がある。

515:デフォルトの名無しさん
07/09/03 22:21:25
思いっきりかぶりましたとさ。

516:デフォルトの名無しさん
07/09/03 23:35:13
一つのキーワードに複数の意味なんてstaticで経験済みさ

517:デフォルトの名無しさん
07/09/04 04:09:37
今、VisualC++使ってます。
たとえば、123214332っていう数字があった場合、3桁区切りで123,214,332って表示しようと思ってる。
いい関数ない?やっぱ自作?,

518:デフォルトの名無しさん
07/09/04 04:13:24
>>517
マルチしないでさっさとイネ


519:デフォルトの名無しさん
07/09/04 04:26:42
>>517
setlocale

520:デフォルトの名無しさん
07/09/04 05:33:02
>>519
ありがとう。
調べてみる。

521:デフォルトの名無しさん
07/09/04 07:51:20
>>520
死ねカス

522:デフォルトの名無しさん
07/09/05 00:48:40
リリースモードでは問題なく動いてるようなんだけど
デバッグモードでアサーション?がでる。
別の似たコードでは問題ないんだけどなぁ・・・。
原因がわからん
眠い。
寝る

523:デフォルトの名無しさん
07/09/05 01:04:21
>>522
リリース時も同様に値がおかしいけど、エラーとして表示されてないだけってことはないよね。

524:デフォルトの名無しさん
07/09/05 02:36:54
>>522
失敗してるアサートの条件を満たさないことがあるってことだな。
デバッガで現場を押さえればおおかた原因がわかるだろ。

525:デフォルトの名無しさん
07/09/05 10:39:58
わっかたああああああああああああああああああああああ

526:デフォルトの名無しさん
07/09/05 11:00:35
vectorコンテナの要素を削除した後に
イテレータを取得し直さないで使おうとしたのがまずかったようだ。
うっかりやっちゃった。
リリースビルドではたまたま問題なかっただけってことかな。

527:デフォルトの名無しさん
07/09/05 15:00:58
コンパイルはできるのですが、実行時にvectorの部分で止まってしまいます。
ソースは以下になります。

istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start , end);

C++を勉強始めたばかりで初歩的な質問だと思いますが、お願いします。

528:デフォルトの名無しさん
07/09/05 15:19:45
標準入力から、ちゃんとEOFが出るまで読み込んでるのに止まるということ?

529:デフォルトの名無しさん
07/09/05 15:25:51
>>528
デバッガで動きを確認したところ、標準入力から、
ちゃんとEOFが出るまで読み込んでいます。
しかし、vectorを作成する部分で止まってしまって
いる状況です。

530:デフォルトの名無しさん
07/09/05 15:51:51
止まるってアプリが強制終了するって事か?

531:デフォルトの名無しさん
07/09/05 16:20:55
入力待ちなんだと思うけどな

532:デフォルトの名無しさん
07/09/05 20:33:36
>>530
vectorの実行するところでループしている感じです

>>531
入力のcinの部分は実行されていました

533:デフォルトの名無しさん
07/09/05 20:48:31
>>527
私の環境では動きましたよ。


534:デフォルトの名無しさん
07/09/05 22:48:50
たまにはexportを思い出してあげて下さい……。

535:デフォルトの名無しさん
07/09/05 22:57:19
C++0xスレにお越し下さい

536:デフォルトの名無しさん
07/09/06 12:02:54
>>533
#include<iostream>
#include<istream>
#include<string>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;

int main(){
cout << "Enter the seres of string::";
istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start,end);





こんなプログラムですが、やはり途中vectorの後にプログラムが進みません
コンパイラはg++-4.1を使っています。

わかる方宜しくお願いします

537:デフォルトの名無しさん
07/09/06 12:12:44
>>536
>>531

538:デフォルトの名無しさん
07/09/06 12:19:41
WindowsならCtrl+Z、UnixならCtrl+Dだっけ。
C++と全く関係ない話だ。

539:デフォルトの名無しさん
07/09/06 12:47:03
進まないとか止まるってのはどういう状態のことを言ってるんだ?
こっちで再現できるだけのソースを貼るんじゃなかったら
その辺キッチリ書けよ

540:デフォルトの名無しさん
07/09/06 18:03:38
>>537-539
ありがとうございました。
何とか解決しました

541:デフォルトの名無しさん
07/09/06 18:14:10
何がどう解決したのかも書かない。
これでは何の肥やしにもならない。
糞以下だね。

542:デフォルトの名無しさん
07/09/06 18:22:47
>>541
すみません。
しかし色々いじっているうちに解決してしまったので、何がどうと言われても答えようがないのです。

543:デフォルトの名無しさん
07/09/06 18:35:01
>>541
まぁまぁ、こういう奴はプログラミング向いてないから
いずれ挫折するなり淘汰されるなりしてこの分野から消えてくれるさ。

544:デフォルトの名無しさん
07/09/06 18:47:54
と自分へメッセージ

545:デフォルトの名無しさん
07/09/06 19:32:13
>>542=544
プログラマとしても人間としても糞以下だね

546:デフォルトの名無しさん
07/09/06 20:11:09
と糞未満のものが申しております

547:デフォルトの名無しさん
07/09/06 20:37:28
真性だな可哀想に

548:デフォルトの名無しさん
07/09/06 20:58:04
ビクンビクン・・・!!

549:デフォルトの名無しさん
07/09/09 23:45:03
>>540>>542
>色々いじっているうちに解決
いじる前後の違いを説明できないと言うのは理解できていないということ。
解決できていない可能性が高い。たまたま動いているだけのソースを直すのが...

550:デフォルトの名無しさん
07/09/09 23:47:30
>>545
あと、自演乙

551:デフォルトの名無しさん
07/09/10 00:19:22
「vectorの部分で止まってしまいます」
これがダウトだったんだろうな

552:デフォルトの名無しさん
07/09/10 00:58:09
メンバ関数ポインタから整数型へのキャストができた試しはないけど、
どうもそれを禁止している条項が規格を洗っても見つからない。
誰か、どこにあるか知ってる人いますか?

553:デフォルトの名無しさん
07/09/10 01:10:26
肯定的な形でreinterpret_castの

554:デフォルトの名無しさん
07/09/10 01:55:41
ポインタは同じサイズの整数型へとキャストできるけど、結果は処理系依存、ってやつのことですよね?
処理系依存だから禁止するのも処理系次第、ってことでいいんですかね。

555:デフォルトの名無しさん
07/09/10 02:02:42
僕の肛門からも悪魔が出そうです><

556:デフォルトの名無しさん
07/09/10 02:03:29
ポインタを同じサイズの整数型にキャストしたときは、それを元のポインタに戻せるはずじゃ?

A pointer converted to an integer of sufficient size (if any such exists on the implementation)
and back to the same pointer type will have its original value;
mappings between pointers and integers are otherwise implementation-defined.

557:デフォルトの名無しさん
07/09/10 02:04:32
いや、そもそもキャスト自体がコンパイル通らない。
VC++ でも g++ でも。

558:デフォルトの名無しさん
07/09/10 02:08:24
もちろん、普通のポインタならキャストは通る。
でも、メンバポインタだと通らない。
警告じゃなくて、エラーになる。

559:デフォルトの名無しさん
07/09/10 02:16:34
メンバポインタは

560:デフォルトの名無しさん
07/09/10 02:20:11
>>558
だったらメンバ関数のキャストの仕方間違ってるだけだろ

561:デフォルトの名無しさん
07/09/10 02:21:32
boostとかで、
namespace xxx_detail{ ふがふが }
ってのを見掛けるんですが、
これは何か意味あるんですか?
ADLの効果抑止とか?

無名namespace( namespace { げふげふ } )とかじゃダメなの?

562:デフォルトの名無しさん
07/09/10 02:26:30
(C++というプライドに賭けた)保守性を考慮した結果。
彼らがあくまでC++プログラマという事を忘れてはいけない。

563:デフォルトの名無しさん
07/09/10 03:40:05
>>561
ヘッダで宣言するコンポーネントに無名 namespace の名前を使ったら、
コンパイル単位ごとに個別の宣言になっちゃうから、 ODR 違反になるだろ。

564:デフォルトの名無しさん
07/09/10 07:42:42
>>552
5.2.10 p4 の以下の記述がメンバへのポインタから整数型への変換を許しているように読める。
"A pointer can be explicitly converted to any integral type large enough to hold it."

でも 3.9.2 p3 に以下の記述がある。
"Except for pointers to static members, text referring to “pointers” does not apply to pointers to members."

"A pointer" も同様に、メンバへのポインタは含まないってことじゃない?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5386日前に更新/205 KB
担当:undef