【初心者歓迎】C/C++室 Ver.61【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001猫でもわかる
2008/11/11(火) 05:02:51ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.60【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1224057986/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
>>2-1001 猫をよろしくです。
0002猫でもわかる
2008/11/11(火) 05:04:58. ,′ .: } .: :}:.. i . '
′ .:; ,;: j .:} .:}.:;ハ::. ! ', ',
. , ,′ .; 〃 .::. ′ .::ハ .:j厶 L:.__ 八| '. :.
′ .: i . i .:ii.:..:{:..,′ .:::/ }「/ jノ_|:.:. / │ . : ! | i
' .: .:: i : i .::jム从:゙ ..:j/ l/ . r=≠ミ 、| .: .: ! | i
i.:/ .:. ! .: |/ |」.ニ { ..:八 丿 〈/i:::j/:ハヾV .:: .:.:リ: l i
i:ハ .:..:{:..', ::.:.. {/|ハルf'i⌒ト、从 ヽ ' {::.:゚。:.:::} l/ .:: .::/:.:. !
ii , ..::l.:. '. ::..:.. ', 〃{し'。(_V{ ヾ::::::::リ/ / .::八.:..:. ', | お会いできて嬉しいね
ii. '. .::l::{::. 、::.:.. '.:{{ V:::゚:.:::} ¨´/, イ .::イ.:i:.:.:..:.. '.|
. i! :、:l八::...\:. ヾ` ヾ::::::ノ ///´ j/..:l:.:i::.:..:.. :、 ヽ、
\. \::...` ー-- ¨´// ′ j .::ii:.:.:.:..:..ヽ ` .._
i ヽ∧ :i'. -‐..'′ イ .:ii:.:.:..:.. :.. :、 `丶、
i .:,' ..:. ,ハ、 / .| ..::i:!:.:.:.:..:.. :.. :、:.. . \
j.:/ .::} '.::i:::> ..,_ . '゙ | .:.:,'!:.:.:.:.:..:..:.. ', :.:..:..、 ヽ
/ .::丿.:.:j/ `7ァ' __,ノ| :,:' .::ト . :.:.:..:..:..:..' :.:.:.. \:.. }
. / ..::/ .:.:/! __\》 _ノ / . ゙ ..::} ` ー- ,」_:..:..:..:.. ヽ ,′
. 〃 .: .:/ ..:.:/ ii ト--=ミr(_ -‐/ ,.:゙ ..:.:,′ 〃 `丶、:.: }:./
. {{ .::≠/ ..:.:/ !! {__彡イ」 ̄¨¨/ / ..::// /,′ ヽ:.:(
0003猫でもわかる
2008/11/11(火) 05:07:03> ゆっくりしていってね!!! <
 ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
/~', /~',
/ '"゛' ;,
ミ ´ ∀ ` ';.
ミ, ,;
ミ ,,.,) (,,., ;,ハ,_,ハ.
'ミ ;,´∀` ':,
ツ ,;', u u ,:
"'U'""゛'U' ' 、,_,,_,., '
0004デフォルトの名無しさん
2008/11/11(火) 06:31:350005デフォルトの名無しさん
2008/11/11(火) 06:59:280006デフォルトの名無しさん
2008/11/11(火) 07:09:470007デフォルトの名無しさん
2008/11/11(火) 13:40:180008デフォルトの名無しさん
2008/11/11(火) 17:50:46半角スペースじゃ複数入れても1つ分になるから、 のことかと思ったが
ソース見ても半角スペースのままだな。
0009デフォルトの名無しさん
2008/11/11(火) 18:29:08その場その場にエラーメッセージ出力コードを書かないと駄目で
エラー処理コードで本筋がgdgdになっちゃう、しかし
例外ならとりあえずその場では投げるだけで済むために出力コードをまとめられる
といった理由で、エラーで落ちるようなところではけっこう気前良く例外を使っちゃってるけど
そういう理由でも濫用になるんでしょうか?
一応、エラーといっても初期化の失敗とか結構fatalなエラーに対して使ってるんだけど、
こういうのでも戻り値とかでなんとかするべき?
0010デフォルトの名無しさん
2008/11/11(火) 18:39:4600119
2008/11/11(火) 18:50:09なら安心しますた
0012デフォルトの名無しさん
2008/11/11(火) 20:09:390013デフォルトの名無しさん
2008/11/12(水) 01:58:00NMHDR lParam;
lParam.code = 4;
lParam.hwndFrom = (HWND)GetAncestor(GA_PARENT);
lParam.idFrom = 1;
NMHDR* lPara = &lParam;
GetAncestor(GA_PARENT)->SendMessage(WM_NOTIFY, (WPARAM)wPara, (LPARAM)lPara);
これの使い方はどこかおかしいですか?
0014デフォルトの名無しさん
2008/11/12(水) 02:18:110015デフォルトの名無しさん
2008/11/12(水) 02:49:220016デフォルトの名無しさん
2008/11/12(水) 04:34:35スッ!!
0017デフォルトの名無しさん
2008/11/12(水) 06:24:06CString* buf;
CString a;
buf = &a;
CString str = str + *buf;
0018デフォルトの名無しさん
2008/11/12(水) 08:10:49CString str;
str = str + *buf;
なら通るかと
0019デフォルトの名無しさん
2008/11/12(水) 08:32:23ありがとう
0020デフォルトの名無しさん
2008/11/12(水) 11:20:45一旦中間変数 lPara に置く意味がないなら、第3引数は (LPARAM)&lParam でいーんじゃね?
くらいかな。
0021デフォルトの名無しさん
2008/11/12(水) 11:42:25(LPARAM)&nmhdrとか
0022デフォルトの名無しさん
2008/11/12(水) 14:51:470023デフォルトの名無しさん
2008/11/12(水) 15:00:170024デフォルトの名無しさん
2008/11/12(水) 18:59:44protected:
Hoge(int);
public:
Hoge(const Hoge& hoge);
Hoge& operator =(const Hoge& hoge);
};
こういうコピーはできるけど、普通に作ろうとすると派生クラスしかできないクラスがあるとき
Hoge Moja::get(){
struct Piyo:public Hoge{
Piyo( int i ) : Hoge(i){}
} piyo( this->id );
return Hoge(piyo);
}
というふうにして、コンストラクタしかない派生クラスの参照を、既定クラスのコピーコンストラクタに
渡して実体を返す関数を使ってるんだが、こういうのってあり?
0025デフォルトの名無しさん
2008/11/12(水) 19:00:41×派生クラスしかできない
○派生クラスからしか作れない
0026デフォルトの名無しさん
2008/11/12(水) 19:59:06スライシングと言って、Moja::getが返すのはPiyoではなくHogeになるが、
どうしてもそれが適切だというのなら。
0027デフォルトの名無しさん
2008/11/12(水) 20:01:56Waveという構造体があります。(チャンネル数、サンプリングレート、波形データなどを格納)
Free_wave()で領域開放できます。
void func(Wave *wavep){
Wave *wavepbuff //モノラルにしたファイルを置く領域へのポインタ
作った領域にモノラル化したデータを入れる
*wavep = *wavepbuff
}
int main(){
Wave *wavep
ステレオファイルをwavepの指す領域に格納
func(wavep); //wavepが指す場所にモノラルファイルを入れてくる
}
こんな感じで書いたんですが、 funcのwavepbuffで作った領域は開放したらだめですよね?元のステレオファイルを格納していた
場所は開放していいんでしょうか?
0028デフォルトの名無しさん
2008/11/12(水) 20:09:42Wave *wavepbuff //モノラルにしたファイルを置く領域へのポインタ
領域を作り、wavepbuffに指させる。wavepbuffが指す領域にモノラル化したデータを入れる という処理をする
//wavepにwavebuffを代入
*wavep = *wavepbuff
}
ここわかりにくいので書き加えました。
0029デフォルトの名無しさん
2008/11/12(水) 20:41:16モノラル化し一時的に、wavepbuffが指す場所に置く。
その場所を指すようにポインタ(wavep)を指しなおす。
それまでwavepが指していた領域(ステレオファイルがあった)を解放する。
という作業です
0030デフォルトの名無しさん
2008/11/12(水) 20:54:59void Swap_wave(Wave *a, Wave *b) {
Wave tmp = *a;
*a = *b;
*b = tmp;
}
void func(Wave *wavep){
Wave *wavepbuff = Alloc_wave();
〜〜
Swap_wave(wavepbuff, wavep);
Free_wave(wavepbuff);
}
int main() {
Wave *wavep = Alloc_wave();
〜〜
func(wavep);
〜〜
Free_wave(wavep);
}
0031デフォルトの名無しさん
2008/11/12(水) 20:56:26どのあたりがやめるべきでしょうか?
0032デフォルトの名無しさん
2008/11/12(水) 21:01:220033デフォルトの名無しさん
2008/11/12(水) 21:03:16Swap_waveはポインタを差し替えてるだけですよね?
だったらwaveの構造体自体は書き換えずに、freeでステレオファイルの領域だけ消せばOKかな?と考えました。
甘いですかね?・・・・
0034デフォルトの名無しさん
2008/11/12(水) 21:09:17ポインタだけ指し替えたいなら
void func(Wave **wavep){
〜
}
int main() {
Wave *wavep;
〜
func(&wavep);
〜
}
こうしなきゃ
0035デフォルトの名無しさん
2008/11/12(水) 21:14:09このPiyoクラスはスライシングが起きてもC++の規約上何の問題も無いでしょうか?
デストラクタもメンバ変数もないし、virtualな関数もオーバーライドしてないんですが
0036デフォルトの名無しさん
2008/11/12(水) 21:14:31tmpにwavepbuffの実体をコピー。
*a = *b;
wavepbuffを元のwavepを指すようにして
*b = tmp;
wavepが指す領域に実体をコピー
ってやってるんですか?
0037デフォルトの名無しさん
2008/11/12(水) 21:50:440038デフォルトの名無しさん
2008/11/12(水) 22:18:340039デフォルトの名無しさん
2008/11/12(水) 22:27:12関数の引数はWave *wavepのままに
ポインタだけ指し替えることはできますか?
004039
2008/11/12(水) 22:28:030041デフォルトの名無しさん
2008/11/12(水) 22:39:25Wave *wavepは構造体のアドレスを指す”変数”だ。
その変数をコピーして呼ばれてるのに
呼び出し元の変数に入ってるアドレス値を変えることは出来ないよ
0042デフォルトの名無しさん
2008/11/12(水) 22:43:31Wave *pp //wave構造体へのポインタが入ってる変数へのポインタ
pp = wavep;
}
こうですか?
0043デフォルトの名無しさん
2008/11/12(水) 23:00:55違う
Wave tmp = *a; ... tmpにwavepbuffの実体をコピー
*a = *b; ... wavepbuffが指す領域にwavepの実体をコピー
*b = tmp; ... wavepが指す領域にtmpの実体をコピー
常に実体 (Wave構造体の中身) をコピーしている
ポインタだけを交換することはできない状況だから、中身を交換するしかない
>>39
できない
0044デフォルトの名無しさん
2008/11/12(水) 23:04:35なるほど。
ポインタへのポインタをしたい場合は、void func(Wave **wavep)とやるしかないんですね・・・
引数そのままで、関数内でWave **p =&wavepとしたら、pには何がはいるんですか?
0045デフォルトの名無しさん
2008/11/12(水) 23:11:42func の wavep を指すポインタが入る
main の wavep を指すポインタではない
func の wavep と main の wavep は (たまたま名前が同じだけの) 異なる変数で、
アドレスも当然異なるから、func の wavep をどういじっても main の wavep には影響しない
0046デフォルトの名無しさん
2008/11/12(水) 23:14:190047デフォルトの名無しさん
2008/11/12(水) 23:22:43Wave *tmp; //構造体へのポインタ変数 アドレスが入る
tmp=あろけーしょん
*wavep = tmp; アドレスの実体をコピー
}
main(){
Wave *p;
func(&p);
}
こうですか?
0048デフォルトの名無しさん
2008/11/12(水) 23:22:470049デフォルトの名無しさん
2008/11/12(水) 23:24:220050デフォルトの名無しさん
2008/11/12(水) 23:25:47どこの部分ですか?
0051デフォルトの名無しさん
2008/11/12(水) 23:26:31funcの引数
0052デフォルトの名無しさん
2008/11/12(水) 23:27:32デストラクタがあってもメンバ変数があってもvirtual関数があっても構いはしない
問題はその動作が自分の意図と一致しているかどうかだ
0053デフォルトの名無しさん
2008/11/12(水) 23:29:10わかりました。ポインタが全然わかってないので、勉強しないと・・・
func内で
Wave **p;
p =wavep;
としたらどういう事してますか?
0054デフォルトの名無しさん
2008/11/12(水) 23:50:33Wave *tmp; //構造体へのポインタ変数 アドレスが入る
tmp = あろけーしょん //モノラルファイル作る
Wave *tmp_p;
tmp_p = *wavep; //ポインタのポインタの実体すなわち main関数で宣言したWaveへのアドレスを代入 (最初あったファイルの領域)
*wavep = tmp; //mainで宣言したWaveへのアドレス を モノラルファイルのwaveへのアドレスに書き換え
Free_Sound(tmp_p); //一番最初にあった領域を解放
どこか間違ってますかね?
0055デフォルトの名無しさん
2008/11/13(木) 00:11:140056デフォルトの名無しさん
2008/11/13(木) 00:12:060057デフォルトの名無しさん
2008/11/13(木) 00:19:12memcpyは解放しなくていいんですか?
そもそも変数を作ればメモリ容量があればメモリに格納されますよね?
なんでHeapAllocとかが存在するんですか?普通に配列変数を確保すればFreeもスコープはずれを活用すれば必要ないですよね?
0058デフォルトの名無しさん
2008/11/13(木) 00:24:550059デフォルトの名無しさん
2008/11/13(木) 00:28:50何を勘違いしているのか知らんが、memcpy()はコピーだからメモリアロケートするわけじゃないぞ。
メモリ確保周りの再履修をお勧めする。
0060デフォルトの名無しさん
2008/11/13(木) 00:42:37本当に勝手ですいませんが
0061デフォルトの名無しさん
2008/11/13(木) 00:45:15パスカル系言語の代入演算子かもね
0062デフォルトの名無しさん
2008/11/13(木) 00:45:46寝ろ。
分かるまでだと今日明日くらいは徹夜になるぞwww
0063デフォルトの名無しさん
2008/11/13(木) 00:47:03そんなに間違ってますか?
ますます練れません・・・
0064デフォルトの名無しさん
2008/11/13(木) 00:47:58解放しないで再度HeapAllocした場合なぜポインタとハンドル名が同じなのにメモリリークしていくんですか?
もしかして、変数もスコープはずれてないと、確保した変数が番地行方不明なだけで再利用不可能ゴミ領域として残って
あ!それがnewしたらdeleteなのかわかっちゃったthx
0065デフォルトの名無しさん
2008/11/13(木) 00:51:27_(__つ/ ̄ ̄ ̄/_
\/ /
0066デフォルトの名無しさん
2008/11/13(木) 01:03:50そのうち辛く苦しいものになることうけあい
0067デフォルトの名無しさん
2008/11/13(木) 10:43:39借りた1万円なくして返さないまま追加で借りた1万円を同じ財布に入れたのに
なんで借金が増えてるんですか?みたいだなあ。
>ポインタとハンドル名が同じなのに
ポインタは別のものが与えられる。ハンドル名に至っては意味不明。
0068デフォルトの名無しさん
2008/11/13(木) 11:06:090069デフォルトの名無しさん
2008/11/13(木) 12:24:43「SSE/SSE2最適化」オプションが付いたとのことで、早速オンにして
コンパイルしましたが、さっぱり早くなりません。
printf ("%d回LOOP実行中\n",loop);
for (int i = 0; i < loop; i++){
for (int j=0; j<4; j++){
s1[j] = double(rand()) / 32767; /* 0〜1までの乱数*/
s2[j] = double(rand()) / 32767;
}
for (int k=0; k<4; k++){
result[k] = s1[k] * s2[k];
}
}
上のように、変数LOOPを1億として4個の配列に浮動小数点乗算を格納する処理を
行いましたが、SSE有り無しにかかわらず36秒かかりました。
SSEの効果が実感できるようなコードはどう書けばいいんでしょうか?
0070デフォルトの名無しさん
2008/11/13(木) 13:58:19rand呼んでる時点でSIMD化できないよ。
インテルにCPUの命令が載ったリファレンスあるからそれで仕様確認して素直に書けばSIMD化してくれる。
0071デフォルトの名無しさん
2008/11/13(木) 17:02:51インラインアセンブリとかによるSSE活用ですね。
for (int k=0; k<4; k++){
result[k] = s1[k] * s2[k];
}
この箇所はSIMDの得意分野のような気がするのですが、
なんでダメなんでしょう。doubleをfloatに変えてもみましたが同じでした
0072デフォルトの名無しさん
2008/11/13(木) 18:18:12http://msdn.microsoft.com/ja-jp/library/7t5yh4fd(VS.80).aspx
> SSE と SSE2 は、SSE/SSE2 命令およびレジスタを使用する方が
> x87 浮動小数点レジスタ スタックを使用するよりも高速であると判断された場合に、
> 一部のスカラ浮動小数点演算に使用されます。
128ビットフルに使いたければ、自分で組み込み関数を呼ぶかインラインアセンブラ。
0073デフォルトの名無しさん
2008/11/13(木) 21:10:22浮動小数点演算をFPUからSSEに切り替えるだけみたいですね。
インラインアセンブラ調べてきます・・
0074デフォルトの名無しさん
2008/11/14(金) 00:36:030075デフォルトの名無しさん
2008/11/14(金) 08:44:49メッセージ処理を多様するのはやばい?なにか問題が出て来りする?
0076デフォルトの名無しさん
2008/11/14(金) 11:23:098万も払うのかな
0077デフォルトの名無しさん
2008/11/14(金) 11:42:410078デフォルトの名無しさん
2008/11/14(金) 12:02:04それにlinuxとlinux版icc入れた方がよさそうだなw
0079デフォルトの名無しさん
2008/11/14(金) 17:40:11頭痛が痛い
0080デフォルトの名無しさん
2008/11/14(金) 19:38:038万もするのにVSに寄生しなければいけないって信じられないよな。
0081デフォルトの名無しさん
2008/11/15(土) 01:34:44どんなコード書けば差が出るの?
0082デフォルトの名無しさん
2008/11/15(土) 03:36:270083デフォルトの名無しさん
2008/11/15(土) 06:03:44オブジェクト間最適化も負けていません。
0084デフォルトの名無しさん
2008/11/15(土) 13:18:03すげえ!SSSEに対応してるのか!
0085デフォルトの名無しさん
2008/11/15(土) 14:10:28struct A
{
int x;
A()
{
x = 0;
}
};
struct B : public A
{
int y;
};
こんな感じのコードが出てきて、実際サンプルコードのコンパイルも通ったのですが
・構造体にコンストラクタを入れる
・構造体を継承した構造体を作る
こんなんアリでしたっけ?
それと、classにするのに比べてどんなメリットがあるんでしょうか
0086デフォルトの名無しさん
2008/11/15(土) 14:11:230087デフォルトの名無しさん
2008/11/15(土) 14:14:41classとsutructの違いは、ディフォルトがpublicかprivateかだけ。
でも、そういう使い方をするならclassにして欲しいと思うけどね。
個人的なclassとstructの使い分け。
・データメンバを公開するならstruct
・只のアクセッサやコンストラクタではない能動的なメンバ関数を持つならclass
・継承されるならclass
0088デフォルトの名無しさん
2008/11/15(土) 14:15:200089デフォルトの名無しさん
2008/11/15(土) 14:27:020090デフォルトの名無しさん
2008/11/15(土) 17:03:04{
char s[256];
sprintf( s ,"%d" , a);
MessageBoxA( NULL, s,NULL,NULL);
}
void MsgBox( float a )
{
char s[256];
sprintf( s ,"%f" , a);
MessageBoxA( NULL, s, NULL,NULL);
}
void MsgBox( double a )
{
char s[256];
sprintf( s ,"%f" , a);
MessageBoxA( NULL, s, NULL,NULL);
}
void MsgBox( char *s )
{
MessageBoxA( NULL, s, NULL,NULL);
}
void MsgBox( wchar_t *s )
{
MessageBoxW( NULL, s, NULL,NULL);
}
まとめる方法を求む
0091デフォルトの名無しさん
2008/11/15(土) 17:27:09{
MessageBox( NULL, s,NULL,NULL);
}
int a;
tchar s[256];
stprintf( s ,_T("%d") , a);
MsgBox(s);
0092デフォルトの名無しさん
2008/11/15(土) 18:21:10その動作ならわざわざ作らないよ
数値を受け取れるようにね
0093デフォルトの名無しさん
2008/11/15(土) 18:26:23void MsgBox( T s )
{
std::ostringstream os;
os << s;
MessageBoxW( NULL, os.str().c_str(), NULL,NULL);
}
0094デフォルトの名無しさん
2008/11/15(土) 18:42:55わざわざ作ってるのが間抜けだって思われたんじゃないかな
0095デフォルトの名無しさん
2008/11/15(土) 18:57:06thx
>>94
逆にこうしかできないのが残念だよね
0096デフォルトの名無しさん
2008/11/15(土) 19:17:00何でこんなの作るんだと思た
デバッグ用? てなことないよな
何に使うのか知いな>>95
0097デフォルトの名無しさん
2008/11/16(日) 01:00:02void MsgPrintf(char *format, ...)
{
va_list ap;
char buf[1024];
va_start(ap, format);
wvsprintf(buf, format, ap);
MessageBox(NULL, buf, NULL, MB_OK);
va_end(ap);
}
MsgPrintf("%d %f", 1, 1.5);
デバッグ用に OutputDebugString に渡すやつなら使ってるが。
0098デフォルトの名無しさん
2008/11/16(日) 01:01:260099デフォルトの名無しさん
2008/11/16(日) 12:30:19いつデータ配列を参照しても最初のデータが配列番号0から始まる仕組みはSTLにありますか?どれを使えばいいんですか?
0100デフォルトの名無しさん
2008/11/16(日) 12:36:13deque
0101デフォルトの名無しさん
2008/11/16(日) 12:41:100102デフォルトの名無しさん
2008/11/16(日) 17:17:48vwprintf 使おうぜ
0103デフォルトの名無しさん
2008/11/16(日) 18:59:32バイナリをリソースに追加したいんですが、どうやってやりますか?
リソースビュー開いて 追加→リソース→ウィンドウが開く(リソースの追加)。
項目がAccelerator、Bitmap、Cursor、Dialog、HTML、Menu、StringTable、Toolbar、Version
しかないんですが、どうすればいいでしょうか?
0104デフォルトの名無しさん
2008/11/16(日) 19:09:17日のインスタンスを++したら翌日になったり、国名を与えれば、与えられた日が休日かどうかを
簡単に判定できたり。
0105デフォルトの名無しさん
2008/11/16(日) 19:15:080106デフォルトの名無しさん
2008/11/16(日) 19:16:080107デフォルトの名無しさん
2008/11/16(日) 20:42:47C/C++でそれをやるんですよね。
VSの操作をC/C++で書いたソフトでやりたいんですね。
0108デフォルトの名無しさん
2008/11/16(日) 23:02:46class X;
typedef boost::shared_ptr<X> X::HandleType;
ってのが通るかどうかはやっぱ環境依存?
DS用のCodeWarriorは通してくれるんだけどVC++2008Expressだと
error C2027: 認識できない型 'X' が使われています。
って言われるんだよ。
0109デフォルトの名無しさん
2008/11/16(日) 23:04:080110デフォルトの名無しさん
2008/11/16(日) 23:19:52Xの具体的な情報が必要ならムリ
0111デフォルトの名無しさん
2008/11/16(日) 23:42:21typename
0112108
2008/11/17(月) 00:11:49レスありがとう。
typedef typename boost::shared_ptr<X> X::HandleType;
にしてみたら、
error C2899: 型名はテンプレート宣言の外側で使用できません。
が増えた。
X::HandleType を X_HandleType とかにすりゃあ行けるんだがなあ。
やはり、クラス内typedefを先行宣言できるCodeWarriorが変態的なだけなんだろうか…。
0113デフォルトの名無しさん
2008/11/17(月) 00:12:13この配列を関数の実引数として使うにはどのような形にすればよいでしょうか?
0114デフォルトの名無しさん
2008/11/17(月) 00:20:300115デフォルトの名無しさん
2008/11/17(月) 00:20:38実引数?
hoge(str);
でいいんじゃ。
0116デフォルトの名無しさん
2008/11/17(月) 00:25:03f( {"OUT","CD","RING"} );
0117デフォルトの名無しさん
2008/11/17(月) 00:26:57char (*x)[5] って仮引数じゃね
0118デフォルトの名無しさん
2008/11/17(月) 00:27:01それいけんの?
0119デフォルトの名無しさん
2008/11/17(月) 00:32:11char str[][5]={"OUT","CD","RING"}; を
参照渡しで、関数に渡す場合の
仮引数と実引数てどう書くんですか?
0120デフォルトの名無しさん
2008/11/17(月) 00:39:55f( char str[][5]={"OUT","CD","RING"} );
0121デフォルトの名無しさん
2008/11/17(月) 00:40:50{
}
hoge(str);
0122デフォルトの名無しさん
2008/11/17(月) 00:41:330123デフォルトの名無しさん
2008/11/17(月) 00:46:10>>122
>>122
0124103
2008/11/17(月) 06:05:54すみませんできました。
良く調べないでカキコミしてすみません。
○○.rcファイルを右クリック→コードの表示
以下を○○.rc以下を最後に記述。
DATANAME DATATYPE DISCARDABLE "DATA_Path"
○○.cppで
HGLOBAL hResource = LoadResource( NULL, FindResource( NULL, TEXT("DATANAME"), TEXT("DATATYPE") ) );
LPBYTE lpResrouce = (LPBYTE)LockResource(hResource);
チラ裏&スレ汚しスマソ。
0125デフォルトの名無しさん
2008/11/17(月) 11:36:36その共有メモリで各スレッド間のデータがやり取りされているのを
確認したんだけど教授が言うには共有メモリの確認にはならん!だそうです。
共有メモリを用いてのプロセス間通信の確認…どのようにすればいいですか?
なぜスレッドだと共有メモリの確認にならないかも良くわかってない状態ですが…
0126デフォルトの名無しさん
2008/11/17(月) 11:42:42スレッド間共有できたからといって、プロセス間共有できてないかもしんない手法使ってないか?という危惧やな
0127デフォルトの名無しさん
2008/11/17(月) 11:46:44プロセス間通信(Inter Process Communication)のための共有メモリを
同一のプロセス内で確認してどうするwww
山田家と佐藤家とのネット間通信(Inter Net Communication)が通じるかを
確認するのに、山田兄弟が家庭内LANだけで確認するようなものだぞ。
0128デフォルトの名無しさん
2008/11/17(月) 12:06:11C99なら。
>>121
const 付けれ。
0129デフォルトの名無しさん
2008/11/17(月) 13:43:34単純に代入すると、deprecatedという警告がでます。
0130デフォルトの名無しさん
2008/11/17(月) 13:47:49どう書いたらどう警告が出たの詳しく。
0131デフォルトの名無しさん
2008/11/17(月) 13:50:091: #include <iostream>
2: int main() {
3: char *a = "aaggff";
4: std::string s = a;
5: return 0;
6: }
$ g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:3: warning: deprecated conversion from string constant to ‘char*’
0132デフォルトの名無しさん
2008/11/17(月) 13:56:400133デフォルトの名無しさん
2008/11/17(月) 13:57:190134デフォルトの名無しさん
2008/11/17(月) 13:57:41↑
3行目だっつってんだ。
0135デフォルトの名無しさん
2008/11/17(月) 14:20:44文字列定数を 'char*' に変換するのは推奨されません
0136デフォルトの名無しさん
2008/11/17(月) 14:33:480137デフォルトの名無しさん
2008/11/17(月) 14:48:38どうもありがとう
じゃあ別プログラムをもう一本用意してやり取りが出来ているかを
確かめてみます。
0138デフォルトの名無しさん
2008/11/17(月) 14:59:33<math.h>を利用
float a,b,c,A,B
A=pow(b,2)ー4*a*c
B=sqrt(A)
これだとAの平方根を計算してくれないみたいなんですがなぜでしょう?
途中や色々省いていますがよろしくおねがいします
0139デフォルトの名無しさん
2008/11/17(月) 15:03:01>138を見る限り、計算される筈だ。
自分の馬鹿さを棚に上げないで、ちゃんと省かずに貼れ。
ついでに言えば、二乗程度にpow()は使うな。
0140デフォルトの名無しさん
2008/11/17(月) 15:03:34#include <math.h>
int main() {
float a,b,c,A,B;
a = 2; b = 6; c = 3;
A=pow(b,2)-4*a*c;
B=sqrt(A);
printf("%f\n", B);
}
実行結果
3.464102
問題なさそうに見えるが
0141デフォルトの名無しさん
2008/11/17(月) 15:03:42必要がない限り、floatは使うな。doubleを使え。
0142デフォルトの名無しさん
2008/11/17(月) 15:07:07しかし、計算が誤差などにより間違った結果が出やすい
慎重に使うべきだな float
0143デフォルトの名無しさん
2008/11/17(月) 15:07:180144デフォルトの名無しさん
2008/11/17(月) 15:10:220145デフォルトの名無しさん
2008/11/17(月) 15:15:230146デフォルトの名無しさん
2008/11/17(月) 15:15:41intelコンパイラの場合
long double > double > float と計算時間が短くなる.(おそらくメモリの消費量が減るため)
80bit > 64bit > 32bit と計算時間が短くなる.(おそらくCPUの計算量が減るため)
という傾向が観測できた.
gcc の場合上記と同様の実験を gcc-4.1.1 (20060619) でも行った.
いずれにせよ,iccと同じようにgccでも,
精度を落とすと処理速度が向上する
型を落とすと処理速度が向上する ことはたしかな様だ.
http://d.hatena.ne.jp/pyopyopyo/20060918/p1
0147デフォルトの名無しさん
2008/11/17(月) 15:16:250148デフォルトの名無しさん
2008/11/17(月) 15:18:11乗算はfloatの方がdoubleより速い
java.lang.Mathによる平方根の計算はdoubleの方がfloatより速い
http://www.asahi-net.or.jp/~dp8t-asm/java/tips/OptUseFloat.html
0149デフォルトの名無しさん
2008/11/17(月) 15:21:010150デフォルトの名無しさん
2008/11/17(月) 15:24:54いくらなんでもPentiumProとかJDK1.1.4は古すぎる
0151デフォルトの名無しさん
2008/11/17(月) 15:26:18まぁ、ソースも提示しないんだったら何とでも結果を誘導できるからね。
仮に、c99でもC++でもない只のCで超越関数を使う場合、
double版の超越関数が用意されていないからdoubleの方が確実に速くなる。
また、floatだけで計算させるように(doubleへの暗黙の変換が起きないように)
コーディングするのはコツがいるからその点でも、一般向きじゃない。
0152デフォルトの名無しさん
2008/11/17(月) 15:28:53今は携帯から書き込んだので後でPCから全部書いてみます。
0153デフォルトの名無しさん
2008/11/17(月) 15:34:49>long double > double > float と型を切り替えると,速度は1割程度づつ向上し,
2.232(double)が2.188(float)になるのは高々2%の短縮でしかないと思うのだけど。
それに、iccでベクタ化するような処理が対象だというところにも注意。
つまり、連続的に配列要素を演算するような処理だということなのだろう。
このような、頻繁にメモリをアクセスするような応用では確かにfloatは有利だろう。
しかし、そうでない応用ならdoubleとの差はますます縮むことになりそうだ。
0154デフォルトの名無しさん
2008/11/17(月) 15:35:57速度は、キャスト <<< 標準関数の呼び出しと実行だ。
関数に費やされる時間がほとんど。 キャストが加わる分だけ少しだけ遅くなる。
実行せずに分かる
0155デフォルトの名無しさん
2008/11/17(月) 15:49:31実行せずに判る。
0156デフォルトの名無しさん
2008/11/17(月) 15:52:520157デフォルトの名無しさん
2008/11/17(月) 15:55:50注意深くfloat同士の演算のみを行い、標準関数も使わずにメモリアクセスもしないという条件でよろし?
0158デフォルトの名無しさん
2008/11/17(月) 15:59:150159デフォルトの名無しさん
2008/11/17(月) 15:59:170160デフォルトの名無しさん
2008/11/17(月) 16:00:54http://homepage1.nifty.com/herumi/prog/prog90.html
0161デフォルトの名無しさん
2008/11/17(月) 16:07:28しかし現在は、32bitとそれ以上の小数点演算がハードウェアとして計算できるようになっている。
単純考えて1ビットを扱えより2ビットの方が難しく、同様に32bitよりかは64bitのほうが難しい。
0162デフォルトの名無しさん
2008/11/17(月) 16:17:18これでSSEにまで触れられていればほぼ完璧なのに。
まぁ、所要時間は大抵の応用では大差ないのだから、
わざわざ使い難いfloatを使うまでもないと思うのだけど。
# 実数リテラルを書くときに、一々1.0fなんて書きたい? 私は1.0で済ませたいね。
0163デフォルトの名無しさん
2008/11/17(月) 17:31:28SSEでのdoubleとfloatの差ならインテルのリファレンスに載ってるぞ。
double除算がfloatの倍かかる以外は同じ。
0164デフォルトの名無しさん
2008/11/17(月) 18:50:26今のx86系ならdoubleだろ、floatはCPUの演算部が貧弱だった時代に
小数点演算したかで作った型なんだろ
0165デフォルトの名無しさん
2008/11/17(月) 19:15:37いやもう、時代に取り残されているから。
# いろんな意味で。
0166デフォルトの名無しさん
2008/11/17(月) 20:42:51除算なんて普通使わんから関係ないな。
0167デフォルトの名無しさん
2008/11/17(月) 22:13:11>>160も見れないのか。そんな言い方ができるなら、見れなかったとしても
doubleがx86のFPUレジスタとは大きさが合わないのは知っているだろう。
0168デフォルトの名無しさん
2008/11/17(月) 22:23:21おれ、全然使ってない、doubleだけだな。
0169デフォルトの名無しさん
2008/11/17(月) 22:46:03VC++6でwindows2000を使っています。
beep音を非同期で指定時間鳴らしたいです。
できれば、WAVじゃなくてマザーボードからなる様にしたくてスレッドは使わないで済ませたいです。
メインでbeepを開始してタイマー割り込みでbeepを指定時間後に止めるような仕組みがいいのですが・・・。
何か方法はありますでしょうか?
0170デフォルトの名無しさん
2008/11/17(月) 22:48:000171169
2008/11/17(月) 23:03:00正直、自分では全く考えてないです。
スレッド使って別スレッドでbeep鳴らすくらいしか思いつきません。
WAVファイルなら非同期でできるけど、beep音は自分で作らないといけないし、
サウンドカード載ってないといけないし。
0172デフォルトの名無しさん
2008/11/17(月) 23:18:030173デフォルトの名無しさん
2008/11/17(月) 23:19:42Beep 時間 というインターフェイスである以上
鳴っている間メッセージポンプしたけりゃスレッド起こす以外の方法は無いだろう
※ Beep ON / OFF というインターフェイスの API があれば別
0174169
2008/11/17(月) 23:23:17Win32APIスレから誘導されてきました。
>>173
まぁ〜、そうなりますよね。
そういうAPIがないか調べたかったわけです。
そして、ググっても見つからないので、多分ないんでしょうね・・・
0175デフォルトの名無しさん
2008/11/17(月) 23:43:54Beep API場合鳴らす周波数、鳴らす時間幅しか設定できない。
自分でBeepOnでなりっぱなし、BeepOffしたければ、I/Oポートドライバを作成し
それ経由でbeepを制御
0176169
2008/11/17(月) 23:54:08I/Oポートドライバはさすがに・・・。
platformSDKとかなんとかが必要そうですし。
とりあえず、CreateProccessでbeepをするプログラムを叩くようにしてみます。
0177デフォルトの名無しさん
2008/11/18(火) 00:02:51そんなの転がっているよ。参考、
http://crystaldew.info/category/openlibsys/
ただ、BeepOn、BeepOffするためだけにドライバーを用意ってのがアホらしいがな
0178デフォルトの名無しさん
2008/11/18(火) 00:07:40どこか分かる方教えて下さいませ。
0179デフォルトの名無しさん
2008/11/18(火) 00:08:29visual studio2008のソースって流出してたっけ
0181デフォルトの名無しさん
2008/11/18(火) 00:26:00char *test(char *buf){
static char tmp[100];
snprintf(tmp, 100, "%s", buf);
return tmp;
}
という関数があったとき、main関数でbuf = test(buf);と記述すると、同様の問題は起こるのでしょうか?
0182デフォルトの名無しさん
2008/11/18(火) 00:37:30main()のbufが配列でなければ大丈夫かもしれません。
少なくとも、引き数のbufが戻り値のbufに影響を及ぼすことはありません。
0183デフォルトの名無しさん
2008/11/18(火) 00:38:100184デフォルトの名無しさん
2008/11/18(火) 00:38:550185184
2008/11/18(火) 00:39:400186デフォルトの名無しさん
2008/11/18(火) 00:44:46仮にbufがmalloc()の戻り値を格納してたりした場合、test()呼び出しによって失われてしまうので解放できなくなりますね。
0187デフォルトの名無しさん
2008/11/18(火) 00:46:20buf = test("hoge");
buf = test(buf);
0189デフォルトの名無しさん
2008/11/18(火) 13:57:09timeに秒数が入るらしいんですが、timeの中を見ると6.35235・・・・・e、みたいな数値になってるんですが、
これどうやって秒にするんですか?たぶん180秒ぐらいだと思うんですが、変換方法を教えてください。
0190デフォルトの名無しさん
2008/11/18(火) 14:05:590191デフォルトの名無しさん
2008/11/18(火) 14:07:07そんな変なこと教えた奴に聞け。標準にはそんなもの存在しない。
0192デフォルトの名無しさん
2008/11/18(火) 14:07:380193デフォルトの名無しさん
2008/11/18(火) 14:08:56いや、馬鹿を晒さなくてもいいから。
>>189
difftime()なら、戻り値がそのまま秒数だ。
何をどう使ってtimeに秒数を入れたつもりになっているんだ?
# インクルード忘れで型化けしたかな?
0194デフォルトの名無しさん
2008/11/18(火) 14:11:270195デフォルトの名無しさん
2008/11/18(火) 14:14:510196デフォルトの名無しさん
2008/11/18(火) 15:13:00すごいできました。ありがとうです。
その0.35はいったいどこから出てくるんですか?
0197デフォルトの名無しさん
2008/11/18(火) 15:14:51いや、馬鹿を晒さなくてもいいから。
0198デフォルトの名無しさん
2008/11/18(火) 15:17:01所要時間に関わらず、常に一定の値がでないか?
0199デフォルトの名無しさん
2008/11/18(火) 15:39:49なります。電卓で計算したらあってたので。intじゃなくてdoubleですね?
0200デフォルトの名無しさん
2008/11/18(火) 15:41:350201デフォルトの名無しさん
2008/11/18(火) 15:45:00これに0.03529083を掛けると全然違う秒数になってしまいます。
助けてください
0202デフォルトの名無しさん
2008/11/18(火) 15:50:110203デフォルトの名無しさん
2008/11/18(火) 15:50:12さっきはなんで6.35235・・・・・eが出てきたんだろう・・・
やばいです、なんかこれC関係ないような気がしてきました。電卓が桁溢れエラーのときどう表示するかの問題な気がしてきましたすいません
0204デフォルトの名無しさん
2008/11/18(火) 15:51:280205デフォルトの名無しさん
2008/11/18(火) 15:58:39初期化されていない自動変数に何かを期待してはいけない
0206デフォルトの名無しさん
2008/11/18(火) 16:13:41void hoge(vector<string> & arg) { boge(arg); }
void boge(vector<string> & arg) { }
int main() { vector<string> & list; hoge(list); }
参照の参照はだめだと先生がいうのですが、なんでだめなのかわからないです。
0207デフォルトの名無しさん
2008/11/18(火) 16:17:400208デフォルトの名無しさん
2008/11/18(火) 16:18:120209デフォルトの名無しさん
2008/11/18(火) 16:22:20無名ネームスペースのこと?とりあえずわかるように頼む。
0210デフォルトの名無しさん
2008/11/18(火) 16:35:070211デフォルトの名無しさん
2008/11/18(火) 16:41:07だめ
参照の参照問題でぐぐってみ
これが原因でSTLでエラーが出る事がよく起きたため
boost::bindが作られた
0212デフォルトの名無しさん
2008/11/18(火) 16:45:31C++でだめなのはint& &のような参照への参照という型。
テンプレートを使っていると意図せず現れる可能性がある。
http://boost.cppll.jp/HEAD/libs/functional/binders.html
0213デフォルトの名無しさん
2008/11/18(火) 16:58:33グローバルに置きたい変数を纏めたクラスを作るのが無難じゃね?
0214デフォルトの名無しさん
2008/11/18(火) 17:02:14#pragma once
#include "funcBBB.h"
class funcAAA;
/////////////////funcBBB.h//////////////////
#pragma once
#include "funcAAA.h"
class funcBBB : public funcAAA
err:定義されていない基本クラスが宣言されています。;
無理ぽ?
0215デフォルトの名無しさん
2008/11/18(火) 17:17:20だがしかし待って欲しい
もっと構造を考えれば色々なクラスに分配できるんじゃないだろうかと
0216デフォルトの名無しさん
2008/11/18(火) 17:20:39Bが読み込まれたときにinclude A.hでinclude B.hされているので
class funcAAより先にclass funcBBB : public funcAAAがでてきてエラーになっている
個人的には何故A.hでBをincludeしているのかが理解しがたい
0217デフォルトの名無しさん
2008/11/18(火) 17:23:36ヘッダに含めないんだったらグローバル(ファイル)スコープっていうのも十分ありだと思うけど
0218デフォルトの名無しさん
2008/11/18(火) 20:40:032通り見かけるのですが、宣言の仕方は、下のどちらでもいいのでしょうか?
friend class ClassA;
friend ClassA;
また、クラス内でfriend指定する場所ですが先頭に書くのが普通でしょうか?
public節に置くのとprivate節に置くのでは違いがありますか?
インデントせず書いてある例も見かけるのですが皆さんどうしておられますか?
0219デフォルトの名無しさん
2008/11/18(火) 21:10:45>friend ClassA;
外側がテンプレートなら上じゃなきゃダメ(下はClassAがクラス名かどうかわからない)
そうでなけりゃ一緒
>また、クラス内でfriend指定する場所ですが先頭に書くのが普通でしょうか?
どこに書いても意味は変わらん好きにしろ
>public節に置くのとprivate節に置くのでは違いがありますか?
全くない
>インデントせず書いてある例も見かけるのですが皆さんどうしておられますか?
メンバじゃないから区別したいんだろうな
個人の好みだ
俺は嫌い
0220デフォルトの名無しさん
2008/11/18(火) 21:20:07丁寧にありがとうございました!
0221デフォルトの名無しさん
2008/11/18(火) 22:27:58Windows Vista BusinessSP1
上記環境で、下記コードをデバッグモードで動かしています。
(コードは某書籍より、ちょっと加工)
string filename = "c:\\test.txt";
const int N = 5;
vector<int> v(N);
fill(v.begin(), v.end(), 55);
ofstream ofs(filename.c_str());
if (ofs) {
copy(v.begin(), v.end(), ostream_iterator<int>(ofs));
ofs.close();
}
else cout << "output file open error." << endl;
管理者に昇格のダイアログも何も出ずにエラーとなるのですが、
何か設定はないのでしょうか?
もちろんEXEを管理者設定して動作させると大丈夫なのですが。
そもそも、VistaではCドライブ直下にファイルを作成しにいくこと自体が間違い?
0222デフォルトの名無しさん
2008/11/18(火) 22:34:24某書籍の名前を言わないと、誰も教えてくれませんよ
0223デフォルトの名無しさん
2008/11/18(火) 22:40:560224デフォルトの名無しさん
2008/11/18(火) 22:41:40ええ?それが重要なの?
「標準C++:STLの基礎知識」ですが、問題は
> string filename = "c:\\test.txt";
ここだと思うのですが
0225デフォルトの名無しさん
2008/11/18(火) 22:45:02じゃ"A:\\test.txt" にしたら
0226デフォルトの名無しさん
2008/11/18(火) 22:48:15これと同じ?
0227デフォルトの名無しさん
2008/11/18(火) 22:52:07具体的にはTCP/IP接続のプリンタにジョブを投げたいんですが。
0228デフォルトの名無しさん
2008/11/18(火) 22:59:190229デフォルトの名無しさん
2008/11/18(火) 22:59:29ユーザー権限で実行で書き込み権限ないところにカキコしようとしていると妄想
0230デフォルトの名無しさん
2008/11/18(火) 23:08:02おお、ありがとうございます。
が、うまくいかなくて、調べていたら、下記ページが。
http://blog.chiztek.net/?p=66
まさにこれですね。
0231デフォルトの名無しさん
2008/11/18(火) 23:09:14230の方法で、デバッグモードでも管理者に昇格ダイアログが出るようになりました。
0232デフォルトの名無しさん
2008/11/18(火) 23:17:02すいまへん、移動します。
0233デフォルトの名無しさん
2008/11/18(火) 23:24:47ソケットをHANDLEにキャストして1番目の引数に渡す。
0234デフォルトの名無しさん
2008/11/19(水) 07:58:32を実行したら静的でなからだめだと言われたので、
static void Function();
と書き直したんですが、エラーが出ます。
これは他のクラスでインスタンスを既に作っている場合問題があるんでしょうか?
0235デフォルトの名無しさん
2008/11/19(水) 08:11:58文章からは何を言ってるか推測できないから、もう少し前後のコードも書いてみて
0236デフォルトの名無しさん
2008/11/19(水) 08:27:41{
ClassB m_classBincet;
}
class ClassB
{
public:
static void FunctionB();
}
include "ClassB.h"
class ClassC
{
}
ClassC::FunctionC()
{
ClassB::FunctionB(); //これがエラーになるんです。
}
0237デフォルトの名無しさん
2008/11/19(水) 08:33:13なんでエラーメッセージの概念がまるっきり頭から飛んでる奴が多いのか。
この世の事象を「自分の願い」と「それ以外」より細かく分類する気がハナっから無いっつーか。
0238デフォルトの名無しさん
2008/11/19(水) 08:34:410239デフォルトの名無しさん
2008/11/19(水) 08:38:010240デフォルトの名無しさん
2008/11/19(水) 08:40:03大丈夫だよ、こんなのが下に付くレベルの職場には居ないから。
てか、君が就ける職場のレベルと一緒にされても・・・(^_^;
0241デフォルトの名無しさん
2008/11/19(水) 08:51:010242デフォルトの名無しさん
2008/11/19(水) 08:53:260243デフォルトの名無しさん
2008/11/19(水) 08:55:59つまりこのコードの部分ではエラーがわからない(無い)ことがわかりました。
static文法がおかしいのかと思いました。どうもです
0244デフォルトの名無しさん
2008/11/19(水) 09:16:040245デフォルトの名無しさん
2008/11/19(水) 09:21:090246デフォルトの名無しさん
2008/11/19(水) 10:06:46{
public:
static void FunctionB(){
}
};
class ClassA
{
ClassB m_classBincet;
};
class ClassC
{
void FunctionC();
};
void ClassC::FunctionC()
{
ClassB::FunctionB();//エラーになりませんよ?
}
int main() {
}
0247デフォルトの名無しさん
2008/11/19(水) 10:12:28全角空白に置換するのはそんなに面倒だろうか
0248デフォルトの名無しさん
2008/11/19(水) 10:14:330249デフォルトの名無しさん
2008/11/19(水) 10:16:110250デフォルトの名無しさん
2008/11/19(水) 10:23:010251デフォルトの名無しさん
2008/11/19(水) 10:34:070252デフォルトの名無しさん
2008/11/19(水) 11:05:00読むのは回答者なのに、なぜ質問者がそんな気を遣わなくてはいけないんですか?
質問はこの書き方でも成立するわけですから、いちいちインデントのことなんか考える理由が
質問者には一切ありません。
自分が楽をするために、他人が苦労して当然と思うのは人間のクズのすることだと思いますが?
0253デフォルトの名無しさん
2008/11/19(水) 11:11:16自分=質問者、他人=回答者?
0254デフォルトの名無しさん
2008/11/19(水) 11:13:21同意
聞いてる側が楽しようとするとかアホかと
0255デフォルトの名無しさん
2008/11/19(水) 11:24:52頼むから釣りだと言ってくれ・・・
0256デフォルトの名無しさん
2008/11/19(水) 11:31:03 でもいいが、これはこれでポップアップ時に全部出ちゃって見づらい。
普通にTABか半角スペースのが再利用時に面倒がなくていい。
0257デフォルトの名無しさん
2008/11/19(水) 12:23:230258デフォルトの名無しさん
2008/11/19(水) 13:50:490259低脳基地質問者
2008/11/19(水) 19:35:30作れるんだろ。なら、全角スペースをTABや半角複数スペースに変換、
逆にTAB、半角複数スペースを全角スペースに変換するプログラムぐらい1-2秒で出来るだろ。
グダグダ言っているなら、低脳質問者のために素敵な変換プログラムぐらい作ってやれよ
0260デフォルトの名無しさん
2008/11/19(水) 19:38:190262デフォルトの名無しさん
2008/11/19(水) 19:42:31あれだろイーマックスとかいう奴だろ
矢印キー使えないアホなエディタ
0263デフォルトの名無しさん
2008/11/19(水) 19:43:590264デフォルトの名無しさん
2008/11/19(水) 19:44:540265デフォルトの名無しさん
2008/11/19(水) 19:46:440266デフォルトの名無しさん
2008/11/19(水) 19:50:35気になんない。みなさんいつもありがとね。
0267デフォルトの名無しさん
2008/11/19(水) 19:53:010268デフォルトの名無しさん
2008/11/19(水) 21:12:190269デフォルトの名無しさん
2008/11/19(水) 21:13:13gdgd
0270デフォルトの名無しさん
2008/11/19(水) 21:13:41int func() {
printf("hello.\n");
}
これ
int func() {
printf("hello.\n");
}
初心者に優しいのは前者だよ。
>>270
0271デフォルトの名無しさん
2008/11/19(水) 21:17:270272デフォルトの名無しさん
2008/11/19(水) 21:22:58下はコピペ後、全角スペースを半角スペースに変換するという
超絶難解な作業が待っているからですよね、わかります。
0273デフォルトの名無しさん
2008/11/19(水) 21:52:53ITドカタは実力ないから見た目で勝負で、実用性、なにそれ?だからね
0274デフォルトの名無しさん
2008/11/19(水) 22:19:421つだけnewしたものをdelete [] したら動作は未定義?
それとも無事1つ解放してくれます?
0275デフォルトの名無しさん
2008/11/19(水) 22:24:41鼻から悪魔
0276デフォルトの名無しさん
2008/11/19(水) 22:38:26マジっすか、困った
ありがとう
0277デフォルトの名無しさん
2008/11/19(水) 22:58:16では
int *i = new int[1];
delete [] i;
これは?だめっぽい雰囲気ですが
0278デフォルトの名無しさん
2008/11/19(水) 23:02:05OK
0279デフォルトの名無しさん
2008/11/19(水) 23:29:20ありがとう
int *i = new int;
int *i = new int[1];
上2つはdeleteでの解放以外はまったく同じ扱いでいい?
0280デフォルトの名無しさん
2008/11/19(水) 23:48:23※ 組み込み型だから結果的に同じの可能性は高いが
コンストラクタとデストラクタに printf 入れて
class を new [] 〜 delete と
new [] 〜 delete[] とを比較してみ。
delete[] では 暗に確保した要素数を知ってるから、
要素数を記憶する器のぶんの余計なヒ-プを確保している可能性は高い
0281デフォルトの名無しさん
2008/11/19(水) 23:50:280282デフォルトの名無しさん
2008/11/19(水) 23:51:54それくらいかな
0283デフォルトの名無しさん
2008/11/19(水) 23:54:47なるほど
new intだとサイズ情報を確保しない→delete[]じゃまずい(サイズ情報を読み込むから)
new int[n]だとたとえn==1でもサイズ分を余分に確保→delete[]でも無問題
ということか(可能性が高い)
0284デフォルトの名無しさん
2008/11/20(木) 00:10:35int a = 1;
txt = "printf("a=%d",a");"
この状況で、txtの中身を命令として実行して
a=1
と出力するにはどうすればいいかねぇ
0285デフォルトの名無しさん
2008/11/20(木) 00:14:26何をしたいのか具体的に。
ソースコードをランタイムにコンパイルしたいと言うことなら、かなり無茶。
0286デフォルトの名無しさん
2008/11/20(木) 00:17:40一度txt の中身をファイル出力して、
gccのプロセスを起こしてコンパイルさせて
出来上がった実行ファイルを起動させて
そのまま表示させるなりそのプロセスとプロセス間通信して受け取るなりする
0287デフォルトの名無しさん
2008/11/20(木) 00:25:10int main(){
int** x;
int row(0),col(0);
func(x,row,col);
//xを使った処理がいろいろ
for(int i=0;i<row;i++)
delete [] x[i];
delete [] x;
return 0;
}
void func(int**& x, int& row, int& col){
//ここでrowとcolは適当に決まる
x = new int* [row];
for(int i=0;i<row;i++)
x[i] = new int [col];
//適当な処理
return;
}
以上のようなコードを実行すると、main関数内の最初のdeleteで、
「Windows によって sample.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。sample.exe または読み込まれた DLL にバグがあります。
あるいは、sample.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
プログラム '[5532] sample.exe: ネイティブ' はコード 0 (0x0) で終了しました。」
というエラーが発生して終了してしまいます。
確保されていない領域をdeleteしたときに発生するエラーのようですが、main関数で
xの中身を参照したときには値が入っていますし、確保されていない訳ではないと
思っているのでしょうが、何が原因として考えられますか?
0288デフォルトの名無しさん
2008/11/20(木) 00:36:44x[0]はなにですか?
x[1]はなにですか?
0289デフォルトの名無しさん
2008/11/20(木) 00:43:19そんなことないよ。
0290デフォルトの名無しさん
2008/11/20(木) 00:44:39kwsk
0291デフォルトの名無しさん
2008/11/20(木) 00:45:220292287
2008/11/20(木) 00:50:56すみません、おっしゃっていることの意味がよくわからないです。
x[0]やx[1]はint型の配列が割り当てられているのと思っていたのですが・・・
>>291
std::vectorを使いたいのは山々なのですが、vectorだとメモリ不足になったため
急遽new[]を使った形に書き直している最中です。
0293デフォルトの名無しさん
2008/11/20(木) 00:51:165.7 加減演算子 p4
> これらの演算子においては,配列でないオブジェクトへのポインタは,配列要素の型として
> そのオブジェクトの型をもつ長さ 1 の配列の先頭要素へのポインタと同じ振る舞いをする。
0294デフォルトの名無しさん
2008/11/20(木) 00:52:08vector でメモリ不足になるんなら new[] 使っても解決しないでしょ。
そもそも何を見てメモリ不足になったと言ってるの?
0295デフォルトの名無しさん
2008/11/20(木) 00:53:240296デフォルトの名無しさん
2008/11/20(木) 00:54:00なるほど。
0297287
2008/11/20(木) 01:01:15TSVファイルをint型の二次元配列に読み込もうとしているのですが、
vector<vector<int> >にvector<int>をpushしていったら、途中で
VC++のエラーが出てきて、メモリが足りないと怒られました。
ついでにリソースモニターを見ていたら、物理メモリを食いつぶされていました。
困って、ほかの部分を変えずにvectorで処理していた部分をnew[]に変えたら
メモリの方でエラーは吐かれなくなったけれど、今度は・・・という状態です。
0298デフォルトの名無しさん
2008/11/20(木) 01:01:20void func(int**& x, int& row, int& col){
//ここでrowとcolは適当に決まる
x = new int*[row];
int *buf = new int[row * col];
for(int i=0;i < row;i++) x[i] = &buf[i * row];
//適当な処理
return;
}
int main(){
int** x;
int row(0),col(0);
func(x,row,col);
//xを使った処理がいろいろ
delete x[0];
delete[] x;
return 0;
}
0299デフォルトの名無しさん
2008/11/20(木) 01:05:47× for(int i=0;i < row;i++) x[i] = &buf[i * row];
○ for(int i=0;i < row;i++) x[i] = &buf[i * col];
0300デフォルトの名無しさん
2008/11/20(木) 01:13:31#include <iostream>
void func(int**& x, int& row, int& col);
int main(){
int** x;int k,j;int row = 10,col = 10;
func(x,row,col);
for(int i = 0; i < row;i++){
for(j = 0,k=1; j< col; j++,k++){
std::cout << x[i][j] << ' ';
if(!(k%10))
std::cout << '\n';
}
}
for(int i=0;i<row;i++)
delete [] x[i];
delete [] x;
return 0;
}
void func(int**& x, int& row, int& col){
int num = 1;
x = new int* [row];
for(int i=0;i<row;i++)
x[i] = new int [col];
for(int i = 0; i < row;i++){
for(int j = 0; j< col; j++){
x[i][j] = num++;
}
}
return;
}
0301デフォルトの名無しさん
2008/11/20(木) 01:22:23バグがないかチェックするのに、いちいちfprint・・fprint・・と打っていくのは面倒くさかったから、処理を関数の中にcharで入れたら、自動でfprintf文を書いてくれるプログラムを作りたかった。
>>286
ありがとう。プロセス間通信調べてみた。
しかしLinux(c++)での共有メモリの作り方、使い方がいくらググっても出てこない。
サンプルどっかにあるかなぁ。
0302デフォルトの名無しさん
2008/11/20(木) 01:38:15tcc あたりをリンクすればんなとか出来るかも。
っと思ったけど、>>301 では「面倒くさい」という動機が語られているので、
どちらがより面倒かと考えると…
0303デフォルトの名無しさん
2008/11/20(木) 02:13:15それなら普通に#define 等のプリプロセッサでいいんじゃね?
変数名の表示含めてできるよ
f(a); を fprinttf(stderr, "a = %d", a); にするみたいなのね
0304デフォルトの名無しさん
2008/11/20(木) 02:54:14おすすめのライブラリってありますか?
gnuplotのように凡例やます目がついた二次元グラフが書けて、グラフの拡大縮小が簡単にできるものを探しています。
普段はパイプでgnuplotに描画しているんですが、
ウィンドウ内にグラフを埋め込む必要が出てきたので、それが可能なライブラリを探しています。
0305デフォルトの名無しさん
2008/11/20(木) 02:58:13要素数はどれだけあるの? reserve() できないの?
0306デフォルトの名無しさん
2008/11/20(木) 02:59:44A;
};
// Visual C++ 2008の場合
TEST test = TEST::A
// gccとかの場合
TEST = A
これ、仕様では後者が正しいんだよね?
VCがまた勝手なことしてるって認識でおk?
まぁ個人的には列挙型もスコープ持ってほしいけど。
0307306
2008/11/20(木) 03:01:390308デフォルトの名無しさん
2008/11/20(木) 03:09:27そうではないのだから大目に見てやれ。
0309デフォルトの名無しさん
2008/11/20(木) 03:15:060310デフォルトの名無しさん
2008/11/20(木) 03:16:520311デフォルトの名無しさん
2008/11/20(木) 03:38:54とりあえずfparserつかえば
0312デフォルトの名無しさん
2008/11/20(木) 03:41:52VCも警告レベル上げれば
「非標準の機能使ってんじゃねぇよ」
ってコンパイラが教えてくれるぞ
0313デフォルトの名無しさん
2008/11/20(木) 03:47:19ははー、自分と同じで低脳で宿題できてないから寝れないんでしょ
駄目ですよ、低脳は背伸びして大学に進学しちゃ
0314デフォルトの名無しさん
2008/11/20(木) 04:01:17x = new int*[row];
int *buf = new int[row * col];
for(int i=0;i < row;i++) x[i] = &buf[i * row];
で2次元配列を作り
delete x[0];
delete[] x;
のデリートでbufのメモリ領域は開放されるんですか?
なんて言うか、凄い高等テク使ってる感じなんですけど
0315デフォルトの名無しさん
2008/11/20(木) 04:03:48だな、buf も配列だ。
0316デフォルトの名無しさん
2008/11/20(木) 04:10:16int *buf = new int[row * col]; で必要なだけメモリを一気に確保して、
行サイズ間隔のポインタを x[] に入れている。
結局 xと buf 用に 2回しか new していないから、delete も2回ですむ。
buf の先頭アドレスは、x[0] に入っているから、 delete[] x[0]; でいい。
0317デフォルトの名無しさん
2008/11/20(木) 04:15:45別に高等でも何でもない
C言語でもmalloc()でよく多用されてるテクニック
0318デフォルトの名無しさん
2008/11/20(木) 04:23:48ありがとう。tccを調べてみた。すごくおもしろいし使えそうだったんだけど、CPU:x86_64はサポートされていなかったようで、インストールしてもコンパイルがされない・・・残念。
>>303
配列の配列なども渡して自動的に表示形式まで計算してデバッグしたかったので、プリプロセッサだけではものたりないー
0319デフォルトの名無しさん
2008/11/20(木) 04:25:40テンプレート引数をうまく使えば new 一回でいけるかな?
template<int row, int col>
class Matrix{
public:
int data[row * col];
int *pdata[row];
Matrix(){
for(int i=0; i<row; i++) pdata[i] = &data[i * row];
}
};
int main(){
int row = 10, col=5;
Matrix<10, 5> *m = new Matrix<10, 5>();
int **x = m->pdata;
// x使って 処理
delete m;
return 0;
}
場合によってコピーコンストラクタが必要になる。
0320デフォルトの名無しさん
2008/11/20(木) 04:29:45for(int i=0; i<row; i++) pdata[i] = &data[i * row];
じゃ、なくて
for(int i=0; i<row; i++) pdata[i] = &data[i * col];
だ。
あと main の最初のrow, col 使ってないなので不要。
Matrix のメンバにrow, col 持たせたほうが扱いやすいだろうな。
0321デフォルトの名無しさん
2008/11/20(木) 04:30:35んじゃテンプレートとも併用すればいいんじゃね?
0322デフォルトの名無しさん
2008/11/20(木) 04:34:55gccスタイルでコード書いたら、他でコンパイルできない。俺は許すよ!><
独自拡張なんてそんなもんだ。
0323デフォルトの名無しさん
2008/11/20(木) 04:40:29newしたのがクラスのオブジェクトでそのオブジェクトが動的メモリを
持ってた場合でも、delete[] x[0];、delete[] x で各々の
オブジェクト、動的メモリは開放されるんですか?
0324319
2008/11/20(木) 04:48:380325デフォルトの名無しさん
2008/11/20(木) 04:50:37オブジェクトであろうと無かろうと、 newした回数delete するだけのこと。
0326デフォルトの名無しさん
2008/11/20(木) 04:58:340327デフォルトの名無しさん
2008/11/20(木) 05:00:08クラスにデストラクタ持たせるのは当然
0328デフォルトの名無しさん
2008/11/20(木) 05:06:27書かなくてはいけないが面倒なので省略。
class Matrix {
public:
int* data;
int** pdata;
Matrix(int row, int col) : data(new int[row * col]), pdata(new int*[row]) {
for (int i = 0; i < row; i++)
pdata[i] = &data[i * col];
}
~Matrix() {
delete[] data;
delete[] pdata;
}
};
int main()
{
int row = 10, col = 5, num = 0;
Matrix* m = new Matrix(10, 5);
int** x = m->pdata;
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
x[i][j] = num++;
for (int i = 0; i < row; i++)
for (int j = 0, k = 1; j < col; j++, k++) {
std::cout << x[i][j] << ' ';
if (!(k % col))
std::cout << '\n';
}
delete m;
}
0329デフォルトの名無しさん
2008/11/20(木) 05:11:420330デフォルトの名無しさん
2008/11/20(木) 05:15:14起きたんじゃないだろうか?
0331デフォルトの名無しさん
2008/11/20(木) 05:16:020332デフォルトの名無しさん
2008/11/20(木) 05:19:50自分のバグを棚に上げて「コンパイラのバグだ!」と言う奴は
腐るほどいる
0333323
2008/11/20(木) 05:53:49delete[] x[0];の場合のx[0]には
x[0] = &buf[0];
が入っていて、配列全体を示すbufは入ってないと思うんですけど
&buf[0] == 配列全体を示すbufになるんですか?
第一要素のアドレスコピーで配列全体の情報(要素数など)もコピーされているんですか?
0334デフォルトの名無しさん
2008/11/20(木) 06:28:32だからfree()やdeleteはポインタを与えるだけでメモリを開放することが出来るわけだ。
0335デフォルトの名無しさん
2008/11/20(木) 09:44:58new で確保したものは delete で開放
new[] で確保したものは delete[] で開放
という指針さえ守ってりゃ良いことになる
ポインタの指し示している中に管理情報が埋まっていることが予測される(実装依存)
new の場合には次の空きヒープへのリストか、確保した容量?
new[] の場合には上記+型情報(どのデストラクタを駆動するか)+要素数 or 1要素あたりの実サイズ?
ポインタ複写しだすと、
どっちで確保したものか一見で区別がつかない
複写元 及び 複写先 のそれぞれを開放操作しちゃった
なんて話がでてくるからやっかいではある (スマートポインタ等の概念が欲しい)
0336デフォルトの名無しさん
2008/11/20(木) 10:02:160337デフォルトの名無しさん
2008/11/20(木) 11:01:400338デフォルトの名無しさん
2008/11/20(木) 12:07:07ありがとう
0339デフォルトの名無しさん
2008/11/20(木) 15:32:26自分もgccでスコープ修飾子つけて列挙子アクセスしたくて、
こんな感じで書いたんだけど、スコープ付きenumと等価にはならなかった。
なんとかならんもんかな?
struct HOGE {
enum {
A;
B;
};
};
void f(HOGE hoge) { ... }
int main() {
HOGE hoge = HOGE::A; // OK
f(HOGE::A); // エラー! f(HOGE::A::<anonymous>)がない
}
0340デフォルトの名無しさん
2008/11/20(木) 15:36:420341デフォルトの名無しさん
2008/11/20(木) 15:37:180342デフォルトの名無しさん
2008/11/20(木) 15:42:05http://gcc.gnu.org/projects/cxx0x.html
0343デフォルトの名無しさん
2008/11/20(木) 15:46:27namespaceでも変わらんとです。
>>341
gcc -lstdc++ですたい。
>>342
待てませんぉ
0344デフォルトの名無しさん
2008/11/20(木) 15:50:00俺はあきらめて疑似Enumクラステンプレートみたいなの作って
EnumとEndEnumをマクロで定義して
Enum MyEnum
{
value1,
value2,
value3
}EndEnum;
みたいにやってる。使い勝手はC#とかのenumと同じ
0345デフォルトの名無しさん
2008/11/20(木) 16:16:470346344
2008/11/20(木) 17:07:55実装はこんな感じ
#define Enum(T) \
struct T \
{ \
enum Enumeration; \
private: \
Enumeration value; \
public: \
T(){} \
T(const T& e){value=e.value;} \
const T &operator=(const T& e){value=e.value;return *this;} \
const bool operator==(const T &e) const{return value==e.value;} \
const bool operator!=(const T &e) const{return value!=e.value;} \
T(const Enumeration e){value=e;} \
const T &operator=(const Enumeration e){value=e;return *this;} \
const bool operator==(const Enumeration &e) const{return value==e;} \
const bool operator!=(const Enumeration &e) const{return value!=e;} \
friend const bool operator==(const Enumeration &e,const T &e2){return e==e2.value;} \
friend const bool operator!=(const Enumeration &e,const T &e2){return e!=e2.value;} \
operator int () const{return value;} \
friend T; \
enum Enumeration
#define EndEnum ;}
>>346 Jane用
おかしいところあったら指摘してくれ
0347344
2008/11/20(木) 17:09:250348デフォルトの名無しさん
2008/11/20(木) 18:05:58これは面白いマクロ。
ぜひ使わせてもらいます。サンクス!
でも>>339みたいな場合だと
f(HOGE::A); // エラー! f(HOGE::A::Enumration)がない
ってなりそうな気も。。いや、まだ試してないんだけどね。
0349デフォルトの名無しさん
2008/11/20(木) 19:14:51bufと&buf[0]は同じポインタになる
0350333
2008/11/20(木) 22:17:57delete [] buf は delete [] &buf[0] と同じだから、
当然、delete buf は delete &buf[0]は同じ結果となり
配列の第一要素のみが開放されるんですよね
でも、delete [] &buf[1]では配列は開放されないんですよな(コンパイルエラーかな)
ポインタといった場合、それに含まれている管理情報はどんなものになるんですか?
少なくとも、オブジェクトのアドレスは有してるとは想像できるのですが。
&buf[0](== buf)、&buf[1]、のもつ管理情報の種類に違いはあるのですか?
int* a = &buf[0]; とした場合と、int* a = &buf[1]; とした場合の
aの管理情報の種類は違うんですか? =の後の情報しだいでaの持つ管理情報の種類が異なるとか
0351デフォルトの名無しさん
2008/11/20(木) 22:35:190352デフォルトの名無しさん
2008/11/20(木) 22:43:40せめて脳をリセットする機能があればねえ
0353デフォルトの名無しさん
2008/11/20(木) 22:57:370354デフォルトの名無しさん
2008/11/20(木) 22:59:32int* a = new int;
int* a = new int[2];
new intがメモリの500〜503番地に確保された場合aの中身は500
new int[2]がメモリの500〜507番地に確保された場合aの中身は500
つまりポインタは配列のサイズを持っていない。
じゃあどこに new int[]の配列サイズがあるかといえば一つ手前の496番地に配列のサイズがある。
つまり new int[2]はあらかじめ496〜507番地まで確保し、496〜499番地に配列のサイズ2を書き込み
500〜503と504〜507までの2オブジェクトのコンストラクタを呼び出す。
そして500番地を返す。
delete [] は aの中身500番地の一つ前の496番地にアクセスし配列のサイズ2を知る。
サイズが2要素だと分かったので500〜503番地と504〜507番地のオブジェクトに対しデストラクタを呼ぶ。
あとはメモリを解放する。
0355デフォルトの名無しさん
2008/11/20(木) 23:17:49いろいろめんどうだが、
> int* a = &buf[0]; とした場合と、int* a = &buf[1]; とした場合の
> aの管理情報の種類は違うんですか? =の後の情報しだいでaの持つ管理情報の種類が異なるとか
そう。
0356デフォルトの名無しさん
2008/11/21(金) 00:17:18断定してるが実装依存だろ
そんな仕様はどこにもない
0357デフォルトの名無しさん
2008/11/21(金) 00:22:31ISO/IEC 14882:2003のどこにそんな事が書いてあんだよ?え?
0358354
2008/11/21(金) 00:31:150359デフォルトの名無しさん
2008/11/21(金) 00:36:22int *a[10];
a[0] = buf;
int *b = a[0];
delete[] b;
0360デフォルトの名無しさん
2008/11/21(金) 00:39:34これは普通なんでしょうか。それとも、プログラムに問題ありと考えた方がいいんでしょうか?
0361デフォルトの名無しさん
2008/11/21(金) 00:42:42ありがとうございました。
つまり、&buf[0]; は配列要素数も管理情報に持ち
&buf[1]にはそれがない。ポインタがコピーされる時はそれもコピー
(たとえばそれが関数の実引数へのコピーでも)される考えると。
そして、delete []の場合は配列要素数情報あるからそれを参照して開放、
deleteの場合は要素数1(配列要素数情報ないから)で開放すると。 こんな理解で良いですか?
0362デフォルトの名無しさん
2008/11/21(金) 00:45:22そんなこと言われてもわからんが
7万個にしたら5秒で34万個にしたら20秒になるなら多分普通
34万個でも10秒のままだったり何分もかかるようになったりするなら多分何かがおかしい
あくまで全部たぶんの話
0363デフォルトの名無しさん
2008/11/21(金) 00:48:352、配列 a について、C/C++ では、a も &a[0] 配列先頭ポインタをあらわす。
3、delete[] は配列オブジェクトのポインタをとって、開放処理を行う。
0364デフォルトの名無しさん
2008/11/21(金) 00:52:040365デフォルトの名無しさん
2008/11/21(金) 00:59:10試したら30秒くらいかかった。
Core2 [email protected] / Vista SP1 / VC++2008EE / Debugビルドでデバッグ実行
デバッグ無し、またはReleaseビルドにしたら一瞬で終わったので、
恐らくメモリ解放時のオーバーランチェックとかが遅いんだろう。
0366360
2008/11/21(金) 01:09:51そういえばその通りですよね。試してみたら倍くらい時間がかかったので
そういうものだと思うことにします。
>>364
確かに、それだけdelete呼ばれたら時間もかかりそうです。
>>365
Q6700/Vista(not SP1)/VC++2008EEなのですが、Debugビルドで20秒くらいでした。
確かにデバッグなし実行なら一瞬です。メモリ解放のオーバーランチェックというのは初耳でした。
0367デフォルトの名無しさん
2008/11/21(金) 01:11:360368デフォルトの名無しさん
2008/11/21(金) 02:30:32突っ込んで解放してみたがCodeGuardをONにしても一瞬だな
0369デフォルトの名無しさん
2008/11/21(金) 02:56:54malloc()に対してcalloc()が遅いのと同様、メモリを全部舐めてりゃ遅くて当然。
0370354 (358は他人だけどGJ)
2008/11/21(金) 08:41:11>ポインタがコピーされる時はそれもコピー
全然分かってねーな。コピーされるのはポインタ(ただの数値)だけだ。
int* a = new int[2]; // a == 500 だとすると
int* b = &a[0]; // b == 500
int* c = &a[1]; // c == 504
int* d = c; // d == 504
図入りの具体例を解説したサイトでも探すのが手っ取り早い。
0371デフォルトの名無しさん
2008/11/21(金) 08:49:160372デフォルトの名無しさん
2008/11/21(金) 09:43:07これ見てもらうのが一番手っ取り早いんだがな
理解できるとは思わんが
理解できんようなら忘れた方がいい
0373デフォルトの名無しさん
2008/11/21(金) 12:18:45mallocとfreeのことしかやってねー
それ見てもdeleteとdelete[]の違いは理解できねー
内容は面白かったが回答としては不正解だな
0374デフォルトの名無しさん
2008/11/21(金) 17:42:40>>328にコピーコンストラクタと代入演算子を実装して実験してみろ
見事うまく動作したら何をやっているか理解できた証拠だ
0375デフォルトの名無しさん
2008/11/21(金) 18:16:010376デフォルトの名無しさん
2008/11/21(金) 18:23:500377デフォルトの名無しさん
2008/11/21(金) 18:40:120378デフォルトの名無しさん
2008/11/21(金) 18:48:440379デフォルトの名無しさん
2008/11/21(金) 19:00:300380デフォルトの名無しさん
2008/11/21(金) 19:21:530381デフォルトの名無しさん
2008/11/21(金) 19:34:17「えむあろっく」は経験長い人に多いな
0382デフォルトの名無しさん
2008/11/21(金) 19:44:550383デフォルトの名無しさん
2008/11/21(金) 20:15:30俺、delete,delete[]をそんな風に使うんだで使っているが、
deleteとdelete[]がある理由、なにかあるんだろ。
(deleteはなぜnew xx[]を開放出来ないのか)
分かりやすく、その理由の解説頼むよ
0384デフォルトの名無しさん
2008/11/21(金) 20:22:38new[]/delete[]はオブジェクトの個数を保持するために余分なメモリ領域を使用している
管理用のメモリレイアウトが異なれば相互運用は不可能
0385デフォルトの名無しさん
2008/11/21(金) 20:25:14>>280で結論でてるだろうが
0386デフォルトの名無しさん
2008/11/21(金) 20:25:46配列の先頭要素のアドレスでもある
deleteが貰うのはアドレスの値だけだから区別が出来ないので
プログラマが区別してやらないといけない
D&Eの10章にその辺の苦労話が書いてある
0387383
2008/11/21(金) 21:04:00なるほどね、>>361のdelete、delete[]であってたのか
おれ、>>370で>>361は完全に間違ったこと言ってるんだと思った
>>385
すまん、最新50カキコだけで、そんな前のカキコなんて読んでなかった
0388デフォルトの名無しさん
2008/11/21(金) 21:33:07必要なぶんだけデストラクタが呼べるわけだろう
配列ではないnewを、要素数1の配列と同じように確保するのなら
deleteとdelete[]を区別する必要は無いのだろうけど、
ゼロオーバーヘッドルールがそれを妨げているんでないの
要素数を入れる32bitかそこらの領域を余分に必要とするのだろうからな
0390デフォルトの名無しさん
2008/11/21(金) 22:04:100391デフォルトの名無しさん
2008/11/21(金) 22:21:280392デフォルトの名無しさん
2008/11/21(金) 22:29:15EXEからDLLを使うのと同じ。
0393デフォルトの名無しさん
2008/11/22(土) 13:18:040394デフォルトの名無しさん
2008/11/22(土) 16:51:25と、たかをくくってたらおなじエラーが出て俺死亡
焦ってデバッグしてみたら追い討ちをかけるように
rowに値を入れる前にnewしてことが判明
0395デフォルトの名無しさん
2008/11/22(土) 19:16:05p = strstr(buff, "\\"); //buffから\\をサーチ
buff2 = p+1
こんな感じでです。
これをstringやSTLのアルゴリズムを使ってもっと簡単にかけますか?
0396デフォルトの名無しさん
2008/11/22(土) 19:45:28その代わりこれを・・・
sscanf(s, "%[^_]_%s", s2, s3);を
istringstreamで書き直す方法を教えてください
0397デフォルトの名無しさん
2008/11/22(土) 21:28:03string でもいいなら、
string s("hoge_fuga");
string::size_type pos = s.find("_");
string s2(s.substr(0, pos)), s3(s.substr(pos+1));
とできるけど
0398デフォルトの名無しさん
2008/11/22(土) 21:28:550399デフォルトの名無しさん
2008/11/22(土) 22:01:250400デフォルトの名無しさん
2008/11/22(土) 22:53:550401デフォルトの名無しさん
2008/11/23(日) 01:13:53func2(const double data[]){
cout <<data[0];
]
func1(const double data[]){
func2(data);
}
main(){
double data[100]:
func1(data);
}
これってfunc2内でちゃんと元のデータ参照できますか?
0402デフォルトの名無しさん
2008/11/23(日) 01:40:43できなかったの?
0403デフォルトの名無しさん
2008/11/23(日) 06:48:460404デフォルトの名無しさん
2008/11/23(日) 12:08:03double data;
char name[20];
}
Hoge hoge[100];
という配列の0番目から40番目の中で、nameの出現回数順にソートする方法ってどういうのがありますか?
0405デフォルトの名無しさん
2008/11/23(日) 13:05:140406デフォルトの名無しさん
2008/11/23(日) 13:11:220407デフォルトの名無しさん
2008/11/23(日) 13:13:22hoge[0].name →ABC
hoge[1].name →ABC
hoge[2].name →CDE
hoge[3].name →FGH
hoge[4].name →ABC
だったら
(ABC 3)
(CDE 1)
(FGH 1)
ってかんじに
0408デフォルトの名無しさん
2008/11/23(日) 14:02:460409デフォルトの名無しさん
2008/11/23(日) 14:32:31全部なめたら、
mapの頭からキーと値を別の構造体に入れる。
その構造体をintをキーにソートって考えましたが・・・
どうでしょう?
0410デフォルトの名無しさん
2008/11/23(日) 14:39:32まず集合から要素→頻度のマップを作ってそれを頻度順にソート
でソート後のマップから要素を取り出して集合を作り直す
妥当だと思うヨ
0411デフォルトの名無しさん
2008/11/23(日) 15:15:28#include <fstream>
のファイル入出力ストリームと
#include <cstdlib>
のfopenを同じソースないで一貫性なく両方つかっていますが、動作的に問題が起きますでしょうか?
0412デフォルトの名無しさん
2008/11/23(日) 16:26:25それだけの条件じゃなんともいえないな。
なんで問題が起こるかもしれないと思うの?
0413デフォルトの名無しさん
2008/11/23(日) 16:32:07標準入力でのprintfとcoutの併用みたいなこと気にしてるんなら大丈夫だよ
0414デフォルトの名無しさん
2008/11/23(日) 18:23:36なんとなく、強いて言えば、勘かな
0415デフォルトの名無しさん
2008/11/23(日) 19:07:430416デフォルトの名無しさん
2008/11/23(日) 19:09:31古いコンパイラ(例えば古いgccとか)では
ios::sync_with_stdio(true); しないとダメだったりする。
規格的にはこんなことしなくても使えないといけないんだけどね。
(デフォルトは true だと規格に書いてある。)
まあ今は気にする必要は無いと思う。多分。
0417デフォルトの名無しさん
2008/11/23(日) 19:41:15とあるブログで見つけたC言語のプログラムなんだが、
コメントがあるから何をやってるのかは大体分かるが、ソース自体がまったく読めない・・・
「static char *__entry_list[]」とか、一体何者・・・?
0418デフォルトの名無しさん
2008/11/23(日) 19:44:110419417
2008/11/23(日) 19:47:11文字化けして読めないって意味じゃなくて、内容が難しすぎるって意味。
0420デフォルトの名無しさん
2008/11/23(日) 19:48:23どの辺が分からんのだ。
0421デフォルトの名無しさん
2008/11/23(日) 19:50:240422デフォルトの名無しさん
2008/11/23(日) 19:50:54time_t と long のサイズが同じとは限らないんだし、ポインタをキャストするのは危険。
0423デフォルトの名無しさん
2008/11/23(日) 19:52:24まあなんか参考書読みなね、とかそういうレベルだわな。
まさか文字列リテラルは const char * にしないとダメよねー、
とかそういうツッコミを迂遠に言ってるのかもしれない。
あるいは、2重アンダースコアで始まる名前は
コンパイラの予約語とぶつかる可能性あってダメじゃん、
とかそういうツッコミをしてるのかもしれない。
0424デフォルトの名無しさん
2008/11/23(日) 19:55:48戻り値がいまいち理解できないな。
一体どういった活用すればいいのだろう?
0425デフォルトの名無しさん
2008/11/23(日) 19:58:43結果を見やすくするために・・・と最後を半角空白で埋めてるが、
printfで幅指定すればいいだけ。
条件式内でstrlenを使ったり空白の追加にstrcatを使ったりするなど実装に無駄が多く、
完全に無駄な処理。(こんなのsprintfで一発でできる。)
ランダムシャッフルも定番の高速なアルゴリズムがあるのに、それを使っていない。
突っ込みどころが多過ぎる。
0426417
2008/11/23(日) 19:58:50うお。
お前らすげーな。
まずヘッダファイルからして、俺にはチンプンカンプン過ぎる。何がなんだが・・・・
それに加え、「*__entry_list」や「__entry_list[]」なら何となく分かるが、「*__entry_list[]」ってなんぞ・・・ってそうゆうレベル。
まだまだ勉強しないといけない事が山ほどあるなorz
0427デフォルトの名無しさん
2008/11/23(日) 20:00:210428デフォルトの名無しさん
2008/11/23(日) 20:00:38まぁ、ヤな変数名ではあるw
0429デフォルトの名無しさん
2008/11/23(日) 20:01:54orzじゃないだろ、シャキーンだろ
0430デフォルトの名無しさん
2008/11/23(日) 20:03:13数学で言う所の関数を思い浮かべればいい。
数学で戻り値の無い関数なんて思い浮かばないし、存在意義も見いだせないだろう。
関数には戻り値があるのが自然の姿。
戻り値の無い関数の方が特殊な姿で、
中には戻り値が無いものを関数とは呼ばない言語もある。(FORTRANとか)
戻り値のない関数にはなぜ戻り値が必要ないのか、
ということをむしろ考えた方がいい。
0431デフォルトの名無しさん
2008/11/23(日) 20:08:070432デフォルトの名無しさん
2008/11/23(日) 20:10:510433デフォルトの名無しさん
2008/11/23(日) 20:11:010434デフォルトの名無しさん
2008/11/23(日) 20:14:16全体的にしろうとくさい書き方のコードだから、あんまり細かいことは気にスンナ。
0435デフォルトの名無しさん
2008/11/23(日) 20:24:45BCCで猫でもわかるwindowsプログラミングを勉強しているのですが、
6章のメニューを作るところができません。リソースをコンパイル
するときにwindows.hが開けませんというエラーがでます。
どうすればいいか教えてください。
0436デフォルトの名無しさん
2008/11/23(日) 21:03:23BCCよくしらないけど、環境変数のINCLUDEに設定するとか、引数で/Iとかに設定するとか、
windows.hのパスを教える方法がなんかあるんじゃね?
0437デフォルトの名無しさん
2008/11/23(日) 21:06:280438デフォルトの名無しさん
2008/11/23(日) 21:17:03インクルードするときもあるだろ。
0439435
2008/11/23(日) 22:02:23ここに乗ってるのまるまるコピーしてきたんで、ソースが悪いんじゃなくて
やっぱり設定なんですかね?パソコンも初心者なんでよく分からないですが、
調べてみます。もし誰か詳しい人いたら教えて頂けたらありがたいです。
0440デフォルトの名無しさん
2008/11/23(日) 22:05:53普通しないと思うけどなぁ
>>439
この場合は消しても問題ないと思うよ
0441435
2008/11/23(日) 22:39:47windows.h消したらうまく行きました!これで先に進めますありがとうございます。
0442デフォルトの名無しさん
2008/11/23(日) 22:45:38うまく動きました!
0443デフォルトの名無しさん
2008/11/23(日) 22:55:560444デフォルトの名無しさん
2008/11/23(日) 22:58:07本気で間違えて覚えていたらかわいそうだから教えてあげた方がいいのかな?
と思いながら放置する
0445デフォルトの名無しさん
2008/11/23(日) 23:42:550446デフォルトの名無しさん
2008/11/24(月) 03:36:27int main(int argc, char *argv[])
という書き方を見たことがないか、見たことあるけど__に惑わされたかのどちらかだなあ
0447デフォルトの名無しさん
2008/11/24(月) 08:19:460448デフォルトの名無しさん
2008/11/24(月) 09:47:26数学の関数でいうのなら、「処理が成功したら0、失敗したらエラーコードを返す」
ってのはオカシな考えだなあ。
0449デフォルトの名無しさん
2008/11/24(月) 11:14:23それはコンピータさんの都合でしょ
0450デフォルトの名無しさん
2008/11/24(月) 11:34:54ん?ディリクレの関数というものがありまして‥‥‥。
0451デフォルトの名無しさん
2008/11/24(月) 11:59:180452デフォルトの名無しさん
2008/11/24(月) 14:30:04そんな事したらメンバ変数が使えないじゃないか!!
0453デフォルトの名無しさん
2008/11/24(月) 14:40:18| ノ\ ヽ | , -─-'- 、i
/ ●゛ ● | | _, '´ / ヽ、
| ∪ ( _●_) ミ j iニニ, "● ∪ ヽ、
彡、 |∪| | iニニ、_ ',
/ ∩ノ ⊃ ヽ 〈`'ー;==ヽ、〈ー- 、 !
( \ / _ノ | | `ー´ ヽi`ヽ iノ
.\ “ /__| | ! /
\ /___ / r'´、ヽ
`´ヽノ
0454デフォルトの名無しさん
2008/11/24(月) 16:00:170455デフォルトの名無しさん
2008/11/24(月) 16:24:33つhttp://pc11.2ch.net/test/read.cgi/tech/1226693085/
0456デフォルトの名無しさん
2008/11/24(月) 16:53:23機種依存だったりします?
0457デフォルトの名無しさん
2008/11/24(月) 16:55:08あと左を評価して偽だったら右は評価しない
0458デフォルトの名無しさん
2008/11/24(月) 16:55:08a > 10 のほうが先
0459デフォルトの名無しさん
2008/11/24(月) 17:41:440460デフォルトの名無しさん
2008/11/24(月) 17:45:130461459
2008/11/24(月) 17:50:10ありがとうございます
0462デフォルトの名無しさん
2008/11/24(月) 17:56:14作成しようとしているのですが、さっぱりわかりませんので誰か詳しい人いたら教えて頂けたらありがたいです。
0463デフォルトの名無しさん
2008/11/24(月) 18:02:34後はわかるな?
0464デフォルトの名無しさん
2008/11/24(月) 18:07:520465デフォルトの名無しさん
2008/11/24(月) 18:09:11数学関数使えないので^と!は使えないのではないのでしょうか
0466デフォルトの名無しさん
2008/11/24(月) 18:17:32地道に計算すればいいだろ
ただし、単純に計算しただけだと小数点以下15桁も有効数字は無い。せいぜい8桁程度
それ以上欲しいなら、さらに工夫が必要
0467デフォルトの名無しさん
2008/11/24(月) 18:22:090468デフォルトの名無しさん
2008/11/24(月) 18:24:370470デフォルトの名無しさん
2008/11/24(月) 18:26:020471デフォルトの名無しさん
2008/11/24(月) 18:33:10eを求めたいのならx=1だから後は簡単
0472デフォルトの名無しさん
2008/11/24(月) 19:57:520473デフォルトの名無しさん
2008/11/24(月) 20:25:140474デフォルトの名無しさん
2008/11/25(火) 00:03:09特定のディレクトリ内のファイルを全てを読み込むにはどうすればよいのでしょうか。
よろしくお願いします。
0475デフォルトの名無しさん
2008/11/25(火) 00:03:580476デフォルトの名無しさん
2008/11/25(火) 00:10:190477デフォルトの名無しさん
2008/11/25(火) 00:15:380478デフォルトの名無しさん
2008/11/25(火) 00:16:09? いや、普通にディレクトリ内のデータを基に処理して、結果をアクセスで使えるようにCVSにしたいだけです。
0479デフォルトの名無しさん
2008/11/25(火) 00:17:06ありがとうございます。調べてきます。
0480デフォルトの名無しさん
2008/11/25(火) 05:36:10つまりその、コンパイルした環境によって、実行結果が変わってしまいますか?
0481デフォルトの名無しさん
2008/11/25(火) 05:49:35関数を使わないで自分で計算すればいいだろ
ちなみに>>463のようにあらわすのをテイラー展開という
0482デフォルトの名無しさん
2008/11/25(火) 06:23:53そのとおりです。大概の rand() は線形合同法だと思います。
0483デフォルトの名無しさん
2008/11/25(火) 11:43:46ConcurrentVersionSystem?
もしかして: CSV
0484デフォルトの名無しさん
2008/11/25(火) 11:58:580485デフォルトの名無しさん
2008/11/25(火) 15:44:10ひとまず、HDD のシーケンシャルリード性能を hdparm -t で計測したら、
60MB/s でした。
次に fgets() で一行ずつ読み込むプログラムを書いて計測したところ、
140MB/s という hdparm より大幅に良い値が出ました。なぜこうなるのか理由
がわからないのですが、どうしてでしょうか?
fgets() で読み込むプログラムはこんな感じです。
while( fgets( linke, LINE_MAX, fp ) ) {
if ( ferror( fp ) ) {
exit( -1 );
}
}
0486デフォルトの名無しさん
2008/11/25(火) 16:21:110487デフォルトの名無しさん
2008/11/25(火) 17:11:57私にヒントをください
0488デフォルトの名無しさん
2008/11/25(火) 17:29:38#include <stdlib.h>
char *GetNumStr1(char *get, int num)
{
sprintf(get, "%d", num);
return get;
}
char *GetNumStr2(int num)
{
static char keep[32];
sprintf(keep, "%d", num);
return keep;
}
int main(void)
{
char str[32];
GetNumStr1(str, 1);
printf("%s\n", GetNumStr2(10));
printf("%s\n", GetNumStr2(100), GetNumStr2(1000));
return 0;
}
関数でなんらかの処理をし、
その結果を文字列を返す関数で
上の2つの関数だと、どちらがいいでしょうか。
2は呼び出し元で文字列を用意しなくてすみますが、
static分の容量が常に必要なのと、
1行で複数使うとよくないみたいです。
0489デフォルトの名無しさん
2008/11/25(火) 17:34:05> 1行で複数使うとよくないみたいです。
とか
戻りをポインタで保持し、その後再び関数呼び出しすると…
char* p1 = GetNumStr2(10);
char* p2 = GetNumStr2(100);
printf("%s,%s\n", p1, p2);
出力結果は 100,100 になっちまうし
0490デフォルトの名無しさん
2008/11/25(火) 18:07:39ありがとうございます。
1にしたいと思います。
2で変数を用意しないで使える便利さも、
関数の中に関数を書くことで、
見づらくなるデメリットもありますし。
0491デフォルトの名無しさん
2008/11/25(火) 18:23:34CString str.Find(_T("abc"), 0);
文字列群を検索するにはどうすればいいんでしょうか?
CString str1 = _T("abc");
CString str2 = _T("def");
CString str3 = _T("ghi");
0492デフォルトの名無しさん
2008/11/25(火) 23:28:10hdparm -Tだと?
0493デフォルトの名無しさん
2008/11/25(火) 23:29:533回検索すれば。。。
0494デフォルトの名無しさん
2008/11/26(水) 02:47:29計測ルーチンにバグが無いと確信できるならば、
ページキャッシュについて調べてみるとよい。
0495デフォルトの名無しさん
2008/11/26(水) 17:07:21例えば
class hoge{
private:
int m;
public:
...
}
とかなっているときに、必ずmの値を指定して生成したい場合などです。
このとき、コンストラクタでmの値を指定することが考えられますが、
その場合、引数を持つコンストラクタのみを使って欲しくて、デフォルト
コンストラクタは使ってほしくないという状況になります。
こういう場合、コピーコンストラクタをprivateメンバに宣言して使用禁止に
するように、デフォルトコンストラクタを使用禁止にするというのは妥当な手段でしょうか。
普通自動生成禁止にするという話になると、大抵コピーコンストラクタの話が出てきて、
デフォルトコンストラクタについて触れられることはほとんど無いので、良い方法なのか
確信が持てません。
0496デフォルトの名無しさん
2008/11/26(水) 17:16:590497デフォルトの名無しさん
2008/11/26(水) 18:08:57何らかのコンストラクタを自分で定義すれば、デフォルトコンストラクタは自動生成されない
引数を持つコンストラクタを作るだけでおk
>>496
それは同じだ
0498495
2008/11/26(水) 18:18:14>何らかのコンストラクタを自分で定義すれば、デフォルトコンストラクタは自動生成されない
本当だ…orz
基本でした。すみません。
どうもありがとうございます。
0499デフォルトの名無しさん
2008/11/26(水) 19:07:38windows&VC++とLinux&gccのそれぞれを知りたいのですが、教えていただけますでしょうか?
0500デフォルトの名無しさん
2008/11/26(水) 20:08:44time.hの関数一通り眺めてみればいいんじゃないかな
0501デフォルトの名無しさん
2008/11/26(水) 20:18:08win32なら
SetLocalTime
ことを言っているのかな
0502デフォルトの名無しさん
2008/11/26(水) 20:20:15阿呆は無理に書き込みしなくてもいいんですよ。
>>499
WinAPIスレ、Unixプログラミングスレへどうぞ。
どっちみち、権限がないと設定できないと思うのだけど。
0503499
2008/11/26(水) 20:25:05なるほど!その考えはなかったわ。と思って
C:\Program Files\Microsoft Visual Studio\VC98\Include 以下と
C:\cygwin\usr\include 以下を見てみたんだけど、
windowsなら_setsystime()であってますか?調べてみたけど使い方がわからない。
Linuxの方はcygwinで調べてみたけど、それらしいのがない・・・orz
0505デフォルトの名無しさん
2008/11/26(水) 21:18:25BALL ball[1000];
memset(&ball,0,sizeof(ball));
このソースでball1000個分ちゃんと0クリア
されるのでしょうか?
0506デフォルトの名無しさん
2008/11/26(水) 21:32:440507デフォルトの名無しさん
2008/11/26(水) 21:34:02BALLが doubleだったり、ポインタ型だったり、それらをメンバにもってたり、コントラクタもってたりしなければ
POD型というだけではダメだろう
0508デフォルトの名無しさん
2008/11/26(水) 21:34:550509デフォルトの名無しさん
2008/11/26(水) 21:37:27&はいらない
0510デフォルトの名無しさん
2008/11/26(水) 22:10:09ttp://xy.yu.to/ (ここは本来のサイトではないが)
この荒れまくりカオス絵チャのminiっていう部屋の
秘密スペース(枠外)への書き込みってどうやれば
できるようになるのか解析して教えろ。
あと、1人の防衛プログラマーのクリアツールが強すぎて、
荒しプログラマーがことごとく全員返り討ちになってるから
オマエラが面白くしてみろ。
ゲハハハごめんね
0511デフォルトの名無しさん
2008/11/26(水) 22:40:42ありがとうございます
なんかsizeofってよくわからないんす
げ、&いらないっすかそういえばそうですね
あるとまずかったりします?w
0512デフォルトの名無しさん
2008/11/26(水) 22:55:380513デフォルトの名無しさん
2008/11/26(水) 23:00:44Javaじゃないんだからそもそもnewなんて使わなくていい。
0514デフォルトの名無しさん
2008/11/26(水) 23:01:34そもそもmemset()を使うよりも自分でループを回してきちんとクリアする習慣をつけるべき。
memset()を使うのは大人になってからw
0515デフォルトの名無しさん
2008/11/26(水) 23:11:19Cでメモリマップドファイルと、Win32APIイベントオブジェクトを使って、1対nのプロセス間通信を
考えているんですが、「対n」の部分がうまくいきません。
複数のプロセスが発生したイベントを1度ずつ参照して、その後にイベントをオフにする、そんな
サンプル、もしくは案があったら教えていただけませんか?
0516デフォルトの名無しさん
2008/11/26(水) 23:12:250517デフォルトの名無しさん
2008/11/26(水) 23:22:01マルチスレッドかAPIのスレに行ってみようと思います
ありがとうございます
0518デフォルトの名無しさん
2008/11/27(木) 01:55:28普通に枠外に書いたら普通に書けて困った
0519デフォルトの名無しさん
2008/11/28(金) 19:55:120520デフォルトの名無しさん
2008/11/28(金) 20:23:310521デフォルトの名無しさん
2008/11/28(金) 21:03:040522519
2008/11/28(金) 21:12:06改めて考えてみると一番の疑問のありどころが>>521で
デストラクタ呼べるのならどうせ最適化で消えるだろうし、呼ぶのが未定義の動作を招くのなら違うコードを作ろうと思っていました。
VC++2008では
template<typename T>
void call_destructor(T &obj)
{
obj.~T();
}
というコードで問題なく動いているように見えます。
0523デフォルトの名無しさん
2008/11/28(金) 22:59:165.2.4 擬似デストラクタの呼び出し
1 ドット演算子.又は矢印演算子->の後ろに≪疑似デストラクタ名≫を付けた表現は、型名の表す非クラス型に対するデストラクタを表す。
その結果は、関数呼び出し演算子()の演算対象にしか使ってはならず、その呼び出し結果の型は、void型とする。
その効果は、ドット又は矢印の前にある≪後置式≫を評価することだけとする。
これ読む限り、こんな風に書けて、効果は「i;」と同じ、っていう風に読めるけどなぁ
VC++2008は文法エラーではねつける…(522のcall_destructor<int>は通るのに)
int i;
i.~int();
規格に詳しい人頼む
0524デフォルトの名無しさん
2008/11/29(土) 05:27:56文法要素としての擬似デストラクタ名 pseudo-destructor-name の中で、 ~ の後ろに
現れるのは type-name なんだけど、文法要素としては識別子とは別格のキーワードである
int, long, ... などはこの type-name に含まれないので文法エラーになる。
ちなみに、一般に「型名」と呼ばれる箇所は、文法要素としては simple-type-specifier が
対応し、これには type-name 単体に加えて、それに名前空間指定などを追加したものも
含まれるほか、 int, long, ... などの組み込み型をあらわすキーワードも含まれる。
完全に文法上の問題でキーワードを受け付けないだけなので、↓なら通ったりする。
typedef int Int;
Int i;
i.~Int();
0525デフォルトの名無しさん
2008/11/29(土) 08:13:24これはどういうときに使うんですか?使い方さえわかればよく使う便利なものになるんですか?
0526デフォルトの名無しさん
2008/11/29(土) 11:07:28なるほど、よくわかりました
キーワードは≪型名≫じゃないのか、盲点だった
0527デフォルトの名無しさん
2008/11/29(土) 11:38:29規模が大きくなるとありがたみが出てくる
あとは仕様変更が多い時とか
0528デフォルトの名無しさん
2008/11/29(土) 16:11:27C#の例で申し訳ないけど、
class Hoge {
:
:
public void Write(Stream stream)
{
foreach (byte ch in tbl)
stream.WriteByte(ch);
}
}
↑こういうメソッドがあったとして、それを使う側は、
streamから派生してるクラスならなんでも渡せる。
Hoge hoge = ……;
FileStream file = ……; // ファイルにデータを出力
hoge.Write(file);
MemoryStream mem = ……; // メモリにデータを出力
hoge.Write(mem);
0529デフォルトの名無しさん
2008/11/29(土) 17:28:01多様な処理を、実行時に動的に切り換えたり組み合わせたりするソフトを作る時に便利
0530デフォルトの名無しさん
2008/11/29(土) 18:15:53俺は逆にベタで書けばよかったと後悔するほうが多かったけどね
0531デフォルトの名無しさん
2008/11/29(土) 18:23:480532デフォルトの名無しさん
2008/11/29(土) 18:26:42仕様変更があったらどんな先読み名人でも無理だろ
結局、プログラムなんて汎用性なんてつけずに
いま必要なものだけをシンプルに組んだほうがいいと悟った
0533デフォルトの名無しさん
2008/11/29(土) 18:34:31例題に出てきそうなシステムをやったことあるけど、C++なのに、ぜんぜん
オブジェクト指向っぽい書き方してなくて、コード中がswitchの嵐で、あーあって
思ったことがあったな。
0534デフォルトの名無しさん
2008/11/29(土) 20:31:31たしかに。お仕事ソフトはいらない機能が多すぎる。
0535デフォルトの名無しさん
2008/11/29(土) 20:32:03それってWMがらみ?ならばいたしかたないかと。
0536デフォルトの名無しさん
2008/11/30(日) 12:49:16内部処理
}
この場合の(条件)にはさまれた,はどういう意味ですか?
||とか&&の類でしょうか?
0537デフォルトの名無しさん
2008/11/30(日) 12:51:08for の継続条件には一番右の評価結果が採用されます
0538デフォルトの名無しさん
2008/11/30(日) 12:54:27「A,B」はAを評価してからBを評価するっていう演算子
Aの結果は捨てられるから、Bが本当の条件でAはその前処理だな
初期化とインクリメントの所ではよく使うけど、条件で使うのは良くないなぁ
0539デフォルトの名無しさん
2008/11/30(日) 13:30:46別にどこで使ってもいいと変わらんと思うが。
0540デフォルトの名無しさん
2008/11/30(日) 13:34:33そもそも関数呼び出しのカンマと区別がつきにくい段階で要らない子だ。
# forの初期化みたいにその子が役立つときもあることはあるが。
0541デフォルトの名無しさん
2008/11/30(日) 13:36:41どきっとするコードではあるな。
0542デフォルトの名無しさん
2008/11/30(日) 13:47:34マクロを書くときにも使える。
0543デフォルトの名無しさん
2008/11/30(日) 14:04:04初期化、インクリメントは副作用の方が必要だけど
条件節は式の評価の値が大事
そこに式全体の評価に寄与しないカンマ左辺みたいなのがあると混乱するから良くない
0544デフォルトの名無しさん
2008/11/30(日) 21:30:01//略
};
Task* InitTaskList() {
Task* task = new Task[NUM_TASK];
//中略
return task;
}
int main() {
Task* taskArray = InitTaskList();
delete[] taskArray;
return 0;
}
この処理でInitTaskList()で動的に確保したメモリはちゃんと開放されますか?
あと、deleteでもコンパイル通るんですが
delete taskArray ←配列の先頭だけ開放
delete[] taskArray ←配列全体を開放
といった解釈でよろしいでしょうか?
0545デフォルトの名無しさん
2008/11/30(日) 21:33:47省略された箇所で例外が発生すると開放されない。
あと、 delete taskArray は未定義動作。
気にしなくてもあんまり問題になることはないんで、そのままでも
いいかもしれないが、完璧を求めるなら std::vector<Task> などの
標準コンテナを使うのがおすすめ。
0546デフォルトの名無しさん
2008/11/30(日) 23:01:43iconvを使ってShiftJISのファイルをUTF8に変換するプログラムを書いています。
http://d.hatena.ne.jp/hp-ux/20081123
を参考に
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8164.c
を書きましたが、うまく動きません。
*outbuf に十分な空きがない。
と言う内容のエラーが出ます。
ですが、自分としては結構な容量を確保しているつもりです。
というかmallocしているoutbufの容量に00を二つ足しても、同じエラーが出ます。
どこか、悪い点を指摘していただけないでしょうか?
ちなみに、
byteread = read(fileno(src), inbuf, sizeof(inbuf));
という処理だけは、引数を含めて変更することは出来ません。
0547デフォルトの名無しさん
2008/11/30(日) 23:24:44char *inbuf = (char *)malloc(21701); を
char inbuf[21701]; にしてみたら?
ポインタに、sizeof(inbuf)すると、21701じゃなくて4になるよ。
0548デフォルトの名無しさん
2008/11/30(日) 23:45:13あんたの頭。
0549デフォルトの名無しさん
2008/11/30(日) 23:47:11初心者スレであんまり調子コキ過ぎなレスつけんな
以降、みんな相手にしないように
0550デフォルトの名無しさん
2008/11/30(日) 23:47:580551デフォルトの名無しさん
2008/11/30(日) 23:49:45マジで書くと、iconv云々以前にCの基本も理解できてないしストリーム系I/Oと低レベルI/Oを混ぜる馬鹿も晒しているし、
なのにread()の処理だけは変更できないなんて妙な拘束条件は提示してもその原因は伏せたまま。
どう考えても悪いのは頭だろ。
0552デフォルトの名無しさん
2008/12/01(月) 00:03:460553デフォルトの名無しさん
2008/12/01(月) 00:12:230554デフォルトの名無しさん
2008/12/01(月) 00:33:14すいません。有り難うございます。
>>548
すいません。
>>550
どういう風に違うのでしょうか?
ファイルをメモリに読み込んで->即変換->変換した物を書き出し
とういう処理を行いたいのですが...
>>551
すいません。
>マジで書くと、iconv云々以前にCの基本も理解できてないしストリーム系I/>Oと低レベルI/Oを混ぜる馬鹿も晒しているし、
>なのにread()の処理だけは変更できないなんて
>妙な拘束条件は提示してもその原因は伏せたまま。
>どう考えても悪いのは頭だろ。
一応filenoを使ったのですが、駄目だったでしょうか?
read()の処理を変えられないのは、
実際の処理はソケットディスクリプタからreadするからで、
それ以外の方法がサンプルコードに乗ってなかったし、
試してもソケットからうまく読み込む事が出来なかったからです。
0555デフォルトの名無しさん
2008/12/01(月) 00:39:34そういうのは先に書こう。
まぁ、iconv以前にソケットから読み込むだけのプログラムでも作って充分納得してからiconvに挑戦することだね。
0556デフォルトの名無しさん
2008/12/01(月) 00:53:39>まぁ、iconv以前にソケットから読み込むだけのプログラムでも作って充分納得してからiconvに挑戦することだね。
いや、そこはもう出来て、満足してるんで別に良いんです。
iconvが動作しないから困ってるんです。
0557デフォルトの名無しさん
2008/12/01(月) 01:02:58これでホントに動かしているの? どうしようもねぇな。
0558デフォルトの名無しさん
2008/12/01(月) 01:10:14なんかGDBで変数を見ながら、
うさん臭いところなおしたら、なんか動きました。
有り難うございます。
ポインタをsizrofすると、このばあいchar *のサイズがかえってくる事を
うっかりしていました。
有り難うございます。
0559デフォルトの名無しさん
2008/12/01(月) 01:31:53スレタイも読めないのかお前は、2chド初心者丸出し
お前、頭悪いぞ!
0560551
2008/12/01(月) 01:36:000561551
2008/12/01(月) 02:14:41それとも何か? 「初心者歓迎」だから「初心者スレ」だとでも?
他に文字通り初心者向けのスレがあることも認識できないのか?
0562デフォルトの名無しさん
2008/12/01(月) 02:30:410563デフォルトの名無しさん
2008/12/01(月) 10:39:050564デフォルトの名無しさん
2008/12/01(月) 11:39:03初心者に寛容になったらと思ってる
0565デフォルトの名無しさん
2008/12/01(月) 11:46:030566デフォルトの名無しさん
2008/12/01(月) 12:32:20誰かをうざがったり馬鹿にしたりという独りよがりをし始めたら
0567デフォルトの名無しさん
2008/12/01(月) 13:06:38その質問をする側じゃなくて答える側になったら
0568デフォルトの名無しさん
2008/12/01(月) 13:10:050569デフォルトの名無しさん
2008/12/01(月) 13:18:38どう対処してよいか分からないエラーが出たので、質問させていただきます
ソースコードはこちらです
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8168.txt
エラーの内容は以下の通りです
-----------------------------------------------------------------------
class.cpp(19) : error C2059: 構文エラー : 'switch'
class.cpp(19) : error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます
どうもswitchの様子がおかしいようですが、どう対処したらいいものか・・・
お願いします
0570デフォルトの名無しさん
2008/12/01(月) 13:24:04switchの前に}があるのがおかしい
0571デフォルトの名無しさん
2008/12/01(月) 13:27:10そんな仕様があったんですか
このswitch文をクラスの外に出しても、switchはmainで機能しますかね?
0572デフォルトの名無しさん
2008/12/01(月) 13:36:02「そんな仕様」が何を指しているのか判らんが、
関数の外には実行文は置けない。
クラス云々以前に、先ずは普通にプログラミングしてみてはどうか。
0573デフォルトの名無しさん
2008/12/01(月) 13:38:20setegara() の中で switch したいのなら
setegara() の中に記述しろ ってことだ
ロダにあがってるソースは setegara() { } switch() { }
ってなってるじゃん と
0574デフォルトの名無しさん
2008/12/01(月) 13:41:37PCを窓から投げ捨てろ。
さもなくば、入門書なりサイトなりのサンプルをそのまま動かしてみろ。
0575デフォルトの名無しさん
2008/12/01(月) 13:56:41すいません、関数とか実行文なんかの概念もキッチリ定着していないので
基本的なタブーなんかを理解出来ていないようです
>>573
その方法でやったら出来ました、有難うございます
そして一つ気付いたのですが、どうも}の数が一つ足りなかったようです
こんなケアレスミスで質問してしまい、すいませんでした
>>574
PC投げ捨てだけは勘弁してください
ご解答していただいた方々、有難うございました
0576デフォルトの名無しさん
2008/12/01(月) 16:19:25あと「ご回答いただいた」か、「回答していただいた」かどっちかでいいぞ。
0577デフォルトの名無しさん
2008/12/01(月) 16:23:460578デフォルトの名無しさん
2008/12/01(月) 19:04:35#include <stdio.h>
using namespace std;
int main() {
int num;
int* Array = new int[40960];
scanf("%d",&num);
delete[] Array;
return 0;
}
このプログラムなんですが、配列を動的に確保しているんですが
タスクマネージャーなどで見てもメモリ使用率が増えていないんですが
メモリの使用状況を調べる方法はありますか?
0579デフォルトの名無しさん
2008/12/01(月) 19:25:480580578
2008/12/01(月) 19:38:150581デフォルトの名無しさん
2008/12/01(月) 19:52:3740960って1MBないだろ?w
160kぐらいだろ?
微妙に変わってるけど気づいてないか
あらかじめ一定量取られちゃってて変化無しか
ってとこじゃね?
0582578
2008/12/01(月) 20:10:22でやってみましたが変化ありませんでした…
0583デフォルトの名無しさん
2008/12/01(月) 20:15:16それ今度はnew失敗してるでしょ?
たしか限界あった希ガス
0584デフォルトの名無しさん
2008/12/01(月) 20:18:190585デフォルトの名無しさん
2008/12/01(月) 20:28:48配列だとたしかすぐ駄目なんだよねスマンコ
0586デフォルトの名無しさん
2008/12/01(月) 20:34:52とりあえず
ttp://d.hatena.ne.jp/NyaRuRu/20051022
でも見れ
0587578
2008/12/01(月) 20:41:58色々助言ありがとうございました!
0588デフォルトの名無しさん
2008/12/02(火) 00:10:48全然よくねーよ
0589デフォルトの名無しさん
2008/12/02(火) 21:01:36お前さん 敬語をもっと勉強しないとやばいぜ?
0590デフォルトの名無しさん
2008/12/03(水) 05:18:29開発OSはXPでターゲットはVistaです。
開発したソフトがXPでは問題なく動作するのですが、Vistaでは動作しません。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\\Services\自分のKey
以下へアクセスしたいのですが、レジストリのキーの値を読むことはできるのですが、
値を変更(削除してから書き込み)ができません。
具体的にはStartレベルを変更できません。
試したこととしては、管理者権限で実行を行い実行>レジストリ値変更できず。
管理者権限で実行&XP(SP2)互換で実行>レジストリ変更できず。
プログラム的な問題なのか?もっと別の問題なのかがわかりません。
どなたか、上記について詳しいサイト、書籍などご存知でしたらご教授願えないでしょうか?
0591デフォルトの名無しさん
2008/12/03(水) 07:14:25((CMainFrame*)AfxGetMainWnd())->m_wndFile.m_Edit.InitEdit();
これはポインタで
CEdit *m_newEdit = ((CMainFrame*)AfxGetMainWnd())->m_wndFile.m_Edit;
m_newEdit->InitEdit();
それか、参照で
CEdit &m_newEdit = ((CMainFrame*)AfxGetMainWnd())->m_wndFile.m_Edit;
m_newEdit.InitEdit();
どっちがいいんですか?どっちも同じなんですか?参照を使ったことがないので教えてください。
0592デフォルトの名無しさん
2008/12/03(水) 07:46:26対象が変わらないなら参照の方がいいね。ポインタだと、使い回しを疑って見ないといけなくなる。
0593デフォルトの名無しさん
2008/12/03(水) 08:06:55これから使っていけそうなきがしてきました
どうもです!
0594デフォルトの名無しさん
2008/12/03(水) 09:10:59static const int ARRAY_N = 10;
int array[ARRAY_N];
};
class B {
int array[ARRAY_N];
};
って感じで、BでもAのprivate使いたいときがたまにあるんだけど、
friendしちゃってもイイのかな?(・∀・)
0595デフォルトの名無しさん
2008/12/03(水) 09:47:21どういう関係のとき使えるの?
静的じゃないとどうしようもなくない?
0596デフォルトの名無しさん
2008/12/03(水) 09:57:40つうか設計がおかしいだろww
0597デフォルトの名無しさん
2008/12/03(水) 10:03:460598デフォルトの名無しさん
2008/12/03(水) 10:04:16じゃあどうすればいいの
0599デフォルトの名無しさん
2008/12/03(水) 10:50:01UACだろ。マニフェストで管理者権限への移行できるようにする。
0600デフォルトの名無しさん
2008/12/03(水) 11:34:57A, B,の関係やARRAY_Nの意味が分からないとなんとも言えない
0601デフォルトの名無しさん
2008/12/03(水) 11:36:07static const は public にしてもいいんじゃね?どうせ書き換えられないんだし。
あ、その値に外部から見て意味があるんならね。
0602デフォルトの名無しさん
2008/12/03(水) 11:37:56friend 使ってまで「あるクラスの持つ定数を
他のクラスに見せたくない」理由が解らん。
0603594
2008/12/03(水) 11:51:10AとB以外には意味のない、ただのマジックナンバーを全体に公開するのも気がひけるなぁ
と思ったんだけど、やっぱfriendはダメかな?
2つ以上のクラスで使う定数はグローバルに出すって人もいるけど、僕はああいうの嫌い
0604デフォルトの名無しさん
2008/12/03(水) 11:52:58inlineじゃだめなの?
0605デフォルトの名無しさん
2008/12/03(水) 11:53:450606デフォルトの名無しさん
2008/12/03(水) 12:05:52class A : C { int array[ARRAY_N]; };
class B : C { int array[ARRAY_N]; };
こんな感じ?
0607デフォルトの名無しさん
2008/12/03(水) 12:25:51なんか気持ち悪いな
0608デフォルトの名無しさん
2008/12/03(水) 13:02:17やっぱそんなもんか
よくそんなんで否定できるな
0610デフォルトの名無しさん
2008/12/03(水) 13:11:37定数のことか?
0611デフォルトの名無しさん
2008/12/03(水) 14:06:18ちゃうわww
0612デフォルトの名無しさん
2008/12/03(水) 14:07:190613デフォルトの名無しさん
2008/12/03(水) 14:10:350614デフォルトの名無しさん
2008/12/03(水) 14:16:180615デフォルトの名無しさん
2008/12/03(水) 14:18:050616デフォルトの名無しさん
2008/12/03(水) 14:19:420617デフォルトの名無しさん
2008/12/03(水) 15:37:26マクロや変数で他人にも意味のわかる名前付けたらマジックナンバーじゃない
0618デフォルトの名無しさん
2008/12/03(水) 16:23:33任意のディレクトリ以下のcsvファイルのフルパス(サブディレクトリのファイル含む)を取得したいです。
FindFirstFileとかででいけそうと思ったのですが、ファイル名しか取得できなくて困っています。
どうすればディレクトリも取得でlきますか?
0619590
2008/12/03(水) 17:08:39レスサンクスです。
マニフェストで、管理者権限与えるのは
右クリック「管理者権限で実行する」と同じものだと思っていたんですが違うんですか?
ttp://www.game-create.com/archives/578#more-578
マニフェストはまだやっていないのですが、
VistaのUAC切って実行したんですが、ダメでした。
0620デフォルトの名無しさん
2008/12/03(水) 17:40:26普通はAdministratorsにフルアクセスがあるはずだと思うんだけど。
0621デフォルトの名無しさん
2008/12/03(水) 17:44:330622デフォルトの名無しさん
2008/12/03(水) 17:53:460623590
2008/12/03(水) 17:57:11>>620
レジストリのアクセス権限の調べ方について、今から調べてきます、、、orz。
>>621
今から実装して調べます。
>>622
書き込み権限はありますが、レジストリキーの値(Start)を
削除するときに失敗します。(レジストリが上書きできないので、削除⇒書き込みとしています)
>>621の言うように何で引っかかっているのかをGetLastError調べてみます。
0624デフォルトの名無しさん
2008/12/03(水) 18:14:30「任意のディレクトリ以下」って言ってんだから、そのディレクトリ名は分かってんだろ?
後はそのディレクトリ名とファイル名を結合するだけじゃないか。
パス関係のAPIはこれな。
ttp://msdn.microsoft.com/en-us/library/bb773559.aspx
0625590
2008/12/03(水) 20:16:43お騒がせしてすみません。
レジストリキーの値を削除できなかった理由ですが、
ドライバが稼動中のため、できなかったためだとわかりました。
最小構成単位のプログラムで実験してわかりました。
みなさまのおかげで解決へといたりました。
(XPでも同様の理由でうまくいかないはずなのですが、
実験環境がたまたま動作してしまったのかもしれません)
スレ汚し申し訳ありません。
0626デフォルトの名無しさん
2008/12/03(水) 23:34:56ありがとうございます。
例えばC:\temp以下&サブディレクトリ(数、名前は不定)のcsvファイルのフルパスを取得もできるってことですすか?
未だサブディレクトリの取得方法がわかりません。
リンク先みましたがどれが該当するかわかりませんでした。。
0627デフォルトの名無しさん
2008/12/04(木) 00:27:11FindFirstFile("c:\\tmp\\?*", lp)とでもして
いったん全部列挙すればディレクトリを取りこぼさない
*.csvならおk
ディレクトリなら再帰探索
それ以外は捨てる
0628デフォルトの名無しさん
2008/12/04(木) 00:28:530629デフォルトの名無しさん
2008/12/04(木) 00:33:28入力した文字をひっくり返したい(例.abc→cba)ので↓のようにしてみたのですがひっくり返された文字+謎の文字の羅列が出てきてしまいます
どこを直せば良いでしょうか?
#include <stdio.h>
int main()
{
int i,j=0,k=0;
char aa[100],bb[100];
printf("99文字以下の文字列を入力してください");
scanf("%s",aa);
for(i=0;i<100;i++)
{
if(aa[i]==0)
break;
}
for(j=0;j<i;j++)
{
bb[j]=aa[i-j-1];
}
printf("入力された文字は%sで、これをひっくり返すと%sです。\n",aa,bb);
}
0630デフォルトの名無しさん
2008/12/04(木) 00:35:28フォーループを脱出したら、bbの該当箇所にナル文字入れてやらんと。
それはさておき、99文字以下なら%sじゃなくて%99sにしておくのが無難。
0631デフォルトの名無しさん
2008/12/04(木) 00:58:28すいませんが変更部分だけでいいのでプログラミングを書いてくれませんでしょうか。
0632デフォルトの名無しさん
2008/12/04(木) 01:03:44{
bb[j]=aa[i-j-1];
}
bb[j]=0; //これを追加?
printf("入力された文字は%sで、これをひっくり返すと%sです。\n",aa,bb);
0633デフォルトの名無しさん
2008/12/04(木) 01:07:47おぉ、出来ましたー。
ホントにありがとうございました。
0634デフォルトの名無しさん
2008/12/04(木) 01:39:370635デフォルトの名無しさん
2008/12/04(木) 01:40:490636デフォルトの名無しさん
2008/12/04(木) 06:12:410637デフォルトの名無しさん
2008/12/04(木) 07:43:28整数として使うときはのときはもちろん0だが
文字定数ってint型なんだよな
0638デフォルトの名無しさん
2008/12/04(木) 07:58:42なんで?
0639デフォルトの名無しさん
2008/12/04(木) 08:36:52ここはCとC++のスレdだぞCスレじゃない
0640デフォルトの名無しさん
2008/12/04(木) 10:59:210641デフォルトの名無しさん
2008/12/04(木) 11:35:440642デフォルトの名無しさん
2008/12/04(木) 13:07:02COMはなにができるんですか?
COMにしなきゃいけない場面がわからないです
0643デフォルトの名無しさん
2008/12/04(木) 13:29:060644デフォルトの名無しさん
2008/12/04(木) 13:44:180645デフォルトの名無しさん
2008/12/04(木) 14:00:020646デフォルトの名無しさん
2008/12/04(木) 14:32:570647デフォルトの名無しさん
2008/12/04(木) 18:07:22マクロ関数は大文字の方がいいだろうか?
0648デフォルトの名無しさん
2008/12/04(木) 18:25:36関数のように見せかけたいとか、関数に置き換える可能性があるとかなら関数の命名に従うのもあり
0649デフォルトの名無しさん
2008/12/04(木) 20:34:500650デフォルトの名無しさん
2008/12/04(木) 22:01:59for(i;i<10000;++;){
配列aを使用
}
for(i;i<10000;++;){
int a[10000];
配列aを使用
}
上のように、ループ内などで一時的に利用したい変数を、ブロック外で予め宣言しておく書き方と、
下のようにその都度ループ内で確保する書き方では、(実感できるかはともかく)上の方が実行速度の面で良好ですか?
一応実測では、(膨大な回数のループを繰り返して)前記の方法の方がわずかに速かったのですが…
0651デフォルトの名無しさん
2008/12/04(木) 22:34:04ホントに差が出た? 初期化がないなら同じでいいはずなんだけどね。
最適化してないなんて落ちはないだろね。
0652デフォルトの名無しさん
2008/12/04(木) 22:42:53すみません、その落ちでした…
つまり、きちんと最適化が施されているならどちらの記法でも変わらない
(一時作業領域なんだからむしろ後者が好ましい)ということですね
0653デフォルトの名無しさん
2008/12/05(金) 00:45:16このプログラムの実行例は次の通り.
99文字以下の文字列を入力してください.
abcABC123sDFgh#"x32YY=
変換された文字列はABCabc***SdfGH**X**yy*です.
注意:このような課題に適したライブラリ関数もあるが,ここではそれらを使用せずにプログラムを作成せよ
誰かこれお願いします。明日までにやらなきゃいけないんですけど全く分かりませんorz
0654デフォルトの名無しさん
2008/12/05(金) 00:47:510655デフォルトの名無しさん
2008/12/05(金) 00:57:55スレチですいませんでした
0656デフォルトの名無しさん
2008/12/05(金) 05:42:21こんなの文章通りにプログラム組んで終わりじゃねーか?w
これが全くわからないレベルってもう組んでもらって
ソースを貼るしか解決策ねーだろマジでw
そもそも四則演算以外の知識マジでいらなくね?
小学生が喜んでとく問題・・・みたいな・・・
0657デフォルトの名無しさん
2008/12/05(金) 09:50:55ある文字を一行目の法則で変換する関数fを作って、
map f 入力文字列
で終了
あ、C++は関数型言語パラダイムも含んでいるんだっけ
0658デフォルトの名無しさん
2008/12/05(金) 09:55:130659デフォルトの名無しさん
2008/12/05(金) 12:35:14boostはなにが出来るのかすらよくわかりません。
0660デフォルトの名無しさん
2008/12/05(金) 12:39:12ググればいくらでも出てくると思うんだが。
0661デフォルトの名無しさん
2008/12/05(金) 12:51:47だとするとBoostは一言でなんですか?解説が難しすぎてまったく理解できません。
0662デフォルトの名無しさん
2008/12/05(金) 12:59:510663デフォルトの名無しさん
2008/12/05(金) 13:00:36一言でいえるなんて考えてる限り理解できるわけ無いな。
あえて質問にだけ答えると、 boost.org のトップにあるとおり。
"Boost provides free peer-reviewed portable C++ source libraries"
0664デフォルトの名無しさん
2008/12/05(金) 13:00:39赤点。一週間後に再テストな。
0665デフォルトの名無しさん
2008/12/05(金) 13:00:56「まとめられた一言」を聞いても、全然効果が無いと思うよ。解説なんかよりずっと難しい。
0666デフォルトの名無しさん
2008/12/05(金) 13:12:09その部分が一言でむりなライブラリってことですか?
0667デフォルトの名無しさん
2008/12/05(金) 13:17:55「便利なライブラリの集合」
個々のライブラリについては概要についてそれなりに言えるけど
そんなもん個々のライブラリのドキュメントのintroductionとかmotivationを読めばいいし
0668デフォルトの名無しさん
2008/12/05(金) 14:13:10ググっても引数1つの例しか見つけられず…よい方法があれば何卒お力添えを
0669デフォルトの名無しさん
2008/12/05(金) 14:17:150670デフォルトの名無しさん
2008/12/05(金) 15:07:172つ引数渡せました、ありがとうございます。
a[0,1] みたいにブラケットだけで渡すのは無理そうですかね
0671デフォルトの名無しさん
2008/12/05(金) 15:08:44無理だがoperator()ならオーバーロードすればいける。
0672デフォルトの名無しさん
2008/12/05(金) 15:11:11元々 [] が単項の演算子なのでどうしようもない
>>671 のような演算子をオーバーロードする
0673デフォルトの名無しさん
2008/12/05(金) 15:24:51うーむ、やっぱり無理かぁ…残念。
ベクトルの要素へoperator[]でアクセスできればいいなあと思ってました。
operator()でやってみますね。どうもありがとうございました。
0674デフォルトの名無しさん
2008/12/05(金) 15:32:260675デフォルトの名無しさん
2008/12/05(金) 16:12:55[]は単項演算子か?
0676デフォルトの名無しさん
2008/12/05(金) 16:21:12スライダーコントロールで下記の様に使いたいのですが
良い方法がありましたら教えて戴けませんでしょうか?
0------------100
--------------
通常時は、0-50までしか動かせない。
チェックボックスに、チェック入れば0-100まで動かせるようになる。
0677デフォルトの名無しさん
2008/12/05(金) 16:33:1250から先に動かしたときに、イベントハンドラで強制的に50に戻してしまえば委員で内甲斐。
0678デフォルトの名無しさん
2008/12/05(金) 16:34:46サブクラス化汁
0679676
2008/12/05(金) 16:45:27OnNMCustomdrawSlider内で、無理やりやってみました。
出来ました。ただチップ表示させると50以降に持っていった時に
50じゃなくて、47とか49とか描画がついてこない?時があります。
もうちょっと、あがいてみます。
サブクラス化については、ググってみます。。
0680デフォルトの名無しさん
2008/12/05(金) 17:27:460681デフォルトの名無しさん
2008/12/05(金) 18:37:24win32用語
メッセージをがめる的使い方をする
0682デフォルトの名無しさん
2008/12/05(金) 19:04:25例外処理で言う例外というのは「エラー」に限定して捉えた方が
いいのでしょうか?それとも呼び出し側の関数からみて想定していない
動作が起こる場合も例外として捉えていいのでしょうか?
言葉でうまく説明できないのですが下のような設計(麻雀)は例外処理の使い方として
あるべき姿かどうか教えてください。
ゲーム管理=順番や牌の受け渡しを管理する
プレイヤ=ゲーム管理から渡された牌に基づき手を作る
ゲーム管理がプレイヤへツモ牌を渡して、戻り値として捨て牌を要求
ゲーム管理側にすれば捨て牌が戻ってくるのが想定している動作
一方、プレイヤ側からすれば、捨て牌がない場合もある(渡されたツモ牌で和了する場合、カンをしたい場合など)
これを解決する方法として、和了例外、カン例外を用意してプレイヤ側がゲーム管理側に自分の判断を通知
例外を使わない場合よりもすっきり書けそう、という理由でこのようなやり方にしようと思ったのですが
エラー処理以外に例外を使用してもいいのだろうか?という疑問がありましてこれを採用してもいいのか迷っています。
0683デフォルトの名無しさん
2008/12/05(金) 19:07:19本来のエラー処理の例外も実装する必要があるだろうし、
例外の仕様が膨らむと見通しの悪い非効率なプログラムになってしまう危険は孕んでいるね。
0684682
2008/12/05(金) 19:22:51ありがとうございます。このやり方でいこうとすると
エラー処理も含めてどの位の例外処理が必要になるか考えていませんでした
例外についてはまだまだ不勉強なところがあるので、特にデメリットに
ついて勉強して採用するかしないか決めたいと思います。
0685デフォルトの名無しさん
2008/12/05(金) 20:10:11俺なら戻り値はプレイヤの操作を受け取りたいかなぁ。
捨て牌は引数にポインタかなんかあげといて、捨て牌アリの操作のときだけ拾う。
エラー以外で例外処理使うとごちゃ混ぜになりそうで嫌だねぇ。
0686デフォルトの名無しさん
2008/12/05(金) 20:42:31この場合、ユーザーの操作としては和了、カンなんかはごく普通に発生するわけだから
例外として扱うのは相応しくないと思う。
>685 の通り、捨て牌ではなくて(牌を捨てることも含めて)ユーザー操作が返ってくるべきなんじゃない?
0687デフォルトの名無しさん
2008/12/05(金) 20:53:35大抵の関数の戻り値はBOOLとかboolにして値は引数で受け取るべき
try、catchは俺は嫌い
動作がわけわかんねー
throwとか投げられてもどう対処していいのかさっぱりわからん
っていうか一番対処方法をわかってるのなんて出したその箇所に決まってるのに
なんで上に投げてくるのかわからん
詳細なんてテメーで処理しろっての
こっちが必要なのはあくまでbool値、成功か失敗かだけだろが
言語開発者マジ殴りてぇ
っていうか多くの現場で当然のごとく使われて無い
当たり前だ
こんな暇なもん実装してられるか
そうそうそれと本題だけどシステム的にこれ以上続けようがないってのがエラーで
続けて対処する仕様まであるならそれは仕様であってエラーではないと思うよ
あー、すっきりした
0688682
2008/12/05(金) 20:56:26ありがとうございます。操作と捨て牌を戻してもらって必要な時だけ
捨て牌を読むというのは考えてませんでした。このやり方なら
例外を使った場合と結果的に変わらない処理の流れが実現できますね。
(僕は例外を使わない場合として捨て牌を表さない値が返ってきたら、管理側から
改めて和了するのかをboolで、カンするのかをboolで、と逐一確認する方法を
考えていました・・・未熟ですorz)
標準ライブラリの例外の継承構造を見ても非エラーを表すような
クラスはなかったのでやはり、エラー時に使うのが前提。とまではいかなくても
わりやすいということになりますね。
0689デフォルトの名無しさん
2008/12/05(金) 21:43:59{
安倍政権();
throw "空気読めない";
}
catch(char *str)
{
cout << "Exception raised: " << str << '\n';
try
{
福田政権();
throw "あなたとは違うんです!";
}
catch(char *str)
{
cout << "Exception raised: " << str << '\n';
try
{
麻生政権();
throw "漢字読めない。";
}
catch(char *str)
{
cout << "Exception raised: " << str << '\n';
while(!政権交代); // ← 今ココ!
}
}
}
0690682
2008/12/05(金) 21:52:38ありがとうございます。確かに和了やカンを例外と扱うのは違和感がありますよね。
スタックを巻き戻ることができる機能として例外を捉えていた部分があるので、皆さんの
意見を参考にもう一度検討してみます
>>687
ありがとうございます。エラーの定義が自分の中であいまいな部分があったので
システム的にこれ以上続けようがないと言うのを参考にさせていただきます
0691デフォルトの名無しさん
2008/12/05(金) 21:56:35これをLPCTSTRに変換したいんですが・・・
どういった方法がありますか?
0692デフォルトの名無しさん
2008/12/05(金) 22:00:35一般的に、プログラムを部品化していくと、エラーを検知した場面では最適な対処方法を
知る術は無い状況はすぐに発生する。
そう思わないのなら、たぶん部品化をあまり行っていないか、部品化するまでも無い
プログラムしか書いたことがないんだろう。まぁ別にそれ自体は悪いことじゃないが、
自分がよくわからない物事を嫌ったり不要だと決め付けたりする姿勢は、技術者としては
かなりのマイナスだね。
0693デフォルトの名無しさん
2008/12/05(金) 22:07:49stringって、STLの文字列か?
ATLの文字列変換マクロとか使うのが簡単かな。
#include <atlbase.h>
#include <atlconv.h>
CString ConvSTLstringToCString(string &str)
{
USES_CONVERSION;
return CString(A2T(str.c_str()));
}
これでCStringに変換されるはず。 キャストなしでLPCTSTRとしても
使える。
0694デフォルトの名無しさん
2008/12/05(金) 22:11:46たとえば、void func(LPCTSTR); みたいな関数に渡すだけなら、
func(CString(hoge.c_str())); で。
バッファにコピーしたいなら、
std::vector<TCHAR> buf(hoge.size() + 1);
lstrcpy(&buf[0], hoge.c_str());
みたいな感じで。
0695デフォルトの名無しさん
2008/12/05(金) 22:14:36>>694
CstringってSTLにはないですよね?ATLってやつですか?
VSexpressでも使えるんでしょうか
0696デフォルトの名無しさん
2008/12/05(金) 22:16:26MFCだから、たしか、expressじゃ使えなかったと思う。
0697デフォルトの名無しさん
2008/12/05(金) 22:18:56じゃあ使えないんですね・・・・
どうしよう・・・
0698デフォルトの名無しさん
2008/12/05(金) 22:20:24#if _UNICODE
#endif
みたいので、文字コードをMultiByteToWideChar()で変換するコードを入れるしかないのかな?
0699デフォルトの名無しさん
2008/12/05(金) 22:21:44expressではつかえない
0700デフォルトの名無しさん
2008/12/05(金) 22:22:51なんか難しそうですね・・・
わかりません
0701デフォルトの名無しさん
2008/12/05(金) 22:23:02現在のCStringTはXCHAR*、YCHAR*両方のコンストラクタを
持っているから、CStringを作る気なら直接char*文字列を食わせればよい
さらに言うと、現在は
USES_CONVERSIONを定義する必要がないCA2T(マクロとテンプレートの
あわせ技)が使えるので、
マクロを使うのなら、そっちを使ったほうがいい
0702デフォルトの名無しさん
2008/12/05(金) 22:25:200703デフォルトの名無しさん
2008/12/05(金) 22:25:25TCHAR系は使わない方向で。
TCHAR使ったって、MBCSとUNICODEの両方に対応したコードを書くのはムリ。
0704デフォルトの名無しさん
2008/12/05(金) 22:29:45LPCTSTRは、Unicodeビルド時は「const WCHAR *」、非Unicode時は
「const CHAR *」に変換されるので、Unicodeビルドでなければ
(MBCS=シフトJIS)、STLのstringの中身は、LPCTSTRでキャストして
やれば問題ないはず。
(LPCTSTR)str.c_str()
Unicodeビルドで、ATLマクロ等ふが使えないなら、Win32 APIの
MultiByteToWideChar()とか使って自分でワイド文字列に変換する
関数を作るしかないな。
もしくは、STLの方で、stringではなくwstringを使うかだ。
0705デフォルトの名無しさん
2008/12/05(金) 22:31:18文字列のリテラルはLをつける。 L"abc" みたいな感じ。
APIはMessageBoxだったらMessageBoxWみたいに後ろにWをつける。
とすれば、変換は考えなくていいかな?
0706デフォルトの名無しさん
2008/12/05(金) 22:33:22Unicodeを使う(デフォルトの設定のまま)にして
MessageBox( NULL, _T("aaa") , _T(""), MB_OK );
こういうのをWにかえればいいんですか?
0707デフォルトの名無しさん
2008/12/05(金) 22:37:20そう。
MessageBoxW(NULL, L"aaa", L"", MB_OK); みたいな感じ。
0708デフォルトの名無しさん
2008/12/05(金) 22:38:11これはexpressでも使えるのでしょうか?
STLのほうを変えたらどうかという提案ですが、そちらは都合で変えることができません
0709デフォルトの名無しさん
2008/12/05(金) 22:41:45MessageBoxW( NULL, (LPCTSTR)(test.c_str()) , (L"test"), MB_OK );
これでやったら、ものすごい文字化けがおこりましたw
0710デフォルトの名無しさん
2008/12/05(金) 22:43:13それは、_MBSCでビルドしたときにだけ使える。
_UNICODEでビルドすると使えない。
片方でしか使えないコードを書くと時はLPCTSTRとか使う意味がない。
0711デフォルトの名無しさん
2008/12/05(金) 22:43:13汎用テキストマッピング TCHAR
あたりのキーワードでぐぐって一度しっかり理解しろ
Windows特有だが、大して難しい話じゃないから
0712デフォルトの名無しさん
2008/12/05(金) 22:45:29リテラルはLをつけるだけでいいけど、それ以外はLPCTSTRでキャストしてもだめ。
MultiByteToWideChar()とかで変換する必要がある。
0713デフォルトの名無しさん
2008/12/05(金) 22:46:05_MBSCでビルドすることに変えたらなにか注意することありますか?
0714デフォルトの名無しさん
2008/12/05(金) 22:50:31MultiByteToWideChar()を使うしかなさそうですね
0715デフォルトの名無しさん
2008/12/05(金) 22:52:55一部のUnicode文字は、MBCS(シフトJIS)では扱えない。ただし、Unicode
でも、シフトJISの機種依存文字は扱えない。
0716デフォルトの名無しさん
2008/12/05(金) 22:53:290717デフォルトの名無しさん
2008/12/05(金) 22:57:24expressだから、ライブラリの類はつかえないらしいよ。
使えるのかな?
0718デフォルトの名無しさん
2008/12/05(金) 22:57:350719デフォルトの名無しさん
2008/12/05(金) 22:58:46int MultiByteToWideChar(
UINT CodePage, // コードページ
DWORD dwFlags, // 文字の種類を指定するフラグ これはなんですか?
LPCSTR lpMultiByteStr, // マップ元文字列のアドレス
int cchMultiByte, // マップ元文字列のバイト数
LPWSTR lpWideCharStr, // マップ先ワイド文字列を入れるバッファのアドレス
int cchWideChar // バッファのサイズ
);
:MultiByteToWideChar(CP_ACP, ?, 元, バイト数1, 先, バッファ)
0720デフォルトの名無しさん
2008/12/05(金) 23:04:14_MBCSで作られてて、中途半端に汎用テキストつかってるシステムを
UNICODE対応にさせられてて、ちょうどむかついてる最中。
0721デフォルトの名無しさん
2008/12/05(金) 23:09:06そんな金にならない仕事あるんだ?w
0722デフォルトの名無しさん
2008/12/05(金) 23:15:190723デフォルトの名無しさん
2008/12/05(金) 23:18:33プロパティ→構成プロパティ→文字セット→マルチバイト文字セットを使用する
設定
0724デフォルトの名無しさん
2008/12/05(金) 23:22:23ttp://msdn.microsoft.com/en-us/library/ms776413.aspx
0725デフォルトの名無しさん
2008/12/05(金) 23:24:57LやらWやらつけるほうが素直で、あとあとトラブルもなさそうと思うけど、
そういうのも分からんって言われちゃう現場だと_MBCSになっちゃうかもね。
0726デフォルトの名無しさん
2008/12/05(金) 23:29:02そもそも、Expressって商用には使えないんじゃなかったっけ?
Visual Studio Expressじゃなくて、Twilight Expressかもしれんが。
デスマ経由地獄行き列車か?
>>722
2003も、2005も、2008も持ってるけど、VC6を一番使ってるぞ。
0727デフォルトの名無しさん
2008/12/05(金) 23:29:23wchar_tのがナンボか楽だろ
今時_MBCSとか本気で意味わからん
0728デフォルトの名無しさん
2008/12/05(金) 23:31:18VC1.5とか使ってるところとかあるしな。
0729デフォルトの名無しさん
2008/12/05(金) 23:34:25それの日本語みてるんですが、わかrません
0730デフォルトの名無しさん
2008/12/05(金) 23:35:33そんな奴にC++なんて奇怪語を触らせるなよ……
と俺はいいたいが
まあ関係ないからどうでもいいや
0731デフォルトの名無しさん
2008/12/05(金) 23:36:050732デフォルトの名無しさん
2008/12/05(金) 23:37:09#include <clocale>
using namespace std;
int main(){
::setlocale(LC_ALL, "Japanese");
::setlocale(LC_NUMERIC, "C");
printf("%s\n","あいうえお");
wprintf(L"%s\n",L"あいうえお");
return 0;
}
これで下の出力がありません。何が足りないんでしょうか?
0733デフォルトの名無しさん
2008/12/05(金) 23:38:250734デフォルトの名無しさん
2008/12/05(金) 23:50:06wprintf(L"%s\n",L"あいうえお"); でマルチワイド変換させたいんだろ?
wprintf(L"%hs\n","あいうえお");
0735デフォルトの名無しさん
2008/12/06(土) 00:09:03てやつでした。これってただのsetlocaleと何が違うんですか?
0736デフォルトの名無しさん
2008/12/06(土) 00:26:41%s -> %ls
0737デフォルトの名無しさん
2008/12/06(土) 00:28:56ていうかそれ関連の関数ってわけわからん仕様の関数が多すぎ
0738デフォルトの名無しさん
2008/12/06(土) 00:46:160739デフォルトの名無しさん
2008/12/06(土) 01:00:40そういう文字を使ったファイルは、エクスプローラ使っても、Linux+Sumba
で動くNASとかにコピーすっとコピーに失敗する。
そんな製品でも、Windowsで動作確認などと平気で謳ってる。(w
0740デフォルトの名無しさん
2008/12/06(土) 01:02:59せめてSambdaと書いてやれよ
LinuxもUTF-8+CIFSでちゃんとセットアップされた環境なら
問題なくUTF-16なファイル名を扱えるんだがね
0741デフォルトの名無しさん
2008/12/06(土) 01:11:110742デフォルトの名無しさん
2008/12/06(土) 01:25:40まあ別にsetlocale使うのと同じ。
VC++などにはsetlocaleにもワイド文字版の_setlocaleがあって、
さらに、Windows API同様のワイド・マルチバイト切替版が_tsetlocale。
引数の型が違うだけで、効果に違いはない。
0743デフォルトの名無しさん
2008/12/06(土) 03:40:11仮にそういうのをデータベースに突っ込んだりするとどうなるの?
っていうのとかどうせ俺とか考えてないしはじめから未対応のが気が楽っちゃ楽
正直、そんなくだらない対応するぐらいなら期間削って安く仕上げてくれって客としか
仕事したことないわ
0744デフォルトの名無しさん
2008/12/06(土) 03:50:000745デフォルトの名無しさん
2008/12/06(土) 03:50:45○作業員
0746デフォルトの名無しさん
2008/12/06(土) 10:29:33全員作業員ってこったな
工事現場以下だ
0747デフォルトの名無しさん
2008/12/06(土) 10:31:44Win32API スレではぐだぐだになってたぞ。
0748デフォルトの名無しさん
2008/12/06(土) 13:53:00atoiみたいな関数つかって変換して・・・っていうのは思いつきましたがその後がわかりません
0749デフォルトの名無しさん
2008/12/06(土) 13:57:150750デフォルトの名無しさん
2008/12/06(土) 13:57:46BCC Developerをインストールしたが
BCC Developerの<デバッグ>ボタンを押しても、ターボデバッガが起動しない。
ターボデバッガのインストール後のパスの設定はどうするのでしょうか。
本には「Bcc Developerの環境設定を参照」とあるが、さっぱり分かりません。
0751デフォルトの名無しさん
2008/12/06(土) 13:59:07検索しても出てこないんですよねー
0752デフォルトの名無しさん
2008/12/06(土) 14:02:24_wtoiを使うのはわかるんですが
例えば12a3aみたいな文字列だったときは12に変換されますよね?
これをエラーとみなしたいんですが
0753デフォルトの名無しさん
2008/12/06(土) 14:07:10atoiだってその仕様じゃないか
wstrtolとかは?
0754デフォルトの名無しさん
2008/12/06(土) 14:22:54wstrtolって何インクルードすればいいんですか?
0755デフォルトの名無しさん
2008/12/06(土) 14:28:27strtolと同じ
0756デフォルトの名無しさん
2008/12/06(土) 14:31:14stdlibですよね?識別子がないといわれるんですが・・・
0757デフォルトの名無しさん
2008/12/06(土) 14:33:450758デフォルトの名無しさん
2008/12/06(土) 14:34:480759デフォルトの名無しさん
2008/12/06(土) 14:35:41wchar.h に wcstol がある
>>753
wstrtol なんてあるのか?
0760デフォルトの名無しさん
2008/12/06(土) 14:37:12それだ、すいません間違えました
0761デフォルトの名無しさん
2008/12/06(土) 14:39:160762デフォルトの名無しさん
2008/12/06(土) 14:40:49ありました
できました!
どうも!
0763デフォルトの名無しさん
2008/12/06(土) 17:23:48そこで、C++のクラスを使って、各層の配列をnewで配列数を無駄なく設定したら良いのではないと思い、トライしているのですが、方法がわかりません。
環境は、Linux(Fedora8)、コンパイラは、C++4.1.2です。
お願いします。
///////////////////////////////////////////////////
typedef struct {
int num; //!< ある層のノード数
UNIT unit[NUM_UNIT]; // <- ここを各層ごとに宣言したい。
} LAYER;
typedef struct{
int num; //!< 層の段数
LAYER layer[NUM_LAYER];
} CLASS;
///////////////////////////////////////////////////
0764デフォルトの名無しさん
2008/12/06(土) 17:29:01NUM_UNITとNUM_LAYERは、defineで宣言しています。
ちなみに、
#define NUM_UNIT ノードの最大値(10000とか)
#define NUM_LAYER 5とか
0765デフォルトの名無しさん
2008/12/06(土) 17:31:39どこまで試して、どういう状態になったのか書いて。
ちなみに配列 new 使うぐらいなら std::vector 使うのがおすすめ。
0766デフォルトの名無しさん
2008/12/06(土) 17:51:23以下のようなサンプルで試しています。
もちろん、/**/の行でコンパイル時に以下のようなエラーがでます。
test.cpp:25: error: expected `;' before ‘new’
///////////////////////////////
class LAYER{
public:
int *bb;
};
class CLASS{
public:
LAYER *aa; // クラスBBのポインタを宣言(のちに配列を動的に確保)
CLASS( int nn,... ){
printf("層数=%d\n",nn);
LAYER *aa = new LAYER[nn]; // クラスLAYERをnum個生成
int *nnum = new int[nn]; // 第2引数以降を格納するための一時配列
va_list args; va_start(args, nn);
for( int ii=0; ii<nn; ii++ ){ nnum[ii] = va_arg(args, int); printf("nnum=%d[%d]\n",nnum[ii],ii); }
for( int ii=1; ii<nn; ii++ ){//層//
int Num = nnum[ii]; // 各層のノード数
/* ここの表現がわからない */ aa[ii].bb new int[Num]; //各層のノード数分確保したい。
printf("[%d]",ii);
}printf("\n");
}
};
int main()
{
CLASS a(3,4,3,2); // ( 層数,各層のノード数 )
return 0;
}
0767デフォルトの名無しさん
2008/12/06(土) 18:05:07そのコードは "=" が抜けてるだけじゃないか。
まぁ案の定 delete が抜けてたりするんで、 std::vector で置き換えるのが
おすすめだけどね。
0768デフォルトの名無しさん
2008/12/06(土) 18:15:44ということは
やろうとしているクラスで、階層構造の無駄のない領域の確保は可能ということなんですね?
そして、デストラクタを除けば、サンプルプログラムで表現できていると判断してよいのでしょうか?
"vector"については、知らないので、これから知らべて、書き換えていきます。
0769デフォルトの名無しさん
2008/12/06(土) 18:18:12delete[]だろ、一応。
0770デフォルトの名無しさん
2008/12/06(土) 18:21:26そうですね。ありがとうございます。
精進します。
0771デフォルトの名無しさん
2008/12/07(日) 04:30:42m_EDIT.GetWindowTextW((LPTSTR)(LPCTSTR)bufstr,160);
LPTSTR pszText;
pszText=const_cast<LPTSTR>(static_cast<LPCTSTR>(bufstr));
CString bufName = *((CString*)pszText);
bufstrが取り出せません助けて!
0772デフォルトの名無しさん
2008/12/07(日) 05:33:48つ[CString::GetBuffer()]
0773デフォルトの名無しさん
2008/12/07(日) 05:44:51wchar_t bufstr[160];
m_EDIT.GetWindowTextW(bufstr,160);
CString bufName = bufstr;
0774デフォルトの名無しさん
2008/12/07(日) 05:50:39m_Edit.GetWindowTextW((LPTSTR)(LPCTSTR)bufstr,160);
wchar_t* bufName = bufstr.GetBufer();
ってことかありがとう!
0775デフォルトの名無しさん
2008/12/07(日) 07:53:43違う。ちゃんとヘルプ嫁。
0776デフォルトの名無しさん
2008/12/07(日) 08:39:25それだと配列の立場なくなる気もするけど。。
0777デフォルトの名無しさん
2008/12/07(日) 08:39:57これで行けてしまった・・・
CString bufstr;
m_EDIT.GetWindowTextW(bufstr);
0778デフォルトの名無しさん
2008/12/07(日) 09:50:050779デフォルトの名無しさん
2008/12/07(日) 10:14:20> やばい771が馬鹿に見えてきた
みんな判ってて言わないだけだから安心しる。
> GetWindowTextW
なんでわざわざワイド文字に限定にするんだろ?
0780デフォルトの名無しさん
2008/12/07(日) 11:42:17つまり、
const int num[3] = { 100, 50, 200 }; // クラスBのbbの要素数格納
A aa[3]; //クラスAを複数宣言
aa[0]のクラスBのbb要素数をnum[0](100)。
aa[1]のクラスBのbb要素数をnum[1](50)。
aa[2]のクラスBのbb要素数をnum[2](200)。
としたい。
これってできますか?
//////////////////////////////
class B{
public:
vector<int> bb;
};
class A{
public:
B *b;
};
0781デフォルトの名無しさん
2008/12/07(日) 11:47:48なんでわざわざそんな突拍子もないことをする必要があるのか、そこから検討しなおした方がいい。
0782デフォルトの名無しさん
2008/12/07(日) 11:51:310783デフォルトの名無しさん
2008/12/07(日) 11:57:53いろいろやり方あると思う。要素数を constructor の引数で決めるとか、
要素数を指定するメンバ関数用意するとか。
0784デフォルトの名無しさん
2008/12/07(日) 12:22:13/*クラスA内で、*/
B *b;
A( void ){
B *b = new b[3];
for( int ii=0; ii<3; ii++ ){
b[ii].num = Num[ii];
printf("num=%d\n",Num[ii]);
}
}
/*main()で*/
printf("%d\n", a.b[0].numsize() );
printf("%d\n", a..b[1].num.size() );
printf("%d\n", a.b[2].num.size() );
とすると
意図した値がでません。
アドレスも違うようです。なぜなのでしょうか?お願いします。
0785デフォルトの名無しさん
2008/12/07(日) 12:58:460786デフォルトの名無しさん
2008/12/07(日) 13:00:240787デフォルトの名無しさん
2008/12/07(日) 13:23:00すいません。きをつけます。
>786
実際つかうときには、もう一段クラスを介するつもりなのです。
0788デフォルトの名無しさん
2008/12/07(日) 13:38:00hoge obj1;
としたときに、
sizeof(obj1);
の結果が1バイトになります。これってどうしてですか?
Linuxの g++ 4.2.4 です。
0789デフォルトの名無しさん
2008/12/07(日) 13:44:44hoge a[10]; のように配列として扱うときも &a[0] と &a[10] が同じアドレスになってしまうではないか
0790デフォルトの名無しさん
2008/12/07(日) 13:58:02#include <stdio.h>
struct hoge{};
int main(){
struct hoge a;
printf("%d\n", sizeof(a));
return 0;
}
0791デフォルトの名無しさん
2008/12/07(日) 14:05:48標準規格では中身のない構造体は認めていない
0792デフォルトの名無しさん
2008/12/07(日) 14:49:07#include <string.h>
int main(void)
{
int i,n;
double unew,unow,uold,dt,m,f,k;
n=10;
dt=10;
m=10;
f=100;
k=10;
unow=0;
uold=0;
for(i=1;i<=n;i++){
unew=dt*dt/m*(f-(k*unow))+(2*unow)-uold;
uold=unow;
unow=unew;
}
printf("u(n+1)=%lf\n",unew);
return 0;
}
上記のプログラムで(error C3861: 'printf': 識別子が見つかりませんでした)というエラーが出てしまいます。
visual C++2008です。
全角とかも使ってないし、どうすれば解決するのかわかりません。
どうか教えて下さい。
0793デフォルトの名無しさん
2008/12/07(日) 14:56:310794デフォルトの名無しさん
2008/12/07(日) 15:22:19これってもしかして、クラスBを配列にするって意味合いになるのでしょうか?
0795デフォルトの名無しさん
2008/12/07(日) 15:23:410796デフォルトの名無しさん
2008/12/07(日) 15:23:560797デフォルトの名無しさん
2008/12/07(日) 15:25:50stdafx.hのなかでincludeされてないんだっけ?
0798デフォルトの名無しさん
2008/12/07(日) 15:29:21されていないとしか思えない。
0799デフォルトの名無しさん
2008/12/07(日) 15:35:37nmake vcwin32.mak
でビルドするとこまではできたのですが、
次はどうしたらいいのかわかりません。
0800デフォルトの名無しさん
2008/12/07(日) 15:46:250801デフォルトの名無しさん
2008/12/07(日) 18:39:36無いっていわれたならないんだろうから四の五の言わずインクルードしろよ。
0802デフォルトの名無しさん
2008/12/07(日) 18:45:11下手するとインクルードの意味も分かってないかもしれない
0803デフォルトの名無しさん
2008/12/07(日) 19:05:580804デフォルトの名無しさん
2008/12/07(日) 19:12:13どっから出てくるんだそんなデマ。
0805デフォルトの名無しさん
2008/12/07(日) 19:14:58対処法を教えて下さい。
ファイルは以下の3つです。
HOGE.h(本体)、ho.cpp(HOGEクラスの関数定義)、
XY.h(HOGEクラス内で使うデータ型を定義)
これをコンパイルすると、
g++ ./ho.o ./main.o -o exe
./main.o: In function `operator+(XY const&, XY const&)':
././XY.h:12: multiple definition of `operator+(XY const&, XY const&)'
./ho.o:././XY.h:12: first defined here
collect2: ld returned 1 exit status
make: *** [exe] エラー 1
とエラーが出ます。
環境は、
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
です。
以下ソースコード
0806805
2008/12/07(日) 19:17:42// HOGE.h
#include<iostream>
using namespace std;
class HOGE{
private:
public:
void ho();
};
#endif
----------------------------
// ho.cpp
#ifndef __HOGE_ho__
#define __HOGE_ho__
#include"./HOGE.h"
void HOGE::ho(){
XY h0={10,10};
XY h1={20,20};
XY h2=h0+h1;
};
#endif
0807806
2008/12/07(日) 19:18:28// XY.h
#ifndef __XY__
#define __XY__
#include<iostream>
using namespace std;
struct XY{
int X; int Y;
};
XY operator+(const XY& t0, const XY& t1){
XY ret = {(t0.X+t1.X), (t0.Y+t1.Y)};
return ret;
}
#endif
0808デフォルトの名無しさん
2008/12/07(日) 19:23:54ヘッダで非 inline 関数定義するな。宣言だけにするか inline にしろ。
あと、エラーとは関係ないけど
インクルードガードに予約識別子使うな。
ヘッダで using namespace するな。
0809デフォルトの名無しさん
2008/12/07(日) 19:27:33あと、昔のソースみたら2項加算のときにfriendにしてた。
なんでそうしてるのかはもう忘れた。
あやふやなんで流してもいいよ。
0810デフォルトの名無しさん
2008/12/07(日) 19:51:12なにでやるのがらくですか?
0811デフォルトの名無しさん
2008/12/07(日) 19:54:070812799
2008/12/07(日) 19:57:140813デフォルトの名無しさん
2008/12/07(日) 19:57:26Cなら、インクルードしなくてもコンパイルできるだろ。
0814805
2008/12/07(日) 20:03:27コンパイル通りました。
ありがとうございます。
>インクルードガードに予約識別子使うな。
知りませんでした。
ありがとうございます。
>ヘッダで using namespace するな。
ごもっともです。。。
0815デフォルトの名無しさん
2008/12/07(日) 20:28:10C++をつかうならどうでしょうか
0816デフォルトの名無しさん
2008/12/07(日) 20:30:06楽がしたいのか勉強がしたいのかどっちなんだ?
後者ならどれでも自分で選んでみればいいだろ。
0817デフォルトの名無しさん
2008/12/07(日) 20:30:27C++を捨ててC#を勉強し始めるというのはどうだろうか
0818デフォルトの名無しさん
2008/12/07(日) 20:39:31まだこんなバカが学校の情報処理で増産されているのか?
0819デフォルトの名無しさん
2008/12/07(日) 20:43:04それは、インクルードしたほうがいいって話?
コンパイルできるかどうかって話とは別ですね。
むしろ、プロトタイプがなくてもコンパイルが通るってことを知らないほうが、
危険です。
0820デフォルトの名無しさん
2008/12/07(日) 20:43:13…
0821デフォルトの名無しさん
2008/12/07(日) 20:43:21なんで「Cなら」なの?馬鹿?
0822デフォルトの名無しさん
2008/12/07(日) 20:44:29>>792のソースがCでもコンパイルできるから。
0823デフォルトの名無しさん
2008/12/07(日) 20:48:03どう考えてもできないと思うんですけど
ひょっとしてこれでコンパイルが通るようなコンパイラがあるのか?
あと、Cのコードの大概はC++でもコンパイルできるだろ
0824デフォルトの名無しさん
2008/12/07(日) 20:57:48C++のコンパイラでコンパイルできるから、>>792がC++のコードだということになって、
「stdio.hをインクルードしないとコンパイルできるってことも知らないバカ」
って勘違いした煽りが正当化されるってことにはならないよ。
0825デフォルトの名無しさん
2008/12/07(日) 21:03:36空の stdafx.h を用意してやれば gcc 3.4 でコンパイルできたよ。
0826デフォルトの名無しさん
2008/12/07(日) 21:04:39#include <stdafx.h> を抜かせば、少なくとも gcc-4.0.1、gcc-4.3.2 でコンパイル通って動いたけど
0827デフォルトの名無しさん
2008/12/07(日) 21:07:04>>818 ではないが、printf が入ってて stdio.h include しないで
C compiler で compile 通るってことは一般には無いはずだよ。
compiler によってはあるかもしれんが。
0828デフォルトの名無しさん
2008/12/07(日) 21:08:56デマながすな。
プロトタイプ必須ってC++だけだろ。
VC++でもコンパイルできるし。
0829デフォルトの名無しさん
2008/12/07(日) 21:10:18Cコンパイラならコンパイルできるべきなのに
どうしてそう思うんだ?
0830デフォルトの名無しさん
2008/12/07(日) 21:22:05引数はどうなるんだっけ?
0831デフォルトの名無しさん
2008/12/07(日) 21:24:09可変長引数関数と同じでしょ
K&R時代と同じといってもいいけど
要は暗黙の型変換の類は一切行われず、積んだものがそのまま渡る
0832デフォルトの名無しさん
2008/12/07(日) 21:26:51渡した型のままで積んでくれる
0833831
2008/12/07(日) 21:26:56charだのshortだのはintに拡張されるはずだ
そこまで含めて可変長引数関数と同じ
0834デフォルトの名無しさん
2008/12/07(日) 21:27:29警告つきで C89 以前の動作を保つコンパイラがほとんどだろうけどな。
http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf
> A new feature of C99:
> The rule for implicit declaration of functions has been removed in C99.
> The effect is to guarantee the production of a diagnostic that will
> catch an additional category of 25 programming errors. After issuing the
> diagnostic, an implementation may choose to assume an implicit
> declaration and continue translation in order to support existing
> programs that exploited this feature.
0835デフォルトの名無しさん
2008/12/07(日) 21:27:34そ、そうなのか・・・知らなかったぜ
理由が知りたい・・・
>>824
いや、別に煽ったつもりも正当化するつもりもないんだけど
CならというからにはC++じゃコンパイルできないのか?ってことが言いたかったんだ
0836デフォルトの名無しさん
2008/12/07(日) 21:35:05int main(){
printf("hello\n");
}
% g++ test.c
test.c: In function ‘int main()’:
test.c:2: error: ‘printf’ was not declared in this scope
% gcc testC.c
test.c: In function ‘int main()’:
test.c:2: error: ‘printf’ was not declared in this scope
コンパイラ通ること保証されてるの?
0837デフォルトの名無しさん
2008/12/07(日) 21:39:07gcc --version
よろ
0838デフォルトの名無しさん
2008/12/07(日) 21:41:22C89 (C90?) 準拠のコンパイラなら >830-833 が正解。
C99 準拠のコンパイラなら未定義動作。ただし C89 の動作を保つことがほとんど。
C++ なら規格のバージョンにかかわらずコンパイルエラー。
0839デフォルトの名無しさん
2008/12/07(日) 21:43:01$ gcc a.c
a.c: In function ‘main’:
a.c:2: 警告: incompatible implicit declaration of built-in function ‘printf’
警告が出るだけでコンパイルは通るし実行もできる @ gcc 4.3.0
0840デフォルトの名無しさん
2008/12/07(日) 21:44:04-std=c99指定しても一緒
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
0841デフォルトの名無しさん
2008/12/07(日) 21:46:52まあ、>>821あたりは完全にあおりですね。
「Cなら」という仮定をもちだしたのは、このスレのタイトルが「C/C++」で
>>792がCでもC++でもコンパイルできるから。
煽ったり正当化ってのは、>>802がC++と決め付けて(もしくはCならコンパイル
できると知らない)で、あおりぎみにレスしてるのにツッコミ入れたら、バカとか、コンパ
イルできないとか見当違いの反論してきたやつがいて、それらに向けた言葉。
0842デフォルトの名無しさん
2008/12/07(日) 21:48:31--
$ g++ foo.c
foo.c: In function `int main()':
foo.c:1: error: `printf' undeclared (first use this function)
foo.c:1: error: (Each undeclared identifier is reported only once for each function it appears in.)
$ gcc foo.c
$ gcc foo.c -std=c99
foo.c: In function `main':
foo.c:1: warning: implicit declaration of function `printf'
$ gcc --version
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
--
0843デフォルトの名無しさん
2008/12/07(日) 21:56:33・ 戻り値の型は int
・ 引数の型は不明(型チェックはないが、可変個引数と同じ形の暗黙の型変換が行われる)
と扱われる。
つまり、int foo(); のような形でプロトタイプ宣言した場合と同じ。
int foo(...); ではない、というか、(...) という宣言は C の仕様的に不可能。
(... の前には必ず別の引数が必要だから)
ここでの暗黙の型変換には
・ char, short → int
・ float → double
の2種類がある。
正確には、char や short と int が同じサイズの場合のみ、
unsigned char や unsigned short は unsigned int に変換される。
そうで無い場合は signed int に変換される。
K&R C まで遡ると unsigned char や unsigned short は
常に unsigned int に変換されるが、C89 でこの点は仕様変更された。
0844デフォルトの名無しさん
2008/12/07(日) 22:32:28gcc version 4.1.1 20061011 (Red Hat 4.1.1-30)
gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
ともに同じ結果。
>>839-840 あたりを見るとなぜかわからん。
俺はいつも include してるから気づかんかったが。
C コンパイラ仕様が今更変わったとするとちょっと気になるが。
0845デフォルトの名無しさん
2008/12/07(日) 22:39:090846デフォルトの名無しさん
2008/12/07(日) 22:51:33-pedantic-errors -Wall くらいは指定しとけ。
0847デフォルトの名無しさん
2008/12/07(日) 22:55:16alias で gcc='gcc -x c++' になってるとかw
0848デフォルトの名無しさん
2008/12/07(日) 23:08:51ソレつけないと無意味だよなw
0849デフォルトの名無しさん
2008/12/07(日) 23:17:16環境依存OKとはいえ大抵VC++だし
0850836,844
2008/12/07(日) 23:37:51それは付けたけどまったくおなじエラーメッセージなんで省いたんだよ。
>>847
gcc に alias かけたりはしてないから。
ちなみに icc だと 8.0, 9.1 ともに
% icc -Wall testC.cc
test.c(2): error: identifier "printf" is undefined
printf("hello\n");
^
0851デフォルトの名無しさん
2008/12/08(月) 00:21:06俺、インクルード無しでCコンパイラならコンパイルできると知らなかった。
もし、これが正しいなら、C++コンパイルモードで動作してるんじゃない
強制的に純粋Cコンパイラモードに出来ないの?
0852799
2008/12/08(月) 00:22:57質問の仕方が悪いのでしょうか?
0853836,844
2008/12/08(月) 00:34:48compile できました。ついファイル名を .cc にしてたため、
gcc でもicc でも c++ モードで compile しようとしていたみたいです。
アホな事言ってすみませんでした。
0854デフォルトの名無しさん
2008/12/08(月) 00:35:37「導入」の意味がよく分からないけど、
プリプロセス時にcurses.hをインクルードして、
リンク時にpdcurses.libをリンクして、
実行時にpdcurses.dllをロードすればいいだけでは。
0855デフォルトの名無しさん
2008/12/08(月) 00:35:52ググってみたけどかなりレアな感じだしみんな知らないってとこじゃね?
0856デフォルトの名無しさん
2008/12/08(月) 00:43:290857デフォルトの名無しさん
2008/12/08(月) 00:45:310858デフォルトの名無しさん
2008/12/08(月) 00:48:110859799
2008/12/08(月) 00:55:15リンカにいろいろ怒られちゃいました
なにか足りないようですが、初心者の私にはさっぱりです・・・
>>855
そうなんです。ググってもわからないんです。
0860799
2008/12/08(月) 00:56:18c:\test>cl test.c /link pdcurses.lib
(中略)
/out:test.exe
pdcurses.lib
test.obj
pdcurses.lib(pdckbd.obj) : error LNK2019: 未解決の外部シンボル __imp__GetKeyStat
e@4 が関数 __get_key_count で参照されました。
pdcurses.lib(pdckbd.obj) : error LNK2019: 未解決の外部シンボル __imp__MapVirtual
KeyA@8 が関数 __get_key_count で参照されました。
pdcurses.lib(pdcutil.obj) : error LNK2019: 未解決の外部シンボル __imp__MessageBe
ep@4 が関数 _PDC_beep で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__FindWindo
wA@8 が関数 __find_console_handle で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__wsprintfA
が関数 __find_console_handle で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__SendMessa
geA@16 が関数 __set_console_info で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__GetWindow
ThreadProcessId@8 が関数 __set_console_info で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__RegCloseK
ey@4 が関数 __init_console_info で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__RegQueryV
alueExW@24 が関数 __init_console_info で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__RegQueryV
alueExA@24 が関数 __init_console_info で参照されました。
pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__RegOpenKe
yExA@20 が関数 __init_console_info で参照されました。
test.exe : fatal error LNK1120: 外部参照 11 が未解決です。
0861デフォルトの名無しさん
2008/12/08(月) 01:09:16pdcurses内から参照されてるWin32 APIが未解決。
コマンドラインの最後に
user32.lib advapi32.lib
を追加。
0863デフォルトの名無しさん
2008/12/08(月) 01:25:38ncursesじゃなきゃやだやだってだだこねてた人?
0864デフォルトの名無しさん
2008/12/08(月) 01:34:090865デフォルトの名無しさん
2008/12/08(月) 01:48:58win32のデータテーブルは用意されてるよ
0866デフォルトの名無しさん
2008/12/08(月) 01:53:34データグリッドビューのwin32版
0867デフォルトの名無しさん
2008/12/08(月) 01:55:470868デフォルトの名無しさん
2008/12/08(月) 01:57:160869デフォルトの名無しさん
2008/12/08(月) 01:57:440870デフォルトの名無しさん
2008/12/08(月) 01:59:110871デフォルトの名無しさん
2008/12/08(月) 01:59:51こういう向きには何でも「ない」といっておけばいい。
0872デフォルトの名無しさん
2008/12/08(月) 02:03:370873デフォルトの名無しさん
2008/12/08(月) 02:20:110874デフォルトの名無しさん
2008/12/08(月) 02:42:19披露し始めるのが意味不明だが、
とりあえず俺も>>871にならって「ない」と言っておこうw
0875デフォルトの名無しさん
2008/12/08(月) 02:46:320876デフォルトの名無しさん
2008/12/08(月) 02:47:460877デフォルトの名無しさん
2008/12/08(月) 02:55:49お楽しみに
0878デフォルトの名無しさん
2008/12/08(月) 03:00:230879デフォルトの名無しさん
2008/12/08(月) 03:07:57Win32ベースで作成されたものを誰も用意していないということを証明するんじゃないの?
0880デフォルトの名無しさん
2008/12/08(月) 03:13:10もう「ない」って決まったのw
0881デフォルトの名無しさん
2008/12/08(月) 03:24:390882デフォルトの名無しさん
2008/12/08(月) 03:27:12win○yは表示してたが、あれはdelphiからの贈り物に過ぎないのかね?
他のGUIライブラリとかMFCにも無いのかね?
0883デフォルトの名無しさん
2008/12/08(月) 03:34:280884デフォルトの名無しさん
2008/12/08(月) 03:38:18それの実態はdelphiの奴
0885デフォルトの名無しさん
2008/12/08(月) 04:31:13int i = 10*20; のような計算の計算速度と、if(i > j) {} のような比較の速度、
AND演算やOR演算ではどれが1番速くてどれが1番遅いのですか?
また、関数呼び出しと比べるとどのくらい差が出るのですか?
0886デフォルトの名無しさん
2008/12/08(月) 04:47:34実測するほかない。
「のような計算」と一口に言っても数値の型や演算子ごとに事情は違ってくるし、
それも含めて大概の要素が処理系にもよるし、CPUにもよるから。
0887デフォルトの名無しさん
2008/12/08(月) 06:22:1410を20回足してメモリに書き込むため遅い
>if(i > j) {}
メモリからi,jをレジスタに読み出し比較したのち条件分岐するため
パイプラインのフラッシュが発生して遅い
>AND,OR演算
メモリからレジスタに読み出しAND,ORをかけてからメモリに書き込むため遅い
結論。どれも遅いよ
0888デフォルトの名無しさん
2008/12/08(月) 06:44:24それは結論でも何でもないよね。
0889デフォルトの名無しさん
2008/12/08(月) 07:15:53コンパイラが10*20を200に定数畳み込みしてレジスタに入れるため速い
>if(i > j) {}
コンパイラがそれぞれの確率を予測して
確率の高い方が分岐の少ないコードになるよう配慮してくれるため速い
が予測が外れると遅い
>AND,OR演算
最適化の余地が少ないためどう足掻いても遅い
結論。
掛け算はもっとも速い
次に条件分岐が速いがたまに遅い
AND,OR演算は遅い
0890デフォルトの名無しさん
2008/12/08(月) 07:28:34「いかに意図のほうをちっとも満たさないまま文にだけきっちり答えるか」
を追求するモチベーション、伝統的にマには多いが、そろそろ何か名前が欲しいところだな。
0891デフォルトの名無しさん
2008/12/08(月) 07:59:490892デフォルトの名無しさん
2008/12/08(月) 12:28:200893885
2008/12/08(月) 13:18:44返信ありがとうございます。
実測したほうがいいようなので計ってみることにします。
0894デフォルトの名無しさん
2008/12/08(月) 13:23:54個々の要素を比べる意味はあんまり無いよ。
実際に組みあがったプログラムについて計測しないと意味無い。
0895デフォルトの名無しさん
2008/12/08(月) 22:51:410896デフォルトの名無しさん
2008/12/08(月) 22:56:05クラス宣言内で関数を記述したら、非inline関数にはならないと思うのだが。
0897デフォルトの名無しさん
2008/12/08(月) 22:58:35public:
void Draw() { printf("BのDraw\n"); }
};
class A{
public:
void Draw(const B *b) { b->Draw(); }
};
こういう方法でA::DrawではBの中身を変更しないことを明示的にしたいのですが、
B::Draw' : 'const B' から 'B &' へ 'this' ポインタを変換できません。
というエラーがでます。どうすれば良いのでしょうか?
0898デフォルトの名無しさん
2008/12/08(月) 23:01:170899デフォルトの名無しさん
2008/12/08(月) 23:05:18ありがとうございます。
コンパイル通りました。
constにそんな使い方があったんですね。
0900デフォルトの名無しさん
2008/12/08(月) 23:09:49Hoge.h
class Hoge{
public:
void hoge(){処理} <-これを呼び出したら、インライン展開される
};
ということでよろしいですか?
0901デフォルトの名無しさん
2008/12/08(月) 23:13:22少なくとも、インライン展開されたかの如く振舞うことは期待できる。
0902デフォルトの名無しさん
2008/12/08(月) 23:15:56決まるという訳ですね?(そもそも展開不可な関数もありますが)
これからもビシバシヘッダに処理を書かせていただきます。
0903デフォルトの名無しさん
2008/12/08(月) 23:26:290904デフォルトの名無しさん
2008/12/08(月) 23:43:440905デフォルトの名無しさん
2008/12/09(火) 00:36:44VS9.0を使い、floatを用いた計算が必要なアプリケーションを作っています。
このアプリケーション、分岐などは特にないのですが、
私の家のPC(WindowsXP、Pen4)での計算結果と、
友人の家のPC(WindowsXP、CPUは不明。必要がありそうなら今度聞いてきます)での計算結果が微妙に異なるのです。
こんなことってありえるのでしょうか?
気になってぐぐってみたところ
floatはCPUでの計算中は精度が高く、メモリーに書き出すを精度が落ちる。
なのでメモリーアクセスのタイミングしだいで結果が異なることもありえる?
というようなページを見つけました
ttp://hw001.gate01.com/eggplant/tcf/cpp/floatprecision.html
この「同じ計算をしているのに、PCによって結果が(微妙に)違う」というのを避ける方法はありますでしょうか?
float変数は、メンバ変数やグローバル変数でも使う必要があるため、ローカルで全部やれ!というのはできません…。
0906デフォルトの名無しさん
2008/12/09(火) 00:55:11同一のexeじゃないよね?コンパイルオプション一緒にしてみてはどう?
0907デフォルトの名無しさん
2008/12/09(火) 01:03:56doubleを使え。floatで計算するよりももしかしたら速いかも知れないし。
それでも結果が違うなら、FPUの精度を外部で指定しているのだろう。
0908デフォルトの名無しさん
2008/12/09(火) 01:12:18自分ではどこが間違っているかわかりません。
お願いします。
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8266.c
0909デフォルトの名無しさん
2008/12/09(火) 01:13:38ほんとうにどんな環境でも同じ値が欲しければ、
浮動小数点数演算を自前でエミュレートするしかない。
0910デフォルトの名無しさん
2008/12/09(火) 01:15:57CPUによってFPUの精度は違うから、適度に補正をかけて細かいところで結果がズレても表面化しないようにすべきって話じゃなかったかな。
0911デフォルトの名無しさん
2008/12/09(火) 01:44:46CPUがIEEE 754に厳密に従っていればそこまでする必要もあるまい。
ただ、x86のFPUがそうであるかどうかは果たして……。
0912デフォルトの名無しさん
2008/12/09(火) 02:02:07fraction normalize(fraction x){ /*約分*/
int a, b, c;
a = x.n;
b = x.d;
if(a<0) a = -a;
if(b<0) b = -b;
if(a<b) { c=a; a=b; b=c; /*aとbを交換*/ }
while(b>0){
c = a%b;
a = b;
b = c;
}
x.n /= a;
x.d /= a;
return x;
}
int main(){
fraction x = {6, 9};
x = normalize(x);
printf("x = %d/%d\n", x.n, x.d);
return 0;
}
0913デフォルトの名無しさん
2008/12/09(火) 02:12:58最近のIntelのCPUは80bit精度で浮動小数点演算をして
メモリに書き戻すときに切り捨てするから、
コンパイラの最適化の加減によって結果が変わってくるという現象が起こる。
floatでもdoubleでも起こる。
浮動小数点誤差は回避できないので、誤差が発生することは受け入れて、
プログラムの側をロバストにしてやる方がよい。
たとえば、0.0 から 10.0 まで101回のループを回したければ
比較時に微小な値のずれを加味して以下のようにする
(この場合は整数を使った方がいいけど)。
const double EPS = 1e-9;
for (double x = 0.0; x += 0.1; x <= 10.0 + EPS) { ... }
0914デフォルトの名無しさん
2008/12/09(火) 02:33:37narmalize()はそのままでもちゃんと結果が出る。
マイナスの扱いはそれでいいのかという疑問はあるが。
出力がおかしいのはprintfの%dに対応するところに
intじゃないものを渡しているからなので、
>>912みたいにするといい。
0915デフォルトの名無しさん
2008/12/09(火) 03:14:13そのページを参考にvolatileつけたら?
ついでにdoubleにした方がいいと思うけど。
0916デフォルトの名無しさん
2008/12/09(火) 08:58:39自分のがデバッグビルドで友人のがリリースビルドなんてことは無いよな?
0917905
2008/12/09(火) 09:29:58DirectXスレで、自分の生き写しのような質問を見つけました。
あちらでも先月話題になっていたようです。
_control87 を使う
floatの細かい部分。たとえが小数点以下4位未満を切り捨てる
などが対処法のようです。
_control87 については初見ですので、これから調べます。
今夜か明日にでもまた友人とテストできると思いますので、結果を報告したいと思います。
ありがとうございました
0918デフォルトの名無しさん
2008/12/09(火) 09:42:060919デフォルトの名無しさん
2008/12/09(火) 10:18:04そうでした。
ところで早速実験してみたのですが、どうやらDirectXが、初期化を行うと浮動小数点の精度を24bitに変更してしまうようです。
(Direct3Dを使ってはいるのですが、まさかfloatの精度に絡んでるとは思わなかったため、こちらのスレに相談にきたのです。)
これをうけて考えてみると、私の環境でも友人の環境でも、精度は24bitに変更されていることになります。
なので _control87 の呼び出し相当のことをすでにやっていると考えられます。
ちなみにDirectXスレによると、D3Dの初期化の際に D3DCREATE_FPU_PRESERVE を指定すれば精度の変更が行われないそうです。
となると、/fp:strict でズレが回避できるかが今回の課題かなと思います。
0921デフォルトの名無しさん
2008/12/09(火) 19:48:02{
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete [] x;
}
というのは何を意図してこの様な書き方をしているのでしょうか
sizeof(T)の結果が0だったらエラーにさせるためということで合ってますか?
あと、もしそうだったら0になる場合ってどんなときでしょうか
0922デフォルトの名無しさん
2008/12/09(火) 20:06:47それをチェックして弾くためにやってるんだと思う
0923922
2008/12/09(火) 20:08:43不完全型のdeleteは未定義らしい
でもまぁ目的は一緒だ
0924デフォルトの名無しさん
2008/12/10(水) 01:03:27クラスのメンバを追加したDLLに差し替えてもアプリケーションは安全に動作するのでしょうか?
例えば、
class Test {
public:
void Hoge();
}
というクラスの入ったDLLを、
int main() {
HMODULE module;
Test* test;
module = ::LoadLibrary("test2.dll");
test = reinterpret_cast<Test*>(::GetProcAddress(module, "Testクラス"));
if(test != NULL) {
test->Hoge();
}
::FreeLibrary(module);
}
というアプリケーションからロードします。
その後、メンバを追加したDLLと差し替えた場合の動作です。
0925デフォルトの名無しさん
2008/12/10(水) 01:15:26仮想関数周りをいじったり、(非静的な)メンバ変数が増減したりしない限り、動くはず。
ただ、COMがこの問題を突き詰めた結果の1つでもあるんで、
興味があれば、ここのPDF立ち読みも見ていったらいい。
http://www.ascii.co.jp/books/books/detail/4-7561-3066-6.shtml
0926デフォルトの名無しさん
2008/12/10(水) 01:20:22そのグローバル変数はプロジェクト全体で参照したいのです。
例えばDLLを作るとき不都合があるとか。
0927デフォルトの名無しさん
2008/12/10(水) 01:30:40たとえばifをつかってある条件を満たした際にキーボードの右(→)を自動で押されるようにしたいのですが・・・
あとOpenCVに詳しい方いましたら質問したいです。
0928デフォルトの名無しさん
2008/12/10(水) 02:21:21>>923
そういうケースがありえるんですね
どうもありがとうございました
0929デフォルトの名無しさん
2008/12/10(水) 02:22:41環境かかないと答えられないよ
0930デフォルトの名無しさん
2008/12/10(水) 03:36:56押されたと認識させたいウィンドウにキーダウンメッセージをとばす
0931924
2008/12/10(水) 05:14:51なるほど、複雑な構造のクラスをDLLに入れないほうがいいのですね。
リンクもありがとうございます。
COMは今一よく分かってなかったので、非常に勉強になりました。
0932デフォルトの名無しさん
2008/12/10(水) 07:27:470933デフォルトの名無しさん
2008/12/10(水) 07:30:530934デフォルトの名無しさん
2008/12/10(水) 08:23:570935デフォルトの名無しさん
2008/12/10(水) 08:32:57制御用のGUIをpython + wxPythonあたりで作りたいんだけど、
こういう場合って、ソケット通信で制御すればいいんかな?
共有メモリやパイプってのもあるっぽいけど、どうすればいいか良くわかんない。
表示用のウィンドウを子プロセスで起動できたら嬉しい。
0936デフォルトの名無しさん
2008/12/10(水) 09:53:30てか、別プロセスにする積極的な理由がないなら
表示部分を DLL にして、python から呼ぶ方が簡単だと思うんだが。
0937919
2008/12/10(水) 16:14:42_control87、_controlfpなどでは問題は解決しませんでした。
念のため毎フレーム呼び出すなどもしましたが…。
同様に、/fp:strictでも問題は解決しませんでした。
現在は、ずれてほしくないfloatに対して
x = (float)((int)(x * 1000.0f)) / 1000.0f;
とすることで、ある程度回避できるようになりました。
が、やはり稀にずれます。
おそらく、2.000000f と 1.999999f は以前ですとほぼ同一のものですが、今回の補正をかけると0.001fずれることになります。
このずれが原因かと。
最終的には、ずれて欲しくないデータにfloatを使わないという解決方法が必要そうです。
0938デフォルトの名無しさん
2008/12/10(水) 16:19:570939デフォルトの名無しさん
2008/12/10(水) 16:22:160940デフォルトの名無しさん
2008/12/10(水) 18:07:110941デフォルトの名無しさん
2008/12/10(水) 18:16:19頼むからログ読んでから口はさんでくれよっと
0942デフォルトの名無しさん
2008/12/10(水) 20:05:35ptr = new Test;
ptr->~Test();
ptr = new (ptr) Test();
delete ptr;
これは偶然うまく動いているだけですか?
0943デフォルトの名無しさん
2008/12/10(水) 21:47:07Exceptional C++ に似たような話がある。
0944デフォルトの名無しさん
2008/12/10(水) 22:52:45約分ってgcdするだけじゃん。
0945デフォルトの名無しさん
2008/12/10(水) 23:04:14int x;
};
とあって
P() として一時変数を作ると0で初期化されたものになるんですよね?
0946デフォルトの名無しさん
2008/12/10(水) 23:12:00xが0になるかって質問であれば、ならない。
以下のようにすればなるはず。
struct P {
int x;
P():x(){}
}
0947デフォルトの名無しさん
2008/12/10(水) 23:12:230948デフォルトの名無しさん
2008/12/10(水) 23:14:210949デフォルトの名無しさん
2008/12/10(水) 23:33:48struct hoge{
int* i;
hoge():i(new int(0)){
}
~hoge(){
delete i;
}
};
みたいなやつになって初めて副作用が出るかも
0950デフォルトの名無しさん
2008/12/11(木) 02:47:510951デフォルトの名無しさん
2008/12/11(木) 03:18:150952デフォルトの名無しさん
2008/12/11(木) 03:51:370953デフォルトの名無しさん
2008/12/11(木) 10:33:35で、それを実装に利用したのがスマートポインタなんですねーこれが
0954デフォルトの名無しさん
2008/12/11(木) 12:19:49初めて知ったぜ畜生・・・
0955デフォルトの名無しさん
2008/12/11(木) 13:19:41なんでそんな仕様なの?
0956デフォルトの名無しさん
2008/12/11(木) 13:38:14未初期化の結果生まれる不定値は危険なバグの元だから。
初期化処理を省きたければ C と同じように書けばいいわけで、
逆に初期化しない理由が無い。
0957デフォルトの名無しさん
2008/12/11(木) 16:45:37どうすればいいですかー?
error C2361: 'items' の初期化が 'default' ラベルによって行われませんでした。
0958デフォルトの名無しさん
2008/12/11(木) 16:46:180959デフォルトの名無しさん
2008/12/11(木) 16:47:53{
int a[100];
}
みたいに{}でくくるとうまくいかないか?
0960デフォルトの名無しさん
2008/12/11(木) 16:48:190961デフォルトの名無しさん
2008/12/11(木) 16:48:240962デフォルトの名無しさん
2008/12/11(木) 16:49:560963デフォルトの名無しさん
2008/12/11(木) 17:31:390964デフォルトの名無しさん
2008/12/11(木) 19:40:11C++/CLIはどうか知らんが、int型にデフォルトコンストラクタなんて
ないし、クラスのコンストラクタで初期化していないのだから、C++
の言語仕様では0にはならんだろ。
それに初期値として0が妥当かどうかはケースバイケース。
0965デフォルトの名無しさん
2008/12/11(木) 19:53:05int x(10);とか
int y;
y = int(10;
とか
0966デフォルトの名無しさん
2008/12/11(木) 19:53:51とか
y = int();
0967デフォルトの名無しさん
2008/12/11(木) 20:09:110968デフォルトの名無しさん
2008/12/11(木) 20:26:59その説明では納得できないな。
P p; と P() は両方変数を作成する構文なのに
後者の場合だけメンバ変数まで初期化するのに妥当な理由が見出せない。
仕様のどこに規定されている?
0969デフォルトの名無しさん
2008/12/11(木) 20:50:55前者は変数を作成する構文で、後者は値を生成する構文。
0970デフォルトの名無しさん
2008/12/11(木) 21:17:12組み込み型の話をしてないか?
964や967の言うとおりクラスの話なんだが。
両方ともオブジェクトをインスタンス化する構文だろ。
0971デフォルトの名無しさん
2008/12/11(木) 21:25:48>>968の書いていることが間違っていると指摘しただけなんだが
0972デフォルトの名無しさん
2008/12/11(木) 21:32:35ん、ごめん。よく分からないな。
P()は一時「変数を作成」する構文だと思ってるのだけど、
「値の生成」なの?
そこがよく分からなかったので、970で、「それは組み込み型の話じゃないの?」って
聞いたんだけど。
0973デフォルトの名無しさん
2008/12/11(木) 22:17:010974デフォルトの名無しさん
2008/12/11(木) 22:19:30一時変数ではなくて一時オブジェクトなのだが
0975デフォルトの名無しさん
2008/12/11(木) 22:23:230976デフォルトの名無しさん
2008/12/11(木) 22:57:180977デフォルトの名無しさん
2008/12/11(木) 23:02:370978デフォルトの名無しさん
2008/12/11(木) 23:03:42フリーソフトやパッケージソフトの類なら、その通りかな
0979デフォルトの名無しさん
2008/12/11(木) 23:55:00using namespace std;
struct A{int i;};
A ga;
int main(){
static A sa;
A la;
cout << "ga.i = " << ga.i << endl;
cout << "sa.i = " << sa.i << endl;
cout << "la.i = " << la.i << endl;
cout << "ra.i = " << A().i << endl;
}
結果(VC2008)
ga.i = 0
sa.i = 0
la.i = 2406644
ra.i = 0
普通の変数と一緒だな
0980デフォルトの名無しさん
2008/12/12(金) 00:17:335.2.3の2段落目や8.5の7段落目でT()は値初期化するとなっているが、
8.5の9段落目では、デフォルトコンストラクタを持たない型で
初期化子のないオブジェクトは初期化されないと決められている。
newだと両方の書き方ができるので、分かりやすいかもしれない。
new intは初期化子がないので、初期化されない。
new int()は空の初期化子を持つので値初期化(組込型ではゼロ初期化)される。
0981デフォルトの名無しさん
2008/12/12(金) 00:25:06とりあえず動いてはいるみたいなんだけど・・・
0982デフォルトの名無しさん
2008/12/12(金) 00:40:09キャストしての変換だったら駄目ぜったい。
&*itなら、vectorならおk、basic_stringも今度から認められる。
配列へのポインタのごとく足したり引いたりしていい。
それ以外のコンテナでの&*itは、単純にその要素へのポインタとしてしか使えない。
0983デフォルトの名無しさん
2008/12/12(金) 02:57:16イィィヤッッッッホオォォォー
* + 巛 ヽ
〒 ! +
+ 。 | |
* + / / +
∧_∧ / /
(´∀` / / +
,- f
/ ュヘ | *
〈_} ) |
/ ! +
./ ,ヘ |
ガタン ||| j / | | |||
―――――――――――――
誰かに届け、この喜び
0984デフォルトの名無しさん
2008/12/12(金) 02:59:43int にデフォルトコンストラクタがあるとか初期値として 0 が常に妥当だとか、
誰もそんなこと言ってないのになんで偉そうに間抜けを晒すかね。
0985デフォルトの名無しさん
2008/12/12(金) 03:05:31ありがとう、気をつけるよ
そしてうまくいかないのは別の原因だった罠・・・orz
0986デフォルトの名無しさん
2008/12/12(金) 03:07:39その気持ち、忘れるなよ。
0987デフォルトの名無しさん
2008/12/12(金) 06:35:26BASICプログラマは黙ってろ!
0988デフォルトの名無しさん
2008/12/12(金) 10:59:590989デフォルトの名無しさん
2008/12/12(金) 11:10:200990デフォルトの名無しさん
2008/12/12(金) 11:38:49>>980 が難しくて解らなかったのか、それとも単に読み飛ばしたのか。
0991デフォルトの名無しさん
2008/12/12(金) 12:44:45CString in = str.SpanIncluding(_T("1234567890"));
in に 123 がはいりません_T("")になってます。どうしてですか?
0992デフォルトの名無しさん
2008/12/12(金) 12:50:16だった解決した
0993デフォルトの名無しさん
2008/12/12(金) 16:12:48ありがとう。規格を読んで全部ではないが理解できた。
PODでは0初期化されるんだな。
そしてnon-POD class typeではデフォルトコンストラクタが呼ばれるから0初期化されないと。
979でstruct A{int i; virtual void Func(){}}; とすると A().i != 0 となったよ。
俺はPODでもこうなると勘違いしてたよ。勉強になった。
0994デフォルトの名無しさん
2008/12/12(金) 18:49:280995デフォルトの名無しさん
2008/12/12(金) 19:31:30{
int i;
cout << i << endl;
}
現実問題、市販フリー問わず現在市場に出回ってるコンパイラで、iの
値が0に初期化されることが保証されるコンパイラってあるのか?
警告レベル上げれば初期化されていない変数を参照しているって警告を
出すけど、ほとんどのコンパイラでiの値は不定だと思うが?
0996デフォルトの名無しさん
2008/12/12(金) 19:36:050997デフォルトの名無しさん
2008/12/12(金) 23:04:430998デフォルトの名無しさん
2008/12/13(土) 00:17:38初期化されると思う方がどうかしている。話題になっているのは、その書き方の話ではない。
0999デフォルトの名無しさん
2008/12/13(土) 00:24:06【初心者歓迎】C/C++室 Ver.62【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1229095398/l50
>>8
たぶん何度もコピペされたからだと思う。
1000デフォルトの名無しさん
2008/12/13(土) 00:29:4610011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。