【初心者歓迎】C/C++室 Ver.59【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.59【環境依存OK】 - 暇つぶし2ch809:デフォルトの名無しさん
08/04/18 20:07:21
>>805 トンクス!

810:デフォルトの名無しさん
08/04/18 20:32:22
>>785
提示されたコードをコンパイルしましたが、特に異状はないと思います。
環境とコンパイルオプションを教えてください。
当方が確認した環境は WindowsXP, コンパイラはgcc3.4.4(cygwin)です。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

811:デフォルトの名無しさん
08/04/18 22:15:10
>>798
[プロジェクト]-[プロパティ]-[構成プロパティ]-[デバッグ]-[作業ディレクトリ]

812:デフォルトの名無しさん
08/04/18 22:41:28
#include <stdint.h> はどの環境でも使えますか?
とブーストとかSTL portとか入れればどれでも使えますか?
32bit環境で、64bit整数のビット演算、掛け算の速度をかなり速いです
使い物になるので使いたいのですが互換性はなかなかあるんですか

813:デフォルトの名無しさん
08/04/18 22:42:11
文書が色々とおかしいです 
エスパーでおねがいします

814:デフォルトの名無しさん
08/04/18 22:55:18
VC2008で対応していなかった為、stdint.h使うのをやめることにしました

815:デフォルトの名無しさん
08/04/18 22:56:44
わかりました
がんばってください

816:デフォルトの名無しさん
08/04/18 22:58:30
>>812
> #include <stdint.h> はどの環境でも使えますか?

いいえ。

> とブーストとかSTL portとか入れればどれでも使えますか?

いいえ。

> 32bit環境で、64bit整数のビット演算、掛け算の速度をかなり速いです

いいえ。

> 使い物になるので使いたいのですが互換性はなかなかあるんですか

いいえ。

817:デフォルトの名無しさん
08/04/18 23:08:19
日本語学びたての外国人か
コンピューターにものすごい興味がある赤ん坊のどちらかだな。

818:デフォルトの名無しさん
08/04/18 23:22:53
外国人の人だと思うので、添削してみました。頑張ってね。


初心者なのですが、いくつか質問させてください。
#include <stdint.h>はどの環境でも使えますか?
boostとかSTL portとかは、インストールすれば使えますか?
32bit環境で、64bit整数のビット演算、掛け算がかなり速くできて、
使い物になりそうなので使いたいのですが、互換性についてはどうでしょうか?


819:デフォルトの名無しさん
08/04/18 23:23:06
  std::vector<std::string> vtSource; を UTF16 に変換して std::vector<std::wstring> vtDest; に保存したいと思っています.

// string >> wstring 変換関数(中身はダミー)
std::wstring A2WString(const std::string& strSource))
{
  return std::wstring(L"out");
}

  この変換関数での変換は以下のコードでできました.

  std::vector<std::string> vtSource;
  std::vector<std::wstring> vtDest;

  vtSource.push_back( "AbC" );
  std::transform( vtSource.begin(), vtSource.end(), std::inserter( vtDest, vtDest.end() ), A2WString );

  しかし,変換関数にデフォルト引数があるとコンパイルエラーになりました.

std::wstring A2WString2(const std::string& strSource, int i=0)//デフォルト引数がある
{
  return std::wstring(L"out");
}

  transform 第4引数で bind2nd や ptr_fun を使用すればいいような気がするんですが,どのように書けばいいんでしょうか?

  std::transform( vtSource.begin(), vtSource.end(), std::inserter( vtDest, vtDest.end() ),  
           std::bind2nd( std::ptr_fun(A2WString2), 0) );//コンパイルエラー

Window2000
Visual C++ 2005 express edition

820:デフォルトの名無しさん
08/04/18 23:26:01
>>812
C++なら、Boostを入れると<boost/cstdint.hpp>が使える。
名前空間boostに入っていること以外はだいたいC99の<stdint.h>と同じ。

821:デフォルトの名無しさん
08/04/18 23:27:47
>>819
いったん別の関数を挟めばいいはず。
inline std::wstring A2WStringHelper(const std::string& strSource)
{
  return A2WString(strSource);
}
こういうものを作って、std::transformにはこれを渡す。

822:デフォルトの名無しさん
08/04/18 23:54:40
スタティックテキストのプロパティCaptionを変更するにはどうすればいいんですか?
IDC_STATIC.Caption("aaa");
で動かないんですけど

823:デフォルトの名無しさん
08/04/19 00:01:09
IDC_STATIC.Caption = "aaa";
GetDlgItem(IDC_STATIC)->Caption = "aaa";
これでも動きません

824:デフォルトの名無しさん
08/04/19 00:09:19
>>822
IDC_STATICは言わばワイルドカードなので、
キャプションを変えたいスタティックテキストに個別のIDを割り当てる必要があります。

825:デフォルトの名無しさん
08/04/19 00:10:34
つーか、そもそも書き方も判ってなくてコンパイルも通らないならエラーメッセージを張れと。

826:デフォルトの名無しさん
08/04/19 00:22:56
ありがとうございます。名前を付けました
GetDlgItem(IDC_STATICTIME)->Caption = "aaa"
error C2039: 'Caption' : 'CWnd' のメンバではありません。
となります

827:デフォルトの名無しさん
08/04/19 00:27:11
IDC_STATICTIME->Caption = "aaa"
これだと
error C2227: '->Caption' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
こういうエラーになります。

828:デフォルトの名無しさん
08/04/19 00:27:43
Captionなんて無いよ・・・とエラーが教えてくれてるじゃん
なんでそんなにCaption大好きなの?

GetDlgItem(IDC_STATICIME)->SetWindowText("aaa");

829:デフォルトの名無しさん
08/04/19 00:30:40
ありがとうございます
別に好きなわけじゃないんです
VBの時はこうやっていたので
プロパティの項目で設定できないのならVC++で項目の意味はあるんですか?
全部のプロパティの設定方法を調べなきゃいけないんでしょうか?

830:デフォルトの名無しさん
08/04/19 00:35:46
プロパティ?ダイアログの? 
あんなのは飾りだ。

831:デフォルトの名無しさん
08/04/19 00:39:07
意味があるとしたら、設計時に入れれば、コーディングしなくて良い事ぐらいかな?
VCは他もみんなこんな感じだから、VBからだと慣れるしかないな。

プロパティのVisible項目→コーディング時はShowWindow();


832:デフォルトの名無しさん
08/04/19 00:44:01
OK覚悟はできたwwww

833:デフォルトの名無しさん
08/04/19 00:55:43
C#を一通りやった者ですが、CよりC++の方が始め易いでしょうか?

834:デフォルトの名無しさん
08/04/19 01:08:42
C# からなら C は不便に感じると思う。
C++ のがいいかと。

835:819
08/04/19 01:46:47
>>821 ありがとう.とりあえずそうやればできました.

   ただ,何でこれは通らないんでしょうか?

  std::transform( vtSource.begin(), vtSource.end(), std::inserter( vtDest, vtDest.end() ),  
           std::bind2nd( std::ptr_fun(A2WString2), 0) );

   A2WString2() の第一引数の参照型をやめたらこれでもコンパイルできましたが,
 もしよろしければどなたかご教示願います….

//引数の参照型をやめる
std::wstring A2WString2(const std::string strSource, int i=0)
{
  return std::wsting(L"out")
}

836:デフォルトの名無しさん
08/04/19 05:07:02
JavaとかC#から始めた人はCやC++の世界には入ってこないでください。

837:デフォルトの名無しさん
08/04/19 07:57:16
>>836
どうして?


838:デフォルトの名無しさん
08/04/19 09:33:00
ガベージコレクタは便利かもしれないが、その便利さゆえに何か重要なことを失くしているような気がする。

839:デフォルトの名無しさん
08/04/19 09:33:54
「JAVAスクールの危険」ってはなし?

840:デフォルトの名無しさん
08/04/19 09:48:02
Java はアレだが、C# はまだマシだと思うけどな。まあ。

841:デフォルトの名無しさん
08/04/19 10:27:27
>>835
それは有名な参照の参照問題
詳細はSTL バインダで検索して一番上あたりがそのものズバリだと思う
解決策だけ抜きだすとboostのfunctional.hppのboost::bind2ndを使う
さらにptr_funを使わずにboost::bind2nd(A2WString2)と書けるところも利点だ

842:デフォルトの名無しさん
08/04/19 11:43:18
>>837
温室育ちが軍隊に入ったら周りが迷惑するだろ

843:デフォルトの名無しさん
08/04/19 11:48:42
軍隊という表現は語弊があるな
せめてど田舎とか電気が通ってないとかそういう表現にしないと

844:デフォルトの名無しさん
08/04/19 13:06:49
その表現もかなりニュアンス違うな。
まぁ、無理して比喩を使う必要はない場面だと思う。

845:デフォルトの名無しさん
08/04/19 14:05:31
2chにゆとりが入って来たでおk

846:デフォルトの名無しさん
08/04/19 14:06:52
>>845
いまいちだな

847:デフォルトの名無しさん
08/04/19 14:58:24
オートマ車しか乗ったことが無い人が、
マニュアル車に乗る感じとか。

でもC/C++をちゃんと理解して使い始めるなら、良いと思う。

理解するフェーズで挫折する人は、諦めてもらって、
理解するフェーズを無視して使い始める人は氏ねば良いと思うよ。

848:デフォルトの名無しさん
08/04/19 15:10:55
1速のままで法定速度維持してエンジン壊すってか。

849:デフォルトの名無しさん
08/04/19 15:20:18
「郷に入っては郷に従え」でいいんじゃないかと

850:デフォルトの名無しさん
08/04/19 15:21:01
> 理解するフェーズを無視して使い始める人は氏ねば良いと思うよ。
多言語から移ってきた人の3割くらいはこれかな・・・?

851:デフォルトの名無しさん
08/04/19 15:27:51
映画と小説の共存が可能なように美麗な3Dグラフィックゲームと想像力をかきたてる2Dのドット絵ゲームというのは共存が可能だと思うのだがいかがなものか

852:デフォルトの名無しさん
08/04/19 15:31:57
ドット絵すらないroguelikeもよろしく

853:デフォルトの名無しさん
08/04/19 15:55:49
文字は高尚なドット絵だよ!

854:デフォルトの名無しさん
08/04/20 10:27:45
ぷァ

855:デフォルトの名無しさん
08/04/20 10:48:12
*nixのフレームバッファコンソール上でハードウェアアクセラレーションを使って描画とかしたい

856:デフォルトの名無しさん
08/04/20 11:39:26
すみません 圧縮・解凍DLLを利用して、どの形式のファイルを渡されても
同一の方法で展開することのできるライブラリってありませんか?
ファイルをチェックして適切なDLLへ渡すやつです。

857:デフォルトの名無しさん
08/04/20 12:11:41
>ファイルをチェックして
ファイル名で?ファイルの中身で?

858:デフォルトの名無しさん
08/04/20 12:12:58
ファイルの中身です EXEでも解凍できるやつもあります そういうのも展開したいです

859:デフォルトの名無しさん
08/04/20 12:20:41
とりあえずは 拡張子判別DLL(ググって) と 統合アーカイバ の組み合わせかな。

exeは知らない。アーカイブ本体をexe末端に付けてるか、
リソースとして持ってるか、とかの方式で変わってくるだろうし。

860:デフォルトの名無しさん
08/04/20 12:25:42
対応形式が多いのはXacRett.dllかな

861:デフォルトの名無しさん
08/04/20 12:25:40
それらを自動でやってくれるのはないかと…

862:デフォルトの名無しさん
08/04/20 12:28:04
サンクス

863:ミミ
08/04/20 13:10:19
Visual C++ でデバッグバージョンのバイナリを作るときって、
みなさんは名前を変えますか?どんな方法にしてますか?

[方法1]
Debug も Release も同じファイル名にして、ビルドすると上書きされるようにする。

[方法2]
Debug バージョンには _d のようなサフィックスを付ける。
some_d.exe hoge_d.lib など。

[方法3]
Debug と Release で出力フォルダを分ける。
bin/Debug/some.exe bin/Release/some.exe など。

864:デフォルトの名無しさん
08/04/20 13:23:48
デフォルトは方法3だよな。
単独で動かす時はそれで十分やね。

他のアプリから利用する必要がある場合は方法2じゃないと都合が悪い。

方法1は論外っすね。

865:デフォルトの名無しさん
08/04/20 14:40:32
>>858
そういうものがあるとしたら、そういうフリーのソフトが公開されている筈だよな。
そういう公開ソフトはないのだから、当然そういうDLLはない。
まぁ、>859にある「統合アーカイバ・プロジェクト」辺りを見てこいと。

866:デフォルトの名無しさん
08/04/20 15:20:46
XacRettで解決したんですけど…

867:デフォルトの名無しさん
08/04/20 17:28:14
最近ゲームのプログラムいじってたらprint系で浮動小数が出力できなくなってしまったんだが、
同じようになったことある人いる?いたら解決策とか教えて欲しいです。
症状としては、%fを含むprint系の関数(wsprintfとかvfprintf)を実行すると
「問題が発生したため~」っていうおなじみのダイアログが出てきて落ちちゃうんです。

868:デフォルトの名無しさん
08/04/20 17:30:03
言語再インストール

869:デフォルトの名無しさん
08/04/20 18:34:25
ウィンドウを作成して、そこにビットマップを表示させたりするDLLを作ってるんだが、
外部からもらったバイナリBMPデータをどういじればいいのか分からん。。。

//---
PAINTSTRUCT psPaint;
HDC hWndDC;
HDC hMemDC;
HBITMAP hBitmap;
HGDIOBJ hGdiObj;

hWndDC = BeginPaint(g_hWnd, &psPaint);
hMemDC = CreateCompatibleDC(GetDC(g_hWnd));
hBitmap = CreateComptibleBitmap(hMemDC, 100, 100);


hGdiObj = SelectObject(hMemDC, hBitmap);

/* ここでバイナリをhBitmapに設定したい */

BitBlt(hWndDC, 0, 0, 100, 100, hMemDC, 0, 0, SRCCOPY);
//---

ビットマップバイナリをどうにかしてhBitmapに突っ込んでやれば良いのかと思ってるんだけど、
方法がわからん…
そもそも考え方が間違ってる?


870:デフォルトの名無しさん
08/04/20 18:45:57
>>869
SetDIBits

871:デフォルトの名無しさん
08/04/20 18:59:48
CreateDIBitmap

872:デフォルトの名無しさん
08/04/20 19:08:32
>>867
再現ソースとエラーを張れと何度いったことか

873:デフォルトの名無しさん
08/04/20 19:46:11
>>872
再現コードの作成はちょっと全体の量も多いし見当もつかないので難しいです・・・。
関係あるとしたらどんなことが考えられるでしょうか?ロケールとか?

874:デフォルトの名無しさん
08/04/20 20:00:57
>>873
スタックを壊したとか関数テーブルを壊したとか
多分バッファオーバーフローか未初期化ポインタを使って
アクセスしてはいけないメモリを壊した可能性が高い

875:デフォルトの名無しさん
08/04/20 20:01:01
だからエラーメッセージ張れつ~うの。テンプレに書いてあるでしょ
呼び出し規約とかランタイムとかリンクされるライブラリとか
なんかプロジェクトの設定いじったでしょ。それを直せばいい

876:デフォルトの名無しさん
08/04/20 20:45:31
>>863
デバッグ版はインストール先のフォルダ。
リリース版はインストーラ作成のフォルダ。

877:デフォルトの名無しさん
08/04/20 21:22:45
>>874-875
レスありがとうございます。以前できていたところがいじってないのに
急になったので875さんの臭いかも知れないけど、気づいたらなってしまってました・・・
BCCでやっててエラーメッセージを取得できる部分が見当たりません・・・。
こういう時ってどうやってメッセージを受け取るんでしょう?すいませんアホで・・

878:デフォルトの名無しさん
08/04/20 21:58:31
浮動小数とか言ってる時点でキミがアホなのはみんな分かってるよ

879:デフォルトの名無しさん
08/04/20 22:11:33
これでまったく関係ない場所でゼロ除算で落ちてたとかだとウケるな

880:デフォルトの名無しさん
08/04/20 22:24:46
あっwsprintfかw
printf系じゃないから%fとか無理
sprintfつかえ

881:デフォルトの名無しさん
08/04/20 22:29:26
snprintfとかswprintfでもいいよ

882:デフォルトの名無しさん
08/04/21 01:09:03
>>870
>>871
さんくす。
CreateDIBitmap使ってやってみたらいけた。

表示用のビットマップはCreateCompatibleBitmapで作って、
外部からもらったバイナリを描画するビットマップをCreateDIBitmapで作成

BitBltで転送して実装できたよ

ありがとう

883:デフォルトの名無しさん
08/04/21 20:49:40
>>879確実にvsprintfで落ちてました。
>>880-881ダメでした。あきらめます。
親切にレスしてくださった皆様、ありがとうございました

884:デフォルトの名無しさん
08/04/21 21:15:55
null = new int[10]
で確保した領域はどこに存在するの?
delete[]しなければ、この確保した領域はプログラムが終了してもずっとそこに存在したままになるの?

885:デフォルトの名無しさん
08/04/21 21:18:33
>>884
ヒープ領域のどこか

終了したらちゃんと解放される
一部されないOSもなくはない


886:デフォルトの名無しさん
08/04/21 21:38:02
コンパイル時にtype_infoみたいな感じで静的にクラス名の文字列を取得できる方法ってありますか?
テンプレートクラスで例外を投げる時に使いたいんですが・・・

887:デフォルトの名無しさん
08/04/21 21:52:34
>>886
boostのこの辺のが役に立つかもしれない
URLリンク(www.kmonos.net)

888:デフォルトの名無しさん
08/04/21 22:10:44
boostって本当にすごいね・・・そんなのも判定できるとは
でも型名の取得は厳しいのかな・・・

889:デフォルトの名無しさん
08/04/22 01:38:20
やっぱりboostでtypeofってのがあって、それで
型名は取得できるのだけど、staticな処理じゃないんだよね。
なのでその用途だとtypeid使うのとあまり変わりない。
URLリンク(www.kmonos.net)

890:デフォルトの名無しさん
08/04/22 03:19:09
STLをはじめ、テンプレートをよく使いなさい。
型の完全名がカオスになって諦めがつくから。

891:デフォルトの名無しさん
08/04/22 04:20:31
void CtimerDlg::OnBnClickedButton2()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。
msgdlg aaae = new msgdlg();
aaae.Create(IDD_DIALOG1, this);
aaae.ShowWindow(SW_SHOW);

}

このボタンを押すとダイアログウィンドウが一瞬表示されたようにみえるのですが、表示されません。
SW_SHOWがいけないんでしょうか?

892:デフォルトの名無しさん
08/04/22 07:09:45
それコンパイル通るの?

893:デフォルトの名無しさん
08/04/22 07:55:39
コンパイルできないし、それが単なるtypoだったとしても資源の管理はどうなってるんでしょうね、と。

894:デフォルトの名無しさん
08/04/22 09:21:56
コンパイルはできますがやはりaaae.ShowWindow(SW_SHOW);で消滅します

895:デフォルトの名無しさん
08/04/22 09:25:14
あ、aaaeをポインタにしたら出来ました。

896:デフォルトの名無しさん
08/04/22 20:23:53
単にスコープ抜けたから、msgdlgのインスタンスが死亡しただけだろう。

897:デフォルトの名無しさん
08/04/22 21:23:39
vsprintfについてなんですけど、下記のva_end(..)っているのですか?

xx func(const char* format, ...) {
char buf[256];
va_list args;
va_start(args,format);
vsprintf(buf, format, args);
va_end(args); // <=== これ必要なんですか?
...
}

898:デフォルトの名無しさん
08/04/22 21:30:35
規格で、同じネストレベルでva_start,va_endの組で使うことになっている。

899:デフォルトの名無しさん
08/04/22 21:32:48
実装によるかも知れんがメモリとかがぶっ壊れるんじゃまいか

900:デフォルトの名無しさん
08/04/22 21:49:24
すいませんちょっとお聞きしたいのですが、GCCで

if(ret = 1){
int dt = 1;
}

みたいにしたら、
「真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします」
と言われたので、

if((ret = 1)){
int dt = 1;
}

みたいにしたら、許してもらえました。

なぜ ((ret = 1)) の方がよいのでしょうか??


901:デフォルトの名無しさん
08/04/22 21:52:09
>>900
ret==1って書いたらその警告消えてくれるよ。

902:897
08/04/22 21:54:54
>>898-899 どうも、
ここのサンプルではva_end使ってないんです
URLリンク(msdn2.microsoft.com)(VS.80).aspx
そして、URLリンク(www.bohyoh.com)
ここに、「本関数は、va_endマクロを呼び出さない」 と記述があるんです

903:デフォルトの名無しさん
08/04/22 22:00:56
>>900
==の間違いだったりしませんよね?大丈夫?っていう警告だからそういうもんだと思え
別に前の書き方でも問題ない

(())の方がよいというわけじゃない

904:900
08/04/22 22:05:44
>>901 さん
>>903 さん
なるほど!ありがとうございます!


905:デフォルトの名無しさん
08/04/22 22:28:34
>>902
VCに限っていえばva_endマクロは何もしないから呼ばなくても問題はない。
しかし、他の処理系で動くとは限らない。

906:デフォルトの名無しさん
08/04/22 23:00:01
>>902
書かなくてもいい環境が有るとはいえ、プログラムとしては書かないと駄目。
運悪く駄目なサンプルに当たったね。

907:デフォルトの名無しさん
08/04/22 23:05:39
>>896
なるほど!
msgdlg aaae = new msgdlg();
をグローバル領域に持って行っても起動しました。
ポインタの理解が深まりました。ありがとう!

908:デフォルトの名無しさん
08/04/22 23:07:36
ちょっとぉぉぉぉぉ

909:デフォルトの名無しさん
08/04/22 23:13:26
これが
「何か適当にいじったら動いた」
という奴か

910:デフォルトの名無しさん
08/04/22 23:14:27
> グローバル領域
深まってない悪寒

911:デフォルトの名無しさん
08/04/22 23:15:55
さすがにこれをコンボでくらったら元のソースを自分で書いていたとしてもデバッグしたくなくなるな
(だから、その変てこなのは後から馬鹿が弄ったんだってば ><)

912:デフォルトの名無しさん
08/04/22 23:18:30
>msgdlg aaae = new msgdlg();
このコード、何度見ても謎が残りすぎ。

913:デフォルトの名無しさん
08/04/22 23:29:02
>891の段階で既に釣りだったんじゃね?

914:デフォルトの名無しさん
08/04/22 23:30:42
>>907
C++の入門書か入門サイトをもう一度見て回った方が良いと思うぞ。
煽りとかじゃなくて本当に。基礎は大事だから。

とりあえず、理解する必要のあるキーワードとしては、
   ポインタ、参照、自動変数、デストラクタ、delete、スコープ、スタック、ヒープ
あたりかな。

915:デフォルトの名無しさん
08/04/22 23:32:33
釣りなら、それはそれでおk。

916:デフォルトの名無しさん
08/04/23 00:24:05
switchのcase文内で、auto変数を宣言しようとすると、{}をつかってブロックを
作らないとだめですか?

917:デフォルトの名無しさん
08/04/23 00:25:05
だめです

918:デフォルトの名無しさん
08/04/23 00:30:02
>>916
例えばこういうことならできる。
switch (value) {
int someVar;
case 0:
someVar = 0;
break;
case 1:
someVar = -1;
default:
someVar = value;
break;
}

919:デフォルトの名無しさん
08/04/23 00:35:00
>>914
レベルアップした気分ですごく満足なのですが
もう一度新C++言語入門シニア編上下を読み直してみます・・・
が、ずばり一言でどこがおかしいですか?頭関係以外でおねがいします。

920:デフォルトの名無しさん
08/04/23 00:35:09
>>917-918
ありがとうです。
918はやり方自体知らんかったス。


921:デフォルトの名無しさん
08/04/23 01:01:17
>>919
頭関係以外で一言にまとめるには、対象が「少数」の「具体的なディテール」である必要がある。
でも君の場合、「基本的な抽象概念」の理解が「幾つも」欠けているように見受けられるから、まとめようがない。
だから>>914も困った挙げ句
> ポインタ、参照、自動変数、デストラクタ、delete、スコープ、スタック、ヒープあたり
という言い方になってるんだよ(これでも親切に用語を絞って挙げてるほう)。

922:デフォルトの名無しさん
08/04/23 02:37:20
>>919
msgdlg aaae; //○msgdlg型の変数
msgdlg aaae = new msgdlg(); //×msgdlg型の変数にmsgdlg*型の値を代入
msgdlg *aaae = new msgdlg(); //○msgdlg*型の変数にmsgdlg*型の値を代入
一言でいうと,どこがイコールよ?





923:デフォルトの名無しさん
08/04/23 07:18:54
>>919

void CtimerDlg::OnBnClickedButton2()
{
  // new msgdlg() → msgdlgのインスタンスをヒープに確保。
  //
  // msgdlg aaae = ... → msgdlgのインスタンスをスタックに確保して、
  // msgdlg(msgdlg* ptr)に適合するコンストラクタで初期化。(※1)
  msgdlg aaae = new msgdlg();

  ...

  // 自動変数のaaaeがスコープから外れるのでデストラクタが呼ばれ、
  // aaaaが保持していたウィンドウなどが削除される。
  //
  // (※1)のポインタptrをdeleteしていなければメモリリーク。
}

が理解出来ていないように見える。

作りたいのがモーダルダイアログなら、
{
  msgdlg aaae;
  aaae.Create(IDD_DIALOG1, this);
  aaaa.DoModal();
}

関数を抜けてもmsgdlgを保持するなら、
グローバルでなくCtimerDlgのメンバにする。

924:デフォルトの名無しさん
08/04/23 07:20:43
よく見たらeだった。
× aaaa
○ aaae

925:デフォルトの名無しさん
08/04/23 09:41:18
ビットフィールドは、

unsigned char x : 50;

のように元の型を超えていても定義できますか?



926:デフォルトの名無しさん
08/04/23 09:43:54
unsigned char配列を、38 、 6 、 4 のように分けたいのですが、ビットフィールドで出来ますか?
あと、38bitの部分は、=で比較できますか? 無理な場合、別の方法はないでしょうか

927:デフォルトの名無しさん
08/04/23 09:51:28
このようにしたら、確保する領域は、40bit + 8bitになりますよね?
33 + 7 ではないですよね?

class A{
public:
bitset<33> a;
char b : 7;
};

928:デフォルトの名無しさん
08/04/23 10:06:17
自己解決しました
これで長い列に変換出来ました


bitset<40> *p;
unsigned char s[5]={1,255,1,255,128};
p=(bitset<40>*)&s;
cout<< *p;

929:デフォルトの名無しさん
08/04/23 10:53:08
そ れ は 偶 然 だ

930:デフォルトの名無しさん
08/04/23 11:16:25
>>922>>923
ありがとうございます。すごくよくわかりました。
void CtimerDlg::OnBnClickedButton2()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。
int a =0;
while(a < 100){
msgdlg *aaae = new msgdlg[100];
aaae[a]->Create(IDD_DIALOG1, this); // エラー
aaae[a]->ShowWindow(SW_SHOW);
aaae[a]->OnBnClickedOk();
delete aaae[a];
a++;
}
}
error C2819: クラス 'msgdlg' にはオーバーロードされたメンバ 'operator ->' がありません。

これは何がいけないんでしょうか?

931:デフォルトの名無しさん
08/04/23 11:32:26
下記のコードを実行したときに test::aaa で内部的に確保されたメモリ(?)が解放されず、
メモリリークが起きてしまっているようで解決方法が見つからず困っています。
STLなどの場合、確保したメモリを明示的に解放する関数などがあるのでしょうか?
( aaa.clear() や aaa.~vector() などは試してみたのですが駄目でした)
それとも test::aaa 自体も new で確保して delete で解放したほうが良いのでしょうか?
環境はVC++2005です、よろしくお願いします。

class base {
public:
~base(){ destory(); }
virtual void destory(){};
};
class test : base {
public:
std::vector< int > aaa;
void destory(){ aaa.clear(); }
};

void main(){
void *p;
{
test *ptest;
ptest = new test;
ptest->aaa.resize(100);
p = (void*)ptest;
}
//ここではポインタ p の基本クラスが base ということ以外はわからない
delete (base*)p;
}

932:デフォルトの名無しさん
08/04/23 11:39:01
デストラクタで仮想関数呼び出すとか馬鹿じゃねーの?

933:デフォルトの名無しさん
08/04/23 11:42:12
古い形式のキャスト使ってるとか馬鹿じゃねーの?
スマートポインタ使ってないとか馬鹿じゃねーの?

いやいや、馬鹿じゃないって。
デストラクタの中から仮想関数呼び出すのはさすがにないけど。

934:デフォルトの名無しさん
08/04/23 11:44:25
>>930
これはひどい

935:デフォルトの名無しさん
08/04/23 11:57:28
… ~base() が呼び出されるときは
既に test::destory の実体はなくなっているからでしょうか?
馬鹿ですみません…
こういう場合、クラスtestで確保したメモリは
どう解放したら良いのでしょうか?


936:デフォルトの名無しさん
08/04/23 11:59:40
しかも書いてありました。
スマートポインタで調べてみます。

937:デフォルトの名無しさん
08/04/23 12:31:15
baseのデストラクタにvirtualをつけて上で
testに自分のdestoryを呼ぶデストラクタを書けば
baseのデストラクタの最初でtestのデストラクタが呼ばれて、testのdetoryが呼び出されるため
この場合はmain内部の変更無しでメモリリークがなくなるけど、それじゃ駄目なの?

938:デフォルトの名無しさん
08/04/23 13:22:22
>>937
ありがとうございます、無事に解放されるようになりました。
いろいろと勉強不足でした。
仮想デストラクタにしないと派生クラスのデストラクタが呼び出されないのはもちろん
メンバ変数のデストラクタも呼び出されないということ(?)なんですね。


939:デフォルトの名無しさん
08/04/23 13:39:34
>メンバ変数のデストラクタも呼び出されない
詳しくは覚えてないが、デストラクタが仮想関数(virtual)であれば、delete演算子が
渡されたポインタから仮想関数テーブルを辿って継承関係を把握できるとか
だったと思う(逆に言えば仮想関数でないと把握できない)。
ちなみに勘違いしてそうなので書いておくけど、デストラクタとは
~クラス名();←引数無し
のこと。destroyとか勝手に名前つけたらそれはただのメンバ関数だよ。
この場合正しくは virtual ~base();とかだ。

940:デフォルトの名無しさん
08/04/23 13:43:43
あ、そういえば~base()はちゃんと書いてあるのかw

941:デフォルトの名無しさん
08/04/23 14:11:20
なるほど…仮想関数テーブルですか、
virtual指定はなんだか漠然としていて理解しにくかったですが
なんとなくはどう動作するかが理解できました。
ありがとうございます。

942:デフォルトの名無しさん
08/04/23 14:16:49
>>930
下のソースはコンパイル可能
行数減らしたから少し見辛いかも
>>914の言うようにポインタと参照について学んだ方がいい

struct CTest{ void test(){} };
void f(){
CTest a;
CTest* b = new CTest();
CTest* c = new CTest[1];
CTest d[1];
a.test(); (*&a).test(); (&a)->test(); (&a)[0].test();
(*b).test(); b->test(); b[0].test();
(*c).test(); c->test(); c[0].test();
(*d).test(); d->test(); d[0].test();
delete b;
delete[] c;
}

943:デフォルトの名無しさん
08/04/23 14:47:49
>>942
感動しました。こんなにわかりやすいの初めてみました。がんばります!

944:デフォルトの名無しさん
08/04/23 15:37:22
物凄い初歩的な質問なんですが
上手い方法を教えてもらいたくて質問します。

ある文字列があって
1文字ずつ処理していくんですが、
何か文字に変化があった時だけ処理を行いたいのです。

char str[]="ああいうええお";//何か文字列
int len=strlen(str);
char current_c;

current_c=str[0];//内容を覚える
for(int i=0; i<len; i++){
if(current_c!=str[i]){//連続している文字が変われば
//処理
}
}

こんなのを思いついたんですが
これだと、1つ目の文字が当然処理されません。
current_c=str[0];//内容を覚える
これを
current_c=str[0]+1;//内容を覚える
として、必ず1回目は処理が行われるようにするのも考えたんですが
もっとちゃんとしたスマートな方法があると思うんですが・・・
こういう場合、どうやるのが一般的なのでしょうか?

945:デフォルトの名無しさん
08/04/23 15:46:25
str[0]+1なんて代入しなくても、0で初期化しておけばいいんじゃないの?

946:デフォルトの名無しさん
08/04/23 15:48:09
>>944
charは1バイトだから平仮名みたいな多バイト文字はうまくゆかないよ。
分かっているならごめん。

947:デフォルトの名無しさん
08/04/23 16:11:33
>>945
0に相当する文字が来た時に駄目でしょ。

948:デフォルトの名無しさん
08/04/23 16:12:08
>>944

typedef char val_t;
val_t str[]="aabbbcccddee";

typedef val_t* iter_t;
for(iter_t begin=str,end=str+strlen(str),back,it=begin; it!=end; ++it){
  if(it==begin || *back!=*it){
    //処理
    back=it;
  }
}


(・∀・)

949:デフォルトの名無しさん
08/04/23 16:13:42
>>947
それはひょっとしてギャグでいってるのか・・・・

950:デフォルトの名無しさん
08/04/23 16:19:37
>>944
最初に1文字目と異なる値 str[0]+1 で初期化しとけば良いんじゃね?
ってのは結構頭の良い発想。凡百の徒には嫌われるけどね。

でもそういうときの current_c は普通 prev_c だな。

951:デフォルトの名無しさん
08/04/23 16:22:12
>>950
そうか?ムダじゃね?

952:デフォルトの名無しさん
08/04/23 16:33:50
一つ目の文字が変わるっていう意味が分からんw

953:948
08/04/23 16:41:36
struct CTest{
  bool operator!=(const CTest& o){
    // ...
    return true;
  }
};
template<typename iter_t> void unique_each(iter_t begin, iter_t end){
  for(iter_t back,it=begin; it!=end; ++it){
    if(it==begin || *back!=*it){
      //処理
      back=it;
    }
  }
}
void f(){
  CTest v[10];
  // v[0] ...
  unique_each(v,v+sizeof(v)/sizeof(*v));
}

(∩゜д゜)アーアーきこえなーい

954:デフォルトの名無しさん
08/04/23 16:46:59
>>951
今回は文字だから 0 にしときゃ良いけど、
一般に先頭要素または直前のと異なる要素を
判定していくには良い方法だよ。

955:デフォルトの名無しさん
08/04/23 16:58:36
>>945の前提条件
nul終端文字列

>>947の前提条件
文字列

>>950の前提条件
コピーコンストラクタ
operator+
operator!=
を持っている型

>>953の前提条件
operator!=
を持っている型

956:デフォルトの名無しさん
08/04/23 17:04:34
>>955
もう>>944とは別世界に行ってるなw

957:デフォルトの名無しさん
08/04/23 17:31:55
PHPやperlでprint を使いながらデバッグするような方法をC++でもやりたいのですが、どうすればよいでしょうか??
そういうデバッグの仕方はC++では難しいのでしょうか。


958:デフォルトの名無しさん
08/04/23 17:32:34
>>944 ちょっとトリッキー、でもうまいやり方
>>945 一番シンプル
>>946 一番重要なレスw
>>953 汎用化し杉ワロタw

959:デフォルトの名無しさん
08/04/23 17:44:15
>>944
#include <algorithm>
#include <string>
#include <iostream>
#include <functional>

int main() {
  std::wstring src = L"ああいうええお";
  src.push_back(0);
  ::setlocale(LC_ALL, "ja_JP.UTF-8");
  for (std::wstring::iterator i = src.begin(); *i != 0; ++i) {
    i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>());
    std::wcout << i-src.begin() << *i << std::endl;;
  }
}

終端一つ加えて条件が逆のadjacent_find

>>957
エスパーするとコードを読ませて実行時に一時的な値を見るとかならデバッガ
gdbとVC付属のやつとか

960:デフォルトの名無しさん
08/04/23 17:44:31
>>944は、charの取りうる最大値を指していた場合
+1すると、オーバーする。

>>945は、処理内容次第では、\0がいきなり来た場合にヤバい。
が、あのプログラムの場合strlenの値がループの実行回数だからOK

>953は、恐らく>>944が本当に必要だったものではない可能性が高いw


961:デフォルトの名無しさん
08/04/23 17:47:00
>>959 さん
なるほどデバッガで変数に格納されてる値を見ることが出来るんですね。
ありがとうございましたm(_ _)m

962:デフォルトの名無しさん
08/04/23 17:51:55
>>>944は、charの取りうる最大値を指していた場合
>+1すると、オーバーする。

するってーと current_c=~str[0]; が適切?

963:デフォルトの名無しさん
08/04/23 17:53:43
オーバーフローしても大丈夫だろ。

964:デフォルトの名無しさん
08/04/23 17:55:39
あ、一文字目が処理されない

965:デフォルトの名無しさん
08/04/23 17:56:06
>>963
実動はともかく、規格的にはアウトだろ

966:959
08/04/23 18:12:21
リベンジ

#include <algorithm>
#include <string>
#include <iostream>
#include <functional>

int main() {
  std::wstring src = L"ああいうええお";
  ::setlocale(LC_ALL, "ja_JP.UTF-8");
  std::wstring::iterator i = src.begin();
  if (!src.empty()) {
    do {
      std::wcout << *i << std::distance(src.begin(), i) << std::endl;
      i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>());
    } while(i++ != src.end());
  }
}



967:デフォルトの名無しさん
08/04/23 18:15:31
そして通告されるeucJP

968:デフォルトの名無しさん
08/04/23 19:01:21
vectorの配列を作ろうと思い

vector<vector<string> > vecStrDim;
vector<string> vecStr;
string strTest = "test";

vecStr.push_back(strTest);
vecStrDim[0].push_back(vecStr);

とやってみました。コンパイルは通るのですが
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
とでて実行してもデバッグエラーになります

vecStrDim[0].push_back(vecStr);が悪いのはわかるのですが、方法が思いつきません
どうすればデバッグエラーを対処できるのでしょうか?

969:デフォルトの名無しさん
08/04/23 19:06:06
>>968
×vecStrDim[0].push_back(vecStr);
○vecStrDim.push_back(vecStr);

970:デフォルトの名無しさん
08/04/23 19:10:40
>>969
あわわ……とんでもなく馬鹿なことしてすみません
解決しました

971:デフォルトの名無しさん
08/04/23 19:14:36
そのコードがコンパイルが通ることが不思議だ…

972:デフォルトの名無しさん
08/04/23 19:29:14
シングルバイト限定なら、current_cをintか何かにして、charで表現できないデカい値にしとけばいい。

973:デフォルトの名無しさん
08/04/23 20:44:51
class内で、static付けたものは、配列にしたときコピーは作られないんですよね? すべて同じ物を参照するんですよね

974:デフォルトの名無しさん
08/04/24 00:27:08
まあ配列にしなくても1つしか実体が存在しないようになるけどな

975:デフォルトの名無しさん
08/04/24 00:49:34
#include <stdio.h>
void main(void)
{
int a;
pirntf("何か入力してください\n\n");
scanf("%d",&a);
while(1){
printf("ぐははははははは!!\n\a");
}
}
この程度しか俺は中なので書けません。プログラマーさん
お願いします。



976:デフォルトの名無しさん
08/04/24 00:50:21
↑MISSりました

#include<stdio.h>
void main(void)
{
int a,b,c;
printf("数字を入力してください\n");
scanf("%d",&a);
printf("数字をまた入力してください\n");
rewind(stdin);
scanf("%d",&b);
printf("数字をまたまた入力してください\n");
scanf("%d",&c);

if(a == b == c)
printf("等しいです,\n");
else
printf("等しくないです,\n");
}


これでa==b==cだったら"等しい"と表示させるように組んでるのに 1、1、1以外の数字は入力してもは全部"等しくないです"になるのは
なんででしょうか?

977:デフォルトの名無しさん
08/04/24 00:52:43
>>976
a == b == c は、(a == b) == c と解釈される。つまり、使い方が間違っている。
その場合、恐らくa == b && b == c でいいだろう。


978:デフォルトの名無しさん
08/04/24 00:57:13
980あたり、次スレたのむぜ

979:デフォルトの名無しさん
08/04/24 00:59:27
>>977
おおwなるほど!
ありがとうございました^^

980:デフォルトの名無しさん
08/04/24 01:11:37
>>990にパス

981:デフォルトの名無しさん
08/04/24 01:14:03
>>976
移動前のスレのコメントにもありましたが、
「君が参考にしてるものは信用しないほうがいい」
です。void main(...) はまずい。

982:デフォルトの名無しさん
08/04/24 01:17:45
void main は g++ でエラーになるしな。
gcc だと警告ですむけど。

983:981
08/04/24 01:34:22
rewind() も、あるのかわからない.....。stdin に対して rewind() ?

984:デフォルトの名無しさん
08/04/24 03:35:46
1~100までの数字でひとつだけない数字があるのでそれを探すという問題なのですが
URLリンク(kansai2channeler.hp.infoseek.co.jp)
でひとつひとつ探す方法はあるのですが
他の方法で、まず
1~50までの個数と51~100までの個数を数えて
1~50が49個
51~100が50個で1~50にあるとして
次は1~25、26~50とどんどん減らして
26~38と39~50の割り切れないときは13と12にしたりなどして
最後2つの数字にし
48が1個
49が0個で49がない数字とするプログラムを作りたいのですが
どなたか例みたいなものを書いていただけないでしょうか?

985:デフォルトの名無しさん
08/04/24 03:41:23
数えながら2つのファイル(小さい,大きい)に書き出していけばいいんじゃねの?

986:デフォルトの名無しさん
08/04/24 03:42:37
どこにあるのかわからないなら、ひとつひとつしらべるのが最善

987:デフォルトの名無しさん
08/04/24 03:48:07
問題でこのような方法で作りなさいとあるので作りたいんですがダメでしょうか?
#include<stdio.h>
#define N 100
int main(void){
int min , max , mid;
int count1, count2;
int data, i;
FILE *fp

ここまでの指定はあるのですが、今自力でやってみてるんですが
どう二つに分けそれ以降どのように区切っていけばいいのかよくわからないんです

988:デフォルトの名無しさん
08/04/24 04:42:58
物凄い無駄な処理だなw

再帰呼び出しを使うのが良いよ

989:988
08/04/24 04:46:09
ああ、ごめん。数字は順番に並んでるわけじゃないのか

990:デフォルトの名無しさん
08/04/24 04:54:26
諦めて全部足して5050から引け

991:デフォルトの名無しさん
08/04/24 05:18:22
#include <vector>

//trueならmidより上、falseなら下
bool hilow(int min, int mid, int max,
  std::vector<int> src, std::vector<int> dst)
{
dst.clear();
std::vector<int> hi, low;

//中間数超と以下でhi, lowに分ける
for(size_t c=min; c <= max; c++) {
if(src[c] <= mid) low.push_back(src[c]);
else hi.push_back(src[c]);
}

//個数が規定値か調べて多い方を返す
if(hi.size() == max - mid ) {
dst.swap(hi);
return ture;
}

dst.swap(low);
return false;
}


続く

992:デフォルトの名無しさん
08/04/24 05:33:54
続き
void main() {
std::vector<int> num;
//ファイルからnumに一度全部読み込む
//ここは自分で書けるでしょ?

int min, mid, max;
min = 1;
max = 100;

do {
(max - min + 1) % 2 ? mid = (max - min + 1) / 2 + 1 : mid = (max - min + 1) / 2;
if( hilow(min, mid, max, num, num) ) min = mid + 1;
else max = mid;
} while(max - min > 2);

//完了

}


993:デフォルトの名無しさん
08/04/24 05:36:05
あー色々間違ってたw

bool hilow(int min, int mid, int max,
  std::vector<int>& src, std::vector<int>& dst)

dst.clear(); は無し


f(hi.size() == max - mid ) {
dst.swap(low);
return false;
}
dst.swap(hi);
return true;
}

994:デフォルトの名無しさん
08/04/24 05:37:10
試してないけどこんな感じで良いと思うよ。
中間の出し方は微妙に間違ってるかもしれんので、自分で検証してね。

995:デフォルトの名無しさん
08/04/24 05:56:21
exeを逆アセンブルしてソースコードに組み込む定番のやり方教えて下さい

996:デフォルトの名無しさん
08/04/24 06:00:08
ソースコードでよくみかける10Lや1Lってなんのことなんでしょうか?
「1Lとは」などで検索したのですが見つかりません。
環境はC++、BCCです。どなたか回答頂ければ幸いです。

997:デフォルトの名無しさん
08/04/24 06:09:58
>>996
整数のあとにつくLはlong intであることを表す。
10はintの10。10Lはlong intの10。

998:デフォルトの名無しさん
08/04/24 06:31:33
>>997
ありがとうございます!
long intをキーワードに検索したら大体わかってきました。
long intを代入するときはLをつけるという解釈であってますか?

999:デフォルトの名無しさん
08/04/24 06:39:42
違うよ。整数リテラルそのものにも型があるの。

1 は int型
'1' は char型
1.0 は double型
1L は long型

1000:デフォルトの名無しさん
08/04/24 06:49:16
重ねてありがとうございます!
詳しい説明でよくわかりました(多分)。
単なる1でも勝手にintにされてるんですね。

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch