1 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:26:08 ] エスケープシーケンスやWin32APIなどの環境依存な物でもOK。 ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.40【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1184717430/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
448 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 01:13:18 ] >>446 特定の型には決まっていない。整数ならいい。 負の数になったら未定義動作。 int と long は違う型です。
449 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 01:30:05 ] music8.2ch.net/test/read.cgi/musicjf/1187412818/72 おもしろいIDでた
450 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 01:32:34 ] わざわざ他板のを持ってこなくてもいいんだよ
451 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 01:34:41 ] >>448 ,446 >特定の型には決まっていない。整数ならいい。 C++の言語仕様の詳細は知らないけど、VCならsize_tでいいんじゃね msdn2.microsoft.com/en-us/library/t48aek43 (VS.80).aspx msdn2.microsoft.com/en-us/library/ms859258.aspx >int と long は違う型です。 これもVC(x86)の範囲内で同じようにつかえるかって質問なら、問題ないと思うけど msdn2.microsoft.com/en-us/library/ms859270.aspx
452 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 01:36:23 ] >>450 この板ID無いが。
453 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 01:57:33 ] >>451 operator new 関数の第1引数は VC に限らず size_t 。 でもそれと new 式の配列要素数を表す式の型とは別。 サイズが同じだろうがなんだろうが int と long は違う型。 まったく同じ型として扱うのには問題がある。
454 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 03:13:14 ] >>453 ごめん、1点分からないので、教えていただきたい。 とりあえず、>>446 はVCの利用上(実装上)の制限が知りたいんじゃないの、 と思ったので、その観点だけで書いたのは自分の思い込みで、それで意見が すれ違うのは仕方ないんだけど、 >特定の型には決まっていない。整数ならいい。 >でもそれと new 式の配列要素数を表す式の型とは別。 の箇所。 そうはいっても、ソースをコンパイルしてバイナリに落とす以上、コンパイラ定義かも しれないけど、具体的な値の有効範囲ってかならずあるんじゃないの? 実際、MSDNの配列定義のサイズ指定の箇所では 0以上の整数型、ただしMicrosoft仕様では... としてsize_tに言及してるわけだし。 それにoperator new 関数の第1引数がsize_tに決まってるなら、size_t以上の値を 記述して受け入れてくれるコンパイラがありそうにないので、 その意味でも「整数ならいい」ってのはあいまいな感じがする。 なので、「整数ならいい」ってのは純粋に言語仕様の話として語っているのか、 それとも、コンパイラの実装やソース記述上の制限を語る場合でも同じ回答 になるのか、気になって眠れなくなりそうなんで、正確なところが知りたいんだけど。
455 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 03:20:37 ] ________ / | /__ | / /. |-―‐. / \ / | / ./ | ノ ヽ__」 | .―┼‐フ |/ /|/ ̄ ̄ ̄\ //| | | | | (二X
456 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 03:39:56 ] >>454 現行の規格ではだいたい >>453 みたいなことしか言えない。ある意味 これが正確なところ。 new とは別に、各処理系が定めるべきいろいろな数値の上限の中に 「オブジェクトのサイズ」というのがある。配列オブジェクトもこの制限を うけるので、値の範囲はこれに基づくとも言える。これについて規格が 最低限のガイドラインとして提示しているのは 262144 。 まだ規格化はされてないけどこんな話もある。 www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#624
457 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 04:45:36 ] ありがとう、これで寝られる。 仕様自身は結局釈然としない部分があるけど、 >>448 ,453の回答が正確で誠実な回答というのは理解できた。 リンク先は策定中の次期規格? また、膨大な項目が... 現状でさえ、もうついていけないくらいややこしいのに。
458 名前:デフォルトの名無しさん [2007/08/19(日) 12:35:03 ] #include "DxLib.h" int WINAPI Winmain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) } ChangeWindowMode(TRUE); if(DxLib_Init()==-1)return(-1); DrawBox(0, 0, 120, 65535, TRUE); WaitKey(); DxLib_End(); return(0); } というプログラム書くとエラー出るのはなぜでしょうか?ちなみに 14さいからはじめるリアルに動くゲーム物理プログラミング教室C言語編 という本に載ってます。
459 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 12:38:39 ] エラーの内容かけ。
460 名前:458 [2007/08/19(日) 12:40:14 ] エラー E2141 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 宣言の構文エラー エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 不要な } エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 不要な } エラー E2303 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 型名が必要 エラー E2356 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 'ChangeWindowMode(int)' の再宣言で型が一致していない エラー E2344 C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib\DxLib.h 1017: 一つ前の 'ChangeWindowMode(int)' の定義位置 エラー E2063 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 不正な初期化 エラー E2293 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: ) が必要 エラー E2040 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 6: 宣言が正しく終了していない エラー E2303 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 型名が必要 エラー E2356 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 'DrawBox(int,int,int,int,int,int)' の再宣言で型が一致していない エラー E2344 C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib\DxLib.h 1519: 一つ前の 'DrawBox(int,int,int,int,int,int)' の定義位置 エラー E2063 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 不正な初期化 エラー E2293 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: ) が必要 エラー E2040 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 11: 宣言が正しく終了していない エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 12: 不要な } *** 16 errors in Compile *** ** error 1 ** deleting Debug\dxtest.obj です。 ちなみに今日勉強したばかりでさぱりとわかりません
461 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 12:41:46 ] 勉強してないからエラーが出る
462 名前:デフォルトの名無しさん [2007/08/19(日) 12:42:05 ] どんなエラーがでてるの?
463 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 12:42:21 ] 最初に4行目にエラーが出ているだろう。 4行目を穴があくまでじっくり見ろ、その教科書とひたすら比較しろ。 それでわからなかったらもっかいおいで。
464 名前:デフォルトの名無しさん [2007/08/19(日) 12:45:46 ] 彼はエラーの見方がわからないと思う
465 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 12:46:33 ] #include "DxLib.h" int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) { ChangeWindowMode(TRUE); if(DxLib_Init()==-1)return(-1); DrawBox(0, 0, 0, 120, 65535, TRUE); WaitKey(); DxLib_End(); return(0); }
466 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 12:49:38 ] ChangeWindowMode(1); こっちのがいいかも分からんね
467 名前:458 [2007/08/19(日) 13:11:31 ] >>465 のように書いてみましたが まだ Fatal: ファイル VORBISFILE_STATIC.LIB が開けません と出ます。 >>464 まったくおっしゃるとおりです
468 名前:デフォルトの名無しさん [2007/08/19(日) 13:59:36 ] >>467 エラーの通りvorbisfile_static.libってファイルが見つからないんだろ。 あとは環境が分からないと何も言えないと思う。 自分の開発環境を検索ワードに入れて、 (「vorbisfile_static.lib VC++」とか「vorbisfile_static.lib BCC」とか) その辺でググって見たらどうよ?
469 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 15:14:22 ] というか似たような質問を、DxLibのサイトで何度も見た気がするんだ。
470 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 15:55:17 ] vorbisfile_static.libはDxLibのアーカイブに同梱されてるから それをソースと同じディレクトリにコピー というか「このフォルダのファイルを全てコピー」みたいなフォルダなかったか?
471 名前:230 [2007/08/19(日) 23:24:29 ] GNU Compiler Collectionのg++コンパイラで -std=c++98というコンパイラオプションというのがあるらしいのですが ぐぐってもよく分かりませんでした。 誰か教えてください。
472 名前:471 [2007/08/19(日) 23:25:32 ] 230というのははミスです。すみません(汗
473 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 23:42:30 ] コンパイラマニュアルとかないの?
474 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 23:48:12 ] >>471 gcc.gnu.org/onlinedocs/
475 名前:471 [2007/08/19(日) 23:49:45 ] どもです。探し見てみます。
476 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 23:51:50 ] もう見てないかな まるちか?2ちゃんではマルチポストは叩かれるですよ せめて、主とする、質問したスレを付記 機嫌が良ければ、そこにヒント書きますから
477 名前:デフォルトの名無しさん [2007/08/19(日) 23:56:08 ] 今更VC++6.0のMFCなんですけれど、 ツリーコントロールのアイテムの文字列が長いときに 横スクロールにせず、文字列を折り返すことってできますでしょうか?
478 名前:デフォルトの名無しさん [2007/08/20(月) 01:12:13 ] curses(ncurses)のプログラミングを euc-jp 環境で行って来たのですが、 訳あって utf-8 環境で行うことになりました。 euc-jp 環境で作ったファイルを utf-8 環境に持ってきて、 iconvで文字コードを変更し、コンパイル、実行すると、出力(日本語)が文字化けてしまいます。 utf-8 環境に持ってきた euc-jp のファイルを、 文字コードをそのままにして、端末の表示文字コードを utf-8 から euc-jp に変更した上で、コンパイル、実行すると、正しく表示されます。 これななぜでしょうか? curses が utf-8に対応していないとかってありますか?
479 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 01:14:08 ] >>478 ソース文字セットと実行文字セットは別。 gcc のオプション -finput-charset と -fexec-charset を参照すべし。
480 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 01:15:56 ] >>478 curses 関係あるのか? puts("あいうえお") とかで試せばわかると思うけど。
481 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 01:20:45 ] 先ずは問題の切り分けだね。 >480の言うように標準出力に出力してみてその時点で文字化けしているならgccのオプションなどを調節。 その上でcurses使うと化けるのなら、cursesの設定か何か、その辺りの調査。
482 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 01:36:08 ] operator=で返す自分の参照は、constつけるべきですか?
483 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 01:42:23 ] >>482 いいえ。
484 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 01:48:55 ] 寧ろつけてはいけません。
485 名前:デフォルトの名無しさん [2007/08/20(月) 02:10:18 ] >>447 どうもです XSIではコマンドを実行する際にエディタのIDのような物が必要で、 エディタウィンドウを複数開いている時には、コマンド実行前に その時アクティブなウィンドウのIDを取得する必要があります。 WM_ACTIVATEとかを使えば良いのでしょうか?
486 名前:デフォルトの名無しさん [2007/08/20(月) 02:24:33 ] 動画とかをエンコードするデコーダって色々ありますよね。 あれ使えるソフト作るのって大変なんでしょうか? AVIutlみたいなソフトって個人では簡単に作れないんですかね? どの辺勉強したらいいんでしょうか?
487 名前:デフォルトの名無しさん [2007/08/20(月) 02:27:35 ] >>478 です。 >>479 ,480,481 さんを参考にして少しいじってみました。 まず、480さんの言うように、単純に puts("あいうえお") を行うプログラムを書き実行してみました。 すると、”-finput-charset=utf-8 -fexec-charset=utf-8”が有る無しに関わらず、文字化けしませんでした。 次に、cursesのコンパイルを、”-finput-charset=utf-8 -fexec-charset=utf-8”を付けて実行してみたところ、やはり文字化けが発生しました。
488 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 02:43:20 ] 単にcursesがutf-8に対応して無いんじゃないの? utf-8だと端末上での漢字の幅がバイト長と単純に一致しなくなるし naiveな実装だと色々問題起きそう
489 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 03:30:44 ] VC++2005で<cstdio>等をインクルードすると、 std::printf はもちろん、名前空間のない ::printf も使えてしまいます。 BCB2006だと逆に、<stdio.h>をインクルードすると ::printf を使えますが、 std::printf も使えます。 どちらが正しいのでしょうか。また、正しくない方を正しくする方法はありますか?
490 名前:デフォルトの名無しさん [2007/08/20(月) 04:18:35 ] >>478 です。 www.hakodate-ct.ac.jp/~tokai/tokai/gtkmm/etc/p3.htm というサイトがあったので、 ・-lncurses ではなくて -lncursesw をリンクする ・#include <locale.h> ・setlocale( LC_ALL, "" ); を取り入れたところとりあえず、euc-jp 環境のファイルを utf-8 環境に持ってきて、 このファイルの文字コードを utf-8 に変えてコンパイルし実行すると、 文字化けしない ・・・というのは達成できました。 しかし、私は UNIX(LINUX) にあるような SLコマンド のクマAA バージョンを作って遊んでいたのですが、 euc-jp環境とutf-8環境では少し動きが変わってしまいました。 その動きの変わってしまう場所が、euc-jp環境で苦労して改良したところなので、 かなりショックです。 まぁ、なんとか解決策があればいいのですが、 私の知識ではちょっとつらいかも知れません。
491 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 07:47:38 ] for(;;) ; こんなのあるのね びっくり
492 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 09:25:05 ] 無限ループの常套手段
493 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 09:27:33 ] 俺はwhile(1)派
494 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 09:31:18 ] 自分も無限ループはwhile派かな カウンタが要るときはfor使うかもしらんけど
495 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 09:46:09 ] >>489 <cstdio> で std::printf が、 <stdio.h> で ::printf が使えるようになることになっている。 1つのヘッダで両方が使えるようになることは保証されない。
496 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:43:51 ] std::bad_allocを捕まえたりいろいろ例外処理を書いているのですが、 メモリ4GBもあるので、デバッグ中にbad_allocが投げられることは今まで一度もありません。 投げられた際の動作をデバッグしたいのですが、そういうときはどうすればいいでしょうか。 敢えてメモリを消費したりするんですか? ↑ではbad_allocのことですが、他にもWindowsのAPI関数が失敗したときとかも、 ちゃんと自分が書いた処理が動作するか確かめたいんですが。
497 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 19:07:29 ] throw std::bad_alloc();
498 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 19:37:17 ] >>496 適当にラップして失敗に相当する結果を返せばいいべ
499 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 20:47:05 ] 起動時に malloc(100000000) とか適当にやっとけば足りなくなるんじゃない?
500 名前:デフォルトの名無しさん [2007/08/20(月) 21:09:14 ] 例えば、"a"とか"あ"の文字コードを出力する方法ってありますか?
501 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 21:11:15 ] printf( "%d", 'a' );
502 名前:デフォルトの名無しさん [2007/08/20(月) 21:30:04 ] >>501 ありがとうございます。 このページ ash.jp/code/unitbl21.htm の、UTF-8の欄のような値を出力する方法ってありますか?
503 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 22:23:30 ] %Xでの表示をぐるぐるまわせばおわりだろうに。
504 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 22:26:44 ] >495 www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456 によると、 > Including the header <cxxx> declares a C name in namespace std. > Including the header <xxx.h> declares a C name in namespace std (effectively by including > <cxxx>), then imports it into the global namespace with an individual using declaration. ということで、xxx.h だと std とグローバル両方で宣言されるというのが規格の意図らしい。 なので、BCB2006 の挙動は(それだけ見ると)規格に合致している。 が、現実的には > If you want to assuredly declare a C name in the global namespace, include <xxx.h>. > You may or may not also get the declaration in namespace std. > If you want to assuredly declare a C name in namespace std, include <cxxx>. > You may or may not also get the declaration in the global namespace. ということで、>495 が妥当な仮定。 規格もこの現状を追認する形での修正が提案されている。 >502 自分がやりたいと思っていることをもうちょい正確に表現して欲しい。 文字が表示されて欲しいのか、文字コードが表示されて欲しいのかどっち? 入力として考えているのはどんなデータ?外部から与えられる文字列か、文字列リテラルか。文字コードは?
505 名前:504 mailto:sage [2007/08/20(月) 22:28:32 ] 最初のアンカーは >489 につけるべきだった。
506 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 02:01:29 ] 別人ですが >>499 バグでそんな値(もっとでかい、0x40000000とか)を与えたことがあるけど、 無理に仮想記憶拡大して確保しようとして、システムが実質操作不能になるだけだった
507 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 02:33:09 ] Windowsって1プロセスが使用できるメモリ空間のサイズって指定出来ないの? Win2000の頃は2G制限とかあった記憶があるけど、今はどうなんだろ。
508 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 03:06:41 ] >>507 以下は単なる思いつき。 1. プログラムの改造が可能なら、自分用の一定量しか領域確保できないメモリマネージャを作る。 2. メモリ取得APIをフックして自力で制限する。 3. SetProcessWorkingSetSizeを指定して、同時にスワップを小さくする。
509 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 05:28:56 ] たった1000行のソースも完全に把握できねぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇ もうだめだぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ
510 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 05:38:16 ] やっと気付いたか。 さっさと人生やり直せ。
511 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 08:15:52 ] >>509 1関数1000行なら窓から投げ捨てろ
512 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 08:40:46 ] 10万行超えると見る気すら失せる
513 名前:デフォルトの名無しさん [2007/08/21(火) 09:28:25 ] float hoge = new float[100]; foo->CopyArray(hoge); Cfoo:Cfoo() { float m_array = new float[100]; } void Cfoo:CopyArray( float arg[]) { arg = m_array; } 配列のコピーをしたいとき、 上のように配列の名前(=先頭のポインタ?) だけコピーするだけではダメなようなのですが、なぜですか? for(int i=0;i<100;i++) arg[i]=m_array[i]; } のように中身を一つずつきちんとコピーしないとダメなんでしょうか?
514 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 09:37:17 ] arg = m_arrayだとコピーじゃなくて同じ配列に別名を付けてるだけになる
515 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 09:43:12 ] ::memcpy(arg, m_array, sizeof(float) * 100));
516 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 09:47:54 ] std::copy(&m_array[0], &m_array[100], &arg[0]);
517 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 11:12:35 ] >>513 >float hoge = new float[100]; コンパイルできるコードを提示しなさい。 >arg = m_array; それは、仮引き数にメンバ変数の値を代入しているだけなので、仮引き数の寿命とともに無に帰します。
518 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 11:13:18 ] >>515 そんなコードを書く香具師は野垂れ死に値すると思います。
519 名前:513 [2007/08/21(火) 11:55:54 ] 皆さんいろいろありがとうございます。 >>517 >コンパイルできるコードを提示しなさい。 float* hoge = new float[100]; でした。 >それは、仮引き数にメンバ変数の値を代入しているだけなので、仮引き数の寿命とともに無に帰します。 というわけで、分かっておられると思いますが渡してるのはポインタでして 寿命は関係あるんですかね? >>514 これもちょっと理屈が分かりません。 なぜ配列に別名をつけてることになるんですか? 配列の名前って先頭のポインタをさしてるんじゃなかったでしょうか? >>518 一行で済むのでforで要素を一つずつコピーするよりは>>515 >>516 はいいかなと思ったんですが、 どうして>>515 はダメなんですか?
520 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 12:04:44 ] >>519 >寿命は関係あるんですかね? その仮引き数の寿命は、その関数を抜けるまでです。 ポインタがポイントしている先のことは言及していませんね。 もう少し、ポインタ変数と言うものを理解しておいた方が良さそうです。 >なぜ配列に別名をつけてることになるんですか? ポインタ変数にポインタ変数の値を代入するだけでは、 ポイント先の複写は行なわれません。 もう少し、ポインタ変数(ry >どうして>>515 はダメなんですか? どうしてダメじゃないと思うんですか?
521 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 12:06:18 ] >>519 > どうして>>515 はダメなんですか? float配列ならば動くけど、一般のオブジェクトの配列なら破滅的。 たとえば、string配列をmemcpyしたらどうなると思う?
522 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 12:17:40 ] float で大丈夫ならダメとは言えないだろ。もっといい方法があるってだけで。
523 名前:デフォルトの名無しさん [2007/08/21(火) 12:24:46 ] >>520 >ポインタ変数にポインタ変数の値を代入するだけでは、 >ポイント先の複写は行なわれません。 いま気づきました。狂ってました。すいません。 要するに考え方として 「呼ぶ側で作った配列を渡してm_arrayの中身をコピーして貰ってくる」んじゃなくて 「ポインタを渡してm_arrayの先頭のアドレスだけ貰ってくる」っていうような 感じの書き方はできないんですかね? 呼ぶ側で、m_arrayの先頭のアドレスとサイズだけ分かれば 中身にアクセスできそうに思うのですが。 例えば、クラスメンバで持っているprivateな普通のオブジェクトインスタンスのポインタなんかの場合は わざわざ中身をコピーしないでアドレスだけGet〜とかで貰って使ったりするじゃないですか? >どうしてダメじゃないと思うんですか? 試したらとりあえずうまくいったんで・・・ >>521 わかりません。floatでは一応動きましたが、なんでダメなんでしょうか。 サイズ指定した範囲をコピーすればうまく動くと思うのですが。
524 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 12:29:27 ] >>523 > 「ポインタを渡してm_arrayの先頭のアドレスだけ貰ってくる」っていうような > 感じの書き方はできないんですかね? なんでできないと思うの?
525 名前:デフォルトの名無しさん [2007/08/21(火) 12:31:36 ] >>524 書き方が分からないんで そういう書き方が出来るなら教えてください、 ってことなんですが。
526 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 12:34:01 ] やっぱりポインタ変数とポイント先の関係がわかっていないような……
527 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 12:35:28 ] floatやint、char[]ならmemcpyしても問題ないが、下みたいなクラスだと問題が出てくる class hoge { char *str; int length; }; main() { hoge* v1, v2; v1 = new hoge; v1->str = new char[100]; memcpy(v2, v1, sizeof(hoge)); strcpy(v1->str, "v1"); strcpy(v2->str, "v2"); printf("v1.str is %s.\nv2.str is %s", v1->str, v2->str); }
528 名前:デフォルトの名無しさん [2007/08/21(火) 12:41:40 ] >呼ぶ側で、m_arrayの先頭のアドレスとサイズだけ分かれば >中身にアクセスできそうに思うのですが。 思いついて下のようにやったらうまくいったようなのですが、 これってなんか危険だったりしますか? float* hoge = new float[100]; hoge = foo->GetArray(); Cfoo:Cfoo() { float m_array = new float[100]; } float* Cfoo:GetArray(){return m_array;}
529 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 12:47:45 ] >>528 最初のnew float[100]で確保したメモリはどうやって解放するんだい?
530 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 12:52:23 ] >>528 配列のコピーをしたいんじゃなかったのか?
531 名前:デフォルトの名無しさん [2007/08/21(火) 12:58:48 ] >>527 理解にしばらく時間を要します。 脳のクロックが著しく劣っているのですいません。 >>529 これでもうまくいったっぽいですが、これならOKですか? float* hoge; hoge = foo->GetArray(); Cfoo:Cfoo() { m_array = new float[100]; } float* Cfoo:GetArray(){return m_array;} >>530 すいません、コピーというか、m_arrayの中身を どうにかして呼ぶ側で使えれば何でも良かったのですが。
532 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 13:00:55 ] floatの計算速度ってdoubleよりも遅いんですか?
533 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 13:02:09 ] >>528 巧くいってない巧くいってない。 >>531 だから、なんでコードの断片載せるんだって。 で、なんでまたfooはポインタなんだ?
534 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 13:03:27 ] >>532 足し算などは同じ。超越関数などは速い可能性が高い。 しかし、他の方への変換が入ったりすると遅くなることもある。 結論:一概には言えない。
535 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 13:06:07 ] もうスマートポインタコンテナとかRange conceptとか使う方がいいよ
536 名前:513 [2007/08/21(火) 13:14:09 ] つまりはどうしたらいいのでしょうか?もうわけ分かりません。 やりたいことはCfooのメンバとしてもってるfloatの配列m_arrayの中身を コピーするなりポインタを貰うなり、どういう方法があるのか分かりませんが 正しい方法で使いたいってことなんですが。 元の中身を書き換える必要はありません。知れればいいです。 で、とりあえず531で動いてますが、これは危険でしょうか。 要素数は別個貰うなりすれば分かるので その範囲内だけアクセスするなら大丈夫そうなんですが、ダメですか。
537 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 13:16:58 ] >>536 特に問題はないんじゃないの
538 名前:デフォルトの名無しさん [2007/08/21(火) 13:28:14 ] >>537 そうですか。ではひとまずこれでやっときます。 どうもお騒がせしました。
539 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 13:36:29 ] 書き換えないなら戻り値はfloat *ではなくconst float *にするべきだな。 それ以前に、Cfooを何故ポインタにしているかを知りたいんだが。
540 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 13:52:24 ] floatならSSEで高速化しやすい
541 名前:513 [2007/08/21(火) 13:53:03 ] >>539 >書き換えないなら戻り値はfloat *ではなくconst float *にするべきだな。 なるほど。 >Cfooを何故ポインタにしているかを知りたいんだが。 特に理由はないですが、 newしたCfooのポインタをメンバとして持ってるだけです。 ポインタで持ってるほうがいろいろ別のクラスに連れまわしたりするとき便利かなと。 むしろなぜそこが気になるのか知りたいんですが。
542 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 14:03:17 ] >>541 >むしろなぜそこが気になるのか知りたいんですが。 半ば個人的な興味だ。無条件にnewしたがるJava出身者が身近にいるもんでね。 # しかも、悪いことにdeleteする癖はついてないと来たもんだw
543 名前:513 [2007/08/21(火) 14:06:22 ] >>542 はい、まさに私のことです。
544 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 14:10:56 ] W
545 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 14:16:01 ] >>542 BCB使いもnewする癖が‥‥
546 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 15:40:21 ] OOっぽく書こうとするとそうなるんじゃないかな C++的にはスマートポインタを使え、ということになるんだが いずれにせよ常にownershipを意識している必要はあるね
547 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 16:02:26 ] ローカルなオブジェクトまでnewを使い始めたらもう、末期症状だ。 # オブジェクトは全てグローバルに管理されているとしたら、それはそれで難だけど。
548 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 16:03:31 ] >>545 VCL使ってると確かにnew癖つくなw