電子書籍の厳選無料作品が豊富!

VC++6.0をつかっているんですが、文字列処理の部分で困っています。

CString strTime, folderPlace="c:\\", fullPath;
CTime theTime = CTime::GetCurrentTime();

strTime = theTime.Format("%Y%m%d%H%M%S");
fullPath = folderPlace + strTime + ".jpg";
int fullPathLength = fullPath.GetLength() + 1; //*1
char charBuf[fullPathLength];
strcpy(charBuf, fullPath);

wchar_t wCharBuf[fullPathLength * 2];
MultiByteToWideChar(CP_ACP, 0, charBuf, strlen(charBuf), wCharBuf, sizeof(wCharBuf));
とすると、【error C2057: 定数式が必要です】というエラーが*1の部分ででます。

また、
CString strTime, folderPlace="c:\\", fullPath;
CTime theTime = CTime::GetCurrentTime();

strTime = theTime.Format("%Y%m%d%H%M%S");
fullPath = folderPlace + strTime + ".jpg";

char *charBuf="";
strcpy(charBuf, fullPath);

wchar_t *wCharBuf=L"";
MultiByteToWideChar(CP_ACP, 0, charBuf, strlen(charBuf), wCharBuf, sizeof(wCharBuf));
とすると、実行時に【 STRCAT.ASMの場所を指定してください】というエラーがでて、これ自体は検索して解決したんですが、どうしても実行時に落ちてしまいます。調べたところ、不定ポインタの指す先でstrcpyなどの文字列処理関数を使うと実行時エラーになるとのことなので、それが原因と思います。

私は、JavaやC#くらいしかあまり経験がないので、C/C++ではこのような場合どうすればいいのかわかりません。

対処方法をご存知の方、よろしくお願いします。

A 回答 (2件)

# 忘れ物 ^^


callocで動的に確保しているので freeで開放してください

2番目の
wchar_t *wCharBuf=L"";
としてしまうと 文字列を書き込む領域が確保されていないため
他の変数や関数の戻り値などを破壊する可能性があります

wchar_t wCharBUf[512];など必要なバッファ量をあらかじめ設定するか
calloc/mallocまたは newなどで確保しましょう

MultiByteToWideChar(CP_ACP, 0, fullPath, fullPathLength-1, wCharBuf, fullPathLength-1);

MultiByteToWideChar(CP_ACP, 0, fullPath, fullPathLength, wCharBuf, fullPathLength);
がいいようです ^^
    • good
    • 0
この回答へのお礼

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

C言語は配列数の指定に定数が必要なんですね。その辺の基礎が飛び飛びで抜けているので、細かなコンパイルエラーが出て困ってます(;^^

私は元々Java暦が長いので・・

また、CStringから直接MultiByteToWideChar関数に値を渡せるんですね。Windowsプログラムも中々知識が浅く、やたらめったらに実践的なものを組んでいる状態なので、検索しては無理やりパズルみたいにはめていってるので、こういうことも教えてもらえてとてもありがたいです。

No.2欄へのご回答により、やりたいことができるようになりました。おかげさまでとても助かりました。Javaができたからできるだろうと、予想して請け負ったはいいけど、えらい目にあっています(;^^

おかげさまで、無事解決できました。No.1とNo.2の回答が両方ともとても参考になりました。AmazonでCの古い本を買って本格的に全部網羅してみようとおもいます。断片的に色々理解してるのでいけるかと思ったんですが、やはりつらいですね。

ご親切にどうもありがとうございました。ちなみに、JavaよりMFCの方が面白いですね。どうもありがとうございました。
とても助かりました。

お礼日時:2009/05/23 15:29

int fullPathLength = fullPath.GetLength() + 1; //*1


char charBuf[fullPathLength];
この記述ではコンパイルできませんね

char charBuf[fullPathLength];
と記述すためにはfullPathLengthがコンパイル時点で確定している必要があります
つまり #defineでなどで定義された定数や 10、20などの即値が必要です

一度 char配列にコピーしてから MultiByteToWideCharに渡していますがそのまま CStringから渡してやればいいはずですよ

wchar_t* wcharBuf = (wchar_t*)calloc( fullPathLength, sizeof( wchar_t ) );
MultiByteToWideChar(CP_ACP, 0, fullPath, fullPathLength-1, wCharBuf, fullPathLength-1);
といった具合で可能だと思います
    • good
    • 0

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