私は現在visual C++6.0を使用して
MFCをちょこちょこ使いながらC++でプログラムを書いています。

皆さんご存知かとは思いますが
CMapStringToStringを使うと一つのKeyからひとつの要素しかとりだせません。
ひとつのKeyに対していくつか要素を追加していけるようにしたいのです。

どなたかご存知の方がいらっしゃったら教えて頂けないでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

適当に作ってみました。



CMapStringToOb SAMap(3);

CStringArray *pVal;
pVal = new CStringArray();
pVal->SetSize(2);
(*pVal)[0] = "田中 太郎";
(*pVal)[1] = "田中 花子";

SAMap.SetAt("TANAKA", pVal); // 要素を追加

pVal = new CStringArray();
pVal->SetSize(2);
(*pVal)[0] = "山田 太郎";
(*pVal)[1] = "山田 花子";

SAMap.SetAt("YAMADA", pVal); // 要素を追加

pVal = new CStringArray();
pVal->SetSize(2);
(*pVal)[0] = "佐藤 太郎";
(*pVal)[1] = "佐藤 花子";

SAMap.SetAt("SATOU", pVal); // 要素を追加

CStringArray *pMapVal;

// 値を獲得
BOOL b = SAMap.Lookup("YAMADA", ( CObject *&)pMapVal);

printf("%s\n",(LPCSTR)pMapVal->GetAt(0));
printf("%s\n",(LPCSTR)pMapVal->GetAt(1));
    • good
    • 0
この回答へのお礼

ありがとうございます!
とてもわかりやすいです!
参考にさせていただきます。
お手数おかけして申し訳ありあませんでした

お礼日時:2001/08/23 01:29

STLのstd::multimap<key, container>とstd::multimap<key, con

tainer>::equal_range()メソッドで御所望の動作が出来ます
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
検討してみます。

お礼日時:2001/08/21 10:20

CMapStringToObとCStringListの組み合わせが


一番質問と近くて簡単ではないでしょうか。

この回答への補足

すいません。
MSDNライブラリを見て検討してみた結果
CStringToObを使ってみようと思い
CStringをキーとして
CObject*がCStringArrayをさすようなものを作ろうと思ったのですが
どのように書いてよいのか、わかりませんでした。

そこで申し訳ないのですが
サンプルになるプログラムを紹介していただけないでしょうか?

補足日時:2001/08/21 10:36
    • good
    • 0
この回答へのお礼

すばやいご回答ありがとうございます。
なんだかピッタリっぽそうです。
検討してみます。

お礼日時:2001/08/21 10:36

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QHBITMAPを初期化するとは?

CreateDIBitmap関数でfdwInit引数をCBM_INITにすると初期化し、0にすると初期化しないとありますが、これの意味がイマイチよくわかりません。

で、初期化しなかった場合、後でSetDIBits関数で初期化しるというようなことが書かれているのですが。

用は、初期化していない状態とは、ビットマップの大きさもろもろの情報のみがわかっている状態で、色情報のみ不明な状態であり、初期化するとはそれに加え色情報まで追加するということ、という考えであっていますか?

で、今の自分の考えが正しいことを前提にしての質問ですが、初期化してある状態としていない状態で、使用するメモリの量が大量に違うとか、CreateDIBitmapで初期化する作業は初期化しない作業に比べて計算時間がかなり違ってくるとかいうような大きな違いがあるのでしょうか。

それとも別になにかあるんですか?

Aベストアンサー

>初期化するとはそれに加え色情報まで追加するということ、という考えであっていますか?

それであっています。
初期化してもしなくてもDDBは作成します。この時点で新たに確保されるメモリは同じです。

DDBをDIBで初期化するという意味はわかりますか?
ディスプレイが16ビットカラーだとすると、DDBも16ビットカラーになります。DIBは8/16/24ビットなど何でもいいわけだから、結果としてフォーマットが変換されます。

SetDIBitsも含めて計算時間がかかるかどうかは重要ではありません。必要あれば呼び出すしかなくて、必要なければ呼び出さないだけの事です。

※MSDNによれば「fdwInit パラメータの CBM_CREATDIB フラグは、現在はもうサポートされていません。」とありますね・・・。

QMFC C++ と C++/CLI の文字列

VS2008です。

Library: NativeC++ with MFC -> DLL
  ↑↓
Wrapper: C++/CLI with .NET -> DLL
  ↑↓
Appli: VB.NET with .NET -> EXE

元々、ActiveXコントロール(非GUI利用)だったNativeC++で書かれたLibraryを
MFC DLLとしてビルドし、Wrapper 経由で Appli から使用できるよう
移植をしています。

Library から必要な関数を dllexport し、wrapper から参照し、
wrapper を Appli が参照して、使用できるようにしました。
int型を引数に取り、結果として返す関数は期待どおり動作しますが、
文字列だと上手く行きません。

Wrapper/Appli は System.CString で統一したいのですが、
Library ではどのような型として宣言すれば文字列のやり取りができるでしょうか。
( 引数・戻値の両者 )

CString wchar_t* char* System.String ALT::CStringT basic_string _bstr_t CComBSTR
LPCTSTR LPTSTR PCTSTR PTSTR LPCWSTR LPWSTR PCWSTR PWSTR BSTR…

なお、Library で下記のようにエクスポートし
__declspec(dllexport) BSTR test(LPCTSTR data);
wrapper で
BSTR hoge(LPCTSTR value){ return test(value); }
と宣言すると、wrapperのビルドで下記のエラーが表示されます。

エラー1error LNK2028: 未解決のトークン (0A000B39)
"wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が
関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)"
(?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。wrapper.objwrapper

エラー2error LNK2019: 未解決の外部シンボル
"wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が
関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)"
(?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。wrapper.objwrapper

エラー3fatal error LNK1120: 外部参照 2 が未解決です。

VS2008です。

Library: NativeC++ with MFC -> DLL
  ↑↓
Wrapper: C++/CLI with .NET -> DLL
  ↑↓
Appli: VB.NET with .NET -> EXE

元々、ActiveXコントロール(非GUI利用)だったNativeC++で書かれたLibraryを
MFC DLLとしてビルドし、Wrapper 経由で Appli から使用できるよう
移植をしています。

Library から必要な関数を dllexport し、wrapper から参照し、
wrapper を Appli が参照して、使用できるようにしました。
int型を引数に取り、結果として返す関数は期待どおり動作しますが、
文字列だと上...続きを読む

Aベストアンサー

Library の DLL に対して
Dumpbin /exports XXXXX.dll
とするとどうなりますか?

Qcdの初期化

cdの初期化について質問です。

書き込むためのソフトにSonicStageVを使っているのですが音楽CDの作成ボタンを押すと、

「挿入されたディスクは書き込み済みです。CD-RWをご利用の場合は初期化ボタンから初期化することで書き込むことができます。」

と出てきます。
初期化しようと「初期化ボタン」探しているのですが見つかりません。

初期化ボタンとはどこにあるのでしょうか。
またこれ以外の方法で初期化することは不可能なのでしょうか。

Aベストアンサー

CD-Rはフォーマット(初期化)は出来ません、1回きりの書き込みです。
CD-RWをお使いなら、前の分は消去出来ます。
消去は書き込みソフトで出来ます、ソフトにより方法は違いがありますが、ソフトのツールバーのボタンを探して下さい。
上でもないソフトもありますが、何処かにありますので探す事です。

Qvisual studio 2005 c++/CLI ではないC++ winアプリ

こんばんは

表記の件に関して質問があります。
表題のとおりなのですが
visual studio 2005 でc++/CLI ではないC++(gcnewがでてこないやつ)
windowsアプリを作成したいのですが、出来ますでしょうか。
2003にすればたぶん大丈夫なのですが、2005でできないでしょうか。
以上よろしくお願いします。

Aベストアンサー

有名どころでは「猫でもわかるプログラミング」でしょうね。
C#に慣れているのであれば、C言語の基本的なところからやっておいた方がよいでしょう。

http://homepage2.nifty.com/c_lang/
VC++2005なら
http://homepage2.nifty.com/c_lang/net2005/sample.htm
をまず理解する必要があり。
これに沿って、それぞれのサンプルを読み替える。

QWii u について初期化の質問です

説明書をなくし、そして求められる質問及び回答がネットに存在していなかったので質問させていただきます。
Wii u の初期化ですが本体の初期化しかありません。
個体ソフトの初期化は可能でしょうか?そしてもし本体初期化をする場合でないと初期化ができない時は、インターネットで設定したIDとパスがあるんですが、それも消えてしまいますか?

Aベストアンサー

Wii uのメニューの本体設定を開き、データ管理というものの中にセーブデータが入っています。
あとは画面に案内が出ていると思うので省略します。

QMFC,C++/CLI,C#の共存

CCDカメラからの画像を画像処理ボード(MV-10というボードです)で受け取り、そのデータを使ったWindowsプログラムを開発したいと考えています。
開発はVisual C# 2005か Visual C++ 2005(C++/CLI)で行いたい(理想としては、フォームなど外観はC#、内部処理はC++)のですが、画像処理ボードのライブラリがMFCとなっていました。
色々と調べて、MFCとC++/CLIを共存させることが出来るらしく、またC#とC++/CLIを共存させることも出来るらしいと言うことが分かったのですが、具体多的な方法が分かりません。

具体的な方法が記述されている書籍や、ウェブサイトなどがありましたら、教えていただきたいです。

Aベストアンサー

下記URLにヒントがありそうです。

参考URL:http://www.wankuma.com/seminar/200708TechEd/Default.aspx

Qパソコンを初期化する質問煮について

パソコンを初期化すると良く質問されてますが人間がするなら好きな事出来るのでその初期化で良いのですが問題は量産タイプのPCご購入時に戻る訳でして初期化という意味ではないと思います。
何処の時点が初期化なのか解る人居れば、例えば組み立てただけの時点なのかOS入れた時点なのか?解る人居れば教えて頂ければ幸いです、お願い申し上げます、初期化の意味を?

Aベストアンサー

メーカーパソコンはOSとサービスソフトが何十本も入っているので

起動ディスクを使ってリカバリーディスク1枚~2枚と必要です。

起動ディスクを使っていたのはWindows 95~98のときで

今はリカバリーディスクとアプリケーションディスクが2枚~3枚です。


今は現在はDVDが有りますので自作PCはリカバリではなく

OSWindows 7のDVDを使ってOSのインストールも初期化も

OSWindows 7のDVD1枚で両方をまかなうことが出来ます。

QC#,C++/CLI,MFCにおけるデータ型の対応と、メソッドへの渡し方

現在、Visual Studio 2005の、Visual C#、C++/CLI、MFCを使ったシステムを構築しています。
具体的には、MFCで書かれたライブラリ(DLL)をC++/CLIでラップし、C#から呼び出して使うというものです。
現在は、http://www.atmarkit.co.jp/fdotnet/special/vcppinvista02/vcppinvista02_04.html
http://msdn2.microsoft.com/ja-jp/library/ac7ay120(VS.80).aspx
これらのサイトを参考にしながら、一部のMFCで書かれたメソッドを、C#から呼び出すことに成功しました。しかし、int型やHANDLE型などの、上記サイトに記述されているデータ型を用いたメソッドのラッピングや呼び出しはできたのですが、HDCやLPRECTなどの特殊な型の場合のやり方がよく分かりません。

具体的に現在分からないのは、次の通りです。
HDC(デバイスコンテキスト)、HWND(ウィンドウのハンドル)、CIRCLE,RECT等の構造体、LPRECTなどの構造体のアドレス、POINT*などの構造体のポインタ
これらが、C#やCLIでどのような型になるのか、メソッドに渡す時にどのように記述するのかが分かりません。

以上、どなたか分かる方いらっしゃいましたら、ご回答をお願いします。

現在、Visual Studio 2005の、Visual C#、C++/CLI、MFCを使ったシステムを構築しています。
具体的には、MFCで書かれたライブラリ(DLL)をC++/CLIでラップし、C#から呼び出して使うというものです。
現在は、http://www.atmarkit.co.jp/fdotnet/special/vcppinvista02/vcppinvista02_04.html
http://msdn2.microsoft.com/ja-jp/library/ac7ay120(VS.80).aspx
これらのサイトを参考にしながら、一部のMFCで書かれたメソッドを、C#から呼び出すことに成功しました。しかし、int型やHANDLE型などの、上記サイトに...続きを読む

Aベストアンサー

> DLLのリンクはIJW機構というものを使用して

そのようですね、勉強不足で申し訳ありません。

>>    RECT lprcDC, lprcDib;
>
>>    return dllfunction(hDC, lprcDC, hDib, lprcDib);
> --------------------------------------------------------------
> この記述ですと、lprcDCとlprcDibがポインタに変換されていないと思う
> のですが、これは記述ミスでしょうか?

DllImport でマネージドとアンマネージドに変換されるので構造体を含め
C++/CLI のマネージドコードで記述してます。

# 他のと同じように lp- というプリフィクスにしたのが誤解を招いたかも
# 知れないです。

念のために拙いコードなのですが、 C# の GUI でコードを書いて動作
確認をしてみました。

TestDll.dll 側の関数実装には TextDraw と Bitblt を記述して任意の
文字列を bmp1(C#) の HDC に描画して bmp2(C#) の HDC には Bitblt で
bmp1(C#) の HDC を反転したものを転送するようにしました。
TextDraw と BitBlt のどちらかで失敗した場合はその時点で FALSE を
返すようになっています。

HANDLE は void* の typdef なので HDC にキャストしました。
TestDll.dll にポインタが確実に渡っているか調べるのだけならそれで
問題ないのではないかと思いましたので。

------------- 呼出用プログラム(C#) --------------
// PictureBox サイズの Bitmap を作成
Bitmap bmp1 = new Bitmap(pictureBox1.ClientSize.Width,
             pictureBox1.ClientSize.Height);
Bitmap bmp2 = new Bitmap(pictureBox2.ClientSize.Width,
             pictureBox2.ClientSize.Height);

// Bitmap から Graphics を得る
Graphics g1 = Graphics.FromImage(bmp1);
Graphics g2 = Graphics.FromImage(bmp2);

// Graphics から HDC を得る
IntPtr hDC = g1.GetHdc();
IntPtr hDBI = g2.GetHdc();

// DLL 呼び出し
if (!wrapper.function(hDC, pictureBox1.ClientRectangle,
            hDBI, pictureBox2.ClientRectangle)
  )
    MessageBox.Show("失敗");

// PictureBox へ描画
pictureBox1.Image = bmp1;
pictureBox2.Image = bmp2;
g1.ReleaseHdc();
g2.ReleaseHdc();

その他の部分は ANo.2 に記述したものと同じです。
----------------------------------------------------

それと、一点お尋ねしたいのですが

>  BOOL result = Mvc10_PaintDIB( (HDC)hDC.ToPointer(), LPrcDC , (HANDLE)hDib.ToInt32(), LPrcDib );

HANDLE は typedef void* かと思うのですが hDib.ToInt32() として
hDib.ToPointer() としてないのは何か理由があってのことでしょうか?

# こちらで試したところ ToPointer() でも ToInt32() でも動作する
# ようですし、立ち入ったことであれば申し訳ないですので、流して
# ください。

> 実際に使用してみての結果は後日報告させていただきたいと思います。

無事に動作されることをお祈りいたします。
自己解決されておられるようで、お役に立てなくて申し訳ありませんでした。

> DLLのリンクはIJW機構というものを使用して

そのようですね、勉強不足で申し訳ありません。

>>    RECT lprcDC, lprcDib;
>
>>    return dllfunction(hDC, lprcDC, hDib, lprcDib);
> --------------------------------------------------------------
> この記述ですと、lprcDCとlprcDibがポインタに変換されていないと思う
> のですが、これは記述ミスでしょうか?

DllImport でマネージドとアンマネージドに変換されるので構造体を含め
C++/CLI のマネージドコードで記述してます。...続きを読む

Qインスタンスフィールドの初期化方法

クラスのインスタンスフィールドを初期化する場合、次の3つが考えられますが、どれが一番スマートなんでしょうか。


クラスQ1はインスタンス変数int xを持つとします。

1.コンストラクタ内で初期化
e.g. Q1() {this.x = 1;}

2.宣言時に初期化
e.g. int x = 1;

3.インスタンス初期化子内で初期化
e.g.
{
x = 1;
}
Q1(){}

Aベストアンサー

スマート、という表現が主観的なので正解はなさそうに思います。強いて言えば、一つのプログラム内で意味もなく複数のやり方を混ぜて使うのはスマートじゃないだろうな、というくらいです。

参考までに、私は基本的にコンストラクタ内で初期化しています。staticな定数なら宣言時に初期化。インスタンス初期化子は使ったことがありませんし、人のプログラムでも見たことがありません。

QMS Visual C++で、Cのargv[]の使い方?

以前「既存のCプログラムをMS Visual C++へ移行して実行したい 」という
質問をした者です。

既存のCプログラムをビルドするところまではいきました。
****(.exe) inputfile outputfile
というふうにプログラムを実行させたいのですが、
VC++の「実行」ボタンでは入出力ファイルを指定するところが
わかりません。
(「実行」ボタンを押すと、DOS窓が開いて、「inputfile outputfile」
を入力する暇も無くエラーになって終了します)

MS固有の関数はできるだけプログラムに入れたくないのです。
ソフト(VC++)の設定で入出力ファイルを指定する方法を
教えてください。

Aベストアンサー

デバッグ中のプログラムの作業ディレクトリは実行ファイル(Debugフォルダ)では無くプロジェクトフォルダ(Debugフォルダの1階層上)に設定されるはずです。

以下、老婆心(っていうか仕様を変えてしまうだかダメ?)ですが…
私ならargcの値を元に
case 1:inputfile,outputfileともに入力
case 2:outputファイルのみ入力、inputfileはargv[1]
case 3:outputはargv[2]、inputfileはargv[1]
と、キーボードから入力するように書き換えます。


人気Q&Aランキング

おすすめ情報