07/08/19 03:13:14
>>453
ごめん、1点分からないので、教えていただきたい。
とりあえず、>>446はVCの利用上(実装上)の制限が知りたいんじゃないの、
と思ったので、その観点だけで書いたのは自分の思い込みで、それで意見が
すれ違うのは仕方ないんだけど、
>特定の型には決まっていない。整数ならいい。
>でもそれと new 式の配列要素数を表す式の型とは別。
の箇所。
そうはいっても、ソースをコンパイルしてバイナリに落とす以上、コンパイラ定義かも
しれないけど、具体的な値の有効範囲ってかならずあるんじゃないの?
実際、MSDNの配列定義のサイズ指定の箇所では
0以上の整数型、ただしMicrosoft仕様では... としてsize_tに言及してるわけだし。
それにoperator new 関数の第1引数がsize_tに決まってるなら、size_t以上の値を
記述して受け入れてくれるコンパイラがありそうにないので、
その意味でも「整数ならいい」ってのはあいまいな感じがする。
なので、「整数ならいい」ってのは純粋に言語仕様の話として語っているのか、
それとも、コンパイラの実装やソース記述上の制限を語る場合でも同じ回答
になるのか、気になって眠れなくなりそうなんで、正確なところが知りたいんだけど。
455:デフォルトの名無しさん
07/08/19 03:20:37
________
/ |
/__ |
/ /. |-―‐.
/ \ / |
/ ./ |
ノ ヽ__」
|
.―┼‐フ
|/
/|/ ̄ ̄ ̄\
//| |
| |
| (二X
456:デフォルトの名無しさん
07/08/19 03:39:56
>>454
現行の規格ではだいたい >>453 みたいなことしか言えない。ある意味
これが正確なところ。
new とは別に、各処理系が定めるべきいろいろな数値の上限の中に
「オブジェクトのサイズ」というのがある。配列オブジェクトもこの制限を
うけるので、値の範囲はこれに基づくとも言える。これについて規格が
最低限のガイドラインとして提示しているのは 262144 。
まだ規格化はされてないけどこんな話もある。
URLリンク(www.open-std.org)
457:デフォルトの名無しさん
07/08/19 04:45:36
ありがとう、これで寝られる。
仕様自身は結局釈然としない部分があるけど、
>>448,453の回答が正確で誠実な回答というのは理解できた。
リンク先は策定中の次期規格?
また、膨大な項目が...
現状でさえ、もうついていけないくらいややこしいのに。
458:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/19 12:38:39
エラーの内容かけ。
460:458
07/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:デフォルトの名無しさん
07/08/19 12:41:46
勉強してないからエラーが出る
462:デフォルトの名無しさん
07/08/19 12:42:05
どんなエラーがでてるの?
463:デフォルトの名無しさん
07/08/19 12:42:21
最初に4行目にエラーが出ているだろう。
4行目を穴があくまでじっくり見ろ、その教科書とひたすら比較しろ。
それでわからなかったらもっかいおいで。
464:デフォルトの名無しさん
07/08/19 12:45:46
彼はエラーの見方がわからないと思う
465:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/19 12:49:38
ChangeWindowMode(1);
こっちのがいいかも分からんね
467:458
07/08/19 13:11:31
>>465のように書いてみましたが
まだ
Fatal: ファイル VORBISFILE_STATIC.LIB が開けません
と出ます。
>>464
まったくおっしゃるとおりです
468:デフォルトの名無しさん
07/08/19 13:59:36
>>467
エラーの通りvorbisfile_static.libってファイルが見つからないんだろ。
あとは環境が分からないと何も言えないと思う。
自分の開発環境を検索ワードに入れて、
(「vorbisfile_static.lib VC++」とか「vorbisfile_static.lib BCC」とか)
その辺でググって見たらどうよ?
469:デフォルトの名無しさん
07/08/19 15:14:22
というか似たような質問を、DxLibのサイトで何度も見た気がするんだ。
470:デフォルトの名無しさん
07/08/19 15:55:17
vorbisfile_static.libはDxLibのアーカイブに同梱されてるから
それをソースと同じディレクトリにコピー
というか「このフォルダのファイルを全てコピー」みたいなフォルダなかったか?
471:230
07/08/19 23:24:29
GNU Compiler Collectionのg++コンパイラで
-std=c++98というコンパイラオプションというのがあるらしいのですが
ぐぐってもよく分かりませんでした。
誰か教えてください。
472:471
07/08/19 23:25:32
230というのははミスです。すみません(汗
473:デフォルトの名無しさん
07/08/19 23:42:30
コンパイラマニュアルとかないの?
474:デフォルトの名無しさん
07/08/19 23:48:12
>>471 URLリンク(gcc.gnu.org)
475:471
07/08/19 23:49:45
どもです。探し見てみます。
476:デフォルトの名無しさん
07/08/19 23:51:50
もう見てないかな
まるちか?2ちゃんではマルチポストは叩かれるですよ
せめて、主とする、質問したスレを付記
機嫌が良ければ、そこにヒント書きますから
477:デフォルトの名無しさん
07/08/19 23:56:08
今更VC++6.0のMFCなんですけれど、
ツリーコントロールのアイテムの文字列が長いときに
横スクロールにせず、文字列を折り返すことってできますでしょうか?
478:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/20 01:14:08
>>478
ソース文字セットと実行文字セットは別。
gcc のオプション -finput-charset と -fexec-charset を参照すべし。
480:デフォルトの名無しさん
07/08/20 01:15:56
>>478
curses 関係あるのか?
puts("あいうえお") とかで試せばわかると思うけど。
481:デフォルトの名無しさん
07/08/20 01:20:45
先ずは問題の切り分けだね。
>480の言うように標準出力に出力してみてその時点で文字化けしているならgccのオプションなどを調節。
その上でcurses使うと化けるのなら、cursesの設定か何か、その辺りの調査。
482:デフォルトの名無しさん
07/08/20 01:36:08
operator=で返す自分の参照は、constつけるべきですか?
483:デフォルトの名無しさん
07/08/20 01:42:23
>>482 いいえ。
484:デフォルトの名無しさん
07/08/20 01:48:55
寧ろつけてはいけません。
485:デフォルトの名無しさん
07/08/20 02:10:18
>>447
どうもです
XSIではコマンドを実行する際にエディタのIDのような物が必要で、
エディタウィンドウを複数開いている時には、コマンド実行前に
その時アクティブなウィンドウのIDを取得する必要があります。
WM_ACTIVATEとかを使えば良いのでしょうか?
486:デフォルトの名無しさん
07/08/20 02:24:33
動画とかをエンコードするデコーダって色々ありますよね。
あれ使えるソフト作るのって大変なんでしょうか?
AVIutlみたいなソフトって個人では簡単に作れないんですかね?
どの辺勉強したらいいんでしょうか?
487:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/20 02:43:20
単にcursesがutf-8に対応して無いんじゃないの?
utf-8だと端末上での漢字の幅がバイト長と単純に一致しなくなるし
naiveな実装だと色々問題起きそう
489:デフォルトの名無しさん
07/08/20 03:30:44
VC++2005で<cstdio>等をインクルードすると、
std::printf はもちろん、名前空間のない ::printf も使えてしまいます。
BCB2006だと逆に、<stdio.h>をインクルードすると
::printf を使えますが、 std::printf も使えます。
どちらが正しいのでしょうか。また、正しくない方を正しくする方法はありますか?
490:デフォルトの名無しさん
07/08/20 04:18:35
>>478です。
URLリンク(www.hakodate-ct.ac.jp)
というサイトがあったので、
・-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:デフォルトの名無しさん
07/08/20 07:47:38
for(;;)
;
こんなのあるのね
びっくり
492:デフォルトの名無しさん
07/08/20 09:25:05
無限ループの常套手段
493:デフォルトの名無しさん
07/08/20 09:27:33
俺はwhile(1)派
494:デフォルトの名無しさん
07/08/20 09:31:18
自分も無限ループはwhile派かな
カウンタが要るときはfor使うかもしらんけど
495:デフォルトの名無しさん
07/08/20 09:46:09
>>489
<cstdio> で std::printf が、 <stdio.h> で ::printf が使えるようになることになっている。
1つのヘッダで両方が使えるようになることは保証されない。
496:デフォルトの名無しさん
07/08/20 18:43:51
std::bad_allocを捕まえたりいろいろ例外処理を書いているのですが、
メモリ4GBもあるので、デバッグ中にbad_allocが投げられることは今まで一度もありません。
投げられた際の動作をデバッグしたいのですが、そういうときはどうすればいいでしょうか。
敢えてメモリを消費したりするんですか?
↑ではbad_allocのことですが、他にもWindowsのAPI関数が失敗したときとかも、
ちゃんと自分が書いた処理が動作するか確かめたいんですが。
497:デフォルトの名無しさん
07/08/20 19:07:29
throw std::bad_alloc();
498:デフォルトの名無しさん
07/08/20 19:37:17
>>496
適当にラップして失敗に相当する結果を返せばいいべ
499:デフォルトの名無しさん
07/08/20 20:47:05
起動時に malloc(100000000) とか適当にやっとけば足りなくなるんじゃない?
500:デフォルトの名無しさん
07/08/20 21:09:14
例えば、"a"とか"あ"の文字コードを出力する方法ってありますか?
501:デフォルトの名無しさん
07/08/20 21:11:15
printf( "%d", 'a' );
502:デフォルトの名無しさん
07/08/20 21:30:04
>>501
ありがとうございます。
このページ
URLリンク(ash.jp)
の、UTF-8の欄のような値を出力する方法ってありますか?
503:デフォルトの名無しさん
07/08/20 22:23:30
%Xでの表示をぐるぐるまわせばおわりだろうに。
504:デフォルトの名無しさん
07/08/20 22:26:44
>495
URLリンク(www.open-std.org)
によると、
> 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
07/08/20 22:28:32
最初のアンカーは >489 につけるべきだった。
506:デフォルトの名無しさん
07/08/21 02:01:29
別人ですが
>>499
バグでそんな値(もっとでかい、0x40000000とか)を与えたことがあるけど、
無理に仮想記憶拡大して確保しようとして、システムが実質操作不能になるだけだった
507:デフォルトの名無しさん
07/08/21 02:33:09
Windowsって1プロセスが使用できるメモリ空間のサイズって指定出来ないの?
Win2000の頃は2G制限とかあった記憶があるけど、今はどうなんだろ。
508:デフォルトの名無しさん
07/08/21 03:06:41
>>507
以下は単なる思いつき。
1. プログラムの改造が可能なら、自分用の一定量しか領域確保できないメモリマネージャを作る。
2. メモリ取得APIをフックして自力で制限する。
3. SetProcessWorkingSetSizeを指定して、同時にスワップを小さくする。
509:デフォルトの名無しさん
07/08/21 05:28:56
たった1000行のソースも完全に把握できねぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇ
もうだめだぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ
510:デフォルトの名無しさん
07/08/21 05:38:16
やっと気付いたか。
さっさと人生やり直せ。
511:デフォルトの名無しさん
07/08/21 08:15:52
>>509
1関数1000行なら窓から投げ捨てろ
512:デフォルトの名無しさん
07/08/21 08:40:46
10万行超えると見る気すら失せる
513:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/21 09:37:17
arg = m_arrayだとコピーじゃなくて同じ配列に別名を付けてるだけになる
515:デフォルトの名無しさん
07/08/21 09:43:12
::memcpy(arg, m_array, sizeof(float) * 100));
516:デフォルトの名無しさん
07/08/21 09:47:54
std::copy(&m_array[0], &m_array[100], &arg[0]);
517:デフォルトの名無しさん
07/08/21 11:12:35
>>513
>float hoge = new float[100];
コンパイルできるコードを提示しなさい。
>arg = m_array;
それは、仮引き数にメンバ変数の値を代入しているだけなので、仮引き数の寿命とともに無に帰します。
518:デフォルトの名無しさん
07/08/21 11:13:18
>>515
そんなコードを書く香具師は野垂れ死に値すると思います。
519:513
07/08/21 11:55:54
皆さんいろいろありがとうございます。
>>517
>コンパイルできるコードを提示しなさい。
float* hoge = new float[100];
でした。
>それは、仮引き数にメンバ変数の値を代入しているだけなので、仮引き数の寿命とともに無に帰します。
というわけで、分かっておられると思いますが渡してるのはポインタでして
寿命は関係あるんですかね?
>>514
これもちょっと理屈が分かりません。
なぜ配列に別名をつけてることになるんですか?
配列の名前って先頭のポインタをさしてるんじゃなかったでしょうか?
>>518
一行で済むのでforで要素を一つずつコピーするよりは>>515>>516はいいかなと思ったんですが、
どうして>>515はダメなんですか?
520:デフォルトの名無しさん
07/08/21 12:04:44
>>519
>寿命は関係あるんですかね?
その仮引き数の寿命は、その関数を抜けるまでです。
ポインタがポイントしている先のことは言及していませんね。
もう少し、ポインタ変数と言うものを理解しておいた方が良さそうです。
>なぜ配列に別名をつけてることになるんですか?
ポインタ変数にポインタ変数の値を代入するだけでは、
ポイント先の複写は行なわれません。
もう少し、ポインタ変数(ry
>どうして>>515はダメなんですか?
どうしてダメじゃないと思うんですか?
521:デフォルトの名無しさん
07/08/21 12:06:18
>>519
> どうして>>515はダメなんですか?
float配列ならば動くけど、一般のオブジェクトの配列なら破滅的。
たとえば、string配列をmemcpyしたらどうなると思う?
522:デフォルトの名無しさん
07/08/21 12:17:40
float で大丈夫ならダメとは言えないだろ。もっといい方法があるってだけで。
523:デフォルトの名無しさん
07/08/21 12:24:46
>>520
>ポインタ変数にポインタ変数の値を代入するだけでは、
>ポイント先の複写は行なわれません。
いま気づきました。狂ってました。すいません。
要するに考え方として
「呼ぶ側で作った配列を渡してm_arrayの中身をコピーして貰ってくる」んじゃなくて
「ポインタを渡してm_arrayの先頭のアドレスだけ貰ってくる」っていうような
感じの書き方はできないんですかね?
呼ぶ側で、m_arrayの先頭のアドレスとサイズだけ分かれば
中身にアクセスできそうに思うのですが。
例えば、クラスメンバで持っているprivateな普通のオブジェクトインスタンスのポインタなんかの場合は
わざわざ中身をコピーしないでアドレスだけGet~とかで貰って使ったりするじゃないですか?
>どうしてダメじゃないと思うんですか?
試したらとりあえずうまくいったんで・・・
>>521
わかりません。floatでは一応動きましたが、なんでダメなんでしょうか。
サイズ指定した範囲をコピーすればうまく動くと思うのですが。
524:デフォルトの名無しさん
07/08/21 12:29:27
>>523
> 「ポインタを渡してm_arrayの先頭のアドレスだけ貰ってくる」っていうような
> 感じの書き方はできないんですかね?
なんでできないと思うの?
525:デフォルトの名無しさん
07/08/21 12:31:36
>>524
書き方が分からないんで
そういう書き方が出来るなら教えてください、
ってことなんですが。
526:デフォルトの名無しさん
07/08/21 12:34:01
やっぱりポインタ変数とポイント先の関係がわかっていないような……
527:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/21 12:47:45
>>528
最初のnew float[100]で確保したメモリはどうやって解放するんだい?
530:デフォルトの名無しさん
07/08/21 12:52:23
>>528
配列のコピーをしたいんじゃなかったのか?
531:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/08/21 13:00:55
floatの計算速度ってdoubleよりも遅いんですか?
533:デフォルトの名無しさん
07/08/21 13:02:09
>>528
巧くいってない巧くいってない。
>>531
だから、なんでコードの断片載せるんだって。
で、なんでまたfooはポインタなんだ?
534:デフォルトの名無しさん
07/08/21 13:03:27
>>532
足し算などは同じ。超越関数などは速い可能性が高い。
しかし、他の方への変換が入ったりすると遅くなることもある。
結論:一概には言えない。
535:デフォルトの名無しさん
07/08/21 13:06:07
もうスマートポインタコンテナとかRange conceptとか使う方がいいよ
536:513
07/08/21 13:14:09
つまりはどうしたらいいのでしょうか?もうわけ分かりません。
やりたいことはCfooのメンバとしてもってるfloatの配列m_arrayの中身を
コピーするなりポインタを貰うなり、どういう方法があるのか分かりませんが
正しい方法で使いたいってことなんですが。
元の中身を書き換える必要はありません。知れればいいです。
で、とりあえず531で動いてますが、これは危険でしょうか。
要素数は別個貰うなりすれば分かるので
その範囲内だけアクセスするなら大丈夫そうなんですが、ダメですか。
537:デフォルトの名無しさん
07/08/21 13:16:58
>>536
特に問題はないんじゃないの
538:デフォルトの名無しさん
07/08/21 13:28:14
>>537
そうですか。ではひとまずこれでやっときます。
どうもお騒がせしました。
539:デフォルトの名無しさん
07/08/21 13:36:29
書き換えないなら戻り値はfloat *ではなくconst float *にするべきだな。
それ以前に、Cfooを何故ポインタにしているかを知りたいんだが。
540:デフォルトの名無しさん
07/08/21 13:52:24
floatならSSEで高速化しやすい
541:513
07/08/21 13:53:03
>>539
>書き換えないなら戻り値はfloat *ではなくconst float *にするべきだな。
なるほど。
>Cfooを何故ポインタにしているかを知りたいんだが。
特に理由はないですが、
newしたCfooのポインタをメンバとして持ってるだけです。
ポインタで持ってるほうがいろいろ別のクラスに連れまわしたりするとき便利かなと。
むしろなぜそこが気になるのか知りたいんですが。
542:デフォルトの名無しさん
07/08/21 14:03:17
>>541
>むしろなぜそこが気になるのか知りたいんですが。
半ば個人的な興味だ。無条件にnewしたがるJava出身者が身近にいるもんでね。
# しかも、悪いことにdeleteする癖はついてないと来たもんだw
543:513
07/08/21 14:06:22
>>542
はい、まさに私のことです。
544:デフォルトの名無しさん
07/08/21 14:10:56
W
545:デフォルトの名無しさん
07/08/21 14:16:01
>>542
BCB使いもnewする癖が‥‥
546:デフォルトの名無しさん
07/08/21 15:40:21
OOっぽく書こうとするとそうなるんじゃないかな
C++的にはスマートポインタを使え、ということになるんだが
いずれにせよ常にownershipを意識している必要はあるね
547:デフォルトの名無しさん
07/08/21 16:02:26
ローカルなオブジェクトまでnewを使い始めたらもう、末期症状だ。
# オブジェクトは全てグローバルに管理されているとしたら、それはそれで難だけど。
548:デフォルトの名無しさん
07/08/21 16:03:31
>>545
VCL使ってると確かにnew癖つくなw
549:デフォルトの名無しさん
07/08/21 18:22:21
カウンタ付けて自動でdeleteするclassくらい自作しろ
550:デフォルトの名無しさん
07/08/21 21:25:00
何で既にあるもん作りなおさにゃならんのん・・・
551:デフォルトの名無しさん
07/08/21 22:27:07
boostの名前あげるとboost厨ウゼェとか言われるから
552:デフォルトの名無しさん
07/08/22 00:16:08
std::tr1::shared_ptrならいいのか?
553:デフォルトの名無しさん
07/08/22 04:50:10
俺はboost::intrusive_ptrが好きだが、めんどい人にはめんどいだろうな。
554:デフォルトの名無しさん
07/08/22 10:37:52
もうIUnknown/comdef.hでいいよw
555:デフォルトの名無しさん
07/08/22 12:21:10
int main (int argc, const char * argv[]) {
char string[] ="Hello,World";
char copystring[13];
stringcopy (string,copystring);
printf("%s¥n",copystring);
return 0;
}
void stringcopy (char *buff,char *copy){
int i = 0;
while(buff[i]){
copy[i] = buff[i];
i++;
}
copy[i] = '¥0';
}
でwhile(buff[i]){…}を
for(i=0;buff[i] == 0;i++)
copy[i] = buff[i];
とすると動かないんですけれど、何故ですか?
556:デフォルトの名無しさん
07/08/22 12:25:25
>>555 条件逆にして動くとでも思ってんの?
557:デフォルトの名無しさん
07/08/22 12:29:42
for(i=0;buff[i] == 0;i++){
printf("loop %d\n",i);
copy[i] = buff[i];
}
ってやってみたら、なにか気づくかも
558:デフォルトの名無しさん
07/08/22 12:36:13
わかった!
for(i=0;buff[i] != 0;i++)
ってすると動くぞ!
559:デフォルトの名無しさん
07/08/22 12:49:13
Containerというクラス名をAAというクラス名にしたら、
Container.h:9: an anonymous union cannot have function members
Container.h:26: abstract declarator `<無名 class>' used as declaration
Container.h:26: anonumous 名前空間の集合体は static でなければなりません
560:デフォルトの名無しさん
07/08/22 12:50:45
>>559
すいません、間違えて「書き込む」ボタン押してしまいました。
Containerというクラス名をAAというクラス名にしたら、
AA.h:9: an anonymous union cannot have function members
AA.h:26: abstract declarator `<無名 class>' used as declaration
AA.h:26: anonumous 名前空間の集合体は static でなければなりません
というエラーが出てきたのですが、このエラーの意味が理解できません。
教えてください。
561:デフォルトの名無しさん
07/08/22 13:12:06
エスパー募集するんでもなければコード貼れよ。
562:デフォルトの名無しさん
07/08/22 13:16:23
>>560
最初のエラーだけとってみれば
無名共用体には関数メンバを持つことができない
というエラー。
だから名前だけじゃなくて何か意味または構造が変わるような修正をしてると
思うけど、情報が不足してるのでこれ以上のことは分からない。
563:デフォルトの名無しさん
07/08/22 13:42:53
>>559です。
自己解決しました。
ContainerからAAに名前を変えたときに、
#ifndef CONTAINER
#define CONTAINER
#include "Container.h"
#endif
も
#ifndef AA
#define AA
#include "AA.h"
#endif
としていたためにエラーが出ていました。
情報の足りない質問で申し訳ありませんでした。m(_ _)m
564:デフォルトの名無しさん
07/08/22 13:51:53
>>563
まあ、解決したのはよかったけど、
そもそものソースの構造がおかしいんじゃないのか?
普通は Container.h の中で全体を
Container.h
-----------------
#ifndef CONTAINER
#define CONTAINER
~
#endif
-----------------
としてくくるんであって、includeする側では、二重取り込み防止マクロなんて書かないだろ。
565:でいびす
07/08/22 16:08:55
VC++5.0でファイルリードをやってます。
その時、読込んだ値を文字として認識できるか
調べたいのですが、やり方を教えてもらえませんか?
ループしながら、1文字づつ調べたいです。
ちなみに、文字列には半角の日本語と全角の日本語が混在しています。
お願いします。
566:デフォルトの名無しさん
07/08/22 16:23:15
文字として認識ってのがあいまいだけど
_ismbbprint
あたり使えるか調べて見れ
567:でいびす
07/08/22 16:51:43
>>566
_ismbbprintは使えませんでした。
ビルドが通らなかったです。
568:デフォルトの名無しさん
07/08/22 16:55:13
URLリンク(msdn2.microsoft.com)(VS.80).aspx
569:デフォルトの名無しさん
07/08/22 16:59:27
なんだってVC++5.0なんてもんを使ってるんだ
570:でいびす
07/08/22 17:04:29
>>569
古いプログラムをカスタマイズする事になったので使ってます。
571:でいびす
07/08/22 17:11:52
>>570
古いプログラムをカスタマイズする事になっても使う必要ありません。
572:デフォルトの名無しさん
07/08/22 17:23:18
いやー、そうとも限らんぞー
573:でいびす
07/08/22 17:24:06
>>570
いやー、そうとも限らんぞー
574:デフォルトの名無しさん
07/08/22 17:25:49
VC++5.0ってSTLがはじめてバンドルされた版だよな
無理やり使ったが、今にして思えばひでえ出来だった
575:デフォルトの名無しさん
07/08/22 19:20:05
new が失敗した時に NULL を返すことを前提にプログラムしてたりするんだろうなあ。
576:デフォルトの名無しさん
07/08/22 19:22:18
new が失敗した時に NULL を返すことを前提にプログラムしてたりしてます。
577:デフォルトの名無しさん
07/08/22 19:42:58
new(nothrow)使えば問題なし
578:デフォルトの名無しさん
07/08/22 19:45:10
newハンドラ使えば問題なし
579:デフォルトの名無しさん
07/08/22 20:49:37
set_new_handler じゃなくて _set_new_handler で、
new ヘッダじゃなくて eh.h で宣言されてたんだっけ。
bad_alloc は VC5 で宣言されてたっけ?
580:デフォルトの名無しさん
07/08/22 21:01:23
>>565
VCだと昔から日本語対応の関数はあって、どこかのバージョンで
_ismbXXXX のようなマルチバイト系関数であることを明示するような
関数名になったはず。
それがVC++5.0かどうか知らないが、でもだから対応する関数はあるはず。
で、ぐぐると以下のサイトに適度に古そうな関数名がならんでいるので
試してはどうだろうか。
URLリンク(www.geocities.co.jp)
581:デフォルトの名無しさん
07/08/22 21:08:46
UTF-8だったりEUC-JPだったりISO-2022-JPだったりする可能性は?
というのは余計なお世話か。
582:デフォルトの名無しさん
07/08/22 21:12:02
文字コードについては>>565が勝手に判断するでしょ。
だいたいVC++5.0の時代のアプリにShift_JIS以外使ってるとも思えないけど。
583:でいびす
07/08/22 21:14:17
VC9使うことにしますた
584:デフォルトの名無しさん
07/08/22 22:09:24
VC++はソースのエンコードすら指定できない糞コンパイラ
585:デフォルトの名無しさん
07/08/22 22:13:51
>>584はVC++はソースのエンコードすら指定できないコンパイラと思っている糞
586:デフォルトの名無しさん
07/08/22 22:20:15
できるの?
clにそれらしいオプションが見当たらないからできんのかと思ってた
587:デフォルトの名無しさん
07/08/22 22:24:34
>>585
どうやって指定するの?
588:デフォルトの名無しさん
07/08/22 22:31:21
>>585
おれもきになる
589:デフォルトの名無しさん
07/08/22 22:40:08
std::vector<foo> hoge という変数があるとして、
これを関数の引数に渡すときはhogeのポインタを渡した方が
hoge自体を値渡しするより動作は速いですか?
590:デフォルトの名無しさん
07/08/22 22:41:32
その通りだが、せっかくC++なのだからリファレンス渡しするか
iteratorを渡せ
591:デフォルトの名無しさん
07/08/22 22:43:22
何すかそれ
592:デフォルトの名無しさん
07/08/22 22:45:33
void hogehoge(std::vector<foo>& rhoge);
593:デフォルトの名無しさん
07/08/22 22:48:03
>>591
void swap_ptr(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; }
void swap_ref(int &a, int &b) { int tmp = a; a = b; b = tmp; }
main() { int m = 1, n = 2; swap_ptr(&m, &n); swap_ref(m, n); }
swap_ref()がリファレンス渡し。
この場合は入出力引数だが、入力だけでいいんならconstつけろ。
594:デフォルトの名無しさん
07/08/22 22:50:19
>>590
サンクスコ
595:デフォルトの名無しさん
07/08/22 22:55:22
>>593
サンクスコ
596:デフォルトの名無しさん
07/08/22 23:12:21
ドトネトのMicrosoft.VisualC.CppCodeProviderってもしかしてclのかわりに
C++コンパイルできんのか
マネージドじゃないと無理かな
597:デフォルトの名無しさん
07/08/22 23:37:33
vector<CHoge>::iterator itr;
このitrが指してる要素の中身のアドレスを取りたいときは
どうやって書けばいいんですか?
CHoge* p_hoge;
p_hoge = &itr;
とか書いたら怒られました。
598:デフォルトの名無しさん
07/08/22 23:40:54
p_hoge = &*itr;
599:デフォルトの名無しさん
07/08/22 23:42:12
CHoge* p_hoge = &*p_hoge;
vectorなら鼻からbegin()/end()を使わず、
&v[0]と&v[0] + v.size()でポインタを得て、
それをイテレータとしても使うという手もある。
600:デフォルトの名無しさん
07/08/22 23:42:39
>>598
出来ました。サンクスコ
601:デフォルトの名無しさん
07/08/23 01:12:40
鼻から悪魔に見えた
602:デフォルトの名無しさん
07/08/23 01:13:32
>>584
エンコードの指定は出来ないが、
BOMが付いてればUnicode LE/BEやUTF-8はそれで判定する。
BOMがなければANSI文字コードとみなしている。
javacやunix系のコンパイラはUTF-8にBOMが付いてると処理してくれないものが多く、
双方で利用しようとすると結構めんどい。
603:デフォルトの名無しさん
07/08/23 01:13:53
悪魔から鼻に見えた
604:デフォルトの名無しさん
07/08/23 01:49:46
>>577
そんなことしてもコンストラクタから飛んでくる例外は止まらないぜ。
605:デフォルトの名無しさん
07/08/23 01:50:20
なんかかっこいい
606:デフォルトの名無しさん
07/08/23 11:14:46
>>602
それなりに移植性考えたらC++のソースにBOMつけるとかありえんわな
で、当然boostのソースにはそんなもんついてないし、一部のヘッダにLatin-1な
人名が入ってるから、VC++8.0でコンパイルすると色々苦情を言ってくんのな
607:デフォルトの名無しさん
07/08/24 22:47:56
C++でHTMLのタグのようなものを使用していたり、『::』のようなものなどを見かけます。
Cには無く、C++では使用出来るようなことを幅広く説明している書籍でお勧めのものはありますでしょうか。
発売年や価格、本自体の厚さなど数多くありすぎて、どういうものを購入すればいいのか分かりません。
近くに本屋さんはあるのですがプログラム関係は少ないですのでネット通販で買おうかと考えております。
それ故、内容が確認できず判断が・・orz
608:デフォルトの名無しさん
07/08/24 22:50:21
HTMLのタグ・・・確かにそう見えんことはないw
609:デフォルトの名無しさん
07/08/24 22:58:28
なんだそりゃ、templateのことか?
あまりに斬新過ぎる見解でワロタ
それはそうと、wxWidgetsのWindowProcって、ウィンドウクラスのインスタンス
見つけるのにわざわざグローバルなハッシュテーブル引いてんだな、なんだこりゃ
せめてWin32ならGetWindowLongPtr()使ってくれよ
なんかそうできない技術的理由があんのか
ATLみたいなサンクに書き換えたら、そんだけで激高速化すんじゃね?
610:デフォルトの名無しさん
07/08/24 23:15:45
>>607
結局この本は必要…通読する対象ではない気がする、字引的にほぼ全部載ってる
URLリンク(www.amazon.co.jp)
611:デフォルトの名無しさん
07/08/25 00:31:15
そんなに高速化するわけない。
いったい一秒に何回メッセージが来て、
グローバルハッシュを引くのに何ナノ秒
余分にかかるというんだ?
612:デフォルトの名無しさん
07/08/25 00:37:41
一秒に何回メッセージが来て、
グローバルハッシュを引くのに何ナノ秒
余分にかかる
613:デフォルトの名無しさん
07/08/25 00:38:15
俺も初めて見たときはタグかと思った。
includeファイルに.hが付いていないことや、標準入出力に<<、>>を使うこと、
「::」の存在など何もかもが新鮮だったあの頃・・・
いまだに初心者の域を抜けられぬ現状orz
614:デフォルトの名無しさん
07/08/25 00:40:43
::は斬新だった。こうゆう記号ってなんか意味を持って決められてるのかな?
615:デフォルトの名無しさん
07/08/25 00:43:25
意味的に : を使いたいけど、ラベルと被るから :: にしたんじゃね?
616:デフォルトの名無しさん
07/08/25 01:44:24
斬新といえばいえなくもないが、: (コロン)は、通常のラベルどころか
・caseのラベル(厳密にいえば通常のラベルと変わらない)
・クラス継承
・コンストラクタの初期化子(?)
・条件演算子の一部
など、よくこれだけ機能を持たせられたと思うものだ。
さらに、ストリームにビットシフト演算子を使うなんて、どこのアホが考えたかと思う。
演算子オーバーロードを見せつけるための演出としか思われない。
さらに、マニピュレータだって?printf系の方がよっぽどうまく素早く整形できるわ。
あんなのC++委員会の遊びにすぎんよ。
もっとも、Cよりは便利なので使わせていただいていますけどね。
617:デフォルトの名無しさん
07/08/25 02:07:29
べ、別に好きでC++を使っているんじゃないんだからね!
Cより便利だから使ってあげているだけなんだからねっ!
618:デフォルトの名無しさん
07/08/25 02:11:22
おっさんが書いてるんだぜ?きめぇ
619:デフォルトの名無しさん
07/08/25 02:11:29
>>616
iostreamとマニピュレータの登場は、標準化委員会の発足より古いはず。
D&Eによれば入出力に演算子を使うのはDoug McIlroy、
マニピュレータはAndrew Koenigのアイデアだそう。
620:デフォルトの名無しさん
07/08/25 04:31:27
printf より優れてる点は型安全な点とポリモーフィズムだな。
printf 風マニピュレータを作らなかったのは C++ の汚点だな。
621:デフォルトの名無しさん
07/08/25 06:21:38
なんで queue には clear() が無いの?
622:デフォルトの名無しさん
07/08/25 10:13:32
ああ、すまん
作るの忘れてた
623:デフォルトの名無しさん
07/08/25 10:32:35
納得した
624:デフォルトの名無しさん
07/08/25 10:37:06
何のqueueにclearが無いの?
625:デフォルトの名無しさん
07/08/25 11:05:14
参照渡しでもらった引数をさらに別の関数に参照渡しするのって
なにか問題ありますか?
626:デフォルトの名無しさん
07/08/25 11:09:57
G++ の STL の queue, priority_queue, stack.
コンテナアダプタには clear() が用意されて無いけど何か理由があるんでしょうか.
627:デフォルトの名無しさん
07/08/25 11:55:33
G++wwwwwwなんという未来言語wwwwww
628:デフォルトの名無しさん
07/08/25 12:00:58
無知発見
629:デフォルトの名無しさん
07/08/25 12:13:16
自己解決しました.
630:デフォルトの名無しさん
07/08/25 12:15:02
>>627
これはひどいwwwwwww
631:デフォルトの名無しさん
07/08/25 12:27:56
>>627=630
そんなエサで俺様が釣られるかクマー
632:デフォルトの名無しさん
07/08/25 13:55:48
>>625
別に問題ない。
寧ろ、参照渡しでもらったものをポインタ渡しするほうがおかしいし、
参照渡しでもらったものを値渡ししてしまったら意味が違ってしまう。
633:デフォルトの名無しさん
07/08/25 15:43:54
何でないんだろうね。
プリンタジョブとかに queue を使ったとして、
ジョブを全部破棄とかすることあるだろうに。
634:デフォルトの名無しさん
07/08/25 16:01:42
1億と2000年前からpopしなさい、というお達しか
635:デフォルトの名無しさん
07/08/25 16:12:47
while(!q.empty()) { q.pop(); }
としろ、ということか。
636:デフォルトの名無しさん
07/08/25 17:14:26
そうだdequeをつかおう
637:デフォルトの名無しさん
07/08/25 17:16:04
q.~queue();
new(&q) std::queue<T>;
冗談だよ、冗談。
638:デフォルトの名無しさん
07/08/25 17:24:21
素直にq=std::queue<int>();と書いてやれよw
639:デフォルトの名無しさん
07/08/25 17:40:57
queue のソースを書き換えればいいんじゃね?
640:デフォルトの名無しさん
07/08/25 17:47:21
queue を継承した my_queue を(ry
641:デフォルトの名無しさん
07/08/25 18:26:24
(x = 1) = 2;
これ、Cだとエラーなんだが、C++ではコンパイルできる
何で?
642:デフォルトの名無しさん
07/08/25 19:11:39
x = 1の結果が、Cは右辺値、C++は左辺値と定められているから。
643:デフォルトの名無しさん
07/08/25 19:19:25
>>642
やっぱりそういうこと?
ストラウストラップの本とK&RとCの規格書調べたんだけど、それらしい記述を
見つけられなかったんだけど、どこかに明記されている?
644:デフォルトの名無しさん
07/08/25 19:26:25
=演算子が参照を返すからじゃね?
645:デフォルトの名無しさん
07/08/25 19:51:03
>>643
642じゃないけど
C言語はJIS X 3010の.5.16代入演算子
代入式は、代入後の左オペランドの値を持つが、左辺値ではない。
C++は手元にあるのが15年前のARM日本語版しかないけど、5.17代入演算子
代入演算子の結果は、代入が行われた後に左のオペランドに格納してある値である。従って、結果も左辺値である。
Cの規格書って何を調べたの?
646:デフォルトの名無しさん
07/08/25 19:54:07
>>644
>>642
647:デフォルトの名無しさん
07/08/25 19:58:03
>>645
脳内
648:デフォルトの名無しさん
07/08/25 20:23:22
X3014にも5.17 1節目の最後に「結果は,左辺値とする。」と書いてある。
>>644
型と右辺値左辺値は別の段階の話。
649:デフォルトの名無しさん
07/08/25 20:33:34
三項演算子で変数返すコード書いて左辺値にしても大丈夫
650:デフォルトの名無しさん
07/08/25 22:36:12
たくさんのレスthx
>>645
同じ規格書の同じとこ読んだんだけど、
代入式:
条件式
単項式 代入演算子 代入式
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ってなってたから、代入式ってのは上の3行目(波線部分)の代入式
のことを言ってるのかと勘違いしてた
単項式 代入演算子 代入式
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
これ全体を代入式と言ってるのか
とすれば x = 1 という代入式の結果は左辺値ではないということに
なるか
代入式は、代入後の左オペランドの値を持つが、左辺値ではない
と書いてあるけど、代入式の結果は と書いてくれたほうがクリアになるなあ
~~~~~~~~~~~~~~~~~
BNF記法が分かってなかった
>>648
なるほど
C++のほうはEffectiveにも参照を返すと書いてあるから
理解できた
C++の規格書も買うかな
651:デフォルトの名無しさん
07/08/25 22:42:13
禿の本がまだなら規格書よりそっちを先に読んだ方がいいよ
652:デフォルトの名無しさん
07/08/25 22:46:24
>>650
知ってるかもしれないが、JISの規格書なら以下で参照できる。
日本工業標準調査会
URLリンク(www.jisc.go.jp)
C JISX3010
C++ JISX3014
検索できないのは最悪だけど。
653:デフォルトの名無しさん
07/08/25 22:49:36
>>651
調べ物するときは同じ内容について
色々な本に目を通してるんだけど、
結局、規格書に明記されてると確信に変わる
んで安心できる
禿の本ってEffectiveのこと?
結構高度だから必要に応じて関連する項目を
潰していこうと思ってる
654:デフォルトの名無しさん
07/08/25 22:52:34
>>652
最初、Cの規格書もそこを見てたんだけど
検索できなくて疲れるから買ってしまった
655:デフォルトの名無しさん
07/08/25 22:59:44
禿本 : Bjarne Stroustrup著 プログラミング言語C++
656:デフォルトの名無しさん
07/08/25 23:52:51
>>650
代入式の結果が左辺値か右辺値かは、構文から
決定できる問題ではないので、構文を記した部分は関係ないぞ。
657:デフォルトの名無しさん
07/08/26 03:47:09
class Hoge{private:vector<CFoo> m_vecFoo;};
Hoge::Hoge(){
//落ちる場合1
CFoo foo = CFoo(age,sage);
m_vecFoo.push_back(foo);
//落ちる場合2
CFoo foo;
foo = CFoo(age,sage);
m_vecFoo.push_back(foo);
//落ちない場合
CFoo* foo = new CFoo(age,sage);
m_vecFoo.push_back(*foo)
}
あるクラスCFooについて、newでインスタンスを生成した場合は落ちないんですが、
newを使わないで直接生成した場合(そういうのをなんていうのか知りませんが)
push_backの行で落ちてしまいます。一応どの場合もコンパイルは通ってます。
原因がまったく分からないのでエスパーしてください^^;お願いします。
デバッグ結果:xutilityファイル内↓
inline void __CLR_OR_THIS_CALL _Container_base::_Orphan_all() const
{ // orphan all iterators
_Lockit _Lock(_LOCK_DEBUG);
if (_Myfirstiter != _IGNORE_MYITERLIST)
{
for (_Iterator_base **_Pnext = (_Iterator_base **)&_Myfirstiter;
*_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter)
(*_Pnext)->_Mycont = 0; ←この辺でとまってる模様
*(_Iterator_base **)&_Myfirstiter = 0;
}
658:657
07/08/26 03:53:14
//さらにもう一個、落ちる場合
CFoo foo(age,sage);
m_vecFoo.push_back(foo);
ちなみに、push_backをコメントアウトして飛ばせば一応落ちないで動いてるようなので
落ちているのはpush_backの行みたいです。
659:デフォルトの名無しさん
07/08/26 05:25:40
その「あるクラス」がどんなものなのか説明しろよ。
ちゃんとコピーコンストラクタでディープコピーしてるかとか。
660:デフォルトの名無しさん
07/08/26 09:15:04
>>659
すいません。力尽きて寝てました。
実際のCFooはでかいのでそのまま貼ることはできませんが、
・コンストラクタの引数にポインタ型がある
・メンバにもポインタ型がある
・引数つきで生成されること前提なのでデフォルトコンストラクタとか作ってない
・唯一書いてある引数ありのコンストラクタは、メンバを初期化リストで初期化せずに
コンストラクタの中身で初期化してる
・単純なGet~みたいな関数はヘッダに直接書いてある
この辺がなにか関係してるでしょうか?
661:デフォルトの名無しさん
07/08/26 09:36:45
レスに間が空いててもいいが、わざわざ寝てましたなどと言わなくていい
662:デフォルトの名無しさん
07/08/26 09:39:42
レスに間が空いててもいいし、わざわざ寝てましたなどと言ってもいい
663:デフォルトの名無しさん
07/08/26 09:43:44
>>660
>659の質問に答えたまえ。
コピーコンストラクタを設けていないのなら、C++を初歩から勉強しなおせ。
664:デフォルトの名無しさん
07/08/26 09:51:36
ディープコピーって何ですか?
665:デフォルトの名無しさん
07/08/26 10:28:29
本読め
Effective C++とかEffective STLとか
666:657
07/08/26 10:35:13
なんかポインタのメンバとかもってたりするクラスは
コピーコンストラクタなるものをきちんと実装しないと
値渡ししたりするときに問題が発生しやすいらしいので
m_vecFooにはポインタを渡すことにしました。
667:デフォルトの名無しさん
07/08/26 10:38:42
参照を参照のままコピーするのが浅いコピー
参照先を複製してコピーするのが深いコピー
668:デフォルトの名無しさん
07/08/26 10:52:14
コピーコンストラクタを実装してなかったことが原因な気がしてきてはいるのですが
なぜpush_backの段階で落ちてるんでしょうか?
二重でdeleteされてるわけでもないし、理屈がわかりません。
669:デフォルトの名無しさん
07/08/26 10:52:28
ディープキスって何ですか?
670:デフォルトの名無しさん
07/08/26 10:56:26
保育園でするもの
671:657
07/08/26 10:59:13
>コピーコンストラクタなるものをきちんと実装しないと
>値渡ししたりするときに問題が発生しやすいらしいので
訂正ですが、ポインタのメンバを持ってるクラスの
コピーコンストラクタをきちんと実装してない場合、
”値渡しする段階”で問題がでるのではなくて、
”後始末の段階”で二重のdeleteが起きたりするので危険なんですよね?
なんでpush_backしただけで落ちるんでしょうか?
どんな可能性が考えられますか?
672:デフォルトの名無しさん
07/08/26 11:10:13
とりあえず、デバッガで
本当に push_back の行で落ちてるのかどうか確認してみた方がいいんじゃない?
673:デフォルトの名無しさん
07/08/26 11:13:40
>>671
CFoo foo = CFoo(age, sage);
CFoo bar = foo;
とりあえずこのコードで落ちたりしないか?
674:デフォルトの名無しさん
07/08/26 11:23:30
あと、
>CFoo foo;
>foo = CFoo(age,sage);
これをちゃんと動かしたいなら、代入演算子も定義しとけ。
675:デフォルトの名無しさん
07/08/26 11:38:52
>>672>>673
CFoo foo = CFoo(age, sage);
CFoo bar = foo;
としたらpush_backをコメントアウトしても落ちました。
ってことはやっぱりコピーコンストラクタなるものが
きちんと実装されてないのが原因っぽいです。
でも実装してないときはコンパイラが勝手に作ってくれるんじゃないんですか?
で、勝手に作られたものでは”破棄時”に問題がでるので、
自分でうまく実装しないと危険ってだけなんじゃないんでしょうか?
676:デフォルトの名無しさん
07/08/26 11:39:52
>>671
それはもちろんだが、その前に、解放済みの動的資源を参照するオブジェクト
ができてしまうことがマズイだろ
677:657
07/08/26 11:43:25
あぁ、なんかコピーをした段階で落ちてるんじゃなくて、
一時オブジェクトが解放される段階で落ちてるみたいです。
678:デフォルトの名無しさん
07/08/26 11:44:10
>>656
式の結果が左辺値になるか右辺値になるかは構文ではなく
言語の仕様ということか
それなら黙って認めるしかないから明白だ
679:デフォルトの名無しさん
07/08/26 11:47:02
>675
>自分でうまく実装しないと危険ってだけなんじゃないんでしょうか?
その「危険」の内容が、落ちるってことだ。
680:デフォルトの名無しさん
07/08/26 11:49:39
誰かスレッドについて教えてくれ。
自プロセスのスレッド数を
CreateToolhelp32Snapshot、Process32First、Process32Next
使ってスレッド数を出力するだけのプログラムで
なんでcntThreadsの値が8になるんだ?
CreateThreadとかしてないのに・・・
681:デフォルトの名無しさん
07/08/26 12:00:10
知らんけど、システム的なDLLの誰かが作ったスレッドなんじゃない?
682:デフォルトの名無しさん
07/08/26 12:09:32
>>680
お前がアホだから
683:デフォルトの名無しさん
07/08/26 12:11:02
純粋に自分の作ったスレッドの数のみを知る方法ってないのかな?
684:デフォルトの名無しさん
07/08/26 12:11:39
>>680
せめて
URLリンク(www.microsoft.com)
あたりのツール使って、実際のスレッド数をまず確かめてはどうか?
685:デフォルトの名無しさん
07/08/26 12:11:47
ある
686:デフォルトの名無しさん
07/08/26 12:11:53
自分で作ったのなら自分で管理して数えればいいじゃん
687:デフォルトの名無しさん
07/08/26 12:27:41
ProcessWalkerを使ってみたんだが、やはり複数立ち上がってる・・・
確かに自分で数えればいいんだが、
パフォーマンスログでスレッド数見ると
自分で立ち上げたスレッド数以上立ち上がってて
たまに増減するんだよね。
688:デフォルトの名無しさん
07/08/26 12:28:33
だから何だ?チラシの裏にでも書いてろ。
689:デフォルトの名無しさん
07/08/26 12:36:37
そりゃ裏でスレッドを作られったって、それはWin32の勝手だろうに。
690:デフォルトの名無しさん
07/08/26 13:03:42
C/C++の文法自体は大体理解できたが、大規模なプログラムの作り方が
さっぱり分からん
大規模なものだと、だいたいフォルダごとに纏められていて総数数百、数千のファイルがあるが
どのような感じでそんな構造をつくっていけばいいのかさっぱりです。
Webにはどこも同じような、内容ばかりポリモを動物を使っての説明w
結局みんな大規模なものはかけないのかな?
691:デフォルトの名無しさん
07/08/26 13:07:39
はは
692:デフォルトの名無しさん
07/08/26 13:09:43
>>690
大規模っつーことで複数人での開発を想定するが
個人的にはプロセスやDLL等の境界で切ってあるほうがずっとやりやすかったかな
切らないんなら、適切にスタブを作るのが常套かと思う
Facadeなどの下に隠すのも良い
画面がいっぱいあるだけの良くある業務系なら、それぞれの画面に飛べるように
なっていて、それぞれが独立していれば概ね問題は無い
まあ所詮ケースバイケースで王道は無いだろ
「銀の弾丸はない」のだと知れ
693:デフォルトの名無しさん
07/08/26 13:10:03
大規模なプロジェクトと動物ポリモとどういうつながりが?
694:デフォルトの名無しさん
07/08/26 13:20:38
>>687
オーディオデータとか動画扱ってる場合とかWindowsが勝手にスレッド作る場合はよくあるお
695:デフォルトの名無しさん
07/08/26 13:25:54
>>675
>でも実装してないときはコンパイラが勝手に作ってくれるんじゃないんですか?
各メンバのコピーコンストラクタを呼び出す、というコピーコンストラクタを作ってくれる。
同様に代入の場合は各メンバに対しoperator=を呼ぶ。
メンバにポインタがある場合ポインタがコピーされるだけで、ポインタが指す先は複製されない。
696:デフォルトの名無しさん
07/08/26 13:30:15
まーメンバがコピーコンストラクタが上手く動くクラスとポインタ以外の
基本型だけならデフォのコンストラクタで問題ないことも多い
ポインタ生のままで保持せずにboost::shared_ptrでくるんだりしてれば
適切に参照カウント処理してくれる
そうでないならちと考えろってこった
697:デフォルトの名無しさん
07/08/26 13:31:27
>>693
私が言いたいのはWebで恰もC++知ってますみたいな講座書いてる奴の大半は
動物ポリモみたいなことかいてるだけで実用的なことは一切出来ないのかな?
と思っただけですよ
698:デフォルトの名無しさん
07/08/26 13:33:05
しらねぇ
つーかどうでもいい
動物ポリモは確かにくだらねぇしオリジナリティはねぇな
699:デフォルトの名無しさん
07/08/26 13:37:16
初心者の為に端折って説明してるだけなんだよ
700:デフォルトの名無しさん
07/08/26 13:39:50
あれで初心者が解るのか疑わしい
701:デフォルトの名無しさん
07/08/26 13:42:37
わからなかった?
精進するよ
702:デフォルトの名無しさん
07/08/26 13:44:29
>>697
動物ポリモみたいなこと書いてないで君もさっさと大規模なもの作れる頭持つか諦めなさい。
703:デフォルトの名無しさん
07/08/26 13:50:52
そうだね
スレ汚しすまそ
704:デフォルトの名無しさん
07/08/26 14:26:55
逆に実用的でコーディング時の仕様に依存しないポリモーフィズムってなに
705:デフォルトの名無しさん
07/08/26 14:30:57
まだ、いってんの?
C++ 講座
で検索してみなよ
どこもおなじようなことしか書いてないからw
706:デフォルトの名無しさん
07/08/26 14:35:06
そりゃC++ 講座だもん
707:デフォルトの名無しさん
07/08/26 14:41:55
偉そうに書いてるわりには、実際に作ったソフトを公開してる人いないよね
実際はC++の文法だけしか理解できていない可能性高し
708:デフォルトの名無しさん
07/08/26 14:42:57
だからなんだよ?どうでもいいだろ?
チラシの裏にでも書いてろよ。
709:デフォルトの名無しさん
07/08/26 14:45:45
有能だけどそこまで親切じゃない人もいるんだよ
710:デフォルトの名無しさん
07/08/26 14:54:36
>>707はアホそうに書いてるだけで、実際に作ったソフトを公開してないよね
実際はC++の文法ですら理解できていない可能性高し
711:デフォルトの名無しさん
07/08/26 14:56:11
大規模な開発なんて経験つんでやっていくものじゃないの
Webのしかも言語自体の解説に何期待してんだか
712:デフォルトの名無しさん
07/08/26 14:57:08
>>707
遊びの延長や使い捨てや自分専用で作るのと
公開するソフトを作るのではかかる手間が桁違いだろ
713:デフォルトの名無しさん
07/08/26 15:06:54
公開ライブラリを作ってる人達の実力は底が知れない
具体的にいうとboost関係の人達
714:デフォルトの名無しさん
07/08/26 15:23:49
知れるかどうかって話で言うと、何も公開していない人のほうが底が知れないね。
715:デフォルトの名無しさん
07/08/26 15:25:40
>>713
そうか?
以前正規表現を使いたくてboostを使ったが速度でイマイチだったから
自前で実装したけど?
716:デフォルトの名無しさん
07/08/26 15:30:47
>>715
そうか?
以前正規表現を使いたくてお前のを使ったが速度でイマイチだったから
自前で実装したけど?
717:デフォルトの名無しさん
07/08/26 15:32:20
どうでもいから出て行ってくれないかな。
718:デフォルトの名無しさん
07/08/26 16:38:43
boostはC++の実験場だから
チューニングはしてないよ
719:デフォルトの名無しさん
07/08/26 17:18:01
チューニングに関する実験でもチューニングしてないよ
720:デフォルトの名無しさん
07/08/26 18:59:25
boost::uniform_01< boost::mt11213b, float > rnd( boost::mt11213b( (unsigned long)(time(0)) ) );
oven::random_shuffle( vec, _1 * rnd() ); // std::random_shuffle( vec.begin, vec.end, _1 * rnd() );
std::random_shuffleの乱数生成関数オブジェクトにboost::uniform_01を使ってみたんですが
なんかうまくばらけてくれませぬ
というわけでstd::random_shuffle用のいい乱数発生方法を教えてください
721:デフォルトの名無しさん
07/08/26 20:48:44
Boostなんてたいしたこと無いだろ
これが一番典型的な例
____ progress_
|← reject| boostの中の人 display ユーザー
. ̄.|| ̄ ̄ ┗(^o^ )┳(^o^ )┳(^o^ )┛≡=-
|| ┏┗ ┗┗ ┏┗ ≡=-
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
722:デフォルトの名無しさん
07/08/26 20:58:05
それがboostの典型なら、boostの中でrejectされたりしないだろう。
boostの中で平均的に評価されているものが、他との比較でreject扱いになって
初めて「boostなんてたいしたことない」になる。
723:デフォルトの名無しさん
07/08/26 22:35:06
progress.hppには
まるで役に立たないprogress_displayと
すごく役に立つprogress_timerが同居しています
そんな兄弟いますよね
724:デフォルトの名無しさん
07/08/26 23:18:30
Visual Studio .NET 2003環境の問題について教えてください。
アラビア語リテラルの入った.ccのソース(MySQL)のコンパイルが出来ません。
error C3209: '・ァル館・' : Unicode 識別子は現在サポートされていません。
というエラーが表示されます。(ソースUTF8の場合)
秀丸でShift-JISにしたり、UTF8にしたりしたのですが、どちらもエラーでした。
VSのエディターではShift-JISの場合、アラビア語が文字化けもなく表示されます。
(UTF8では文字化けして表示されます。)
2時間くらいググッても分かりませんでした。
この問題の解決法を教えてください。
エロイ人お願い!
725:デフォルトの名無しさん
07/08/26 23:21:48
>>724
VC が UTF-8 を認識できてないんだろ。どうやるのか知らんけど。
Shift_JIS でアラビア語が扱えないのは確実。
726:デフォルトの名無しさん
07/08/26 23:26:42
英語版に言語パック入れたら?
727:デフォルトの名無しさん
07/08/26 23:29:28
BOMつきUTF-8ってVS2003で食えたっけ
VS2005なら大丈夫のはずだが
リテラルはワイド文字なのか?
そうだと仮定すると、ソース修正して
16進でUnicodeのコードポイントを記述してやるのが一番手早い
Perlか何かを使えば簡単だろ
728:724
07/08/26 23:45:35
素早いレス、感謝感激です。
>>725
アドバイス、㌧。
どこで聞けば分かりそうですか?ご存じでしたら教えてください。
オプションやらヘルプやら一通り見てみたのですが、分かりませんでした。
>>726
ちょっと難しそうです。㌧。
>>727
> BOMつきUTF-8ってVS2003で食えたっけ
BOMつきかどうかを確認する方法をご存じでしたら教えてください。
> リテラルはワイド文字なのか?
リテラルはワイド文字です。
確かにソース修正が一番簡単ですね。
ただ、ソースの下の方を見てみたら、ヒンディ語・ヘブライ語・・・と限りなく続いてますので、結構大変かも。
729:デフォルトの名無しさん
07/08/26 23:51:04
>>728
BOMを確認したければファイルの先頭をバイナリエディタで見てみろ。
BOMつきでなければ、VS2005でも食えない。
ワイド文字リテラルなら、話は簡単だな。
手でやらずに簡単なフィルタープログラムを書いて、機械的に変換してしまえ。
そんなら多国語でも関係ない。
730:デフォルトの名無しさん
07/08/26 23:55:03
助けて!以下のプログラムでメモリがおかしくなるお!
分母150 試行回数100000で繰り返すとなるお!
助けて!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i,j,dom,cnt,max,ret,k;
int ch;
int array[128];
int over, less;
long int times;
i = j = k = dom = cnt = times = max = 0;
printf("input dominator >");
scanf("%d", &dom);
printf("input times >");
scanf("%ld", ×);
731:730続き
07/08/26 23:55:39
LOOP:
k = 0;
over = less = 0;
while(getchar() != '\n');
printf("dominator = %d times = %d\n", dom, times);
sleep(1);
srand(time(NULL));
for(i=0; i<times; i++){
cnt++;
ret = rand() % dom;
if(ret == 7){
array[k] = cnt / 100;
array[k]++;
k++;
array[k] = -1;
printf("%d\n", cnt);
if(cnt > max){
max = cnt;
}
if(cnt > dom){
over++;
}
else{
less++;
}
cnt = 0;
}
}
732:730続き
07/08/26 23:56:15
for(i=0; array[i] != -1; i++){
for(j=0; j<array[i]; j++){
printf("*");
}
printf("\n");
}
printf("MAX = %d\n", max);
printf("OVER = %d ELSE =%d\n", over, less);
printf("%d/%d\n", over+less, times);
printf("%f\n", times / (double)(over + less));
printf("Retry ? (y/n) >");
ch = getchar();
if(ch == 'y' || ch == 'Y'){
goto LOOP;
}
return 0;
}
733:730
07/08/26 23:56:54
このままじゃパチンコで勝てないお!
助けてお!
734:デフォルトの名無しさん
07/08/27 00:00:33
こんなプログラム書いて何になるの?
735:デフォルトの名無しさん
07/08/27 00:01:41
>>734
>>733
736:724
07/08/27 00:01:41
>>729
ありが㌧。見てみたら、BOMついてませんね。
付けてオンパイルしてみます。ノシ
737:デフォルトの名無しさん
07/08/27 00:04:27
>>730
ざっとみだけど
>int array[128];
が足りてないだけじゃないの?
738:デフォルトの名無しさん
07/08/27 00:06:54
>>730
メモリをケチるな!
array[128] → array[2048]
期待値は (1/150)*100000=666.67
739:730
07/08/27 00:10:46
できたおおおおおおおおおお!
これで勝てるお!
740:730
07/08/27 00:11:55
期待値の詳細希望
741:730
07/08/27 00:14:06
なるほどお!ボヌスが666.67回くるってことかお!
ありがとお!
742:730
07/08/27 00:17:43
やっぱりすごいお
さっぱりわからなかったのに
すぐ回答がきたお
どうしたらそうなれるかお?
743:デフォルトの名無しさん
07/08/27 00:20:17
>>742
毎日2時間、電灯のヒモでボクシング。これを1年続けること。
744:デフォルトの名無しさん
07/08/27 00:21:02
みんな半年から1年ぐらい
アーバンチャンピオンと
スパルタンXで鍛えてるはず
745:デフォルトの名無しさん
07/08/27 00:26:58
>>740
100000回×(1/150)=666.67回 kがインクリメントされるわけだから
array[k]はarray[668]って式で参照される可能性があるわけで
array[128]と宣言したのではあきらかに足りないってことなんではないかと>期待値云々
こういう実行時に入力される値に依存するような大きさの配列はメモリの動的確保で扱うべきだとは思うけどね
746:724
07/08/27 01:39:46
>>736
ファイルの先頭にBOM(というか、ZERO WIDTH NON-BREAKING SPACE。ef bb bfの3バイト)を付加したら
無事、オンパイルできました。
747:デフォルトの名無しさん
07/08/27 01:42:28
>>746
いや、ファイル先頭にある場合、つまりBOMである限り、
それはBOMであってZERO WIDTH NON-BREAKING SPACEとは言わないんだ。
748:724
07/08/27 02:02:45
>>747
添削ありが㌧。
WikipediaのUTF-8(URLリンク(ja.wikipedia.org))のところに記述がありました。
> プロトコルが常にUTF-8である事を強制しているものである場合はBOMを禁止するべきで、
> この場合ファイル先頭のBOMは "ZERO WIDTH NO-BREAK SPACE" と見なされる。
> 逆にプロトコルがそれを保証しない場合BOMは禁止されずファイル先頭のそれはBOMと見なされる。(URLリンク(tools.ietf.org))
2文目ですね。
749:デフォルトの名無しさん
07/08/27 10:40:28
www.vista-osx.com/kensaku.htm
750:デフォルトの名無しさん
07/08/27 15:06:25
ヘッダファイルの書き方について質問です。
自分で複数ファイルのプログラムを作ったとき、
たとえば、mian.c , sub.c , sub.h という3つのソースファイル
からなるプログラムの場合、
$ gcc main.c sub.c
としますよね。
でも#include<stdio.h>などでは、
stdio.hにはプロトタイプ宣言しか無くて、printf( );とかの定義が無いはずなのに
$ gcc main.c stdio.c
などとしなくてもいいのはなぜですか?
751:デフォルトの名無しさん
07/08/27 15:09:05
パス通ってるからじゃないん?よーわからんけど
752:デフォルトの名無しさん
07/08/27 15:11:52
引数で指定しなくてもリンクされるようになってるから。
753:デフォルトの名無しさん
07/08/27 15:17:52
C++のvector配列って結構処理重いんでしょうか。
10MB前後のテキストデータをmallocしたポインタ読み込んで、区切り文字単位に編集・分解していった場合と、
stringに読み込んでからvector<string>に編集・分解していった場合で、
処理時間が前者が約25秒、後者が約60秒掛かったのですが、こんなもんなんですかね。
754:デフォルトの名無しさん
07/08/27 15:28:49
コードplz
755:デフォルトの名無しさん
07/08/27 15:34:02
vector に malloc なんか使ってるから・・・
756:デフォルトの名無しさん
07/08/27 15:36:15
>>753
vector<string>版も意外に速いなw
STLコンテナは基本的に値を保持するんで、その場合はstringのインスタンスを
コピーしまくることになる
ポインタだけで操作すれば格段に速いのは当たり前だ
vector<>が遅いというよりはメンバのコピーに時間がかかっているだけなので、
そこが性能のボトルネックになっているのなら、
vector<char*>でポインタを保持するなり
vector<int>でインデクスを保持するなりするとよいだろう
757:753
07/08/27 15:45:43
>>756
なるほど、言われてみればインスタンスのコピー云々で納得です。
御指導ありがとうございましたm(_ _)m
758:デフォルトの名無しさん
07/08/27 16:01:38
質問です。
i = (char*)malloc(sizeof(char) * 256);
でメモリ領域を確保したのですが、256バイト以上使用することができます。
なぜでしょうか?教えてください
759:デフォルトの名無しさん
07/08/27 16:03:02
>>758
たまたま
760:デフォルトの名無しさん
07/08/27 16:07:29
>>758
本来アクセスしちゃいけないところにアクセスしてるだけ
CはC#などとは違ってそんな事しても例外は発生しないし
たまたま何のエラーも出ない事がある
だからってそんな事やってたらきっとそのうちクラッシュするよ
761:デフォルトの名無しさん
07/08/27 16:10:57
>>758
一般的にmallocは、予めOSから確保しておいたでっかいメモリの塊から
必要な分だけを切り分けて自身の戻り値にしている(残りは次回以降のmallocなどで使う)。
理由は、OSのメモリ確保処理が大抵大容量の確保に向いていて小回りが利かないから。
そういうわけでその256バイトの後ろにも、OSから見れば
アプリケーションが確保した(実態はmallocが抱えていたり
他のmallocなどの呼出で使われている)メモリ空間が広がっている。
だから一見256バイトの後ろも読み書きできるように見えるというわけ。
762:デフォルトの名無しさん
07/08/27 16:16:24
758です。
勉強になりました。
ありがとうございます。
763:デフォルトの名無しさん
07/08/27 16:19:05
運が悪いと範囲外に書き込んだときに他の変数の値書き換えたりすることがあるから範囲外アクセスはNGよ
764:デフォルトの名無しさん
07/08/27 20:10:51
質問させて頂きます。
現在UNIX環境でコンソールベースのプログラムを組んでいるのですが
CUIからメニューの操作、カーソル操作の為のエスケープシーケンスに悩んでおります
コンソールベースのプログラム自体あまり組んだ事ないのですが
CUIからメニュー操作というのは可能なのでしょうか?
765:デフォルトの名無しさん
07/08/27 20:16:05
環境によるかもだけど、ncursesとか調べてみると幸せになれるかもしれない。
766:デフォルトの名無しさん
07/08/27 20:27:24
>>764
こんなのでいいなら簡単にできるけど
エスケープシーケンスの設定が済んでいることが前提
#include <stdio.h>
int main(void){
int i, x, y;
printf("\x1b[2J"); // clear screen
for(i=1;i<=9;i++){
x=i;
y=(i%2)+1;
printf("\x1b[%d;%dH", y, x); // cursor move
printf("%d", i);
}
return 0;
}
767:デフォルトの名無しさん
07/08/27 20:31:35
malloc使う奴はクソだとか言われる事が増えてきてる中、このスレは落ち着きますね…
768:デフォルトの名無しさん
07/08/27 20:34:39
まじで?そんなこと言う奴がいるのか・・・
769:デフォルトの名無しさん
07/08/27 20:52:36
vector型の配列をランダムに並び替えるには自前で作るしかないですかね?
770:デフォルトの名無しさん
07/08/27 20:56:12
std::random_shuffle だっけ
771:デフォルトの名無しさん
07/08/27 21:25:47
>>770
ありがとうございます
772:デフォルトの名無しさん
07/08/27 22:44:37
>>765-766
有難うございます。
ncursesについて詳しく調べて見たいと思います。
エスケープシーケンスからの操作なのですが、設定とはどう行うかご教授願えないでしょうか?
検索しても見つからなくてorz
773:デフォルトの名無しさん
07/08/27 22:51:24
>>772
UNIX環境なら使うターミナルを選ぶだけかな…
MS-Windows環境なら ansi.sys を読み込ませる
774:デフォルトの名無しさん
07/08/27 22:53:34
>>772
TERM環境変数
普通はシェルの初期化スクリプトなどで設定するが、
普通にシェルを操作できてるんなら、まあ大丈夫だろう
775:デフォルトの名無しさん
07/08/27 23:01:57
>773
えー。それって、Windows環境で、DOS-Exeを動かす場合だけでそ。
776:デフォルトの名無しさん
07/08/27 23:12:20
>>773-775
有難うございます。
凄く勉強になります。
ご教授して頂いた所を詳しく調べてみたいと思います。
777:デフォルトの名無しさん
07/08/27 23:48:42
>>775
bashとかでもあるよ。
778:デフォルトの名無しさん
07/08/27 23:54:03
だれか俺にbashとansi.sysの関係を教えてくれ。
779:デフォルトの名無しさん
07/08/27 23:58:10
すまん。レス番見間違えた。
780:デフォルトの名無しさん
07/08/28 03:00:09
プログラム初心者なのですが,助けてください.
VC++2005Express,WinXP Pro環境で,
コンソールアプリケーション上でWM_TIMERを使いたいのですが,
調べてみると不可視ウィンドウを作れば良いと書かれていました.
そこで,以下のようなウィンドウを生成しているのですが,うまく動きません.
ご教授いただけないでしょうか?
HWND Create(){
WNDCLASS wcHide;
HWND hwndHide;
// ウィンドウクラス
wcHide.style = 0;
wcHide.lpfnWndProc = (WNDPROC)MWndProc;
wcHide.cbClsExtra = 0;
wcHide.cbWndExtra = 0;
wcHide.hInstance = (HINSTANCE)GetModuleHandle(NULL);
wcHide.hIcon = NULL;
wcHide.hCursor = NULL;
wcHide.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcHide.lpszMenuName = NULL;
wcHide.lpszClassName = "";
hwndHide = CreateWindow ( wcHide.lpszClassName, "", WS_DISABLE, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, wcHide.hInstance, 0);
}
781:780
07/08/28 03:01:24
LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wp, LPARAM lp)
{
switch ( iMessage ) {
case WM_CREATE:
SetTimer(hWnd , 5000 , 1 , NULL);
return 0;
case WM_TIMER:
printf("test\n");
return 0;
}
return 0;
}
とりあえず,5秒毎に"test"を出力できるようにしたいのですが,
よろしくお願いします.
782:デフォルトの名無しさん
07/08/28 03:04:49
URLリンク(www.google.co.jp)
うまく動かないってのはどんな状況?
783:780
07/08/28 03:20:40
正しくはご教示でしたか
間違えて使っていました.ありがとうございます.
>うまく動かないってのはどんな状況?
何も表示されずに終了してしまいます.
以下を試してみましたが何も表示されませんでした.
・main文でCreate()を呼び出した後にwhile(1)やsleepをはさんでみる
・WndProc()関数の最初にprintfでチェッカーをはさむ
よろしくお願いいたします.
784:デフォルトの名無しさん
07/08/28 03:23:52
>>780
メッセージループはあるか?
なければググれ
785:デフォルトの名無しさん
07/08/28 03:32:35
ウィンドウクラスの名前が無い。
RegisterClassしてない。
SetTimerの第2引数と第3引数が逆とか、
ウィンドウプロシージャで自分で処理しないメッセージをDefWindowProc()に渡してない。
786:780
07/08/28 03:40:59
>>784
ありがとうございます.
ありません.早速ググってみました.
>>785
ありがとうございます.
調べてみます.
787:780
07/08/28 04:42:09
>>784
>>785
ありがとうございました.
ご指摘の通り,メッセージループ,RegisterClass,DefWindowProc()
全てを書いたところ,意図した動きをしました.
お世話になりました.
788:デフォルトの名無しさん
07/08/28 05:41:34
ちょっと質問。
・外部ハードからデータを所得(配列に格納)し、そのデータ長に数値計算を施し結果を画面上に表示させたい
この動作で、随時変化しているデータ長の所得・数値計算・グラフ描画、
この3つを同時?(なるべくリアルタイムにあるデータ長の数値計算結果をグラフ描画)したいんだけど、
こういう場合ってどんな風に処理・流れにさせればいいの?
例えば、マルチスレッド(出来るかどうかよくわかりませんが)を使って
データ所得→計算→描画
|
→データ所得→計算→描画
|
→データ所得→計算→描画
こんな感じで計算させつつデータを所得。描画させつつ計算。みたいに出来ますか?
789:デフォルトの名無しさん
07/08/28 05:56:44
所得
790:デフォルトの名無しさん
07/08/28 06:00:16
データ所得税
791:788
07/08/28 06:06:24
すんません。取得の間違いでした
792:デフォルトの名無しさん
07/08/28 08:23:36
その程度なら今のPCは十分に早いから
データ所得→計算→描画→データ所得→計算→描画
で十分じゃね?
データ取得に時間掛かるならデータ取得部分だけ別スレッドで回した方がいいけど。
793:デフォルトの名無しさん
07/08/28 18:09:00
典型的なProducer-Consumerパターンでないの?
794:デフォルトの名無しさん
07/08/28 22:40:45
>>788
出来る出来ないで言えば、出来ると思う。
どっちかいうと、例えばデータをファイルに書き込んでるなら、
データ書き込みとデータ読み出しの排他処理してるだろうから、
あんまり頻繁に読み出しに行くとデータ更新を阻害しそうで
そっちの方が怖い。
795:デフォルトの名無しさん
07/08/28 22:47:05
>>788読む限りでは出力先は画面でないの
ファイルに書き戻したりしてないように見えるけど
796:デフォルトの名無しさん
07/08/28 23:53:55
Windows SDKの_msize()で、callocした領域のサイズを見ようと呼び出したのですが、
呼び出した行でプロセスが停止してしまいます。
エラーも何も帰ってこず、前の行のprintfは呼ばれて、次の行のprintfは呼ばれていないという
状況です。_msize()の説明を見ると、動的確保されていない領域でも
エラーが帰ってくるみたいですが…
こういった症状聞いたことある方いませんか?
VC6でデバッグビルドです。よろしくお願いします。
797:デフォルトの名無しさん
07/08/29 00:09:09
ぬるぽではないのか
798:796
07/08/29 00:11:55
ガッ
799:デフォルトの名無しさん
07/08/29 00:13:31
引数に入れてやったポインタがNULLを指してるってことでしょうか
今環境がないので試せないですが、if ( p == NULL ) とかで見てみます
800:デフォルトの名無しさん
07/08/29 00:14:12
だめだこりゃ
801:デフォルトの名無しさん
07/08/29 00:16:09
?
違うんですか?
802:デフォルトの名無しさん
07/08/29 00:17:38
違う
803:デフォルトの名無しさん
07/08/29 00:19:45
よくわからないので教えて貰えませんか?
_msizeの戻り値を参照してるところで止まってる訳でもなく、
_msize自体で止まるので、引数として渡してやったポインタがNULLなのかと思ったのですが
804:デフォルトの名無しさん
07/08/29 00:25:12
>>803
NULLに対する対処くらいしていてもよさそうだけど
805:デフォルトの名無しさん
07/08/29 00:31:07
>>804
よく読んでみれば、
この関数は、パラメータを検証します。memblock が null ポインタの場合、
「パラメータの検証」に説明されているように、_msize は無効なパラメータ ハンドラを
呼び出します。エラーが処理されると、この関数は errno を EINVAL に設定し、-1 を返します。
とのことなので、-1が返ってくるようですね。
ぬるぽってヌルポインタ(Javaとかだとヌル参照例外)のことですよね?
引数のポインタがNULLでも動くなら、>>797は何について仰ってるのでしょうか?
806:デフォルトの名無しさん
07/08/29 00:31:26
>>803
試しに_msizeの引数にNULL入れたら、Assert出て落ちた。
VS2005 Standard Edition
「止まる」というのは、関数から戻って来ないのか、不正終了するのか、どっち?
807:デフォルトの名無しさん
07/08/29 00:35:00
ねるぽ
808:デフォルトの名無しさん
07/08/29 00:37:28
確認しないとわからないかも…
というのは、Windowsのサービスとして動かしてるのです。
サービスでも普通のプログラムと同じようになんかダイアログでて
落ちるのなら前者の関数から戻ってきてないのだと思いますが、
出なくて静かに落ちるなら、タスクマネージャからプロセスが生きてるか確認しないとわからないかも
>>796のそこで止まるというのは、_msizeを挟んで呼び出し前と呼び出し後を
ログに吐かせたときに、呼び出し前までしか吐かれてなかったのです。
Assert出て落ちるのなら、プロセスが静かに死んでそうな気がしてきました。
809:デフォルトの名無しさん
07/08/29 00:39:32
確認してなかったのか
810:デフォルトの名無しさん
07/08/29 00:40:17
ウザ~イ!ウザイよ小沢さん。想像で答えられてもウザ過ぎるよ。
811:デフォルトの名無しさん
07/08/29 00:49:13
まぁ「初心者歓迎」ってついとるし、初心者はバグの見所もわかんねだろ。
免罪符にゃならんが。
そこら辺分からんと答えよう無いしな。
812:デフォルトの名無しさん
07/08/29 00:49:15
そこだけ切り出してコンソールアプリにでもしてみれば。
NULLじゃないけど
IsBadReadPtrに引っかかるポインタとか
813:デフォルトの名無しさん
07/08/29 06:40:31
サービスであっても、デバッガアタッチするといいb
814:デフォルトの名無しさん
07/08/29 13:31:03
>>805
本当によく読んでるのか?
> _msize は無効なパラメータ ハンドラを呼び出します。
無効なパラメータ ハンドラが何やるかしってるか?
> 無効なパラメータが見つかると、C ランタイムは、
> 現在割り当てられている無効なパラメータ ハンドラを呼び出します。
> 既定により無効とされているパラメータが見つかった場合、
> ワトソン博士のクラッシュ レポートが起動します。
> 実行中のアプリケーションはクラッシュし、分析用のクラッシュ ダンプを
> Microsoft に提供するかどうかをユーザーに求めるメッセージが表示されます。
> デバッグ モードでは、無効なパラメータが見つかるとアサーション エラーになります。
815:デフォルトの名無しさん
07/08/29 20:48:30
かなり初歩的な質問で申し訳ないんだけど
現在VC++ 2005 Express Editionで開発中で、所謂多重定義の問題にハマっています
Formアプリで、複数のFormをどんどん遷移していくような感じなのですが
イメージとしては、ATMのような、各画面1クリックでどんどん進むようなので、それぞれの画面が
個別のFormとして作られています。
(Form1がForm2を作って、Form2が3を・・のような)
で、聞きたい事は、VC++2005ExpEditでは、Formを作ると、そのclassの定義がすべてForm1.h
のように、ヘッダファイルに書かれてしまいます。
このとき、Form1とForm2で相互にincludeしたい場合、多重includeガードをしても、定義のせいで
リンクがエラーになり、コンパイルが通りません。
いちいちForm1.hの中身を.cppにコピペし、宣言のみを.hに書き直すようなことをしなければいけないのでしょうか
うまい回避方法があれば教えてください。
(長文すみません)
816:デフォルトの名無しさん
07/08/29 21:58:45
C++/CLI?
817:デフォルトの名無しさん
07/08/29 22:02:03
API直で叩けばいいんじゃね?
818:デフォルトの名無しさん
07/08/29 22:25:54
stlのstring使っています。
このstringを1行ごとに読み込んで処理したいのですが、どのようにすればいいでしょうか?
tokenが使えないので、ちょっと苦労しています。一旦とってきたstringをcharに変えるのも、どうかなぁ……って気がしますし、
できれば、stringのままで一行ごとの読み込みがやりたいんですが、やり方を教えてください。
VC++2005 WinXPHomeです。
819:デフォルトの名無しさん
07/08/29 22:32:43
findとかiteratorで改行しらべる
820:デフォルトの名無しさん
07/08/29 23:01:37
>>815
#ifndef Form1_H
#define Form1_H
#include "Form2.h"
class Form1 : public Form
{
};
#endif
----------------------
#ifndef Form2_H
#define Form2_H
#include "Form1.h" //Form1.hからincludeされた場合はForm1_Hが定義済みなのでインクルードガードで無視される
class Form2 : public Form
{
};
#endif
こんな感じで書かれてればエラー出ないと思うんだが‥‥
821:デフォルトの名無しさん
07/08/29 23:48:13
つか、C++を使ってなぜ.NETなのかさっぱり分からん
822:デフォルトの名無しさん
07/08/29 23:51:54
つか、C++を使ってるのか.NETなのかさっぱり分かってないんだろう
823:デフォルトの名無しさん
07/08/29 23:52:29
>>818
std::istringstreamとstd::getline(std::stringを引数にとるほう)はだめ?
824:デフォルトの名無しさん
07/08/29 23:56:08
>>818
意味がイマイチわからんかったが、
istringstream と >>
じゃだめか?
825:デフォルトの名無しさん
07/08/29 23:58:58
>>823
あ
そっちじゃなきゃだめだわ
(大域のgetline か basic_istream<> の istream)
826:デフォルトの名無しさん
07/08/29 23:59:07
>>818
boost, boost-sandbox or pstade使ってもいいなら良い方法があるんだけどいいかな? by boost厨
827:デフォルトの名無しさん
07/08/29 23:59:32
basic_istream<> の istream ×
basic_istream<> の getline ○
828:デフォルトの名無しさん
07/08/30 00:04:46
聞いてくれよ、おら
C++のunionにメソッドを置おけること、昨日知ったよ、orz
これって常識?
829:デフォルトの名無しさん
07/08/30 00:12:39
>>828
structはよく見るけどね
830:デフォルトの名無しさん
07/08/30 00:12:40
unionを使うことが非常識
831:デフォルトの名無しさん
07/08/30 00:17:44
どちらかというと常識ではないと俺は思う。
自身で使ったことがないし、他人が使っているのを見たこともないし。
832:デフォルトの名無しさん
07/08/30 00:25:36
なんかクラスWidgetがあって、
Widget();
という文があったら、Widgetのオブジェクトを(デフォルトコンストラクタで)作成して、
次の行に逝く前にすぐ消される(デストラクタが呼ばれる)と思います。
んじゃ、こういう場合はどうだろうと思い、↓を書いてみました。
Widget *w = &Widget();
「Widget() はこの行でデストラクタが呼ばれ消えてしまうので、ポインタwは無効になるだろう」と考え、
考え通り、すぐデストラクタが呼ばれました。
んじゃ、参照はどうだろうと・・・
Widget &w = Widget();
自分の考えとは違ってすぐにデストラクタが呼ばれず、この関数(またはブロック)を抜けるところでデストラクタが呼ばれました。
参照だと何か特殊なんですかね・・・
833:デフォルトの名無しさん
07/08/30 00:29:15
参照には null が無いから
834:デフォルトの名無しさん
07/08/30 00:34:16
大きなファイルサイズの読み込みを早めるためにMemoryMappedFile使う場合、
ファイル全てのアドレスを割り当てたらまずいですよね・・?
やはりマッピングアドレスを動的に変化させる仕組みが必要でしょうか?
そうすると編集時に問題になってしまいそうですが、何かセオリーみないなモノはあるのでしょうか?
835:デフォルトの名無しさん
07/08/30 00:39:33
>>832
const参照なら標準規格でも明文化された規定になっている。
(知っている人は少ないかもしれないが)
けれど、非const参照の初期化に一時インスタンスの使用はできないことになっている。
一時インスタンスは右辺値だが、非const参照の初期化には左辺値が要求されるため。
最近のVC++やg++ではエラーになる。
どうせお前が使っているのはBorand C++だろう。窓から投げ捨てろ。
836:デフォルトの名無しさん
07/08/30 00:40:16
>>832
参照は一時オブジェクトを捕まえておける
関数の戻り値とかもおっけー
837:836
07/08/30 00:40:53
const参照だけだっけか。すまそ。
838:デフォルトの名無しさん
07/08/30 01:04:15
>>823,824
thx istringstreamでいってみます。
839:デフォルトの名無しさん
07/08/30 12:51:44
>815
別にForm1の定義がまるまる欲しいわけじゃないでそ。
Form *createForm2();
みたいな生成関数があれば大抵足りるんじゃないの。
840:デフォルトの名無しさん
07/08/30 13:45:38
>>820
ガードは試してみたんですが、「定義」が.hに書かれているので・・
>>839
まったくそのとおりなんですが
VCを使うと、デフォルトでヘッダファイルに定義が書かれているんですよ
なので、どうしたものだろうかと
やっぱり、いちいち自分でヘッダファイルに書いてある定義をcppに持っていって、ヘッダファイルでの
宣言は改めて書くようにしないとダメなんでしょうか
841:デフォルトの名無しさん
07/08/30 15:06:39
>>835
BCCタンを悪く言うと痛い目にあうお(#^ω^)ビキビキ
842:デフォルトの名無しさん
07/08/30 15:56:48
>>835
警告は出るがな
843:デフォルトの名無しさん
07/08/30 16:09:45
>>840
form2.h では、#include "form1.h"のかわりに、
class Form1;
と書いとけ。
これで、Form1* ほげほげって書けるようになる。
form1.h でも同様にする。
form1.cpp, form2.cpp では、両方のヘッダファイルをincludeする。
844:デフォルトの名無しさん
07/08/30 21:06:59
BorlandC++5.5.1を使ってコンパイルしているのですが、
このコンパイルをプログラム側からSystem()関数で行った場合に、
プログラム側でコンパイルでエラーが出たかどうかを判断できないのでしょうか?
具体的には System(bcc32 helloworld.c); の返り値とかで判断できないものでしょうか?
845:844
07/08/30 21:07:40
すみません、C言語です。
846:デフォルトの名無しさん
07/08/30 21:30:34
無理。
847:844
07/08/30 21:33:22
>>846
そうですか、意外とプログラム側から分かる情報は少ないんですね。。。
どうしようかな・・・
848:デフォルトの名無しさん
07/08/30 21:38:26
諦めろ
お前には無理
お前のプログラム側から分かる情報なんて皆無
849:デフォルトの名無しさん
07/08/30 21:42:46
んあ?
コンパイルに失敗したかどうかは分かるんじゃない?
エラーが出たのかどうかは分からんが。
BCCのsystem()は良く知らん。
gccのなら、↓でcommandの終了コード取れたと思うけど。
status = system("command");
if(WIFEXITED(status))
exit_code = WEXITSTATUS(status);
850:844
07/08/30 22:02:00
>>849
manpageを見る限りだと、<sys/types.h>と<sys/wait.h>の二つをインクルードするみたいなのですが、
これをコンパイルしたところ、sys/wait.hをオープンできないというエラーがでます。
何故でしょうか・・・;;
ちなみにそのWEITSTATUSの返り値はint型でいいのでしょうか?
851:デフォルトの名無しさん
07/08/30 22:04:07
お前がアホだから
852:デフォルトの名無しさん
07/08/30 22:06:34
数千行から1万行程度で書けて、出来たとき達成感のあるような練習課題思いつけば教えてください
テトリスとかどうかなと思ってるんですが
853:デフォルトの名無しさん
07/08/30 22:33:30
将棋でも作れば?
854:デフォルトの名無しさん
07/08/30 22:36:06
>>852
テトリス
855:デフォルトの名無しさん
07/08/30 22:48:33
>>850
いや、ちょっと待ち。
BCCはWindowsの話じゃないのか?
gccはUNIXとかLinuxの話で。
WEXITSTATUSがBCCでも存在するか知らんのだが。
856:デフォルトの名無しさん
07/08/30 22:49:26
>>850
なぜなら、manpage は bcc じゃないから。
戻り値よりも、obj ファイルや exe ファイルが生成されてるかどうかを見た方が楽なんじゃないか。
857:デフォルトの名無しさん
07/08/30 22:51:43
>>852
テトリス
858:844
07/08/31 00:21:14
>>856
それだとコンパイルするたびに、objファイルを消さないといけないですよね。
コンパイル前にobjファイルとexeファイルを消すプログラムにすれば済む話かもしれないですけど・・・
859:デフォルトの名無しさん
07/08/31 00:25:28
>>852
2ch専用ブラウザ機能付きテトリス
セルフコンパイル機能付きテトリス
英日翻訳機能付きテトリス
OCR機能付きテトリス
人工無能機能付きテトリス