MENUITEMINFO menuInfo;
char * str = "aaaaaaa";
menuInfo.dwTypeData = _T(str);//※
もしくは
menuInfo.dwTypeData = TEXT(str);//※

上記の※部分のように_TやTEXTマクロに変数を使用したいのですが、
どのようにしたらよいのでしょうか?

お力添えをお願いします。

A 回答 (3件)

> 関数化した下記のコードが2回以上走ると※部分の


> 長さ取得するところで処理が返ってこなくなります

あなたのミスでしょう。
コレ↓はちゃんと動作しますから。

#include <windows.h>
#include <iostream>
#include <locale>
#include <cstdlib>

using namespace std;

wchar_t* conv(const char* str) {
int len = 0;
wchar_t * buf;
len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, NULL, 0);//※
buf = (wchar_t *)malloc(len);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, buf, len);
return buf;
}

int main() {
const char* input = "日本ちゃちゃちゃ";
wcout.imbue(locale("japanese"));
for ( int i = 0; i < 10; ++i ) {
wchar_t* output = conv(input);
wcout << output << endl;
free(output);
}
}
    • good
    • 0
この回答へのお礼

ありがとうございます

デバックで追っていったところ
ポインタの初期化ミスでした。

的確なアドバイスと的確なご指摘ありがとうございました。

Cをやり始めて3日目で日頃は
C以外のデフォルトUnicode環境な言語を
使用していましたのでつまづいてしまいました。
(初期化ミスは論外ですが。。。。(汗))

multibyte と widecharの違いも初めて知ることができました。

ここをクリアしたのであとは
メモリ管理には気をつけてプログラムを組んでいきます。

本当にありがとうございました。
またつまづいた時はお力添えをお願いします。

お礼日時:2011/04/10 15:47

できません。



MultiByteToWideChar で変換します。

参考URL:http://msdn.microsoft.com/ja-jp/library/cc448053 …

この回答への補足

回答ありがとうございます
アドバイス通り下記のようにしてみたのですが、
関数化した下記のコードが2回以上走ると※部分の
長さ取得するところで処理が返ってこなくなります

void conv (char * str) {
int len = 0;
wchar_t * buf;

len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, NULL, 0);//※
buf = (wchar_t *)malloc(len);
if (buf == NULL) {
return;
}
MultiByteToWideChar(
CP_ACP,
MB_PRECOMPOSED,
clipStruct -> clip,
-1,
buf,
len);

//以下bufを使用した処理
}

補足日時:2011/04/10 11:47
    • good
    • 0

それはできないと思いますけど…。


普通は

LPTSTR str = _T("aaaaa");

とか

TCHAR *str = _T("aaaaa");

みたいにしておいて

menuinfo.xxxxx = str;

のようにすると思いますが、そういうのはダメなんでしょうか?

この回答への補足

回答ありがとうございます

メニューに表示するテキストが
リテラルにできるようなものでなく、
入力によるものなので
変数となってしまいます。

補足日時:2011/04/10 02:14
    • good
    • 0

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

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

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

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

Qエクセル(マクロ記録)

よろしくお願いします。
エクセルで、印刷マクロを作ろうと考えています。
             (基本、入門者です)
マクロ記録で、作っていますが、
記録終了するたびに「 印刷 」がかかっては、
用紙が何枚あっても足りません。

いい考えがありましたら、お教えください。
お願いします。

Aベストアンサー

#3の回答者です。

>出来たら、この i=1 の意味を教えていただけませんでしょうか?
単に、それはページ数です。

ヘルプを引用します。(PrintOut で調べました)

式.PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName, IgnorePrintAreas)

From オプション 印刷を開始するページの番号を指定します。この引数を省略すると、最初のページから印刷します。
To オプション 印刷を終了するページの番号を指定します。この引数を省略すると、最後のページまで印刷します。

と出てきます。

Qchar *str; と char* str;

char *str; と char* str;
どっちも同じことを意味しているんですか?

Aベストアンサー

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染むのでしょう。ちなみにそういう風な人たちは

char *str1, *str2;

とは、書けない体になっています。

char* str1;
char* str2;


変数の宣言だと、C に慣れていれば、char* str というのはちょっと違和感があるのは
私も分かりますが、関数のプロトタイプ宣言だと、どちらの方がすっきりしますか?

extern char *memcpy(char *, const char *);

extern char* memcpy(char*, const char*);


# まあ、どっちが正しい、っていうんじゃ無いんですよね

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染む...続きを読む

Qエクセル マクロコードの記述の勉強

独学でエクセルでのマクロのコード記述ができるようになりたいのですが、コードがかける人はどのようにしてかけるようになったのでしょうか?

プログラミング関係にはまったくの初心者なので、入門本を立ち読み程度読んでみたのですが、「面白そうだが、かなり手強そう」というような印象でした。

現実的な問題として、実際にコードをかける人は、プログラミング関係の学校等で学んだ人ぐらいしかいないのでしょうか?

めざすレベルはエクセルでこうしたいと考えたものを調べながらコードをかける程度のレベルです。

Aベストアンサー

> 実際にコードをかける人は、プログラミング関係の
> 学校等で学んだ人ぐらいしかいないのでしょうか?

そんな事ないです。私も独学で覚えましたから。

エクセルはマクロ記録がありますので、実際の操作を記録して書かれたコードを追っていったり、書き直したり出来ます。
VisualBasicEditor画面でコードにカーソルを置き、F1キーを押すとVBAヘルプ(たしか標準ではインストールされないので追加インストールの必要がある)が開くので、意味を調べたり、サンプルコードを見たりして覚えて行きました。
ネットにも沢山サンプルがありますし。

変数の使い方とforやif等を覚えてマクロ記録を直すだけでも結構便利になります。

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む

Qエクセルについているマクロが出てこない・・・

 エクセルをひらき、ツール→マクロ→マクロでマクロの作成ができると聞きましたが、私のエクセル2002ではマクロのその機能が空欄状態です。復帰や回復できる方法を教えて下さい。

Aベストアンサー

(1)自分でマクロの記録を採る。
    ツールーマクロー新しいマクロの記録
(2)または他人がマクロの記録をとった。
   (3)他人がVBAコード(プログラム)を組んだ
    ツールーマクローVBEープログラム作成
場合に出てくる。(1)(2)(3)ともやっていないから、出てこないのは当然。
(1)なぞはマクロの画面でマクロー編集でコードが見れます。
ーーー
本でもWEBでも、マクロに関する本1冊か、「エクセル マクロ」でWEB照会して、勉強し。予備知識をえるべきです。

Qキャストについて str = (CString*)("999") ;

環境 WIN98 VC++6.0 MFC にて

いつもお世話になります。
先日質問したばかり(QNo.682705)なのですが、やはり納得できないことがあるのでお願いします。

分かっている人からみれば、おかしな疑問と思われるかも知れませんが、私にとっては素朴に疑問が生じてしまいます。

***************************
以下2つのコードのうち、<A>は文法的にOKで<B>がNGな理由が知りたいです。

<A>
CString* str ;
str = (CString*)m_array.GetAt(i) ; //OK

<B>
CString* str ;
str = (CString*)("999") ; //NG


<A>は、m_arrayの要素にCString*を入れていて、初めて成り立つ式です。
と教わりましたが、むしろ私にはCString*以外が入っているため、CString*のキャストしていると思える。
CString*が入っているのなら、キャストする必要は無いのではないでしょうか?

ネット上で見つけたコードなため、実際の値やm_arrayの宣言がどうなっているかは確認出来ません。

そして、<A>がおかしなコードでは無いという大前提にたつと、<A>は別の表現をすると
<A>
str = (CString*)(CString*以外のポインタ) ;
となります。

そうすると<B>のコードも、"999"は999の文字列が入っているアドレスを指すポインタであるという考えが正しいとすると、
<B>
str = (CString*)(999をさすポインタ) ;
となり、おかしなコードではないと思えるのですが、考え方のどこがおかしいのでしょうか?




**************************
以下のことを教わった上であえて聞いています。


str = (CString*)("999"); は、リテラル文字列をつっこもうとしています。
リテラル文字列とCStringはまったく別物です。

環境 WIN98 VC++6.0 MFC にて

いつもお世話になります。
先日質問したばかり(QNo.682705)なのですが、やはり納得できないことがあるのでお願いします。

分かっている人からみれば、おかしな疑問と思われるかも知れませんが、私にとっては素朴に疑問が生じてしまいます。

***************************
以下2つのコードのうち、<A>は文法的にOKで<B>がNGな理由が知りたいです。

<A>
CString* str ;
str = (CString*)m_array.GetAt(i) ; //OK

<B...続きを読む

Aベストアンサー

ポインタからポインタへのキャストは
(継承が関係しない限り)
コンパイラに型情報を通知するだけで
実質何も実行されません。
なのでキャストが有効かどうかは
プログラマにかかっています。

<A>の場合
MSDNには
CPtrArray クラスは、void ポインタの配列をサポートします。
とあります。つまり、<A>のm_arrayの要素は
CStringへの実体を指すvoid型へのポインタです。
なので、このキャストは本来CStringであるものを
CStringにキャストして保存しています。

<B>の場合
char*からCString*へ変換しています。
つまり、charがあるところにCStringがあるように
認識しろとコンパイラに命令しています。
コンパイラは渋々CStringにみなしますが
実行してもうまく動作するはずがありません
(char*からCStringへのキャストは
CStringのコンストラクタが働くのですが)

Qエクセル2010で作成したマクロ

エクセル2010で作成したマクロブックがあります。
このエクセルを知人にメールで送りました。

知人のエクセルは2007です。
マクロブックのフォームボタンを押しても何も動作しない状況との事です。

エクセル2010で作成したマクロブックはエクセル2007と互換性がないのでしょうか?

素人の質問で申し訳ありませんが、ご指導お願いいたします。

Aベストアンサー

>エクセル2010で作成したマクロブックはエクセル2007と互換性がないのでしょうか?

ご相談の状況からすると、まずそういう事はありません。
まぁ2010でしか動かない内容であなたがマクロを作成した可能性は確かにありますが、その場合でも「何も動作しない」という事はありません。ふつーにエラーが出て止まります。



一応あなたの側で確認しておくべきポイントとしては、
○間違ったブックを送っていないか再確認する
 ・ちゃんとマクロを付けたブックを送ったか確認する
 ・名前を付けて保存でファイルの形式をマクロ有効ブックにして保存したのを送ったか再確認する
といったところをよく確認してください


先方に対してあなたが確認すべきポイントとしては、
○「何も起こらない」とは、具体的にどんな状況なのか再確認する
 ・ホントにうんともすんとも反応が無いということなのか
 ・実は何かエラーメッセージっぽいダイアログが現れて、OKをクリックしてもマクロが動作した様子が無いとかの状況では無かったか



具体的な状況が明らかになったら、ようやく対処を検討する事ができるようになります。
●そもそもどういうマクロを作成したのか、ご自分の作成したマクロをよく確認して、「反応が現れない」マクロを書いてたんじゃないのか再確認する
 たとえば無意味にon error resume nextのような仕込みをしてたりしないか
 たとえば不適切なデータに対して何も作動せずに終わってしまうようなそもそも作りにしてたんじゃないか
 とか。

●実は何かダイアログが出てたのなら、具体的にどんなダイアログなのか正確に聞き取って、あなたの方で対処を考える
 「マクロが無効になってる」のなら、マクロを有効にして実行するように伝える
 とか。

>エクセル2010で作成したマクロブックはエクセル2007と互換性がないのでしょうか?

ご相談の状況からすると、まずそういう事はありません。
まぁ2010でしか動かない内容であなたがマクロを作成した可能性は確かにありますが、その場合でも「何も動作しない」という事はありません。ふつーにエラーが出て止まります。



一応あなたの側で確認しておくべきポイントとしては、
○間違ったブックを送っていないか再確認する
 ・ちゃんとマクロを付けたブックを送ったか確認する
 ・名前を付けて保存でファイル...続きを読む

Qchar *(*)[3];について

#include <iostream.h>
main(){
char *(*pp)[3];
printf("%lu", sizeof(char*));
printf(" pp%lu", pp);
printf(", ++pp%lu", ++pp);
}

これを実行して
4 pp6660000, ++pp???????
のように表示されたときに、???????の部分が何になるか考えました。
ppはchar[3]を指すポインタのポインタだから、ppをインクリメントすれば、「char[3]を指すポインタ」の大きさだけ大きくなるはずだから、「char[3]を指すポインタ」の大きさである4バイト大きくなるはずだから
4 pp6660000, ++pp6660004
になると思いました。
どこを勘違いしていてどう考え直せばよいか教えて下さい。

Aベストアンサー

pp は、3コのポインタの配列へのポインタです。
ポインタのサイズが4バイトの時、
pp をインクリメントすると12バイト増えることになります。

例えば、次の様に書くとわかりやすいと思います。
#include <cstdio>

using namespace std;
// CHAR3 は、3のサイズを持つchar の配列
typedef char CHAR3[3];

int main(){
CHAR3 *pc3;//pc3 は、char[3]を指すポインタ
char test[3];
pc3=&test;
printf("%p\n",pc3);
pc3++;
printf("%p\n",pc3);//+3(サイズ分)される

CHAR3 **ppc3;//ppc3 は、char[3]を指すポインタのポインタ
ppc3=&pc3;
printf("%p\n",ppc3);
ppc3++;
printf("%p\n",ppc3);//+4(ポインタサイズ分)される

return 0;
}

pp は、3コのポインタの配列へのポインタです。
ポインタのサイズが4バイトの時、
pp をインクリメントすると12バイト増えることになります。

例えば、次の様に書くとわかりやすいと思います。
#include <cstdio>

using namespace std;
// CHAR3 は、3のサイズを持つchar の配列
typedef char CHAR3[3];

int main(){
CHAR3 *pc3;//pc3 は、char[3]を指すポインタ
char test[3];
pc3=&test;
printf("%p\n",pc3);
pc3++;
printf("%p\n",pc3);//+3(サイズ分)される

CHAR3 **ppc3;//p...続きを読む

Qエクセルで作成したマクロが他のシートに反映しない

必要に迫られ始めてマクロをエクセル上で作成してみました。(初心者)
そのマクロを違うエクセルファイル上でも反映させたいのですが
マクロを作ったおおもと(最初)のファイルを閉じてしまうと違うエクセルファイルを開いてもマクロが反映されていません。
マクロでの命令内容としては 
エクセル上の数字の羅列→グラフ作成→上書き保存 という手順で作りました。
他のエクセルファイルも同じように数字の羅列があります。それを同じ作業(グラフ作成→上書き保存)したいのです。
一度作ったマクロを他のエクセルファイルにも反映させるにはどうしたら良いのでしょうか?
説明がわかりにくくてすみません。
よろしくお願いします。

Aベストアンサー

マクロの記録先を「個人用マクロブック」にするのが良いと思います。
一回マクロの記録を行い「保存先」を「個人用マクロブック」にします。するとPERSONAL.XLSという特別なブックが作成されます。

このブックの標準モジュールシートに先に作ったマクロを貼り付けてください。

そうすればエクセルを開くと、どのブックでもマクロが実行可能になります

Qfor(s=p; *p; p++)の*p(ポインタ)の意味

for(s=p; *p; p++)の*p(ポインタ)の意味
C言語初心者です。
今ポインタを勉強しているのですが、
for文で上記のようなものが出てきて、意味が分からず困っています。
*pで*p != NULL と同じような意味になるみたいなのですが…。
どうしてそのような意味になるのでしょうか?

ちなみにsとpはポインタで、
sには配列(入力した文字列)の先頭アドレスが入っています。
pは文字列を指していて○○○○○NULL ←になるから上記のような条件で
回るんだろうなぁとはなんとなく考えているのですが。

Aベストアンサー

念のため:
ヌルポインタは「ビットパターンとして」0 じゃないかもしれませんが, ソースプログラムにおいて「ポインタが要求される場面」で「0」とあれば, それは「ヌルポインタ」です.
もうちょっと厳密に書くと「整定数 0」はヌルポインタに変換される.


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング