★初心者にVisual C++を教えるスレ★ Part26
1 : ◆Manna2uCLg :2005/04/15(金) 13:33:14
Visual C++入門者・初心者からの質問を、
お兄ちゃん達が優しく、時には厳しく回答してくれるスレッドです。
■質問するにあたって
・エラーや警告のときはエラーメッセージを書きましょう。
・開発環境も書きましょう。
・できるだけ具体的に。
質問の仕方については次のページが大変参考になります。
http://www.hyuki.com/writing/techask.html http://myu.daa.jp/osiete/ ■回答するにあたって
・回答する場合はその答えに至るための「コツ」も書いてあげると良いでしょう。
(MSDNのどの項目だとか、何のキーワードでGoogleするとか)
・ネタや煽りは軽く流しましょう。
過去スレ、関連スレなどは
>>2-5 。
以上、前スレ997でした。 >>前スレ998-1000 ありがとうございました。
1乙
7 :
前987 :2007/04/13(金) 01:54:08
関係ありそうなとこにはvolatileつけましたが一緒でした 変数の初期化はしてあると思うのですが もう一度確かめてみることにします CEventと変数では同期をとるのになにか違いがあるのですか? 大分前に同じと言われたような
>>7 変数だと
たとえばaが0以外になると次の処理に進む。
while(true) {
if( a != 0 ) break;
Sleep(100);
}
最適化されて
if( a == 0 ) {
while(true) {
Sleep(100);
}
}
になってしまうことないようにvolatile使うんじゃないの。
でも俺は最適化とvolatileが上手く機能するか調べたことない。
同期イベントなら関数コールして調べるので前期のような最適化はかからない。
また、上記だと1秒間に10回aを調べる。
aの値が変化しても反応が最大で100ミリ秒遅れる。
かといってSleepを減らすとこの空回りするループにCPU処理を使ってしまい無駄。
>>8 以下のようにすれば最適化はされないはず。
これでも駄目なら別の原因?
//宣言のみ
bool check();
void thread()
{
while(true) {
if( check() ) break;
Sleep(100);
}
......
}
//threadの後または別のファイルに
//checkがあれば最適化不可能だろう
bool check()
{
return a != 0;
}
同期イベントならループにしたりSleepつけなくていい。
>>7 > CEventと変数では同期をとるのになにか違いがあるのですか?
・同時に複数のスレッドから変数を変更する可能性
・リードする側がチェック直前/直後で変数が書き換わる可能性(それで動作が異なってしまう場合)
等、気をつける必要があると思。
11 :
デフォルトの名無しさん :2007/04/13(金) 12:07:46
VisualC++ 2005 Expressを使用しています。使用歴は1週間だけです。
UNIXのプログラムにWindowsのガワをつけたプログラムの作成をして配布しようと思っている
のですが、配布の段階でつまずいてしまいました。
プログラムはWindowsフォームアプリケーションでCLIに依存しています。
OSはWindows Vista x64です。
インストーラの作成を行いたいのですが、その方法が分かりません。
私が検索してたどりついたのは以下のところまででした。
お力をお借りできないでしょうか。
1.MSDNで
ttp://msdn2.microsoft.com/ja-jp/library/ms235317 (VS.80).aspx
にあるように「その他のプロジェクトの種類」を行おうと思ったのですが、見当たりませんでした。
「Visual Studioにインストールされたテンプレート」と「マイテンプレート」だけでした。
2.ヘルプを参照するとプロジェクトのプロパティで「ビルド」を選択すると必須コンポーネントが
選択できるということでしたが、そのような項目はみあたりませんでした。
(Visual C#には「発行」にありましたが、VisualC++ではこれも見つかりませんでした)
3.Windows Installerをインストールしようと思ったが、「このコマンドを実行するのに十分な
記憶領域がありません。」というエラーでインストールできなかった。
経験が全くないため見当違いな部分が多く、検索も下手で要領を得ませんが、解決法をご存知の
方がいらっしゃったらお力を貸していただけないでしょうか。
12 :
デフォルトの名無しさん :2007/04/13(金) 12:20:26
Visual C++ 6.0を再インストールしようと思って、 一旦削除してもう一回インストールし直したら、 「プライマリ プラットフォームがありません。 ビルドシステムは使えません。セットアップがインストールしたアドオン プラットフォーム(.pkg)のロードに失敗した可能性があります。」 といわれ、エラーで落ちる。 何回インストールし直してもだめ。 教えてエロい人><
13 :
デフォルトの名無しさん :2007/04/13(金) 12:49:00
Visual Sutdio 2005を初めて使うのですが、Eclipseのインポートの再編成のような機能はないのでしょうか。 言語はJAVAからの応用がききますが、クラスや関数はまだ覚えられていないため、 #includeやusingを設定するのに苦闘しています。 ※例外処理でfinallyが無いのが納得できない……
>>11 たぶんそれはExpress Editionにない機能と思う
15 :
デフォルトの名無しさん :2007/04/13(金) 18:08:20
>>14 お返事ありがとうございます。
今日ずっと調べた所、VisualC++ではインストーラーは作成できないようですね。
VisualC#であればClickOnceを使ってインストーラーの作成ができたので、つらいですが
VisualC#でプログラムを書き直そうと思います。
予算があればStandard Editionを買いたい所ですが・・・
16 :
デフォルトの名無しさん :2007/04/13(金) 22:02:57
VisualStudio2005のスタンダード版ってMFCと静的リンクできますか?出来るなら買いたい。
階層構造でtodoを記述できるような補助機能ってあります?
性的リンク
WindowsXP環境でVisualStudio2005・C++で単純なWin32アプリケーションを作成したのですが、 これをWindowsVistaで実行しようとすると、 「このアプリケーションのサイドバイサイド構成が正しくないため、アプリケーションを開始できませんでした」 というエラーが出て起動できません。 Vistaで動かすにはどうしたらいいでしょうか?
21 :
デフォルトの名無しさん :2007/04/15(日) 00:08:40
WindowsXPでVisual C++ 2005 Express Editionを使っています。 「Windowsゲームプログラミング」という本のプログラムを実行してみたところ、 アクセス違反と表示されてしまいました。 デバッガでステップ実行してみるとWM_DESTROYのreturn 0;からDispatchMessageを出るまでの間に 表示されるのですが、どこが悪いのか分かりません。 どうしたらアクセス違反を無くせるでしょうか。 以下、出力抜粋とコードです。 test_window2.exe の 0x77d0f450 で初回の例外が発生しました: 0xC0000005: 場所 0x25a2c7fc を読み込み中にアクセス違反が発生しました。 test_window2.exe の 0x77d0f450 で初回の例外が発生しました: 0xC0000005: 場所 0x25a2c7fc を読み込み中にアクセス違反が発生しました。 プログラム '[3220] test_window2.exe: ネイティブ' はコード 0 (0x0) で終了しました。 #include <windows.h> #define APP_NAME TEXT("Sample_MainWindow") #define DRAW_STRING TEXT("Kitty on your lap") LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { WNDCLASS wc; MSG msg; HWND hWnd; HDC hdc;
22 :
21 :2007/04/15(日) 00:10:29
wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1; wc.lpszMenuName = NULL; wc.lpszClassName = APP_NAME; if (!RegisterClass(&wc)) return 0; hWnd = CreateWindow(APP_NAME, TEXT("Window Title"),WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL); if (hWnd == NULL) return 0; /* デバイスコンテキストのハンドルを取得 */ hdc = GetDC(hWnd); /* デバイスに文字列を描画 */ TextOut(hdc, 10, 10, DRAW_STRING, lstrlen(DRAW_STRING)); /* デバイスコンテキストのハンドルを解放 */ ReleaseDC(hWnd, hdc); while(GetMessage(&msg, NULL, 0, 0) > 0) { DispatchMessage(&msg); } return msg.wParam; } よろしくお願いします。
>>21 実行してみたが、ウチの環境では問題なし。
24 :
21 :2007/04/15(日) 02:38:05
わざわざ実行までして頂いてありがとうございます!!
問題なしですか、どうしよう…
そうするとコードではなくてうちの環境が悪い可能性がありそうですね。
………
ということで環境を疑う前提で再度ググりまくってみたところ、おかげさまで解決策が見つかりました!
ImeWatcherというソフトを起動していたのですが、そちらを終了させるとアクセス違反が発生しなくなりました。
その結論に至った流れとしては、こちらのページ
ttp://forums.belution.com/ja/vc/000/335/02s.shtml を参考に出力に知らないソフトが混じっていないか見てみたところ、
なぜか起動中のソフトのdllがいくつか混じっていたため試しに一つ一つ終了させて確認していたら
それを終了させておけばアクセス違反が発生しないということが判明したという次第です。
これが相性とかいうやつなのか、単にImeWatcherのバグなのか分かりませんが、
原因(と一応の対策)がわかってすっきりしました。ありがとうございました。
下記はアクセス違反発生時の出力の抜粋です。
'test_window2.exe': 'C:\src\test_window2\debug\test_window2.exe' を読み込みました。シンボルが読み込まれました。
'test_window2.exe': 'C:\WINDOWS\system32\ntdll.dll' を読み込みました。シンボルが読み込まれていません。
'test_window2.exe': 'C:\WINDOWS\system32\kernel32.dll' を読み込みました。シンボルが読み込まれていません。
…
ここ→'test_window2.exe': 'C:\Program Files\Takubon\ImeWatcher\ImeWatch.hook' を読み込みました。バイナリはデバッグ情報と一緒にビルドされませんでした。
…
'test_window2.exe': 'C:\WINDOWS\system32\oleaut32.dll' を読み込みました。シンボルが読み込まれていません。
test_window2.exe の 0x77d0f450 で初回の例外が発生しました: 0xC0000005: 場所 0x25a2c7fc を読み込み中にアクセス違反が発生しました。
test_window2.exe の 0x77d0f450 で初回の例外が発生しました: 0xC0000005: 場所 0x25a2c7fc を読み込み中にアクセス違反が発生しました。
プログラム '[2644] test_window2.exe: ネイティブ' はコード 0 (0x0) で終了しました。
MS VC++ VS2005なんですが #include <stdio.h> int main(void) { FILE *fp1; if( (fp1 = fopen( "d:\\tmp\\aaa.txt", "r" )) == NULL ){ }else{ } } だと、警告がでるんですが でない書き方(fopenを使わない)を教えて下さい
どんな警告が出るんだ?
>>26 レスどうもです
warning C4996: 'fopen': This function or variable may be unsafe. Consider
using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNING
S. See online help for details.C:\Program Files (x86)\Microsoft Visual
Studio 8\VC\include\stdio.h(234) : 'fopen' の宣言を確認してください。
ググったらfopenは古いから使うなってことらしいです
>>27 移植性を考慮するなら、言語規約にあるfopen()を使うのが妥当。
MSの甘言に載せられて移植性を度外視するのなら、fopen()の派生版でもAPIでも使えば宜しい。
C/C++言語の初心者が使うには余計な機能
>Consider using fopen_s instead
31 :
デフォルトの名無しさん :2007/04/15(日) 12:21:21
>>21 GetMessage(&msg, NULL, 0, 0)
で&msgで参照する時、ImeWatcheあたりがmsg使ってて、
それでプロテクトメモリ競合が発生して、AccessViolation出してるっぽいなあ
while(GetMessage(&msg, NULL, 0, 0) > 0) {
DispatchMessage(&msg);
}
return msg.wParam;
}
を
REGETMESSAGE:
if(&msg){
while(GetMessage(&msg, NULL, 0, 0) > 0) {
DispatchMessage(&msg);
}
}
else{goto REGETMESSAGE;}
return msg.wParam;
}
なんてするとどうなるんだろか?
MSG msg; で、このmsgがぶつかる場合というのは ウィンドウメッセージキュー なのか PostThreadMessageキュー どっちかで、他がつかんでて、ぶつかってるんだろう。
Web API(Yahoo! API)をVisual C++で使いたいのですが、 Web APIを利用するためのクラスなどはありませんか?
>>33 スレ違い。
そして無視される>28、>29
>>25 C++のstd::ifstreamを使えばOk
>>28 ところがどっこい、あのセキュリティ強化のライブラリ関数はTR 24731として公開されており、
下手すると将来の標準Cに取り込まれる可能性すらある。現時点ではまだどうなるかわからないけどな。
ちなみにOpen Watcomのも実装しているようだ。
>>36 M$のはSafer Cと相違点が多すぎる。
警告通りに直したら後でひどい目にあうのは確実。
fopen_s なんか使ってるやついるんか? winアプリならapi使うだろうし 学習用途なら標準Cライブラリだろうし
39 :
デフォルトの名無しさん :2007/04/15(日) 19:32:11
XP VS2002 MFC。 大文字と小文字を区別せずに文字列(char)を検索したいのですが、 速くて簡単な方法ありましたら教えて下さい。
40 :
デフォルトの名無しさん :2007/04/15(日) 19:44:58
元々は正社員だったのに取引先にフリーのほうが稼げるとか騙されて 結局派遣やってるバカがいるんだけどw なんか派遣先といい関係、とか言ってたから思わず吹き出しちゃったよw 最近はマネージャーもやってるとか寝言言ってるし、派遣がまねぇじゃぁ?はあ!?w そもそも信頼されてるなら直接契約するか正社員にするはずだが、 いつでも切れる派遣会社経由って舐められてんだよ 派遣期間が長くならないうちに早く就職しろ、と忠告したら、ウッキー!って逆ギレw バカで頑固だから何度言っても理解できない 騙されたとはいえ結局は自分で決めて派遣やってる癖に逆ギレしちゃってまぁ 人間として本当に恥ずかしい
42 :
39 :2007/04/15(日) 21:36:55
>>41 レスありがとうございます。
先頭からstricmpで比較していって検索するモノが出来ました。
SDKで作ったサンプルプログラムですがアプリの動作で ちょっとおかしなところがありまして質問します。 ファイルから読み込んでビットマップを表示させます。 画像がクライアント領域よりも大きければ、表示と同時にウィンドウ標準の スクロールバーを各種設定をして表示させます。 スクロールバーはきちんと機能して画像がスクロールされます。 ところがウィンドウのサイズを小さくして水平スクロールバーが クライアント領域が消えるくらいまで小さくすると水平スクロールバーが 消えたと思ったら下側のフレームに水平スクロールバーが薄く表示されています。 そこからもっとウィンドウのサイズを小さくするとタイトルバーの×ボタンに重なって スクロールバーのサイズグリップが重なって見えます。 これでは見栄えが悪いと思い解決方法はないかと思い質問しました。 よろしくお願いします。 開発環境はVisual C++ 6.0 Pro OSはXP Pro SP2
なんか難解な日本語だなw 下側のフレームに薄く表示されるって状態がいまいちわからんのだけど 言ってる各状態のスクリーンショットとか撮れん?
45 :
43 :2007/04/17(火) 00:06:02
最小のサイズを決めておけば?
>>45 CreateWindowでウィンドウスタイルにWS_HSCROLLとWS_VSCROLLを指定してスクロールバーを出して
その時に一緒に表示されるサイズグリップの挙動ってことでいいんだよな?
VCが作る雛型にスタイル追加してやってみたけど、サイズ小さくしたら普通に消えていったけどなぁ
2000とXPの違いなんだろうか・・・
3つほど質問があります。 @C++はクラス外に関数を記述できますが、main()やWinMain()以外を クラス外に記述する意味はあるのでしょうか? 単にCからの引き継ぎ、慣習ということであれば なるべく全ての処理をクラス内に記述したいのですが。 AVisual C++には、JavaのLoggerクラスの様な標準ログ出力クラスは用意されていないのでしょうか。 見あたりませんでした。clogをリダイレクトする処理を実装するしかないでしょうか。 BGUIアプリを、コンソール出力無しに作成する場合は、 WinMain()関数を使用するしかないのでしょうか?(Google検索だとそのように記述するサイトがヒット) 機種依存するコードはなるべく外出し、極小化したいのですが、 WinMain()からmain()を呼ぶように記述するしかないでしょうか。
1. まあみんながみんなOOPというわけではないからね。 Cみたいな手続き型プログラミングだけでなく、 STLアルゴリズムみたいにジェネリックプログラミングでは非メンバ関数も必要に応じて使う。 何にせよ、OOPのときでも静的メンバだけのクラスなんて作るなんて馬鹿げていると俺は思うけどね。 2. Logger(というよりJava自体)を俺は知らないが、clogをリダイレクトするくらいなら、 適当なファイルをofstreamで開けば十分だと思う。ちなみにVC++のclogは、バッファリング付の標準エラー出力。 3. プロジェクトのプロパティ→リンカで •システム→サブシステムにWINDOWS(コンソールを使わない指定)、 •詳細→エントリポイントにmainCRTStartup(main用のスタートアップルーチン) を指定すると、mainから始まる非コンソールアプリケーションが作れるはず。 あまり一般的な手法ではないかもしれないが。
>>48 GUIアプリって時点で十分環境依存だからWinMainを排除したところで意味はないぞ。
>適当なファイルをofstreamで開けば十分だと思う。ちなみにVC++のclogは、バッファリング付の標準エラー出力。 (cin, )cout, cerrの他に用意されてるの? #尤も、cerrはバッファリングしないが。
質問があります。 開発環境、実行環境ともにWindowsXP(SP2) 仕様環境はVC++6.0です レジストリの HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR のStartを3から4に書き換えた(USB大容量記憶デバイス禁止)状態で USBポートに挿入されているリムーバブルディスクの確認(空き容量と場所(E:などの割り当てられる文字))を行う方法が 存在するのなら、ご教示ください。
>>48 1:C++は不完全OOPです。
2:所詮テキストをフォーマットしてファイルに出力するだけなのでそもそも特別に必要でない
3:Windowsの標準的なGUIアプリにおいてはそもそもコンソールなんて使ってません
ていうか規定のエントリポイントを排除しないでください
55 :
48 :2007/04/17(火) 20:34:52
>>49 ご丁寧にありがとうございます。
1につていは、Javaの癖なんですよね。C++では非メンバ関数が当たり前ということであれば
郷に従う必要がありそうです。
2については、ログレベル(外部ファイルで、出力する下限レベルを設定)を
実現したいので、やはり個別実装しないと駄目なんでしょうね。
3については、なるべく一般的なコーディングを心がけて移植性を高めたいと思うので、
一般的でないなら止めた方が良さそうですね。
>>50 そのまま他でコンパイルできることまでは望みませんが、
このクラスは機種依存、と明確にして移植性を高めるのが目的です。
確かに、WinMainでそれを考える意味はあまりないのかもしれませんね。
イベントドリブンでなければともかく。
56 :
48 :2007/04/17(火) 20:39:34
あ、返事中に新たな回答が。
>>53 1、そう意識していくしかないのでしょうね。
もっとも、自分で制約をかければほぼ完全にOOP的に
実装できそうだと思ってはいますが(それが良いかはともかく)
2、
>>55 で書いてしまったのですが、ログレベルを実現したいのです。
個別実装したいと思います。
3、わかりました。WinMainを使って素直に実装しようと思います。
Windows用のプログラムを作れる環境では、 どんなコンパイラでもWinMainが使えると思って平気。 その程度の移植性ならある。
ていうかWinMainが使えなきゃWindows用のGUIプログラムなんて作れなくね?
>>58 >>49 インスタンスハンドルはGetModuleHandle(0)で、
WinMainの最後の引数の代わりはSW_SHOWDEFAULTで代用すればいい。
(どうしても拘るのならGetStartupInfoと言う手もあるが)
そこまでする意味が理解できない件
環境依存コードはどうやったって出てくるだろうしね。 自分は環境依存コードにWinMain書いておいて、そこからmainを呼ぶようにしているが、 それは48氏が初めに書いているね。(それでいいと思うけど)
http://freepg.fc2web.com/cpp/topic_vce_001.html 以前のパソコンで上のサイトよりVisual C++ 2005 Express Editionを
インストールできたのですが新しいパソコンでインストールできません(VISTA)
CDイメージ(.iso)インストール(AIR-EDGEだと途中でダウンロードが止まる)
Webからインストール(これで試しています)
Microsoft Platform SDK を一緒に使うで
[PSDK-x86.exe]を実行すると
下のメッセージがでます
「インストールパッケージを開くことができませんでした。
アプリケーションベンダに問い合わせ、このパッケージが有効な
Windowsインストーラパッケージであることを確認してください」
3日間悩んでいます>_<;よい意見などあれば宜しくお願い致します。<(_ _)>
Vistaを捨てるのはどうだろう。
MSに訊いてみるのはどうだろう。
Visual C++ 6.0で質問です。 サービスプログラムから複数のスレッドを起動し、中でDLL関数を明示的に 呼び出しているのですが、この関数に不具合があるらしく、アクセス違反が 発生するうえ、呼出元のスレッドごと堕ちてしまいます。 DLLを直せば済むんでしょうが、とある事情によりDLL自体に手を入れ難い状況です。 そこで質問なのですが、DLLのエクスポート関数内で発生した保護エラー等を 呼出元でトラップし、処理続行するようなことはできるものでしょうか? よろしくお願いします。
自分がやってることは疑わずに悪いのはこの関数と決めつけてるし ほっといてあげよう
適当に言うけど catch(...) で捕らえられんの?
>>66 仰るとおりです。以後気をつけます。
DLLのソースは入手しまして、fopen()が失敗した際にNULLが返っているにも
関わらずfclose()を実行してそこでコケているので、
>>65 のような書き方を
してしまいました。
>>67 レスありがとうございます。
catch(...)で試してみたのですが、拾ってくれない(そこまで到達してない)
ようです。
一度通常のコンソールアプリに組み込んでトラップできるか試してみます。
何かお気付きの点ありましたら、お願いします。
プログラムの1機能的な例外ではなくOSが発する例外なのにcatchできるわけないべw
>fopen()が失敗した際に 失敗の原因が >サービスプログラムから複数のスレッドを起動 だったりしないよな
>>68 /EHaを付けて、SEH (__tryと__expect)の方を使えば受けられるかもしれない。
SEHで受けられるなら、_set_se_translatorでC++例外へ変換する道が開ける。
>68 そのDLLの内部でfopen()お呼びfclose()が行われてるってことかな。 ソースあるなら呼ばないで自分で似たようなの作り直すってのはダメなのか? あるいは、そのDLLの問題部分を完全に突き止めて、ここをこう直せと指摘するとか。
お前らの話しを全部理解できてないので間違えてるかもしれんが 俺も例外をcatch(...)で取れないことが最近あった。 で、調べた。 記憶が確かなら VC6のころはメモリアクセス違反をcatch(...)で取れた。 VC2005はコンパイルオプションを変えないと その手のCPUがだす例外をcatch(...)で取れない。 あるいは例外ハンドラを自分で書くのかな。 コンパイラオプションは覚えとらんので書けない。 とりあえずメモリアクセス違反を握りつぶすのも問題だから VC2005でデフォルトが例外をcatch(...)で取れないようになったのは 妥当なことなのかな。
>>72 それが一番だよな。
エラー処理が不十分てことだからDLLを直させるべき。
でも自分の担当じゃないDLLの細部まで調べないと云々は納得いかんな。
社外の作成したDLLだからソースなしで
責任転嫁だとか本当にお前の担当部分にバグがないのかとか・・・
愚痴になってしまったのでおしまい。
>>73 C++例外でないアクセス違反を、C++の構文で捕捉できた事が異常。
>74 >でも自分の担当じゃないDLLの細部まで調べないと云々は納得いかんな。 他人に直させるにしても、問題が本当に相手のソースにあるのかまではつきとめないと やっぱり自分のミスでしたって事になった場合、人間関係に亀裂が入り易いからなぁ。 (はっきり指摘してやって逆ギレするのもいるが、そういうのは置いといて^^;) 少ない修正で済むような問題なら、教えてやった方が結果的にロスタイムも少ないしな。
なぜfopen()が失敗するのか
>>76 別に細部まで調べなくても
渡すデータがDLLの仕様どおりで、呼び出し部以外でコケてなけりゃどう考えてもDLLの問題だし
下手に全部調べてからDLL担当者に「バグってますよ」というより、 「巧くいかなくて困っているんで、DLL側で助けてもらえませんか」と下手に出たほうが 協力を得やすく労力も減るかもしれない。
もしそのDLLが普通に使われてるんなら 仮にバグがあったとしても今まで問題にならなかったということだ。
とある事情によりDLL自体に手を入れ難い状況ということは今まで何事もなく使われてたんだろ
まあ、ファイル名を引数等で指定して処理させるような形だったら 一度呼び出し側でfopen()して開けなきゃDLLの関数は呼ばなきゃいいんじゃね? 2度手間になるから、もちろんいじれるならDLLいじった方がいいが。
VC++ .NET 2003のオプションで指定するインクルードファイルとかのパスって どこに保存されてるの?
デフォルトの設定 レジストリ プロジェクトの設定 プロジェクトの定義ファイル
レジストリ内の場所ってわかる? レジストリエディタで目的のパスで検索かけてもHitしないんだけどさ・・・ ちなみにオプションのVC++ディレクトで設定する、インクルードファイルとか実行可能ファイルとか指定するとこなんですが
VC++2005なんですが 自作のクラスにメンバを追加したり、STLなどの既存のクラスを読み込んだりしたときに かなりの頻度で、プロジェクトを閉じて開いたり、VSを再起動したりしないと :: や . や -> などを入力した後の一覧に追加したメンバが表示されないのですが 再起動などせずに解決する方法は無いのでしょうか
MSに要望出せ
88 :
デフォルトの名無しさん :2007/05/08(火) 20:40:19
なぜかある場所でメンバ関数呼び出すと thisポインタを使わないとメンバ変数が使えなくて thisで指定しないでその変数に行くとランタイムエラーだされるんですが これはメモリの領域破壊のバグのひとつでしょうか?
ある場所をはっきりさせてから質問してください
ランタイムエラーが出るんならランタイムに行ってんだろ
ランタイムの使い方がおかしいんだろうね。 その辺りのコード晒してみ?
92 :
デフォルトの名無しさん :2007/05/09(水) 15:54:38
スレ違いでしたらすみません。 質問があります。 ホームページビルダーを久しぶりに起動したら、 次のようなエラーメッセージが出て、起動できなくなりました。 何か解決方法はありますでしょうか?よろしくお願いします。 環境はOSがXP、HBはV9です。 ----------------------------------------------------- Microsoft Visual C++ Runtime Library Assertion failed! Program: ... Files\IBM Homepage Builder V9\bin\hpbpage.exe File: .\RegistryBase.cpp Line: 81 Expression: code == ERROR_SUCCESS -----------------------------------------------------
ホームページビルダー作った会社に訊け
>>92 ここは「Microsoft Visual C++を使う人」のためのスレです
Microsoft Visual C++を「使って作られたソフトを使う人」はお帰りください
95 :
デフォルトの名無しさん :2007/05/09(水) 21:27:25
ウェブ上に公開されているサンプル プロジェクトをビルドすると、次のエラーが出て失敗します。
環境はWinXP、VC++2005です。
> error C2678: 二項演算子 '<' : 型 'const ErrorEntry' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
> c:\program files\microsoft visual studio 8\vc\include\xutility 267
試したサンプルはWinsock Programmer's FAQのAsynchronous I/O Clientです
ttp://www.kt.rim.or.jp/~ksk/wskfaq-ja/examples/basics/AsyncClient/index.html (ページの下のほうの「project package (33 KB)」からダウンロード)
ファイルはVC++5のプロジェクトが丸ごと圧縮されており必要なものは全てそろっているそうです。
VC++2005でプロジェクトを変換して開いたのですが、上記のようになりました。
エラーの場所が場所なのでコンパイラに渡すオプションあたりをいじる必要があるのでしょうか?
ご教示お願いします。
全然関係ないけど P.J. Plaugerが自ら語るVS2005搭載C++テンプレートライブラリ STL.NET
従来のSTLの機能の大半は.NET Frameworkクラスで事足りるのにSTL.NETとはこれいかに
なんでこう、バージョンアップするごとにIntelliSenseがバカになってくいんだ・・・
新しいものに慣れるのがつらい年頃なのかね。
そうか、いくらファイルを保存してもインテリの情報が更新されないのが新しいものなのかw
102 :
デフォルトの名無しさん :2007/05/11(金) 00:49:58
>>99 IMEも98ぐらいの時が一番賢かった気がする。
それはない
ATOK使おうぜ
いやVCのインテリは付いたときから馬鹿だろ それだけがVBの取り柄
>>104 そのあたりは無理に標準でついてるもの以外を使う必要が無いからなぁ
Japanist2003
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPTSTR lpCmdLine,int nCmdShow){ MessageBox(NULL,lpCmdLine,"1",MB_OK); if (lpCmdLine=="/abc"){ MessageBox(NULL,lpCmdLine,"2",MB_OK);} return 0;} これで実行ファイルを1.exeとしますと、1 /abcとコマンドラインから実行しても 2つ目のメッセージボックスが出ないんですが何故でしょうか?VS2005,WinXPです。
何それ?
できました、ありがとうございました。
_tWinMain
他のC++用IDEにある、IntelliSense同等の機能の方が、圧倒的に性能いいの?
他は知らんが 個人的には VS2003 のインテリセンスの具合が好き 2005 はインテリセンスに限らず全体的使えないと思う
あー俺も。2003から離れられない。
pimplイディオムを使うとインテリセンスも利かなくなるんだけど これって意図された動作なのかただの偶然なのか?
117 :
デフォルトの名無しさん :2007/05/19(土) 12:09:55
昔VC6.0で作ったプログラムをVC2005に移植したいんですが、 そのままだとビルド出来ませんでした。 プロジェクト自体は変換とか出来たんですが、StdAfx.hでインクルードされてた Windows ヘッダー ファイル群(windows.hとか)が、No such file or directoryでエラーになります。 かといってこれを外したらコンパイル通らないし・・。 1から組むのは大変なんで、何とか使い回せないかと思うのですが、 何かいい方法ありますでしょうか。
Express EditionでPlatform SDKをインストールしてないとか、 パス通してないとかってオチはないよな?
No such file or directoryぐらいの簡単な英語なら理解できるだろ
121 :
117 :2007/05/19(土) 14:01:08
117です。 すみません、仰るとおり、SDKをインストールしていませんでした。。。 インストールしたらインクルードは解決しました。 今度はコンパイルエラーとwarningがいっぱい出てきましたが ワーニングは無視してコンパイルエラーを修正。 (コンパイルエラーは for(int i=0) の i を for以降で使ってました) 次に「ファイル 'LIBC.lib' を開くことができません」が出ましたが、これはググッて解決。 (プロジェクトのプロパティで特定ライブラリの無視にLIBC.lib追加。) 現在、このエラーと格闘中です。 「zlib.lib(gzio.obj) : error LNK2019: 未解決の外部シンボル _errno が関数 _gz_open で参照されました。」
VCのインテリセンスは昔からウンコ
errno は VC2005 だとマクロになってた気がするよ。 余計な warning が鬱陶しければ #pragma warning(disable:警告番号) で消した方が。
こんどはzlibの追加だネ!
VC2005についてるSTLとSTLportでは何が違うの?
126 :
117 :2007/05/19(土) 15:37:14
117です。 zlib.libを作り直そうと思って調べてるんですが、 VC2005でStatic Libraryは作れないんでしょうか? 2005、全部1から作るには楽なんだろうけど、ちょっと違うコトしようとしようとすると途端に・・
初心者の俺でも作れるし
VC6使ってたんなら初心者というわけじゃないだろうし 自分で調べてみるぐらいしようよ ちょっとでも調べてたらそういう質問はないと思う
ダイアログの大きさがフォントの大きさによって変わってしまうのですが、 常に設計時の大きさになるようにする設定ってありますか?
あ、実行時にフォント変えてもダイアログの大きさは変わらないのかな? ↑は無視してください。
VC++.NETとVC++とは違うものなのでしょうか?
.NET使わないなら単なるVC7、VC8
>VC2005についてるSTL そもそもそんなものは無い
クグって見たんですが.NET Framework?MFC見たいな物? VC++ .NET?って? .NET Framework?って? VC++6.0で知識が止まってますorz
VistaマシンでVC6.0は使用できないのでしょうか。 (「VMWare等で旧OS(XPや2k)入れて使え」と言うのは取り合えず置いておいて) インストール試してみようと思いsetup.exe実行 →「このプログラムには基地の互換性の問題があります。」 と表示されたところでいったん止めてWeb漁ってるのですが、なかなか有効な解放が得られず。。。
VC++.NETという表現は使われなくなりました。
139 :
117 :2007/05/19(土) 22:08:00
117です。 何とか解決しました。 ググってはいたんですが、VS2005の用語が全然分からなくて、とっかかりがなかったです。 ソリューションて何?とかいう浦島太郎状態で。 5年前に自作したツールの、数字を決め打ちしてた部分を1カ所直したいだけだったんですが 結局ビルド通すのに丸一日かかりました。 で、通ったら今度はデータが読めない・・・。 fwrite(this,sizeof(Cdata),1,fp); ってやってクラス丸ごとバイナリで保存しておいたデータを fread(this,sizeof(Cdata),1,fp); で読み込んでるんですが、読み込んだデータが化けてるっぽい。 この辺の仕様も変わっちゃってるのかなぁ・・・
ひとりごと
141 :
117 :2007/05/19(土) 22:25:25
昔に保存したデータをあきらめて、データ作り直したら行けるっぽいです。めんどいけど。 長々チラ裏に付き合ってもらってありがとうございました。
考えられる原因はこんなとこか? バイナリモード指定していない アラインメントの指定がおかしい データ型の大きさが変わった (ex time_t)
インスタンスのメモリイメージをそのままをバイナリ保存って無謀すぎ。 普通はシリアライズ用関数とか用意するもんだ。
144 :
デフォルトの名無しさん :2007/05/19(土) 22:47:52
あと、文字列がANSIだったとか。
手抜きなんだからしょうがない
>>117 vtable の事もたまには思い出してあげてくださいね。
どうせ ANSI 文字列をユニコードで表示しようとしてるんだろう。
148 :
デフォルトの名無しさん :2007/05/20(日) 17:31:22
旧バージョンのVisual C++4.0で「コンソールプログラムを作成する」 というような使用条件であれば、十分に活用できますか? (主にRS232CをWin32APIから使用するのが目的です) また、当時NT4.0との組み合わせで不具合(多分使用できない機能?) があるとかの話を耳にしたような記憶があります。 WinXPおよびWin2000での動作はどうでしょうか? バージョンからして、既に現状に沿った話でなくて恐縮ですが、ご教示下さい。
そこまでしてVC4を使う理由が判らない。 つーか、Win32APIからRS232Cを使うというのが何を意味しているのか判らない。 単にシリアル伝送したいだけならmodeコマンドで条件設定してcopyコマンドでもtypeコマンドでもできるだろうに。
XP+VC5を使ってる人は知ってるけど、 VC4はわからないなぁ。
昔のプログラムでも動くのは動くし、動かないのは動かない 適当なの探してきて動かしてみればいい
include の path 指定の書式について質問です。 stdafx.h #include <../creptopp/sha.h> と記述してこれをコンパイルすると、 -------------------------------------------------------------------------------- コンパイルしています... debug.cpp c:\test\Anonymous\stdafx.h(126) : fatal error C1083: include ファイルを開けません。'../../creptopp/sha.h': No such file or directory -------------------------------------------------------------------------------- ファイルの階層は下のようになっています。 test - creptopp/ - Anonymous/stdafx.h #include <sha.h> #include <../creptopp/sha.h> #include <../../creptopp/sha.h> と試してみたのですが、うまくいきませんでした orz どうぞよろしくお願い致します。m(__)m
#include <file-name> 使うならちゃんとpath通しとけよ
>>152 相対パスの元は、stdafx.h の場所ではなく
コンパイルしている cpp の置かれた場所なんじゃね?
解凍してそのまんまビルド ライブラリができたらヘッダとlibを適当な場所へ置いて使うだけ
C++で普通に関数にするのとクラスのメンバ関数にするのとではとちらが遅いのでしょ?
一概には言えない。コンパイラの最適化で、実質的な差が出ない可能性も高い。 速度に関しては、個別に実測する以外は全てただの憶測。
オーバーヘットとかは無いの?
非仮想関数ならthisを積む程度の差しかないだろうなあ まぁそんなこと考えるのは時間の無駄だから、コードの見易さ・美しさを考える方がいいよ
>オーバーヘットとかは無いの なんですか? その「オーバーヘット」って。
夏塩蹴
まあ韓国の文化は冷麺のどんぐり麺?あれだけは評価できるね
VC++2005アカデミック日本語版で質問です 「warning C4996: 'scanf' が古い形式として宣言されました。」 scanf()を使うと2005から上記の警告が出ることはググって分かったのですが 当方の警告文は全て英語のままで上記の一文が出てきません ↓これだけ 'This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' 日本語の警告文の説明を表示させたいのですがどこを設定すればいいのでしょうか? よろしくお願いします
C4996でググればいい。 というより、MSDNライブラリインストールしろ
役に立たねぇ香具師だなぁ。警告を日本語にしたいって書いてんだろ。 C4996だけの問題じゃねぇんだよ。判ってねぇなら書くなよ。
すいませんした。俺が悪いんです。この通りです。許してください。読み違えただけなんです。怒らないでください。日本語にするやり方分かります。でも教えないです。ごめんなさい。
どんな警告・エラーもCxxxxの番号が振られているんだから、 C4996以外もその番号でググればいい。
わざわざ英語で出るように自分で設定変えたくせに 元に戻す方法は人に聞くのってどういう了見なんだ?
C4996でググったらみんな日本語で警告が出るのに 俺の環境じゃ英語しか出ねえよ て解釈した 英語にアレルギーがあるかしらんがこの機会に慣れたら?
VC++2005日本語版に付属のコンパイラとは別に英語版のコンパイラも入れたの?
特に何もしてない
何もしないで変わるかっつーの
MSのサポートに訊けばいい
MSマンセー
誰かがVC++2005EEでも入れて混ざってんじゃないのかね
VS2005無印にSP1当てたら俺も英語だけになったぞ でもたいして問題じゃねえしMSDNライブラリあれば心配ねえよ
それは、英語版のSP1を入れてしまったのでは?
(´,_ゝ`)プッ ソンナオチダッタノカ
んなわけない
そうだな。 本人は「特に何もしてない」と言ってるんだからSP1だってあててるわけが無い
痴呆か。
俺もSP1当てたからかしらんが英語だよ その程度の日本語の説明なら要らんけど あと、うちはProfessionalだな
SP1入れてない。 MicrosoftUpdateで時々入れようとしてるんだけど毎回失敗する。
俺も前失敗続いてたけど最近あらためてやったら成功したな 何が原因だったんだろ
ちょっとツンだっただけさ
SP1を当てたが別に英語になっていないぞ
188 :
デフォルトの名無しさん :2007/05/24(木) 10:37:27
MFCで×ボタンを押してアプリケーションを終了するとき どこになんと言う名前でその処理が書かれているか教えてください 終了するときに処理を付け加えたいのでお願いします
WM_CLOSEのハンドラを追加
SC_CLOSE → WM_CLOSE → WM_DESTROY の順じゃないかな。それぞれのデフォルトハンドラで MFCだと、OnSysCommand() からクローズ投げて OnClose() が呼ばれ、そこでDestroyWindow()して OnDestroy()が呼ばれる。 もしかしたら違うかも。spy++やデバッガで確認してみて
処理内容によっちゃExitInstanceでという選択肢も
192 :
デフォルトの名無しさん :2007/05/24(木) 11:16:42
ありがとうございます処理内容はダイアログを表示させて パスワード入力とOKボタンを押し終了させるものです パスワードが違っているかキャンセルボタンを押した場合終了しません という処理をしようと思っています
クラックしてやんよ
194 :
デフォルトの名無しさん :2007/05/24(木) 11:47:19
連レスすいません ハンドラの追加でON_WM_CLOSE()を追加したんですが 対応する関数に反応ありませんでした
×ボタンってダイアログの話なの? 何がどうなってるのかよくわからん、反応が無いとは何で判断?
196 :
デフォルトの名無しさん :2007/05/24(木) 11:57:31
>>195 フォームビューによるダイアログです
プロパティのメッセージから追加しました
ブレークポイントをつけて通っているか判断しました
197 :
デフォルトの名無しさん :2007/05/24(木) 11:58:45
んーと、WM_CLOSEが来るのはその閉じるウィンドウにくるんだよ。 こないのはおかしいね。spy++で観察してみては。
199 :
デフォルトの名無しさん :2007/05/24(木) 12:14:47
spy++でみてみるとWM_CLOSEはちゃんとありました
エスケープキーでダイアログが閉じないようにするので、そのへんやったことあるけど ダイアログベースじゃない場合は、どのクラスがメッセージを処理してるかだな
sdi/MDIでeditビューの場合は編集中にプログラム閉じようとすると 保存しますか? みたいな確認でたような気がするけどどうだったかな?
202 :
デフォルトの名無しさん :2007/05/24(木) 12:27:28
観察した結果は WM_DESTROY→WM_NCDESTROY→WM_CLOSE→WM_SYSCOMMAND でした
CMainFrame::OnCloseにちゃんと来るじゃん そのあと閉じていいか確認が出る
204 :
デフォルトの名無しさん :2007/05/24(木) 13:13:44
閉じていいか確認が出ないのですが CMainFrame::OnCloseをオーバーライドして使えばいいということですか? そこも通らないような・・・
205 :
デフォルトの名無しさん :2007/05/24(木) 13:15:33
あとWM_DESTROYは反応ありましたがウィンドウが閉じたあとでした
sdi/MDIでeditビューが基本 最初からそういう風に動作するようになってる
>>205 まあいろいろ試してあちこちにハンドラ置きまくってみればいろいろわかることもある。
208 :
デフォルトの名無しさん :2007/05/24(木) 13:40:25
通りました!!CMainFrame::OnCloseでした!! ありがとうございます!
209 :
デフォルトの名無しさん :2007/05/24(木) 16:34:45
自作ダイアログ表示させようとしたら 自分でつけたコントロールのほかに TODO: コントロールをここに置く のテキストボックスと OKとキャンセルボタンがついてごっちゃになってました Jisakudlg dlg(this); dlg.DoModal(); なぜなのか教えてください
>>209 ダイアログの選択したパーツを整列するボタン押したんじゃないの?
211 :
デフォルトの名無しさん :2007/05/24(木) 16:52:44
すいませんよくわからないですけどhtmlが入ってたみたいで 作り直したらいけました
可変個引数の簡単な使い方(できれば、va_arg,va_end,va_startを使わない)を教えてください。 やりたいことは、下記のようにprintf系の関数に引数をそのまま渡したいのです。 void printfWithHeader(char *str, ...) { char buf[1000] = "Header:"; strcat(buf,str); printf(char *str, ...); } 環境は、Visual Studio 2003です。 皆様、お願いいたします。
VCというか普通のCの質問だろ そんなことをわざわざVCスレで質問する意味がわからん
できません 規約も護れないやつぁ帰れ
vprintf 系を使えよ・・・。
Visual Studio.net2003を使っているのですが、 UTF-8のソースを扱うにはどうすればいいのでしょうか。 コンパイルはできるのですが、日本語の表示ができません。
>>215 thx.
vprintf系でできそうです。
>>213 > VCというか普通のCの質問だろ
> そんなことをわざわざVCスレで質問する意味がわからん
レスありがとうございます。
VCの拡張機能も含めて、回答を頂きたかったからです。
老婆心ながら、
>>213 さんは行間をうまく読めないようですので、コミュニケーション能力を鍛えた方がよろしいかと思いました。
質問等で、行間を読んでくれる事に期待するってのは、 一般社会ではコミュニケーション能力不足と判定されます。
219 :
217 :2007/05/25(金) 00:29:21
確かにその通りですね... (-_-;)
>>216 先にShift_Jisに変換してからコンパイル、が一番楽。
.NETベースのコンパイラは、文字列=Unicodeで保持、と決め打ちできるんだけどねえ。
Windows は UTF-16 で動いてるけど、 .NET を通す場合だとどうなんだろう。 よく知らん。
>217 人が多いスレで質問した方が適切な回答が得られやすい ここはVC限定でしかも初心者限定だから人が少ない
いやこんな質問初心者レベルだろ
>>216 VS2003にもVBとか色々あるが、ここで質問するからにはVC++2003でいいんだな?
仕様書の行間なんぞ読まれたらと思うと・・・
>>217 は技術者としては失格だろ
技術者が設計図の行間とか読んだら、ものは出来上がらない
行間読むくらいなら、設計を詳細まで確認するのが正しい
VC2002を初めて使っているのですが、DllプロジェクトとMainのプロジェクトがあり DLL側のヘッダをincludeし、定義しているクラスをメインのexeで使いたいのですが 宣言はできるのですがビルドすると 未解決の外部シンボル と怒られます。 どうしたらよいのでしょうか。
複数のプロジェクトをいっしょに扱うのが難しかったら DLLを先にビルドしてしまえば、DLLで配布されてるライブラリなんかと同様に扱える
即レスありがとうございます。 実はcppUnitを使用したいと思いまして、現在のプロジェクトをそのままに 新規でテスト用のプロジェクトから該当のクラスにアクセスしたいと考えておりました。 おっしゃられるように入出力だけのテストなら、dll呼び出せばできそうです。 ありがとうございます。
フリーでVisualC++用のリファクタリングアドインある?
231 :
230 :2007/05/27(日) 08:29:21
232 :
デフォルトの名無しさん :2007/05/28(月) 12:20:46
VisualC++6.0でCDialogについて質問です。 1つのプロジェクトに複数のダイアログ画面でがあり、 各画面で同じ処理を行うメンバ変数・関数が存在します。 これをまとめるため、CDialogから派生したCCustomDialogを作成し、 各画面の基底クラスに使用することを考えました。 通常のC++クラスであれば、上記のことが可能であるとわかりますが、 CDialogクラスでも可能でしょうか? (Windowsのイベントとかメッセージとかが、正常に処理されるのか心配しています。)
>>232 CDialogを派生して各ダイアログクラスを作るように、CCustomDialogを派生すればいい。
CCustomDialogの作成には幾つかMFC特有のおまじないが必要だから、どっかでサンプルを探すのがいいね。
234 :
232 :2007/05/28(月) 19:36:24
>>233 レスありがとうございます。
参考にさせていただきます。
メッセージループとか使わないプログラムで、 キーボードの入力を待たないでキーボードの入力を取得するにはどうすればよいのでしょう? (押されてなかったらNULLかなんかで抜けてくれる関数等)
GetAsyncKeyState
VisualC++2005,XPで開発してます。 ダイアログボックスに画像とその説明のテキストのリストを載せたいのですが、 どのコントロールを使えば最適でしょうか?
さあ
ありがとうございます。 適当にやります。
使わないのが最適
初めまして、VisualC++2005のC++/CLI でフォームのすべてのイベントに反応させたいのですが、 そのようなイベントが見つかりません。 そのようなデリゲートはないのでしょうか?
メソッドだけどWndProcは?
HideCaret(static_cast<HWND>(this->textBox1->Handle.ToPointer())); で、キャレットを非表示にすることまでは分かったのですが、常に非表示にするにはすべてのテキストのイベントで実行させなければなりません。 もっと効率よくキャレットを非表示にする方法はないものでしょうか?
またお前か
ご無沙汰しております。
ないだろ どうせ普通はそんなこと誰もやらないし
サブクラス化してしまえ
テキストつかわなきゃいい
ウインドウズの電卓はテキストBOX使ってない
キャレットに用意されているマウスカーソルイメージを弄れば。
ShowCaret使わないなら同じこと
テキストボックスコントロールを自作すれば?
タイマーで監視しとけ。
>>255 プログラマーとしてそんな行為が許されると思っているのですか?
257 :
62 :2007/05/31(木) 06:44:08
もうDestroyCaretで殺しチャイナYO
261 :
257 :2007/05/31(木) 07:14:02
>>258 読みやすくしたつもりですが・・・長文過ぎたか ><;
>>260 一応何回かやっています。どなたぞ宜しく願い^^
もう少し待ってつつ頑張ります。 ><;
いや長文じゃないし日本語じゃない
263 :
257 :2007/05/31(木) 07:23:08
何がやりたくて、何をしたけど現状どうなってるのか
>すません><; 言葉を注意されてすぐにもこんな事書くのか。
><;
><;><;><;><;><;><;
268 :
257 :2007/05/31(木) 11:43:11
バカじゃねぇのw そんな簡単な所で躓いてんのかよwww 既出も既出大既出
>>268 やっぱり、「現状どうなっているのか」は大事だね。
それで正常だよ。Win32アプリケーションを作りたかったら
もうちょっとこことか、他のサイトでも調べてごらん。
>>268 もっと具体的に何をしたか書いてみ。
例えば、AppSettings.htmはどう修正したとか。
で、コンソールアプリケーションを作成はしてみたのかな。 コンソールアプリケーション作成時に、ウィザードの選択肢はチェックしたのかな。
273 :
257 :2007/05/31(木) 15:55:17
>>269 どうもです^^
>>270 >>271 >それで正常だよ >例えば、AppSettings.htmはどう修正したとか。
この意見は大きかったです <(_ _)> その辺を意識して再調査しました
>>272 コンソールアプリケーションも動かしてみます
意見を聞いて調べ実行した結果。種類でWindowsアプリケーションが選択できました(^_^)ノ
Googleキーワード 「Windows アプリケーション AppSettings.htm corewin_express.vsprops」
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1351057&SiteID=7 を発見!それまでは秀丸で編集して反映されてOKと思っていたのですが・・・(AppSettings.htm)
メモ帳で開く反映されていない!え〜><;・・・ならばメモ帳で編集すればOKかと思ったのですが
反映されませんでした><;なんで〜T_T;意味分かりません><;・・・サイトの通りに
管理者権限でやるとうまくいきました・・・勉強します orz
多くのレス有難うございました。又何かありましたら宜しく願います。<(_ _)>
>>273 ExpressEditionはしばらくしたら爆発するから気を付けろ
現在のプロジェクトのフォルダを一発で開くような便利な技はありませんか?
ツール(T)->オプション(O)->環境->スタートアップ->スタートアップ時(P): を、最後に読み込んだソリューションにする
開くって何で開くのさ
フォルダなら2発目ぐらいで開ける
愛で開くのさ
開く押したら開くけど
フォルダを開くって言ったらエクスプローラーで開くことなんだけど
>>275 ファイルを開くダイアログで十分操作はできると思うぜ。
〃〃∩ _, ,_ ⊂⌒( `Д´) エクスプローラーじゃなきゃヤダ `ヽ_つ ⊂ノ ヤダ ジタバタ
それくらい自分で作れやカス
馬鹿には無理だけど、ダイアログからエクスプローラは1発で開ける
ΩΩ <な、なんだってー!!
287 :
275 :2007/05/31(木) 19:40:50
ふっ・・・できたぜ・・・世話んなったな。アバヨ!!!!!!!!
___ 見えませ〜ん ‖ | ∨ ‖現実 ∧_∧ .ヘ∧ ‖ \ ( ・∀・) (゚A●) || ̄ ̄⊂ ) ( と) 凵 し`J U U ___ 読めませ〜ん ‖ | ∨ ‖空気 ∧_∧ .ヘ∧ ‖ \ ( ・∀・) (゚A●) || ̄ ̄⊂ ) ( と) 凵 し`J U U ___ 知りませ〜ん ‖ | ∨ ‖常識 ∧_∧ .ヘ∧ ‖ \ ( ・∀・) (゚A●) || ̄ ̄⊂ ) ( と) 凵 し`J U U ___ ありませ〜ん ‖ | ∨ ‖未来 ∧_∧ .ヘ∧ ‖ \ ( ・∀・) (゚A●) || ̄ ̄⊂ ) ( と) 凵 し`J U U
WisdomSoftのWinAPI講座のメッセージボックスのページ、「文字列フォーマット」に倣って #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { CHAR chStr[128]; wsprintf(chStr , "インスタンスハンドル : %d" , hInstance); MessageBox(NULL , chStr , TEXT("Kitty on your lap") , MB_OK); return 0; } とやっているのですが、UNICODEでコンパイルしようとすると(勿論マルチバイトではコンパイルできます) error C2664: 'wsprintfW' : 1 番目の引数を 'CHAR [128]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 error C2664: 'MessageBoxW' : 2 番目の引数を 'CHAR [128]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 と型変換のエラーではねられます。 CHARをTCHARにしてみたり、とりあえず無闇にキャストしてみたりしたのですが、上手く行きません。 wsprintfをUNICODEでコンパイル通すにはどうしたら良いのでしょうか。
#include <windows.h> #include <tchar.h> int WINAPI _tWinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , LPTSTR lpCmdLine , int nCmdShow ) { TCHAR chStr[128]; wsprintf(chStr , _T("インスタンスハンドル : %d") , hInstance); MessageBox(NULL , chStr , _T("Kitty on your lap") , MB_OK); return 0; }
291 :
289 :2007/06/02(土) 21:19:53
>>290 あふ。wsprintfでもTEXTマクロ噛ませないといけなかったのですね。
情けなや……
どうもありがとうございました。
winnt.h内で #define VOID void typedef char CHAR; typedef short SHORT; typedef long LONG; やら、 windef.hで typedef int INT; やら定義されていますが、これら大文字の型を用いる時(或いは用いることが望ましいとされている時) はどのようなときでしょうか。 或いは過去or未来との互換性の為に存在するのでしょうか。 また、もしMSDNに参考となるドキュメントがあれば、それもお教え下さい。
apiの仕様にあわせやすい 将来仕様変更あってもいい
>>292 > 或いは過去or未来との互換性の為に存在するのでしょうか。
じゃねーか。
295 :
292 :2007/06/04(月) 00:58:10
>>293-294 解答ありがとうございます。
Win32App的には大文字で記述した方が将来的に互換性が維持されることが期待される、ということでしょうか。
サンプル漁ってもVOIDはたまに見かけますが、INTとかは今のところ見つけられていないので、現実にはほとんど利用されていない、のかな。
>>295 > 大文字で記述した方が
というわけではなく。
たとえばintのビット数が現在のコンパイラと違うものがあった場合(実際あるよ)、
直接INTを使うよりもtypedef されたものを使っていた方が移植が簡単。
typedefのところ1箇所を変えればいいのだから。
てなとこじゃないかと・・・・
297 :
296 :2007/06/04(月) 01:09:58
間違えた 「直接int」 ね。
あ、なるほど。訂正ありがとうございます。 コンパイラ側の設定(と呼んでいいのかな)としてintのビット数を将来的に変更しやすいようにしているわけですね。 どうもありがとうございました。
299 :
デフォルトの名無しさん :2007/06/04(月) 07:28:27
すいません質問があるんですが、ゲーム中に visual c++ runtime library runtime error abnormal prpgram tarmination っていうエラーが起こってしまいましてゲームが進まないのですが、どのように対処したらよいでしょうか? ちなみにXPです
凵@ ○ ∇ 、,、´`゙;~、 ';冫 ☆ ┏ ━ゝヽ''人∧━∧从━〆A!゚━━┓。 ╋┓“〓┃ < ゝ\',冫。’ 、 ._〃Ν ; ゛△│´' 'ゝ'┃... ●┃ ┃┃_.━┛ヤ ━━━━━━,/\.\━━━━━━━━━ .━┛ ∇ //\\.\ 火、ヽ,,"∧.: .┨'゚,。 .。冫▽ < // \\.\ 十 乙 ≧ ▽ 。 ┃ . Σ、\. \\|, 、\'’│ て く ┠ .ム┼\\. /// ,,’.┼ ァΖ.┨ ミo'’` 。、゚`。、 i/\,\// レ' o。了 、'’ × 个o ○ ┃ `、,~´+√ ▽ ',!ヽ.◇ o┃ ┗〆━┷ Z,.' /┷━''o ヾo┷+\━┛,゛;
>>299 OSがC++でできてるの知ってる?
そのエラーはね爆発予告なんだよ。
だから
>>300 の言うように今すぐPC投げ捨ててぶっ壊さないとダメなんだよ。
地球を滅ぼしたくないならね。
ウイルス
そのゲームをキミが作ったんじゃなけりゃ そのゲームのスレかPC初心者あたりのスレで
環境 WindowsXP VisualStudio2005 VC++ 文字セット UNICODE 目的 読み出したテキストと同じ内容を表示 //TCHAR szStrは外部のメモ帳で作成したテキストファイルから読み出し //内容=>test.txt "テスト1234テスト" int Len; TCHAR buf[1024*64]; Len = MultiByteToWideChar(CP_ACP,0,(LPCSTR)szStr,-1,buf,0); MultiByteToWideChar(CP_ACP,0,(LPCSTR)szStr,-1,buf,Len); //違うのは当たり前だけど、いい方法が解らない buf[(Len-1)/2] = '\0'; //Lenは27 //出力すると=>"テスト1234テストフフフ" 目的通りに元の文字列を表示させるにはどうしたらいいでしょうか?
306 :
305 :2007/06/06(水) 13:42:57
試行錯誤してたら出来ましたが、これで問題無いんでしょうか? int buflen; TCHAR buf[1024*64]; int len = _tcslen(szStr); buflen = MultiByteToWideChar(CP_ACP,0,(LPCSTR)szStr,-1,buf,0); MultiByteToWideChar(CP_ACP,0,(LPCSTR)szStr,-1,buf,buflen); buf[buflen-len-1] = '\0';
>>306 何がしたいのかわからん。
MultiByteToWideChar の戻り値をよく考えろ。
バッファサイズに0を指定した場合、ヌル終端も含めたバイと数が返ってこないか?
わざわざ '\0' を入れてるのは何で
バイト数じゃないや、文字数ね
>>305 test.txtの文字コードが定まっているのなら、
szStrはTCHARではなく、CHARやWCHARあるいはその他の大きさが変化しない型にすべき
ビルドがUNICODEってことか? 改行文字を"\0\0"でやってみそ ここのMultiByteはUTF16(エンディアンは忘れた)だからエスケプ文字も2バイト長だったかな Sjis→Uni変換ならCP_ACPはNULLでもよかったような希ガス
311 :
310 :2007/06/06(水) 20:32:13
改行文字じゃないよ、EOFだよ俺('A`)
ヤフれカス
>>313 ヤフっても出てこないけど?
いいから教えてください。
そんな簡単な事も分からんのに・・・
316 :
デフォルトの名無しさん :2007/06/07(木) 03:25:47
だからいいから早く教えろよ。 検索しても出てこないから聞いてるんだろうがよ。
317 :
デフォルトの名無しさん :2007/06/07(木) 03:27:21
なんなんだよ
318 :
デフォルトの名無しさん :2007/06/07(木) 03:28:54
全然寝てないのに加わってめちゃくちゃイラ回るな。 もったいぶらずに教えろよ。
書いてあるやんw 日本語も分からんのか(´・ω・`)
寝て起きたら分かるよ
321 :
デフォルトの名無しさん :2007/06/07(木) 03:39:12
GetCharABC”D”Widths って何だよ・・・。GetCharABCWidthsかよ・・・。 ひでーよなんだよ・・・。くそー。スマンカッタ
包囲網かとオモタ
\(^o^)/ワーイ
>>313 ググること自体が検索するの意味なので「ヤフれ」はおかしい。
大抵の用語集には「ググる」とはグーグルで検索することとあるがしかし、
これはグーグルが「勝手に名前を使うな」とちゃちゃを入れたことから始まる。
昔は「ググる」とは一般的に検索するという意味で使われていたのである。
そんな痛々しい策略に乗ってヤフれなど言うのは恥ずかしいことこの上ない。
325 :
デフォルトの名無しさん :2007/06/08(金) 23:19:55
ヤフれ
ググレカスで初心者も含めてgoogleに流れるなら、 それはググルにとっても利点だろう
ググレカレ
Google独裁社会
ググルもいいけど、やふーもね
孫某というハゲがウザいので、アホーは使わない
書籍スレで評判がよかったので 「プログラマ養成入門講座 VisualC++ 山本信雄」 という本でVisualC++を学習しているのですが、 本で使っているソフトがVisualC++6.0で、当方2005でを使っているのですが 操作方が原型を留めていないのですよ。 VisualC++6.0はもう手に入らないのでしょうか? もしくは手に入れる方法はないのでしょうか?
それだけの理由で6を使うくらいなら本を替えたら? 6はまだインストールされてるけど、2005使うともう使う気になれないな・・・
つーか、操作方法を本で勉強したからといってプログラマにはなれないわけだが。
やってることの意味が理解できてればバージョン違っても大丈夫なはず 付録のCDがついてると思うけど サンプルをそんまんまビルドして動かしてみればいいと思う。
336 :
332 :2007/06/14(木) 09:44:58
>>333 三冊で約8000円ですよ。
今さら買いかえるなんてあんまりです。・゚・(ノД`)・゚・。
本にこんなに注ぎ込んだのは大学以来ですよ〜。。
ちなみに。、MFCが消えるって知ったのは最近です。
>>334 いやーでもビジュアル面は大事ですよ。
操作方法が判ってるとびびらなくなりまし。
会社でC#使ってるんですが、標準C#入門読み終わって。
VS.netみたらびびりましたもん、なんじゃこれ?って。。
>>335 あんましよく理解できてないかも。。
APIなんて触ったの初めてだし。
OSとかAPIとかの本読まなきゃダメなのかな orz
操作方法なんてその場でヘルプ見ればいい 本は言語関連だけ参考にすればいい
でも初心者は本があった方が助かることも事実 本買う金が惜しかったら、ネットで調べるしかないな
339 :
デフォルトの名無しさん :2007/06/14(木) 19:45:04
VC++2002 MFC7.0 フォルダを探してそのフォルダの中にテキストファイルを作成 すでにテキストファイルがあればテキストを追加 もしフォルダが存在しない場合フォルダを作成してからテキスト作成 テキスト作成はC言語のやり方でやろうと思っています フォルダの作成でいいのがあれば教えてください
>>339 好きなのどぞ〜
複数階層を纏めて掘れるSHCreateDirectory/Exは、
残念ながらdeprecated扱いなので注意。
// C Runtime
_mkdir
system("mkdir ○○○")
// Win32
CreateDirectory/Ex // _mkdirかこれが無難か
SHPathPrepareForWrite // 一番楽?
// Automation
Scripting.FileSystemObject.CreateFolder // WSHでは標準的な方法
Shell.Application.NameSpace - Folder.NewFolder // マニア向け
// .NET
System.IO.Directory.CreateDirectory
System.IO.DirectoryInfo.Create
Microsoft.VisualBasic.FileSystem.MkDir // 昔のVBLoveな人向け
Microsoft.VisualBasic.FileIO.FileSystem.CreateDirectory
つ[system("/cygwin/bin/mkdir -p /foo/bar/baz")
MakeSureDirectoryPathExists
すみません教えてください ExecuteSQLでテーブルにInsertする際 データにダッシュ(―)が入っていた場合 実行後にテーブルを見てみると―が?に 変換されています。どうしたらよいのでしょうか?
―って、SJISで815Cだけど、エンコードの指定は問題ない?
回答ありがとうございます プロジェクトの文字セットはUNICODEにしています 文字列もwchar_t型で扱っていますがそういう意味では ないのでしょうか?
えーと、ファイルから読んでるのかどこから読んでるのかによるし 問題がどっちにあるのか切り分けできない? 環境(と、バージョン)がわかればもうちょっと何とかなるかもよ
申し訳ありません。 OS環境:WinXP SP2 開発環境:VS2005 MFC使用 DBはSQLServerで構築しました。 データはただ単にダイアログのエディットに 入力された文字をSQL文と連結しています (どちらもCString型です)
349 :
デフォルトの名無しさん :2007/06/20(水) 18:07:59
アクセラレータ(ショートカット)をエクセルみたいな一覧表にしたいのだけど ツールとかないかしらん?
>>349 ***.rcファイルをコピーして、拡張子をcsvに変え、必要なとこだけコピーペーストする。
とかではダメか?
352 :
デフォルトの名無しさん :2007/06/21(木) 14:01:29
サンンクス
質問です 現在、複数のプロジェクトでリソースファイルを共有しています。 リソースファイルに複数のバージョン情報リソースを定義し、実行している EXEによって表示するバージョン情報を変えたいと思っているのですが、 どうやったら異なるバージョン情報リソースのデータを取得するかが分かりません。 EXEファイルからリソース情報を取得する方法はよく見かけるのですが リソースファイルから取得する方法はなぜかありませんでした。 ご教授をお願い致します。
質問です。 VC2005で作成されたプロジェクトファイルを 2003でも開けるように、変換してくれるような ツールってありませんか?
自分でスクリプトでも書けば? 事実上、バージョン番号書き換えるだけでしょ。
メモ帳で十分だった気がする
357 :
デフォルトの名無しさん :2007/06/24(日) 13:42:42
コンパイルしたら ------ ビルド開始: プロジェクト: saiki, 構成: Debug Win32 ------ コンパイルしています... WinMain.cpp .\WinMain.cpp(5) : fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory kooh2.cpp というエラーが出たんだが、どうすれば解決できるの? 超初心者にもわかりやすい説明希望。
WindwosSDKをダウソ・インスコして、INCLUDEとLIBを設定する。 これで判らないなら、VisualStudio2005 StandardEdition Upgradeを 買ってインスコしとけ。
教えてください。 CTest クラスのInit()というメンバ関数を、複数のスレッドがコールします。 しかし、Init()関数の中には一度だけしか行ってはいけない処理があります。 (実装ライブラリの初期化処理) どうすれば、実現できるのでしょうか?
>>358 ダウンする以外の方法はないの?
うちのパソ、ダウンにかなりの時間かかるからそれだとできないのだが。
じゃあStd版買えばいいじゃん。
自分でwindows.h書けばいいと思うよ。 >ダウンする以外の方法はないの? >VisualStudio2005 StandardEdition Upgradeを 買ってインスコしとけ。
>>361 Stdがなんなのか知らないけど、それ以外の方法はないの?
じゃあダウンすればいいじゃん。
ダウンも購入もしない方法はないの?
了解しました。もっと勉強して出直して参ります。
>>359 そいつは実装の問題だな。
色々やり方あるけど
とりあえず CriticalSection あたりを利用してみれ
# 当然コレだけじゃ出来んぞ
まぁそもそも、全体的な構成が悪い気もするけど。
>>369 ありがとうございました。調べてみます。
ダウンにかなりの時間って、まさか今時アナログとかISDNとか言うんじゃないだろうな ADSLなら余裕だろ
372 :
ちんこ :2007/06/24(日) 22:58:23
ダイヤルアップでちゅ
音響カプラーでふ。
脳内電波でちゅ
伝書鳩
矢文
377 :
デフォルトの名無しさん :2007/06/25(月) 14:58:11
378 :
デフォルトの名無しさん :2007/06/25(月) 21:44:01
助けてくれ〜。 当方初心者、Windows XP、Visual Studio 2005使用。 簡単なウィンドウアプリを書いて無事ビルドできたんだが、 いざ実行しようとしたら 「'C:\WINDOWS\system32\ほにゃらら.dll'を読み込みました。 シンボルが読み込まれていません」というメッセージがずらーってできた。 今まで同じようなアプリは普通に実行できたのに。 俺何もしてないはずなのになぜ、ひねくれるの?おしえておじいさん。
気にするな。
ググレカス。お前より年下の方が多そう
help me お兄さん。 同じく初心者、WinXP VisualStudio2005使用。 フルスクリーンのウィンドウを表示してbmpを全画面に貼り付けようといじっててフルスクリーンのウィンドウは出るんですが、 全くいじらずデバッグ開始しているにも関わらず、bmpがキチンと画面全体に描画される場合と下に空白ができる場合があって悩んでます。 ちょっと曖昧過ぎて答えにくいかもしれませんがお願いします。
382 :
デフォルトの名無しさん :2007/06/25(月) 22:46:00
main関数がないだけであたふたする僕
>>381 もちろんWM_PAINTのタイミングで描画してるよな。
386 :
381 :2007/06/26(火) 02:42:06
>>384 すみません、できているとは思うんですが自信がなくなってきたので質問・・。
それができていなかった場合
>>381 で書いたような不安定な不具合が起こるんでしょうか?
387 :
デフォルトの名無しさん :2007/06/26(火) 02:42:21
そんなに長いソースじゃないし どこにでもあるようなものだろ? 全部上げるか問題部分だけ上げれば?
下の空白ってなんだ? タスクバー分?
390 :
378 :2007/06/26(火) 13:37:30
解決しました〜。Ctrl+F5ってすればいいんだな。
>>379 教えてくれてありがとう、おじいさん。
>>380 孫娘に「口笛はなぜ〜♪」って聞かれて「自分で調べろカス!」って、
おまいに人の心はないのか。・゚・(ノД`)・゚・。
孫など出来るのは後何十年以上掛かる 孫娘でも知ってるような事を分からなくて孫娘に聞くって、 おまいはどんだけ〜。・゚・(ノД`)・゚・。
392 :
デフォルトの名無しさん :2007/06/26(火) 15:43:02
マルチスレッドでclock関数を使っても大丈夫しょうか?
393 :
デフォルトの名無しさん :2007/06/26(火) 17:12:50
ちょっとスレ違いかもしれませんが Visualstudio6.0を入れてるPCに2005Expressを入れてしまったのでアンインストしようと思うんですが 普通に2005をアンインストしても6.0の動作に問題はありませんか?
うん
395 :
381 :2007/06/26(火) 19:25:52
帰宅しました。 空白はタスクバー分の空白だと思います。
396 :
381 :2007/06/26(火) 21:23:35
長々とすみません、再描画処理を入れたらなんとか全画面化できました。 何故再描画入れないとタスクバー分空白ができるのか結局分からず仕舞いでしたがありがとうございました。
そんなこったろうと思ったよ
空白ができるときとできないときで、描画範囲の数字が違ってると思うんだけど GetClientRectあたりで取ってきてんのかな
399 :
sage :2007/06/27(水) 23:38:35
VC++6で作ったプロセスをWindowsのクラスタサービスの 汎用アプリケーションリソースにしています。 最近Windows2000からWindows2003にOSをアップグレードしたところ、 プロセスのオフライン時にデバッガが起動して、 オフラインに失敗する事象が頻発するようになってしまいました。 デバッガを見てもアセンブリが読めないため、難儀しております。 このような場合、考えられる問題は何がありますでしょうか。
>考えられる問題は何がありますでしょうか。 名前欄にsageと書くバカらしさ
ソースとpdbもちこんでは
402 :
デフォルトの名無しさん :2007/06/28(木) 02:09:28
プログラム経験ない管理部門ですが、突然C++使えるようになれと命令 されたんですが、独学で可能ですか?いろいろ調べるとC言語が理解して いないと無理なように思えたんですが。
>>402 独学も可能だしC言語の知識がなくてもわかると思うけど…
でもやっといてもいいんじゃないかな?
404 :
デフォルトの名無しさん :2007/06/28(木) 08:09:23
>>402 基本的にCからやったほうがいいと思いますが
センスがあればC++でも問題ないと・・・
しかし初心者にはC++は難しい
自分は入りやすいように
DXライブラリというサイト利用してゲームを作っています。
グーグル検索してみて〜
後は本を買ったりして基本と必要なことだけを覚えていくこと
どこまでやるかによるけど… プログラム経験ないんだろ? 変数とは何か、配列とは何か、演算子とは何かからはじめるわけだ。 使えるようになれと命令されたってことは猶予はせいぜい1ヶ月くらいか? もう無理と断言していいんじゃまいか。
そうでもない
もう不要と断言されたようなもの?402カワイソスw
>>402 別にたいしたことやるわけでもないなら余裕だろ
ポインタやらビット制御やらまでくると理解が難しいだろうが
復習をしようと思ってとても簡単そうな #include "stdafx.h" #include <stdio.h> void main() { int a,b,wk; scanf("%d,%d",&a,&b); wk=a; a=b; b=wk; printf("a=%d b=%d\n",a,b); } を試してみたのですがaとbを入れ替えるプログラムがうまく動きません。 写し間違いはないと思うのでが何が原因なんでしょうか
ここVCスレなんだしデバッガ使って自分で調べりゃいいだろ
入力でミスってるに1票。
C初心者スレへ行った方がいいと思うよ
BSTR型ってサイズの制限とか無いですよね? Base64でエンコードされたファイルをBSTR型文字列で受け取ることになっているんですが、 メモリの許す限り何MBでも入りますよね?
有ります。
A four-byte integer 理論上は終了文字含まないで4GBだな。 バイナリ換算だと1GBか。
418 :
417 :2007/06/30(土) 16:43:53
Win32だとUTF-16だから、文字数はその半分、 バイナリ換算すると512MBだった…… orz
何で限界バイト数が減るのか理解できん。 #Win32ではまず連続1GBもメモリは確保できないけど。
420 :
417 :2007/06/30(土) 21:03:50
Base64の一文字当たりの情報量は6ビットだから、バイナリ変換すると3/4、 4GBytes => UTF-16:2G => 1.5GBytes だろ、常識的に考えて。 ごめん、今日はボケてるみたいだ orz
いつもじゃね?
>>415 >>417-420 が4バイトといっているのは、
BSTRの先頭の文字列の長さを格納する部分の大きさを根拠にしている。
Win64でもこの大きさは変わっていない。
あと、言ったところでどうにもできないとは思うけど、
BSTR自体は直接バイナリデータを扱えるようにもなっている。
残念ながら、BSTRは例え64bitWindowsでも2^32-1バイトをサポートしていない。
最大は2^29バイトとなるように実装されている。
BSTRは別段UNICODE
(これはM$が勝手に決めたUNICODEであって、本来はいわゆるUTF-16に準拠したもの)を
格納するためではない。その気になればEUCだって代入できる。
現に
>>422 も単なるバイナリデータとして扱えると言っている。
ところが、少なくともVB6のCComBSTRのメンバ関数は、2バイト文字を扱うように実装されおり、
かつ、null-terminal文字列として扱っている。
BSTRはどんな文字セットでも扱えるとM$は称しているが、実際のところ安全なプログラムを組むには
UTF-16以外は代入しない方がいいと考えていい。
そして、文字列のバイト数は2^29-2であって、文字列は2^28-1文字(最後は`\0')しか代入できない。
ちなみに、Windows95系と互換性を持たせたかったら、4095バイトを限界にした方がいい。
うろ覚えだが、確かメガバイト単位までは実装されてなかったはず。
>VB6のCComBSTR >null-terminal文字列 ここは突っ込むところなのだろうか。
425 :
423 :2007/07/01(日) 00:16:16
>>424 よく突っ込んでくれた!といいたいところだが、単なるミスです。
当方チューハイ4杯入ってますので。
SysAllocStringの > zero-terminated string to copy. The sz parameter must be a Unicode string >in 32-bit applications, and an ANSI string in 16-bit applications. についてはどう考える? まあ、インターフェースと内部実装でコードが違ってる場合もあろうけど。
>>426 非ヌル終端の文字列でBSTRを初期化したければSysAllocStringLen。
バイナリデータでBSTRを初期化したければSysAllocStringByteLen。
>The sz parameter must be a Unicode string こっちのほうだけど。
ありがとうございます。 まとめると、データがBase64文字列の最大100MB程度で OSがWinNT系なら、何も考えずにBSTRに格納できるということでしょうか。 ただ、格納されるBase64文字列はUTF-8かSJISのどちらか(未確認)です。 Base64文字列データを返値として提供してくれる関数の返値の型がBSTRになっているのですが、 そのまま格納してはまずいのでしょうか…。 CStringに入れれば大丈夫だったり? ※ 上の関数はライブラリで提供されてるので中身の実装は分からないのですが、中で 返値をBSTRに格納してるのなら一緒じゃないかと思ったり
VC++2005ってC99コンパイルできますか?
いいえ。
VisualStudio2005でC++のライブラリの追加がうまくいきません ツール>オプション>プロジェクト及びソリューション>VC++ディレクトリ でインクルードファイルとライブラリファイルのところに 追加してるんですがうまくいかない場合は他にどこに気をつけるべき?
プロジェクトに追加しろよ
>>434 しょっちゅう使うつもりなんでできるだけ環境に入れときたいんですが……
ライブラリをインクルードファイルに追加する分際で何言ってんの? だからプロジェクトに追加しないとリンクされねぇっつーの。 プロジェクトなりソースでファイルをリンクするように設定しろや 環境にPATHを入れるのは自由だ
437 :
デフォルトの名無しさん :2007/07/02(月) 00:53:23
ううん
うまくいかないで考えが終わってるから うまくいかないんだろう 猿の方が賢いかも
VC++なら、提供するincludeファイルに、#prafma comment(lib, "xxx.lib") をつけときゃ、あとはディレクトリの指定だけしときゃいい
自作のクラスやメソッドをインテリジェンスで表示させるときに コメントも一緒に表示できるようにならないかねぇ・・・ 俺が知らないだけかもしれないけど・・・
New C++ Language Features - XML Documentation に何か書いてあるっぽい。C#のXMLドキュメントコメントと似たようなものか? でも、読むの('A`)マンドクセ
444 :
デフォルトの名無しさん :2007/07/02(月) 23:10:07
>>441 いや、どうせなら
#prazma
ディレクティブの方が多少面白かったのに。
タブに普通にあるスタイルに見えるけど
447 :
デフォルトの名無しさん :2007/07/03(火) 00:13:30
>>446-447 dwStyle &= ~TCS_EX_FLATSEPARATORS;
の行をコメントアウトしたらできました。
大変下らない質問でスレを汚してしまい、
申し訳ありませんでした。
ありがとうございました。
ちょっと待て。それかっこいいのか?
>>449 まあまあ、主観の話なんだからケチ付けない。
451 :
デフォルトの名無しさん :2007/07/03(火) 15:43:22
452 :
デフォルトの名無しさん :2007/07/03(火) 16:11:09
453 :
デフォルトの名無しさん :2007/07/04(水) 19:41:46
マルチスレッドなのでlocaltime_r()というものを使いたいのですが #include <time.h> をしてもlocaltime_r() が使えません 何故だか教えてくださいVS2002ですよろしくお願いします
VSはTLS使うので、マルチスレッド版でコンパイルすれば、 スレッド間で干渉はない。よって、localtimeつかってればいい。
455 :
デフォルトの名無しさん :2007/07/04(水) 20:02:19
マルチスレッド版でコンパイルというのは 普通にコンパイルするのと同じでいいのでしょうか?
プロジェクトのプロパティで C/C++→コード生成→ランタイムライブラリ→マルチスレッド〜を選択しろ DLLかスタティックか、デバグ用かリリース用かで計4種類ある Makefile手書きかcl.exeを直接実行してる場合は、 clに-MT -MD -MTd -MDdのいずれかのオプションを指定しろ つうか、これぐらいぐぐるかヘルプ嫁
457 :
デフォルトの名無しさん :2007/07/04(水) 20:43:00
すいませんプロジェクトのプロパティがわかりません メニューのプロジェクトのところをみているのですが存在しませんorz
458 :
デフォルトの名無しさん :2007/07/04(水) 20:58:57
存在しない理由がわかりました 私はMFCプロジェクトでプログラムを作成しています その場合どうすればいいのでしょうか?
(´・ω・`) 君にVisualC++は向いていないんじゃないかな。
460 :
デフォルトの名無しさん :2007/07/04(水) 21:11:14
むいてなくてもいいですが 存在しないものは存在しないので普通混乱するでしょう?
(´-ω-`) ……'プロジェクト プロパティページ'でヘルプを検索してみなさい
あちこちで右クリックしまくってみ
463 :
デフォルトの名無しさん :2007/07/04(水) 22:59:50
ぐぐればヒントが見つかるかも もしかしたら出ないしくみかもしれないし・・・
検索ダイアログ操作しようとして Viewクラスにメッセージ定義してコールバック関数追加したんですけど メッセージがViewに飛んできません。 //View cppに static UINT WM_FINDREPLACE = ::RegisterWindowMessage(FINDMSGSTRING); BEGIN_MESSAGE_MAP(C**View, CFormView) ON_REGISTERED_MESSAGE(WM_FINDREPLACE, OnFindReplace) END_MESSAGE_MAP() LONG C**View::::OnFindReplace(WPARAM wParam, LPARAM lParam) { return 1L } //Vew hに afx_msg LONG OnFindReplace(WPARAM wParam, LPARAM lParam); ダイアログ自体の表示もうできてるんですが、なんでメッセージこないんですか?
おーいエスパー
なんだよ、、、寝てたのに・・・
467 :
デフォルトの名無しさん :2007/07/05(木) 22:32:12
doxygen(Ver1.5.2)とHTML Help Workshopを使って、Windowsヘルプを 作成しているのですが、索引がどうしても文字化けしてしまいます。 INPUT_ENCODING = Shift-JIS DOXYFILE_ENCODING =UTF-8 と設定し、ページに関しては文字化けは解消されたのですが… 何か解決策があれば教えてください。
VCとdoxygenに何の関係が?
すんまそ。いまいちどこで聞けばいいか分からず一番最初に 目に入ったここで聞いてしまった; 別んとこで聞きます。
470 :
デフォルトの名無しさん :2007/07/06(金) 00:35:51
VC++2005を使ってます。 int型の値をテキストボックスに表示したいのですが、 int→System::Stringに変換できず困っています。 int→std::stringやSystem::String→intはぐぐると出てくるのですが、 int→System::Stringが出ません。 int型の値をいったんchar型の配列に入れなおして、Stringに変換しようと しても、やはりコンパイルエラーになってしまいます。 どのようにするべきでしょうか?
int i = 42; System::String^ s = i.ToString();
472 :
470 :2007/07/06(金) 00:58:52
ありがとうございます。 ToString()を使えば一発なんですね。
このスレの勢いがほとんどなくなったのは もうみんなMFC使ってないんですか?
474 :
464 :2007/07/06(金) 09:09:54
みんな検索置換ダイアログボックス使ったことないのかなあ。 ぜんぜんVC使いこなせてないんですねえ。 質問した私が馬鹿でした。
馬鹿はお前
>>474 そうそう、お前のがレベルが上なんだからこんなスレにはもう用無いだろ?
2度と来なくていいよw
手元の本みたら検索置換ダイアログはたいていのやつに載ってるな ざっと 見て4冊ぐらいにあった
478 :
464 :2007/07/06(金) 10:15:39
で?
本買えばいいよ
うちらに検証しろと
VC++6.0でActiveX DLLを作る方法はどこで勉強すればよいでしょうか?
ウイザードでできないの?
Visual C++で文字コードの変更ってどこからできますか? いちいちLつけるのめんどくさい(´・ω・`)
Visual C++に484が言うような機能はないし、 あったとしてもソースコードの文字コードと実行ファイルの文字コードは関係ないので、 ワイド文字・文字列にLを付けなければいけないことに変わりは無いぞ。
プロジェクトのプロパティ→全般→文字セット unicodeからマルチバイトに。
487 :
464 :2007/07/07(土) 11:50:40
だからさ、こんなスレに質問しないで本買いなね。 そこに全部答えが載ってるってさ。
>>486 TCHARではなくWCHAR固定なら意味無いだろ。
質問のレベルからすると、単に、
VC6から移行したら、文字列全部にLを付けなくちゃいけなくなった。なんとかならない?
ってことでは。そういう人向けには、
>>486 でOK。
なら文字列はコードに埋め込むんじゃなくてリソースで管理するようにすればいい☆
冷たくあしらわれたにも関わらず、必至にこのスレを覗きにくる464に萌えたw m9(^Д^)
質問が意味不明なら、まともな答えがもらえるわけないだろ 迷子センターじゃないんだし、泣いてたら誰かが面倒みてくれると思ってんの?
VC6でboostって使えないんですか? vector<string> v; string message = "This is a pen"; boost::algorithm::split( v, message, is_space() ); こんなテストコードをコンパイルすると error C2265: '<Unknown>' : サイズが 0 の配列への参照は不正です。 コンパイルされたクラスのテンプレートのインスタンス化 'boost::algorithm::size_descriptor<I>' の参照を確認してください fatal error C1506: ブロックが大きすぎて、コンパイルできません。 こんな調子なのですが
VC6なら仕方が無い。 試しにVC++ 2005 Expressでも入れてみ。
VC++6にできてVC++2005 Expressにできない事ってなんでしょう
>496は無視でいいよ
498 :
464 :2007/07/08(日) 11:52:09
古い文法を使ったプログラムをコンパイルする事
>496 ある程度自分で調べて違いをまとめてから質問してくれる?
調べもしないで質問するやつは死んでいいよ
ここは冷たいスレでつね
怠け者の相手はしてられん
CRTとして、MSVCRT.dllをリンクすること。
505 :
デフォルトの名無しさん :2007/07/09(月) 08:42:42
case WM_MOUSEMOVE: GetCursorPos(&mp); if (mp.y>200) { //mpはPOINT SetWindowPos(hWnd,0,0,0,40,80,0); } (VC++6.0 SDK) 上記のような書き方でマウスカーソルのY座標が 200を超えたらウィンドウのサイズを変えるようにしたいんだけど (ウィンドウのサイズは50,50 位置は 0,0) どうもこの書き方だと出来んのです。 どこをければいいんでしょう?
ウィンドウのサイズを50,50 じゃなくて200以上にしてやってみ
507 :
505 :2007/07/09(月) 08:58:13
>>506 説明不足ですいません。
本当は「普段はデスクトップ左上で小さく待機し
マウスカーソルが当てられるとウィンドウが大きくなり
マウスカーソルがウィンドウから出ると元の大きさに戻るランチャー」を作りたくて
実験してました。
どうやら、WM_MOUSEMOVEだとウィンドウの外に出た時
効かないようです。
マウスカーソルがウィンドウ外にあっても
動いたのを感知できるメッセージってありますか?
だから ウインドウの外にメッセージ来ないのが原因だって わかってないみたいだから 200以上にしてやってみろと言ったの
510 :
509 :2007/07/09(月) 10:17:27
マウスキャプチャは、ボタンを押している間しか効かないような・・・
512 :
デフォルトの名無しさん :2007/07/09(月) 23:31:25
動的引数関数を#defineでラップする方法を教えてください。 #define ABC( prm00, prm01, ... ) \ func( prm00, prm01, ...);\ void func( int prm00, int prm01, ... ) { } エラーになってしまいます・・・
#define ABC func でいいんでね?
typedef???
#define ABC func で ABC(prm01, prm02, prm03, prm04); か #define ABC(params) func params で ABC((prm01, prm02, prm03, prm04)); か 好きな方を
>>511 ボタンを押してるときに使う例がほとんどなのであって、押してる間しか効かないわけではない。
他のウィンドウをクリックすると解除されるけどね。
518 :
デフォルトの名無しさん :2007/07/10(火) 12:56:30
C++ってもう過去の言語なんだろ?
Yes, I did.
>>518 C# がおすすめ だからもう来ないで。
まぁ、さまざまな言語が使われているが、現在世の中で書かれてるプログラムで 圧倒的多数派はCとC++だよね。 過去の言語っていえば、過去の言語だけど。 生まれてちょっとだけチヤホヤされ、誰も話題にしなくなった言語は、C生存中に いくつあるだろう。 現在の言語で20年後にも話題にされるような言語はあるのだろうか。
英語
COBOL とか話題にはなってるな。 糞言語だって。
COBOLしか選択肢が無い時代だってあったんだよ それでも、オンライン端末でWWWの元祖みたいな画面(CICSとか)で DBとはSQLでデータやりとりしてたんだぜ。
それを言ったらマシン語直打ちしか選択肢が(ry
526 :
464 :2007/07/11(水) 06:42:21
ちょーいっぱいなデータをリストコントロールに表示させなくちゃなんないから
http://www5b.biglobe.ne.jp/~kouta_y/c/c07.html このページで仮想リストコントロールを寝ずに勉強しました。すごく分かり易いサンプルで助かりました。
でもリストビューのソートは自前でデータをソートさせなくちゃならないので、
このサンプル通り再起関数使ったクイックソートでやったら、
ちょーパソが固まってスタックオーバーフローになっちゃいました。
ちょーいっぱいなデータを扱うために仮想リストにするのに、ちょーいっぱいなデータを仮想関数使ったクイックソートを使うとスタックオーバーフローになるのは当たり前なのにさっき気付きました。
いったいどういうつもりであんなサンプル作ったんですか?
ちなみにシェルソートも寝ずに勉強して何とかなりました。
527 :
464 :2007/07/11(水) 06:45:09
>ちょーいっぱいなデータを仮想関数使ったクイックソート←ばつ 間違えました >ちょーいっぱいなデータを再起関数使ったクイックソート←○
CRTのqsort_s使え
サンプルはあくまでサンプルだし 丸ごとパクって使う馬鹿はいない
プログラムの楽しさに付いて教えてくれないか 何か作るか思って絵を描く、動かす為にドットパターンを作る、シナリオ考える ここまでは誰でも行けると思うが いざ、形にしようと行動するとプログラム出来ないし止めたになる これを回避するには楽しさを語って貰うのが一番だと思うんだ
>526 あんまりデータ多い時は実データをソートするのは無駄 仮想リストなんだから要求されてもないデータを並べ替える必要ない
リストビューのソートがクイックソートではない、という情報自体怪しい気がする。 昔、ソート速度が遅いのを修正した時は、 比較毎にリストビューにアイテムの文字列を問い合わせていたのが原因だった。 その時は、予めLVITEM.lParamを一意の値&ソート直前に必要な項目を全取得してlParamと対応付け、 として問い合わせを無くすだけでかなり改善した。
CHoge *hoge = new CHoge(); ではコンストラクタが呼ばれるのですが CHoge hoge; の場合はコンストラクタは呼ばれますか?
呼ばれません
ま、マジっすか?
寿司食いたい
なんで自分で試してみないんだろ
>>534 なにをいい加減なことを言っているのですか?
オブジェクトがメモリ上にインスタンスを作った時点でコンストラクタが呼ばれるでしょう
インスタンスどこで作ってる?
#include <iostream> class A { public: A() { std::cout << "呼ばれたじゃないか、嘘つくなよボケが" << std::endl; } }; int main() { A a; }
#include <iostream> って懐かしいお
クラス定義中のメンバオブジェクトの宣言時には呼ばれないがそれと勘違いしたんだろうか。
>>544 定義と宣言の使い方が微妙でよくわからん
// クラス定義 class CFuga { public: CFuga(){printf("CFugaクラスコンストラクタ\n");} }; // クラス定義 class CHoge { public: CHoge(){printf("CHogeクラスコンストラクタ\n");} CFuga m_fuga; // メンバオブジェクト宣言。まだCFugaのコンストラクタは呼ばれない。 void func(); }; // メイン関数 int main(void) { printf("main内でCHogeオブジェクトの宣言\n"); CHoge hoge; // ここで初めてコンストラクタが呼ばれる。CFuga→CHogeの順。 printf("main内でCHogeメンバ関数呼び出し\n"); hoge.func(); } // CHogeメンバ関数実装 void CHoge::func() { printf("CHogeメンバ関数内でCFugaオブジェクトの宣言\n"); CFuga fuga; // この関数が呼ばれるとここでもCFugaコンストラクタが呼ばれる。 }
構文上・意味上の話をすると、 546がクラス定義と言っているものは宣言だし、 main内でのCHoge hoge;は、自動変数の定義と言える(定義は宣言を兼ねるが)。 そしてfuncの実装はメンバ関数の定義。
> 546がクラス定義と言っているものは宣言だし // クラス宣言 class A; // クラス定義 class A { int n; };
役に立たん連中だな
C++初心者向きの話題だからどうでもいい
551 :
464 :2007/07/14(土) 22:02:41
552 :
デフォルトの名無しさん :2007/07/15(日) 01:02:18
VC++2005 EEを使用しています これまで正常に動いていた同じフォルダ内の ソースファイルとヘッダファイルを をsrcとincludeのフォルダに分けてました(整理のため) ビルドの結果 fatal error C1083: include ファイルを開けません。'xxx.h': No such file or directory というメッセージがでます メニュー>ツール>オプション>プロジェクトおよびソリューション>VC++ディレクトリ で前もって登録すればいいのかと思ったのですが どのようにすればいいのかわかりません。どなたかアドバイスを願います
>>552 構成プロパティ - C/C++ - 全般 - 追加のインクルードディレクトリ
に設定するのが無難かな。
554 :
デフォルトの名無しさん :2007/07/15(日) 01:22:21
>>553 速レス有難うございましたm(_ _)m
試してみます
555 :
デフォルトの名無しさん :2007/07/15(日) 07:23:19
すいません、学校のC言語の課題で 「入力した値を大きなものから順に表示するプログラムを作れ」 と言う課題があり、ここまでは作ってみたのですが、「★」の部分で どうしても下記のエラーメッセージが出てしまいます。 しかしどういう意味なのかが全く分かりません。 どなたか助言をお願いします・・・。 動作環境はVisual C++ 2003です。 #include<stdio.h> int input(float data[], int n)//数値を入力し、なお且つ数値の個数を求める関数 { int i; for(i=0;i<n;i++) { printf("実数値を一つ入力してください: "); scanf("%f",&data[i]); if(data[i]==0) break; } return(i); } void swap(float *a,float *b)//引数としてアドレスを与えられた二つの変数の値を入れ替える関数 { float c; c=*a; *a=*b; *b=c; return; }
556 :
デフォルトの名無しさん :2007/07/15(日) 07:27:05
続きです・・・。 float maxp(float *data,int n)//最大値が入っているアドレスを返す関数 { int i=0; float s=0; while(i<n) { if(s<=*(data+i)) {s=*(data+i);} i++; } return(s);//★error C2440: '=' : 'float' から 'float *' に変換できません。 } void sort(float *data,int n)//data配列内の数値を大きな値から順番に並べなおす関数 { int i=0; float *x; while(i!=n) { x=maxp(data+i,n-i); swap(x,data+i); i++; } return; } main() { float x[100]; int i,j=0; i=input(x,100); sort(x,i); while(j<i) { printf("%f\n",x[j]); j++; } }
宿題スレへ
558 :
556 :2007/07/15(日) 13:47:45
「初心者にVisual C++を教えるスレ」なんだから、答えてやれよ
>>555 実際にエラーになったのは、
★印の行じゃないのだろ?
maxp()の戻り値を使う所じゃね?
561 :
464 :2007/07/17(火) 01:40:47
初心者が答えるところでもありますん><
562 :
デフォルトの名無しさん :2007/07/17(火) 03:12:02
>>556 関数maxp()はfloatを返すんだから、
*x=maxp(data+i,n-i);
にしないとマズイのでは?
563 :
デフォルトの名無しさん :2007/07/17(火) 04:15:47
こんにちは。VC++で以下のコードを実行すると、ファイルを見つけられないと、エラーになるのですが、 ファイルはコードのあるディレクトリのどこにおけばいいのでしょうか。 いろいろ試したのですが該当なしでした。。。 よろしくお願いします。 int input_statement_from_file(char *one_statement, int *statement_length) { FILE *fp; char filename[64], input_one_statement_buff[65536]; int state = 0, length = 0; gets_s(filename); if ((fp = fopen(filename, "r")) == NULL){ printf("ERROR: could not open file. \n"); state = 1; goto exit; } /* Get data till ";" detection */ while(fgets(input_one_statement_buff, 65536, fp) != ";") { length++; state = 0; } fclose(fp); exit: return state; }
つGetCurrentDirectory 親プロセス次第で子プロセスのデフォルトカレントディレクトリが変化するので、 相対パスを使うときは注意しる。
565 :
デフォルトの名無しさん:563 :2007/07/17(火) 05:18:05
>>654 紹介ありがとう。
でも、”++”初めてなので、
Public Declare Function GetCurrentDirectory Lib "KERNEL32" Alias "GetCurrentDirectoryA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
という部分を扱い方(クラスの何か?)がわからんちんです。。。
どう見ても誤爆
568 :
デフォルトの名無しさん:563 :2007/07/17(火) 08:45:58
それapiじゃなくてclrの気がする うちの父親もホームセンターで蛍光灯買ってきたけど サイズ合わないから母に交換してきてくれと言われたけど 結局放置して埃かぶってる。 蛍光灯と言ってもいろいろ種類があるように VCといってもいろんなプログラムの作り方があるんだ だからいきなりわけのわからりプログラム作り始めてから 相談されても困るんだよね 基本から間違ってるんだと最初から作り直しだろうし
カレントディレクトリの変え方 絶対パスの指定方法 相対パスの指定方法 この辺知らないと作った本人がプログラム使えないだろう。
572 :
デフォルトの名無しさん:563 :2007/07/17(火) 09:35:08
>>569 コンパイルオプション指定で、無効にいくつかしたら/clrは使えるようになったようですが、
「識別子が見つかりません」となりました。わからない領域へ突入です。。。
573 :
デフォルトの名無しさん:563 :2007/07/17(火) 11:39:47
とりあえず、fopen_s()に代えてみたら、
デバッグディレクトリ上のテストファイルを読み込めるようになりました。
ただ、
char buff[64];
while(fgets(buff, 64, fp) != NULL);
でデバッグすると、初回呼び出し時、fgets.c上の
(str != NULL)
というところに引っ掛かり中断してしまいます。
問題点を把握できていません。
このプログラム(
>>563 )の問題点を指摘していただけないでしょうか。
>>573 中断した時の呼び出し履歴をみて、各階層の変数の値をチェックしよう。
>568 >572はどうなった? 知らんぷりする気か
>>573 つーか、、
>while(fgets(input_one_statement_buff, 65536, fp) != ";")
これは何をしたいの。fgetsの戻り値は何だっけ?
前の行のコメント読んだらわかりそうなもんだけど
中卒も馬鹿にしたものじゃないってことか?
580 :
デフォルトの名無しさん:563 :2007/07/17(火) 12:57:18
>>576 済みません、ソース間違っていました、「ヌル」でない時でした。
ヌルまでラインゲットです。
>>573 のように書いています。
その上で、上記のようなエラーが発生しています。
>>575 もともと、fopen()でファイルがこの関数見つけられなかったんで、
パスを表示してみればというアドバイスだったんです。
>>574 fgets.cの57行でストップしているので、そこの流れを見てみます。
>>580 VCやる前にCかC++の勉強した方がいいいな
CかC++スレへ行けば?
582 :
デフォルトの名無しさん:563 :2007/07/17(火) 13:50:52
結局、ヌルファイルを読み込んでいたためということでした。
ファイルをデバッグディレクトリへ置いて直接指定してみると実行できました。
>>581 そうします。ありがとうございました。
16ビットカラーを32ビットカラーにしたいんですがどんな感じになるでしょうか? ビット演算でおねがいします RRRRR GGGGGG BBBBB RRRRRRRR GGGGGGGG BBBBBBBB AAAAAAAA
>>583 ANDとORと左右シフトくらい知っとけ
違いません
unsigned short rgb16 = 0; unsigned tempR = rgb16 >> (5 + 6); unsigned tempG = (rgb16 >> 5) & ((1 << 6) - 1); unsigned tempB = rgb16 & ((1 << 5) - 1); unsigned long rgb32 = (tempR * ((1 << 8) - 1) / ((1 << 5) - 1)) << (8 + 8 + 8) + (tempG * ((1 << 8 - 1) / ((1 << 6) - 1)) << (8 + 8) + (tempB * ((1 << 8 - 1) / ((1 << 5) - 1)) << 8;
>>587 >ちがうっぽい
と思ったんなら、何でそう思ったかの過程を書けよ。
592 :
デフォルトの名無しさん :2007/07/21(土) 09:27:16
ダイアログベースでボタンを配置しておいて、 while文実行中(無限ループ)にそのボタンを押されるとプログラムを終了する、 という感じのものを作りたいんですが、どうすればいいですか? while文実行中はボタンを押しても無反応になってしまいます。
何でそんなことしとんねん。設計見直せ while文実行中にボタンが押されてないか確認
windowsプログラミングの常識を超えたね
>>592 ループをUIスレッドとは別スレッドで実行しろ
ボタン押されたらイベントハンドラでフラグでも立てるかEventをシグナルして
それをループ側でチェックすればいい
フラグの変数を使うのならvolatileにするのを忘れずに
596 :
592 :2007/07/21(土) 09:57:37
( ゚,_ゝ゚)プッ
タイマーでも使っとけば
イベントドリブンで作りたくないんだろ ゲームじゃないの
599 :
592 :2007/07/21(土) 10:05:38
( ^,_ゝ^)ニコッ
600 :
592 :2007/07/21(土) 10:11:18
601 :
デフォルトの名無しさん :2007/07/21(土) 10:13:20
>>600 m9(^Д^)プギャー あほすぎてわろた
602 :
592 :2007/07/21(土) 10:22:14
スレッドじゃないんですか?
603 :
592 :2007/07/21(土) 10:27:30
>>602 は偽者です。
スレッド難しすぎで諦めました。
昔ながらのスレッド使わないメッセージループ内包というのもあるが 諦めるのが一番簡単
逆転裁判
592を名乗ってるのは全部偽者です!(#゚Д゚)ニセモノコラァ!!
>>595 スレッドは難しそうなイメージがあり敬遠しておりましたが、
この機会に勉強してみようと思います。
>>597 例えば10秒経過したら自動的にプログラムを終了するとかでしょうか?
出来れば、ボタンが押されたときに終了させたいのです。
>>598 ボタンが押される(イベント)→終了
これはイベントドリブンということになるのでは?
とりあえずスレッドを調べてみます。アドバイスサンクス。
>>607 m9(^Д^)プギャー あほすぎてわろた
>>607 GUIプログラム作ったりネットワークプログラミングとかするならスレッドの知識は必須
がんばれ
質問するときトリップつければ偽者は出ないよ
というか見分けが付く
>>609 別に必須じゃないだろ。
何のために、WSAASyncSelect なんてものがあるんだよ。
まあ、個人的にはスレッドの方がわかりやすいと思うが、
スレッド起こせるようになっただけで、スレッドなんて
簡単と勘違いしてる奴がいるのが難点。
アフォだから苦労したんだねw同情するよ
ボタンが押されるイベントで終了すればいいだけだろ Whileになんの意味があるのかイミフメイ
スレッドって比較的簡単なことを数多く学ぶ必要があるし、初心者にとってはとっつきにくいだろうね。 でも慣れてくると592で言ってることぐらいは簡単に書けるようになるから頑張れ。
人それぞれ
昔、引継ぎしたソースはスレッドがメインで7個、サブで15個位あって大変だった 作った奴(すでに退社してたけど)ぶっ殺したくなった
>>609 ネットワークはスレッド使えば確かに簡単かもしれないが
GUIプログラムにスレッドが必須かといわれるとそうでも無い気がする
まぁ、メッセージループが単一だといろいろ問題があるのはわかるけど
インストーラーみたいなもん作ってるんじゃないのかと勝手に予想。 その昔の俺もはまったなぁ… 結局1つスレッド作って回避したけど。
レベルの低い質問ですいません VC++ Express Editionを使っています つい先日プログラミング始めたばかりで,一応C++の参考書に 目を通したので簡単なゲームでも作ってみたいと思ったのですが プロジェクト作成のさいにどれを使ったらいいのか分かりません
そこの 「図3 作成したプログラムの一例」 だけど、min の比較前に else つけると バグらない?
>>620 すいませんコンソールアプリケーションじゃなくて
ウィンドウアプリケーションが作りたいんです
いきなりVC++でGUIプログラムか 無理じゃね
微妙に分かってきましたありがとうございます
>>625 自分でもきついと思いますがやらなくてはいけないことなんで('A`)
ヘルプ読めカス
最大化しないでウィンドウを作成し、ウィンドウのサイズを 大きくすると、タブバーやボタンバーの灰色の下地の横の 長さが足りなくなって、右側に白い余白ができてしまうのですが、 どうしたら余白を無くすことができるでしょうか?
そんなんできたっけ テーマとか設定してる?
631 :
629 :2007/07/23(月) 02:41:47
>>630 レスありがとうございます。
テーマ等は設定せず、全てデフォルトで使っています。
SDKで、「猫でもわかるプログラミング」を参考に
タブバーやツールバーを作ってみたら、メイン
ウィンドウの幅を起動時の幅より広げた時に、広げた
幅の部分のタブバーやツールバーの下地が表示
されなくなってしまいます。
普通はそういう風にはならないと思うけど 猫でもわかるの作者じゃないからどうやったらそんな風になるのか知らないし、 プログラムに問題があるなら作者に聞いてみれば?
作者迷惑どう見ても629のせいです。
ウインドウの幅を変えた時にツールバーの幅を ウインドウの幅に合わせたいという意味だったら ウインドウの幅が変ったらツールバーの幅を ウインドウの幅に合わせるんだよ(自分で)
635 :
629 :2007/07/23(月) 06:36:23
VC++7.0でお尋ねします。 ソースファイルがプロジェクトファイルと同じフォルダに作成されるのですが、 ソースファイルの作成されるフォルダを別の場所に変更することはできないのでしょうか? ソースファイルとヘッダーファイルを別のフォルダにしたいのです。
638 :
636 :2007/07/23(月) 15:54:24
>>637 手順もしくは説明しているホームページを教えてくれるとありがたいのですが・・・。
639 :
636 :2007/07/23(月) 16:03:17
VC++7.0と書いてしまいましたがVC++2005の誤りでした。
640 :
636 :2007/07/23(月) 16:13:05
手作業でソースファイルとヘッダファイルを別のフォルダに移動させた後、 もう一度プロジェクトに追加してビルドすると fatal error C1083: include ファイルを開けません。'stdafx.h': No such file or directory というメッセージが表示されます。これが解決したらなんとかなりそうなのですが・・・。
プロジェクトからファイルを削除 実ファイルを移動 プロジェクトへファイルを追加
そもそも何で分けたいの? 分けたら、#include "xxx.h" → #include "../header/xxx.h" とかにすんの?
643 :
デフォルトの名無しさん :2007/07/23(月) 16:40:54
ユーザーインターフェーススレッドオブジェクトを newで生成したとき役目が終わると自動的に破棄されますか? deleteをしなければ破棄されていないことになりますか?
644 :
636 :2007/07/23(月) 16:48:44
>>642 昔UNIXの仕事をした時に、そこではソースをフォルダ分けしていたので
同じようにしないと気持ちが悪いというか・・・。
フォルダが適当に分かれていた方がファイルが探しやすいような気がします。
たとえば(ダイアログ名)フォルダの下にソースとヘッダの両方が置いてあるとか
>>641 さんのやり方でやった時に640のメッセージが出てきてビルドできないのです。
>>644 だったらプリコンパイルヘッダーの使用をやめてstdafx.hは捨てちゃえば
>>643 そのままではdeleteは呼ばれない。
PostNCDestroyでdelete this を呼んでWindowが破棄されたら
オブジェクトも消えるようにできる。
647 :
デフォルトの名無しさん :2007/07/23(月) 17:04:01
VC++2005EE環境でゲームを作り リリースビルドをして実行すると >構成が正しくないといわれて起動できないです… が表示されます。原因が分かりません。 どなたか意見などありましたら宜しくお願いします
648 :
デフォルトの名無しさん :2007/07/23(月) 17:04:41
Test *Testsure;に for(int i=0; i<10; i++){ Testsure= new Test; } をするとどうなりますか?deleteしないで newを繰り返しますから以前にnewした領域は 破棄されませんよね?
649 :
デフォルトの名無しさん :2007/07/23(月) 17:05:28
650 :
636 :2007/07/23(月) 17:18:23
>>645 実はプリコンパイルヘッダーとかstdafx.hの意味もよくわかってなかったりします・・・。
ところで自己解決しました。
[プロジェクトのプロパティ]−[構成プロパティ]−[C/C++-]-[全般]タブの
追加するインクルードディレクトリにヘッダを格納したディレクトリを設定すればビルドできました。
教えて下さった皆様ありがとうございました。
そもそもstdafx.hだけ移動させなければエラーにならないはず。
stdafx.hを移動するのがきもちわるい
>648 Testクラスが中でdelete this;とか発行してるかもしれないし。 削除オブジェクトに登録して削除してもらう実装も考えられる。 あるいは、実はGCを動かしているのかもしれない。
654 :
デフォルトの名無しさん :2007/07/23(月) 22:05:05
VC++2005を使って関数ポインタを作成し、クラスAが呼び出した クラスBから、所望のタイミングでクラスAの関数を呼びたいと 思っております。 そのために、関数ポインタを作ったのですが、コンパイルすると、 void (__clrcall *)(int)からvoid(__cdecl *)(int)に変換できません というコンパイルエラーになります。 原因を調べてみると共通言語ランタイムをclr:/pureではなく/clrのため というのがわかりました。他で開発されたdll、Libraryを使用するため、 /clrでコンパイルするように設定しております。 共通言語ランタイムを/clrにしたとき、 関数ポインタの受け渡しをするためにはどうすればよいでしょうか? 例などを教えていただけたらうれしいです。 [class Aの一部] CLASSB classb // class bの作成 classb.passfunc(funcpointer); //関数ポインタfuncpointerを渡す // この行でエラーが出る。 void funcpointer(int){ // funcpointerの中身 } [class bの一部] void passfunc(void (*func_)(int)){ // passfuncの処理 }
そういう風に書かれると関数funcpointerはAのメンバでないように見えるが、 そのエラーメッセージだと、void passfunc(void (__clrcall *func_)(int))にしたらどうだろう? いざとなったらBoost.Functionとかデリゲートとか 関数呼出できるものなら何でも受け付けるぞって奴を使えばいい。
>>654 関数の呼び出し規約についてちゃんと勉強しなされ
657 :
デフォルトの名無しさん :2007/07/24(火) 13:48:18
Visual Stadio 6.0(おそらくVC++ 6.0)使っています。 以前はVisual Stadio 6.0をフルインストールした状態のPCで使ってた『自作ソフト.exe』を 今回は容量の少ないシリコンディスク(2GB)のFAタイプPCで使用したいのですが、 Visual Stadio 6.0をインストールするほど容量が確保できないので、 そのまま『自作ソフト.exe』を起動したところ、アプリケーションエラーが発生し ソフトが起動しませんでした。 専門書等を見てみましたが 1)メイン及び、監視タスクのパス(フォルダ)位置が、pathに登録されているか? 2)アプリでOCX等が使われてたりすると、アプリのみでは実行できない場合があるため、 必要なOCXをそのPCに登録する必要がある。 などと書いてありましたがはっきりいってわかりません ちなみに、私は初心者というか普通にWordやExcelぐらいしか使えないレベルの人間なので ビルド(リビルド)ぐらいしか出来ないくらいの知識しかありません… しかもこの『自作ソフト.exe』を作った人が会社辞めてしまってるので、このソフトの中身すら 私には理解できない現状です。 (起動したときの使い方ぐらいしかわからないんです…) ちなみにOSはWindows2000 SP4で、 エラー内容は 「エラーが発生したので。『自作ソフト.exe』を終了します。 プログラムをもう一度開始する必要があります。」 という表示が出てきました。
>>657 Studioだろ
まず、Releaseビルドかどうか
DebugだったらReleaseでビルドしなおして
>>657 我が社にご依頼いただければ調査から必要な修正まで格安にて対応させていただきます。
>>657 MFCが共有DLLを使うようになってるだけの予感。
ソースがあってビルドできるならプロジェクトの設定に全て書いてあるのだが、
わかりませんの連発ではなんとも。
>>659 お任せしたいと思います。連絡先を教えて下さい。
dllないときはdllがないというエラーが出たはず
シリコンディスク(2GB)のFAタイプPCって 特定の業務専用機だろ
だろうね。OSも書いてないし、釣りじゃなければ地雷だね。
6.0ならプロジェクトメニューにメイクファイルのエクスポートがあるから それ出力して見てもらうのがいいかもな
666 :
デフォルトの名無しさん :2007/07/24(火) 17:33:13
::func(〜,〜); この記述って普通の関数とどう違うの?
>>666 namespaceをグローバルに限定している。
クラス内で使用しているなら、メンバ関数を誤って呼ぶのを防止する効果がある。
>>657 MFCDLLのバージョンはチェックしたのか?
669 :
デフォルトの名無しさん :2007/07/24(火) 23:39:54
なぜVC++のコードはやたら__が付いてるのでしょうか? どういうときにつけるのでしょうか。
670 :
654 :2007/07/24(火) 23:49:24
655さん、656さんありがとうございます。 void passfunc(void (__clrcall *func_)(int))にしても同様の コンパイルエラーが出ました。関数ポインタを渡すことは 不可能なのでしょうか・・・? デリゲートを薦めてくださいましたが、デリゲートはC#特有のものと 思っておりました。検索してもC#ばかり。 みなさんは関数を他のクラスに渡すときどのようにしてらっしゃるの ですか?
boost::function(w
>>670 基のコードはネイティブC++でもコンパイルできないだろ。
まず、非静的メンバ関数からポインタへの変換は存在せず、
非静的メンバにアドレス演算子を使用しても、
得られるのはメンバへのポインタと言い、普通のポインタとは全く別物。
更にC++/CLIの参照・値クラスでは、メンバへのポインタが使えない。
デリゲートはC#特有のものではなく、CLIが持っている機能でC++/CLIからも使える。
http://msdn2.microsoft.com/ja-jp/library/ms235237 (VS.80).aspx
でないとWindows Formsなんか困る。
>>669 下線で始まる名前は処理系のためのもので、一般の利用者が使ってよいものではない。
そのコードはどうせマネージドC++だろ。.NETに対応させるため、
様々なキーワードを追加しているが、ことごとく独自拡張扱いとして
処理系予約の名前になるよう追加されたキーワードは下線で始まるようになっている。
673 :
654 :2007/07/25(水) 00:09:56
671さんありがとうございます。 boost::functionはなるべく使いたくないと思っております。 Microsoft提供のものでできたらと思うのですが・・・・
いつかstd::tr1::functionをマイクロソフトが実装するときがくるかもしれない。 何年先のことだかわからないけど。
675 :
654 :2007/07/25(水) 00:17:50
672さん、ありがとうございます。 メンバのポインタが使えないことは初めて知りました。 現在、Form1.hという一番最初に生成されたヘッダファイル内に 関数を作成し、それを関数ポインタとして別クラスに渡していました。 関数ポインタを使うことはそもそも不可能ということでしょうか?
654はコードを正確にコピペしたのか気になる。 手で写したので写し漏れがあるなんてことはないか? このコードで同じエラーメッセージを再現できた。 しかしこれだと655で解決できるんだよな……。 void passfunc(void (*pfn)(int)); ref struct S { static void f(int); }; void test() { passfunc(S::f); }
677 :
654 :2007/07/25(水) 01:06:08
676さんありがとうございます。 現在、以下のようにしていますが、コンパイルエラーになります。 // Form1.h private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { ClassA classa; classa.SetFunc(FuncPointer); } public: static void FuncPointer(int pos){pos = 0;} // ClassA.h class ClassA { // 省略 // 〜〜〜〜 private: private: void (*PointerFunc) (int); public: void SetFunc(void (__clrcall *PointerFunc_) (int )){ PointerFunc = PointerFunc_; } };
>>677 SetFuncの引数だけでなく、それを代入するPointerFuncも
void (__clrcall *)(int)型にしないと駄目だよ。
関数へのポインタ型なんて、いちいち打つのが面倒だからtypedefしたほうがいいよ。
>>677 ところで、FuncPointerのpos = 0は、
ここで晒すためだけのダミーだよな?
680 :
654 :2007/07/25(水) 01:15:52
678さん、みなさん ありがとうございます!コンパイルが通りました。これで次のコーディング に進めます。 typedefにして設定するようにします。 ところで、このClassA.hを利用しようとする他のプロジェクトファイルを 作るとしたら、そのプロジェクトファイルは必ずVC++2005で作成した プロジェクトでなければならないのでしょうか?それとも、他の(VBや2003など) で作成したプロジェクトにも組み込めるのでしょうか? 非常に初歩的な質問で申し訳ありません。ついでで勝手ながらですが、 教えてほしいです。。。
681 :
デフォルトの名無しさん :2007/07/25(水) 01:16:11
ファイアーモックス!
>>680 そのままではVC++でしか使えない。
他のCLI言語で使いたければ、.NETクラスライブラリ(だったかな)のプロジェクトで
マネージドDLLを作る。その中でClassAを公開の参照クラスとして定義すればいい。
できたDLLと中のクラスは参照設定すれば使えるようになる。
ただし、CLRのバージョンが違うので、VS .NET 2002/2003では使えない。
当然CLI、特にCTSやCLSの制約を受けることになるので、その点は厄介。
CLIなんて世の中にゴミを撒き散らすだけだからやめてくれんかなぁ。 バカマイクロソフトに言ってるんだけどね。
684 :
654 :2007/07/25(水) 01:37:10
682さん、683さんありがとうございます。 要するに__clrcallの呼び出し規約に設定することで、一気に 汎用度が下がるのですね・・・? じゃあ、普通、VC++2005で汎用的?というか一般的にライブラリを公開 (提供)する場合はどうやって関数ポインタを実現するのでしょうか? 何かずれている質問をしているのかもしれません。
VBやらC#やらでもDLLを呼び出したいなら__stdcallを使う。 VC++だけなら気にしなくていい。 __stdcallと__cdeclの違いは調べておいたほうがいい。 __thiscallもついでに調べておけば、クラスとメンバの関係が理解できるかもな。
686 :
654 :2007/07/25(水) 01:59:12
685さん、ありがとうございます。 呼び出し規約について深く調べてみます。 みなさん、ありがとうございましたm(_ _)m
687 :
デフォルトの名無しさん :2007/07/25(水) 02:46:55
ファイアーモックス!
>>685 マネージドC++とC++/CLIなら件の__clrcallも欠かせないだろ。
689 :
464 :2007/07/25(水) 19:46:58
初心者スレの話題じゃない><
(LPCWSTR)char*のようにしてchar*からLPCWSTRにキャストすると 文字化けしてしまうのですが、どのようにしたらちゃんとキャストできますか?
>>692 orz
では、System::Stringからの変換は可能ですか?
VS2003です。シンボル情報を含んだ実行ファイルを、外部からCreateProcessで デバッグモードで起動させ、実行ファイルが含んでいるシンボル情報を動的に 取得したいと思っています。 CreateProcessで一度サスペンドさせ、SymInitializeをコールしてシンボルハンドラ を初期化させてモジュールアドレスを設定したいのですが、実行ファイル本体に含む シンボルを取得するモジュールアドレスに何を設定するかわかりません。 実行ファイルが読み込むDLLのシンボルは、デバッギが発生させるDLL_LOAD割り込みから 取得できています。 試しにLoadModuleイベントをすべて見張ってシンボルを出力してみたところ、実行 ファイルに含まれるシンボルは取得できませんでした。 誰か分かる人いませんか?
スレ違い
697 :
695 :2007/07/26(木) 22:43:34
スレ違いだったかもだけど、自己解決したので情報垂れます。 MapDebugInformation関数を呼んで、実行ファイルのベースアドレスを取得して SymEnumSymbolsCallbackから取得できました。別にCreateProcessを呼んでも 呼ばなくてもできますね。PDBファイルを作るように実行ファイルを作った時は PDBファイルがないとシンボルは取得できないようです。 LoadModuleイベントを組み合わせると、実行ファイルが参照するシンボルを全て 見ることができました。(Win32の隠しAPIも見れましたが、あれは問題ないのかな?) これでINT3仕込めば、シンボル参照ができるデバッガの完成です。 _64のサフィックスを付ける事ができる関数がほとんどなので、64bit対応も問題なさげ。 Vista対応は分からず。
698 :
デフォルトの名無しさん :2007/07/28(土) 22:04:40
はじめまして。 今日vc++を購入したのですが、教本で悩んでいます。 教本はc++のものでもよろしいのでしょうか? まだプログラムを打ち込んだことが一度もないのでvc++についての基本概念 などが理解できるものがあれば教えていただけますか?
最低限CかC++は知ってる前提じゃないかな まだだったら当然やっておかないと
では、先にc++等を勉強し満足するものが作れるまでvc++には 手を出さない方が良いでしょうか?
701 :
デフォルトの名無しさん :2007/07/28(土) 22:50:25
手を出さない方が良い
>>700 そういうものでもない。
C++はC言語を拡張しているが、考え方は全く違う。
せっかくVC++を買ったのならそれで色々作ってみたら?
最初はコンソールアプリケーションで練習すると、分かりやすい。
赤くてでかい本でC++プログラム言語(かな?) 第4版
というのが、C++のバイブル扱いになっていると思う。値段も高い。
同じ体裁でC++ Primerもある
金があるならまずこの二つかな。
俺も手を出さないほうがいいとは思うが もう買ってしまったんなら仕方ない。 まずはコンソールアプリケーションとC入門書ではじめるべし
704 :
デフォルトの名無しさん :2007/07/28(土) 23:15:09
C言語、VC++はやめておけ まずはC++(STL)がいいと思うぞ
>>704 は、VC++でSTLが使える事を知らないらしい。
しかも、C++がいいというが、処理系を書いていない。
釣りかもしれない
706 :
デフォルトの名無しさん :2007/07/29(日) 00:04:53
>>705 違うよ
統合環境として初心者向けでは無いんだ VC++は
初心者はコンパイルの速いBCCつかっとけ
>>705 704はCやVC++の本はやめとけという意味だと俺は思ったぞ。
708 :
704 :2007/07/29(日) 00:58:25
(C言語のみ、VC++は)本も本体もやめとけ とくに文字列操作はSTLから始めた方がいいぞ
700からでした。
STLの文字列操作もなぁ。
ありゃ。なに俺のハンドル名。
なにが?
Visual C++ Express Editionを使用しています。 テキストボックスに書きたいのですが、コンパイルができません。 初歩的かもしれませんが解決方法を教えてください。 コード public: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { debug1(); } int debug1() { textBox1->text = "あいう"; // ← 135行目 return 0; } エラーメッセージ c:\〜\projects\test2\Form1.h(132) : error C2248: 'System::Windows::Forms::Control::text' : private メンバ ( クラス 'System::Windows::Forms::Control' で宣言されている) にアクセスできません。 c:\〜\projects\test2\Form1.h(25) : 'System::Windows::Forms::Control::text' の宣言を確認してください。 c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : 'System::Windows::Forms::C ontrol' の宣言を確認してください。 テキストボックスのModifiersはpublicにしました(ここは関係ないんでしょうか) public: System::Windows::Forms::TextBox^ textBox1;
いいんだよ。
717 :
名無しさん@そうだ :2007/07/29(日) 03:03:47
こんな感じで普通に出来たぞ private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { testtext("あいう"); } void testtext(System::String ^s) { this->textBox2->Text = s; }
>>717 さん
ありがとうございます。
小文字のtextが原因だったようです。
しかし (System::String ^s) の意味も??です。
Visual C++ の道は険しそうです・・・
>>715 よ。
お前さんがやってるのは「C++/CLI」だ。
「C++」ではないことを指摘しておくぞ。
>>700 プログラミング初心者ならば、コンソールアプリをVC++の開発環境を使わないで作るのがいいかも
BCCを使ってもいいけどせっかく買ったVC++でもVC++上のビルドではなくて
コンソール上からでもコンパイル出来るからそれをやる方がいいと思う
古い考え方かもしれないけど、やっぱりc(c++)言語をやる人間はmakeファイル、コンパイル、リンク
の知識は知っていてほしいし
>>708 文字操作に関してはcから始めた方が良いと思う
文字操作はメモリの勉強の第1歩だし
以上、最近は管理職に回ってしまった中年SEの意見です
お前どんだけ(yr
722 :
名無しさん@そうだ選挙に行こう :2007/07/29(日) 07:45:20
> makeファイル、コンパイル、リンクの知識は知っていてほしいし > 文字操作はメモリの勉強の第1歩だし 無くても出来ることをわざわざやる必要なし 関数の受け渡しにc_str()が必要になる事以外に、char型で操作する必要なし ソースが難解になるだけだ
704ウゼェ
724 :
名無しさん@そうだ選挙に行こう :2007/07/29(日) 07:52:48
区切りを見つける find、部分文字列を取り出す substr 、 文字列連結 + 、領域自動確保が使えすぎる charでやる必要がどこにある? ポインタとかは考慮する必要はあるだろうが、文字列操作限定では string型で出来ないことはないだろ
さらにboostのstring algorithmを使えば向かうところ敵無しですからね
string 使おうと思ったら、クラスやメンバ関数を覚えてないといけない。 それに入出力を扱うならストリーム、さらに STL 特有のイテレータ操作なども必要。 正直初心者には、ポインタよりハードルが高いと思うんだがなぁ。
覚えなくてもその都度リファレンスマニュアル調べればいいじゃない その過程でストリームやイテレータの概念を理解していけば一石二鳥だよ ポインタ等の低レベルな操作はそれらを理解した後の方がやりやすい ような気がするんだけどどうもそれはあんまり一般的じゃないようだ というか、そもそもC/C++をやるやつそのものが周囲に少なかったり…orz
そうそう、AMSI Cの標準関数でも全部覚えてるかっつーと 覚えてないし、要はしたいことをするためにどうすべきかを 調べる能力が大事だね。
stringなんかよりprintfのほうがよっぽど使えるが。
730 :
名無しさん@そうだ選挙に行こう :2007/07/29(日) 15:00:41
出力(coutとprintf)を比べたらだろ それ以外ならstringだろ
まて、どっちが使えるかじゃなくて、 初心者が覚えるならどっちから、って話だったはずだ 問題から履き違えたら、答えが分かれるのは当然だぞ
でもまあポインタというかメモリの概念がわかってないと いろんなところでつまずくからなぁ 不正なメモリ操作をしてるのに全く気づかないとかになりがち
VC知らなくてもいい内容だと書き込みが増えるのがいつも不思議
736 :
デフォルトの名無しさん :2007/07/30(月) 16:59:56
アプリケーションを作成したんですが 1回目 2回目と作業をしていくと メモリ使用量が40kbずつどんどん増えていきます new deleteには気をつけてるつもりなんですが 他になにか原因になるようなものはありますか?
>>736 デバッガで実行して終了時にメモリリークはダンプされる?
他は、GDIオブジェクト(BITMAPとか)はメモリ使用量に出るんだったか?
タスクマネージャでGDIオブジェクトの数を見れるので、漏れをチェックすべし。
>>736 100回起動を繰り返して高々4Mでしょ。OK。合格。
739 :
デフォルトの名無しさん :2007/07/30(月) 19:43:45
>>737 勉強してからレスしますね
>>738 起動じゃなくて
メッセージを受け取って作業して
その作業がし終わったらなので
4Mは大きいですよね
ヘッダファイルの <new.h> はどういう時に使用するファイルなのか教えて下さい
obsoleted
742 :
740 :2007/07/30(月) 21:43:47
>>741 C++ではほとんど使われていない。と言う意味でしょうか?
回答ありがとうございました。
・・・出来れば<new.h>の意図するものを教えていただきたいです
>意図するもの obsoleted
プログラム組もうと思ってるんだよね? なんで、new.h を開いてみようとか思わないの? *new.h - declarations and definitions for C++ memory allocation functions
標準C++には<new>があるんで、そっちのことを少し書いてみるが、 operator newやnew[]、delete、delete[]などといった関数の宣言が置いてある。 new(ptr) hoge_tのようなvoid*の引数を1つ取る配置newなんかは、 これをインクルードしないと使えないはず。
746 :
740 :2007/07/30(月) 23:32:11
m(..)m
Visual C++ 2005について質問です。 読み込むファイル名を指定する以下のプログラム TCHAR tmpName[256]; sprintf_s( tmpName, sizeof(tmpName), "wanko.txt" ); を、構成プロパティ→全般→文字セット の項目が「Unicode 文字セットを使用する」 という設定のプログラムにコピーしたところ、コンパイルエラーが出ました。そこで、 WCHAR tmpName[256]; wprintf_s( tmpName, sizeof(tmpName), L"wanko.txt" ); と修正したところ、コンパイルは通ったのですが、 tmpNameに、「wanko.txt」の文字列が入っていないことがわかりました。 どこに問題があるのでしょうか? あるいは回避方法などが、あれば教えてください。よろしくお願いします。
>>747 やりたいことをはっきりしろ。
コンパイルエラーが出るのは、きちんとTCHARに対応したコードになってないからだ。
charでやりたいんなら
char tmpName[256];
sprintf_s(tmpName, sizeof tmpName, "wanko.txt");
TCHARでやりたいんなら
TCHAR tmpName[256];
_stprintf_s(tmpName, sizeof(tmpName)/sizeof(TCHAR), _T("wanko.txt"));
wchar_tでやりたいんなら
wchar_t tmpName[256];
_swprintf_s(tmpName, sizeof(tmpName)/sizeof(wchar_t), L"wanko.txt");
swprintf_s() 呼びたいのはこっちじゃ?
全然違うみたいだけど同名のやつがいろいろあるのかな? int wprintf_s( const wchar_t *format [, argument]... );
>>750 wprintf_s()はprintf()のワイド文字版のセキュア版
>>747 はsprintf_s()を置換するつもりで間違った関数を使ってしまったと言うだけ
よくありがちなのが、入ってるのに入ってないって騒ぐやつ Unicodeが表示できないものもあるからな
753 :
747 :2007/07/31(火) 22:02:44
>>748-752 wprintf_s を swprintf_s と書き直したところ、意図したとおりに動きました。
どうもありがとうございます。
工工工工工工エエエエエエ(´д`)エエエエエエ工工工工工工
ごちゃごちゃ書かれているが、748のTCHAR版が一番の正解だろ。
747には理解できません
TCHAR というのは、Unicode でも MBCSの どちらでも対応できるとですか?
758 :
デフォルトの名無しさん :2007/07/31(火) 23:58:39
てすと
>>757 「正しくコーディングすれば」大丈夫。
>>748 はその例。
もっとも、場合によってはそれが無駄に面倒なこともあるがな。
MBCSで必要なロジックが、SBCSやUCSの場合と明らかに異なる場合などがそうだ。
例えばTCHARでMBCSを考慮する場合は、文字へのポインタをインクリメントするのに
単に
s++;
と書いてはいけなくて、
CharNext()や_tcsinc()といったものを使わなければならない。
が、それは明らかに単なるポインタのインクリメントよりも高価な処理で、
記述も面倒になる。
最近では面倒くさくなって、 TCHARをほとんどWCHARとして扱うことが増えてる。 9x系OSは完全無視。
最近では面倒くさくなって、 TCHARをほとんどCHARとして扱うことが増えてる。 9xもNT系OSも完全考慮。
>>760 せめてunicows.libをリンクしてください。
運が良ければそれだけで9xでも動きます。
最近よく こんなの→ System::String ^s 見かけるんだけど、 「^」ってどういう意味ですか?
>>763 C++で.NETする気が無いなら知らなくても良い
じゃあ必要ないや
>>760-761 それなら、最初からTCHARなんぞ捨てて、明示的にchar/wchar_tに汁
APIはA/Wを明示汁
といいたいが、ATL/WTL/MFCはほぼTCHAR専用なんだよな……
>>763 C++/CLI と gcnew でググれ。
やだね必要ないもん
>>767 なんだ、マネージドC++か。興味なし。
362 :デフォルトの名無しさん [] :2007/08/01(水) 04:54:48 マネージドなプログラム組むならC++なんか使わねっつの!w
.NETってあの厨房御用達のやつ?マジ世の中から消え去って欲しい。ゴミを撒き散らすなよな。
772 :
デフォルトの名無しさん :2007/08/01(水) 12:48:17
PTSTRをstringにしたいんですけど、、、単純に代入しちゃだめ? ってか正直分かってないんです。
std::basic_string<TCHAR>へなら代入や初期化ができる。 std::stringはstd::basic_string<char>のtypedef。
774 :
デフォルトの名無しさん :2007/08/01(水) 13:33:56
VC++2002のMFCでアプリケーションを作ったんですが タスクマネージャーのメモリ使用量のところで 48000KBほどから少しずつ増えていき52000KBになると 例外エラーがでたあと アサーションいれた覚えが無いのにアサーションがでてきました これはメモリリークですか?
何の例外? デバッグ環境での実行?
776 :
デフォルトの名無しさん :2007/08/01(水) 13:55:37
unkownがなんがなんたらかんたらで命令が16進数のなんとかをなんとか すいませんメモしていませんでした コンパイルしたexeファイルを実行しました
>>772 std::basic_string<>はマルチバイト文字対応ではない。
TCHARを使うWindowsベッタリなプログラムなら、CStringを使うのもアリだ。
CStringなら内部的に_tcs〜系の関数を使っているので、MBCSで
コンパイルした場合には正しくマルチバイト文字が処理される。
Windowsベッタリではないコードを分離したいなら、TCHARは使わず
std::wstringで書くと良いと思うが、VC++のC++ランタイムは8.0になっても
未だにlocale周りにバグを抱えているので、wchar_tを使ったプログラムは
しばしばそれを踏むことになるかもしれん。
778 :
デフォルトの名無しさん :2007/08/01(水) 14:22:10
>>773 >>777 ありがとうございます。Javaから入ってVC++に慣れない日々が続いています。
まだ解決には至ってませんが、とても有益な情報ありがとうございました。
779 :
774 :2007/08/01(水) 15:58:16
一つのアプリケーションの使える メモリ領域の限界って決まってるんですよね? その限界を調整する方法ってあるんですか?
PCに搭載してるメモリを外したり増やしたりすれば調整できるよ
781 :
774 :2007/08/01(水) 16:19:24
ハード的な部分でしか無理ですか? VC++の設定では無理ですか? 限界まで使っているように見えないので
そりゃキミのプログラムの欠陥
メモリを確保する部分のコード晒してみ?
listexp2を使ってkernel32.dllをリストアップしてみました。 で出来上がったdswをVC++2005 Express Edition + Platform DSKで開き、 ビルドすると、 c:\_ernel32_dummy.cpp(7) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません c:\_ernel32_dummy.cpp(7) : warning C4508: 'd_ActivateActCtx' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。 というエラーが1行ごとに吐き出されてしまいます。 色々検索して調べてみたのですが、どうすれば直るでしょうか・・?
関数に戻り値の型指定子を書いてください
786 :
774 :2007/08/01(水) 17:08:49
TestThread=new TEST[MAX*num];//UIスレッド動的生成 こんな感じですが他のところも似たようなものです ちなみにこのときは75個ほど生成しています
new[]しているけど、delete[]ではなくdeleteを使っているなんてことはない?
>>785 なるほどと思いlistexp2で吐き出されたcppをみたところ、void指定されていませんでした。(^^;
listexportを使ってcppとdefを吐き出し、listexp2で吐き出されたプロジェクトに上書きしてから
開いてみたところ、正常にビルドできました。
本来なら新規プロジェクトでcppとdefを読み込んでdllビルドできればいいのですが、
ビルドして出来上がったdllはdllでないらしく・・・。
何はともあれ解決しそうです。ありがとうございました。
789 :
774 :2007/08/01(水) 17:18:17
delete[]をしています 自動変数の使いすぎが原因とかでしょうか? 領域が増えていってもエラーがでないようにしたいのです スレッドが反応してそれぞれ作業していくので48000KBほどから52000KBに 増えていっても不思議じゃないのですが メモリリークが原因かわかりませんが52000KBになってもエラーがでないように するにはどうすればいいのでしょうか?
どっかでオーバーランしてんじゃないの。 とりあえず、実行し直して、メモを取り直せよ
>>788 プロパティ→リンカ→入力→モジュール定義ファイル
にdefを指定しているか?
>>791 ありがとうございます。できました(>_<)。
794 :
デフォルトの名無しさん :2007/08/02(木) 07:10:21
プログラムの話になるか分らないのですがどなたか質問聞いていただけますか? 色々な海外サイトを回っていたらJust-In-Time デバックとの表示が度々出てきます。 ぐぐってみた所、他の方々は選択を無視出来るようなのですが、それをすると自分のブラウザは勝手に終了してしまいます。 無視せず進むとMicrosoft Visual Studioが起動しエラー表示後、逆アセンブリで〜など色々表示されるのですが理解できず苦戦しています。 現状がどうなっているのかも理解できません、なのでここに書き込みしてみました。 プログラマの方、プログラム経験者の皆様によろしければ助言など頂けると助かります。 使用OS WinXP 使用ブラウザ Sleipnir 設定などは特に変更してません。 よろしくお願いします。
そのまま苦戦してればいいよ
やすゆきに言えよ
>>794 >Microsoft Visual Studioが起動し
アンインストールすればおk
>>794 Visual Studioが入っていて、君のブラウザ(ブラウザに限らないけど)が回復できないエラーになると、そういう表示が出てくるのさ。
つまり、ブラウザのバグってこと。
特別なスキルが無い限り、『無視』でブラウザを強制終了するしかない。
解決策は
>>797 にするか、君のブラウザをもっとバグの少ないものに変えるべきですね。
エスパー登場
どこに?
シリウスの方向に 1 光年くらいのところに
面白くないよ
オマエモナー
?
!
const A&
807 :
774 :2007/08/03(金) 15:41:09
>>790 例外 unknown software exceptionというのがでました
>>807 きちっと環境作ってデバッグしたほうがよさげ
Visual C++2005をつかってDirect Xベースのゲームを作ろうかと思うのですが、 Visual C++本体とDirect X SDKの他に必要、重要となるものは何かありますでしょうか?
ネットがあれば何もいらない。
うそをうそと見抜く力が必要
そろそろできた? できなかったら何か足りないと思うよ
816 :
810 :2007/08/06(月) 12:27:53
マスタ〜アップしました♪
ここは初心者に冷たいインターネットですね
暖かすぎだと思うけど・・・普段どんだけインターネット満喫してるんだw
819 :
デフォルトの名無しさん :2007/08/07(火) 01:19:44
関数の入力をしているときに、 関数に入力する引数がガイドででるときと、でないときがあるけどなんで?
ツンデレ
Visual C++2005で開発してますが、ソースはViクローンで書いています。 Viでインテリセンス出す方法が知りたいです。
無理だろwww
それでもvimなら、vimならやってくれ(AAry
それでもvimなら、vimならやってくれない
もうMFCはおなかいっぱい。
テンプレートを使うと「コンパイルされたクラスの テンプレート のインスタンス化…」とかいう ワーニングが大量に出てうざいんですけど、これが出力されないようにする方法ってありますか?
>>830 なんでエラーコード書かないのか知らないが、警告消すだけなら
つ[#pragma]
まつがい。 つ[#pragma warning]
>>830 そんなんもしらんってバカじゃねぇの( ゚,_ゝ゚)
その警告だけに限定して消す方法は存在しません。
コンパイラオプションに「-EHsc」追加するといいよ
ワーニングって何だ? ウォーニングなら知ってるが。
837 :
デフォルトの名無しさん :2007/08/07(火) 22:56:00
オーバーフローを防ぐために、 <limits.h>をインクルードして、INT_MIN + 2以下INT_MAX - 2の値以上を入力したら、 再入力を促すようなプログラムを組んだのですが、 スルーされることがあるのはなんでですかorz ちなみに、Cygwinで実行した時は、うまくいきました。
勘違いだろ
840 :
デフォルトの名無しさん :2007/08/07(火) 23:42:29
>>839 どういう意味でしょう……?
もしかして、INT_MINやINT_MAXはint型じゃないんですか……?
オーバーフローしてからチェックしても遅いでしょう。 値チェックの直前で値をprintfして確認してみたら?
842 :
デフォルトの名無しさん :2007/08/07(火) 23:49:04
int使うならlong
843 :
デフォルトの名無しさん :2007/08/07(火) 23:49:44
intってOSに依存しなかった?
844 :
デフォルトの名無しさん :2007/08/07(火) 23:51:43
>>841 オーバーフロー後に確認してもダメなのですか……。
つまり、こんなプログラムは無意味?
do {
printf("値:");
scanf("%d", &n);
} while (n < INT_MIN + 1 || n > INT_MAX - 1)
もし、オーバーフローを起こす前に確認できるプログラムがあれば、
教えていだだきたい所存orz
少なくともこんなことしてたらダメだ。 int foo; scanf("%d", & foo); if (foo <= INT_MIN + 2) ...;
>>844 入力の桁数が非常に大きかった場合にscanf()がどういう値を返すかは
完全に処理系によるみたいだな
gccなんかは、intで表現し切れなかった場合はINT_MINやINT_MAXを
返すようだから、それで判断がつくだろう
一方、VC++あたりは、何も考えずに足し算掛け算を行いオーバーフローした
結果をそのまま返すので、それではどうしようもない
scanfがオーバーフローを検出して、INT_MAXを返す仕様なら それでもいいけどさ。
普通はキー入力で桁数チェックして それ以上はを受け付けないようにして コピペされちゃったら切り捨てかな
つ strtol
>>834 #pragma warningで普通にできるから
本人だろう
コンソールアプリケーションをビルドしてデバッグ開始したときにウィンドウが勝手に消えないようにするにはどうすればいいんでしょう
デバッグしてるなら、途中で止めるからそういうのは気にならないはずなんだけど、 止めない=デバッグしないのなら、CtrlF5とかでデバッグ無しで実行ってやればいい 止まる関数を入れてもいいし、ブレークポイントを設定してもいいけど。
つ getchar
ありがとうございます
856 :
デフォルトの名無しさん :2007/08/08(水) 18:29:34
ImmGetCompositionStringを使って、入力された文字列を拾っているのですが、 ウィンドウ左上に入力中文字が表示されてしまいます。 これを非表示にしつつ、文字を拾う方法はありますか? 拾った文字は、DirectXによって画面に出力させています。 WindowsXP、VC++6.0です。
>>856 DirectXのCustomUIサンプル見るといいよ。
これ以上話を続けるならDirectXスレで。
858 :
856 :2007/08/08(水) 21:10:29
>>857 ありがとうございます。
参考にさせていただきます。
昨日始めたような初心者です とりあえずC++に触ってみようと思い1番簡単なプログラムをコンパイルしようとしたのですが うまくいきません。どうすればいいのでしょうか? Visual C++ 2005 Exp #include <iostream> using namespace std ; int main() { cout << "Hellow World \n; return 0; } あほらしい質問かもしれませんがよろしくお願いします
後ろの"抜けてる えらメッセージでないの?
あ、忘れてました。コンパイルしてるのではちゃんとついてます
プロジェクトの設定が間違っているんじゃないの? それともコンパイルできたけどプログラムが一瞬で終了するとか?
Win32コンソールアプリケーションで作製しています プロジェクトの設定は初期のままで弄ってないです 出るエラーは プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。 '#include "stdafx.h"' をソースに追加しましたか? でした
初めからそう書けばいいのに。 プロジェクトの設定でプリコンパイルヘッダを使用しないにするか、 言われた通り#include "stdafx.h" をソースに追加すればいい。
>>864 ありがとうございます。コンパイルできました!
後
>>862 で言われてるようにプログラムが一瞬で終了しないようにするにはどうすればいいですか?
あ〜質問がgdgdだ…次回から気をつけます…
コマンドプロンプトから実行する
度々ありがとうございます 頑張ってみます
868 :
デフォルトの名無しさん :2007/08/10(金) 22:26:49
>LINK : warning LNK4067: エントリ ポイントがあいまいです。'mainCRTStartup' が選択されます。 この警告がほぼいつも出るのですが、なにか悪いのでしょうか? デバッグするときは、特に問題なく動くのですが……。
869 :
デフォルトの名無しさん :2007/08/11(土) 00:30:58
質問させていただきます.
http://www.ne.jp/asahi/nagoya/ahomaro/builder/cpb-061.html にある「プロジェクトWavePlay」のサンプルプログラムを落として
Visual Studioでコンパイルしようとしたのですが,
"fatal error C1083: include ファイルを開けません。'vcl.h': No such file or directory"
というエラーが出てしまいコンパイルできません.
一応Win32コンソールアプリケーションとして新規プロジェクトを作ってみたのですが
うまくいきません...
どなたかご教授いただけませんでしょうか?
>>869 どう見てもC++Builder専用のソースです。
ありがとうございました。
ちなみにC++Builderを知ってしまうと、その快適さ故に
以後のVC++の扱いが苦痛になるという恐ろしいシロモノです。
VC++を長く使って行きたいなら、近づかない方が身のためです。
注意しましょう。
ソースの編集をする画面上で、コピー&ペーストが使えなくなってしまいました。 又、Backspaceキーもその行の文字しか消すことができず、何だか 操作がおかしくなってしまいました。何か間違ってキーを押してしまった のだと思うのですが、わかる方いませんか? ちなみにVisual C++上以外では通常通りに操作が出来ています。
喜んで再インスコ
キーバインドをemacs風とかにした、とか?
875 :
872 :2007/08/11(土) 18:30:06
するわけないじゃんw emacsなんて・・・ダサッ
おいしいです
>>871 C++Builderってそんなにいいのけ。ちょっと検討してみっぺ。
| | | | /  ̄  ̄ \ (=) /、 ヽ J |・ |―-、 | q -´ 二 ヽ | ノ_ ー | | \. ̄` | / O===== | / | / / |
Visual Studioの自動変数ウィンドウってフォントを指定できるのでしょうか? いつのまにか超巨大なフォントになってしまって元に戻したいのですけど。
>>879 なんでそうなったのかは知らんが、指定はできるよ
ツールのオプションの環境のフォントおよび色で、設定の表示を自動変数ウィンドウにしてみ
881 :
879 :2007/08/13(月) 11:41:44
「設定の表示」のリストボックスに「自動変数ウィンドウ」のような項目はなかったのですが、 片っ端から選んでは「規定値を使用」を連打していったら直りました…。
882 :
デフォルトの名無しさん :2007/08/13(月) 18:59:58
String^ a = "aaa\r\nbbb\r\nccc"; //Splitを使って文字列Stringの配列に // "aaa", "bbb", "ccc"とさせるにはどうしたらよいのでしょうか? VC++ 2005を使っています。
>>882 それは最早C++とは言えなくなってしまった化け物だ。.Netスレへ逝け。
こんばんわ。熟練のC++プログラマのみなさまに質問です。組み込み系の開発をしていまして、だいぶ詰まっているので教えてください。 java->C++へのコンバートで、文字列をsplitするようなメソッドを作っているのですが、 目的通りに動いてくれません。 class Stringがあったとして String** A::split( const char* c_str, int c_str_len, char jud, int& ret_str_len ) こんな感じでポインタポインタを返そうとしています。 1度目はちゃんと動いてくれるのですが、2回目で失敗します。 このメソッド内でしているのは、細かい部分を除いてだいたいこんな感じです。 char* cpybuff = (char*)MALLOC( c_str_len + 1 ); String** pplist = new String*[ ret_str_len ]; // 必要分だけ確保します pplist[array] = new String( c_str ); // こいつはバッファのコピーを持ちます FREE( cpybuff ); return pplist; 呼び出し側では、 void A::main() { char c_line[] = { "1,2,3,4,5,6,7,8,9," }; int lenA = 0; int lenB = 0; str_listA = split( c_line, STRLEN( c_line ), ',', lenA ); str_listB = split( c_line, STRLEN( c_line ), ',', lenB ); } こんなイメージです。 ポインタポインタのとらえ方が間違ってるのでしょうか?
それをなぜ「Visual C++」のスレで質問するかな
C++のスレにも質問してるから
multi kayo
888 :
884 :2007/08/13(月) 22:43:22
マルチじゃないです…。 いまいちどこで質問していいか迷ったもので。。。vcでとりあえずはプログラムしてるので、アリかなと思ったんですが。 すいません。
889 :
884 :2007/08/13(月) 22:49:32
目的としてはjavaでString[] split()みたいなメソッドの戻り値を c++風に String** array split(); みたいにしてみました。 *str[1]->equals() ってな感じで使いたいけどうまくいかんのです。お助けを…
本当に「C++風に」やるんなら std::vector<std::string> split(const std::string &s) みたいになるだろうな Javaの移植ってことで手抜きをするために何でもポインタに しているのだろうけれど、GCでも使ってるの?
891 :
884 :2007/08/13(月) 23:02:07
ちなみにテンプレートと標準関数は使えないのです。。。
>>891 組込みだから?
malloc()/free()ではなく、MALLOC()やFREE()を用いているね。
そのわりに、placement newではなく普通のnewを使っているようだけれども。
それと、それだとイマイチ関数の仕様がわからんな。
>>884 のmain()の例で言うと、
split()の2度の呼び出しの後に、str_listA, str_listB, lenA, lenB
の中身はどうなって欲しいわけ?
Embedded C++か? それなら、素直に文字列配列クラスを一つでっち上げた方がいいな。
>>884 本当に1回目は動作するっていうんなら、
引用部分以外のところで領域破壊でもしてるんじゃない?
c_lineの領域自体を更新したり、c_line内のポインタをStringに保存してたりとか。
「Javaの移植」なら、全部Objectから継承させて、operator newで 専用のアロケータでも使わせるのかな テンプレート使えないってことでGenericsは無しで、 Object*を保持するArrayList風のクラスを作ればいいかと ゴミ掃除をどうするつもりか知らないがw
>String** pplist = new String*[ ret_str_len ]; // 必要分だけ確保します ここのret_str_lenの計算が違うとか というか、これは意味的にはsplitした文字列の数と推測すると、名前がスゴイな。 >pplist[array] = new String( c_str ); // こいつはバッファのコピーを持ちます ここでc_strという引数文字列全体を生成しているのはなぜだとか 破壊にミスってるのでは、とか。 まあ、それだけではアレだね
よくわからんが、こんな感じか String **split(const char *s, size_t len, char delim, size_t &arraysize) { arraysize = 0; for (size_t i = 0; i < len; ++i) if (s[i] == delim) ++arraysize; String **vec = new String*[++arraysize]; const char *p = s, *q; int n = 0; while (q = reinterpret_cast<const char*>(std::memchr(p, delim, len))) { vec[n++] = new String(p, q - p); len -= (q - p + 1); p = q + 1; } vec[n] = new String(p, len); return vec; } なお、ここではString に String(const char *, size_t) なコンストラクタが あることを仮定しているが、無い場合は適当に。 std::memchr()が使えない場合も、適当に。 メモリの解放については知らね。
質問です。 VC2003でVISTA用アイコン(*.ico:256*256の特大イメージ付き)を リンクさせてビルドしたのですが、 VISTA上で、特大アイコンが表示されません。 これってVC2003をつかっているからなのでしょうか? VC2005なら大丈夫なんでしょうか…(困)
900 :
デフォルトの名無しさん :2007/08/14(火) 21:36:35
PNG
メモリ開放のタイミングについて質問です。 使用環境はVC++ 2005 WinXPHomeを使っています。 下記のようなテストクラスを作成し、 class CTest { public: CTest() { m_pInt = new int; *m_pInt = 10; } ~CTest() { delete m_pInt; } int* GetInt() {return m_pInt;} private: int* m_pInt; }; // 続く
// 終了
上のクラスを、下記のように使ってみました。 void CSample1Dlg::OnOK() { int* pTemp = NULL; { CTest test; pTemp = test.GetInt(); } TRACE(_T("Num = %d\n"), *pTemp); } んで、このような使用法をした場合、TRACEでは無効なポインタを参照していると思うのですが、 なぜだか、この"Num = -17891602"という結果が出力されます。 もちろん、値自体は無効なのがはっきり分かるのですが、実際にはアクセスできないメモリに行ってると思うので、 TRACEで落ちてほしいんです。どうやったら、TRACEで落ちるように(間違いに気づけるように)なるのでしょうか。 よろしくお願いします。
,ヘ ,:ヘ. /: : \ /:: ! /::::..... \--―‐'.:.:::... ! プギャーーーーーーーッ /:::::: .::::::::::::: ', ,':::: /\ヽ_ヽv /: /\i .i:::: √___丶 ! !:::. / / tーーー|ヽ ! |::::.. ..: | |ヽ l _,-,.、 i;::::.. | |⊂ニヽ| | ! i´ヽ い {,-ゝ. ':;::::... | | |:::T::::| ! / l ,人 __,!...!_}ゝ l _ \:::::.... ト--^^^^^┤ / ヽ. '´ ` / / `ヽ `ゝ:::::........ ....../_ / ァ-- ' i::..... ;\!..-ー 、 /⌒ヽ 、\ / .:/ ` '''''ー- 、::::/ ,.. . `/::: 〉‐ 、 \ \ / ..::ノ .ソ' : /::. /:: 〉 \\,/ .:/ /i:. :,'::. /:: ./ヽ \! ..:;' / |:: |ヽ.:.. :'::/ \ .::/ / !::. i::.:.:`:‐"ー、_,ノ \:::/ / ,/ヾ;:.... /:.:.:.:.:/:::.:.. ヽ、 | :i `ー::':.:.::.:.:./\:::::.:.:. ':;
TRACE は別に不正なポインタで落とすようなマクロじゃないぞ。とりあえず。 でまぁ、デストラクタで開放した後 ポインタへNULL 代入しておけば ぬるぽコールで落ちるのでは無かろうか。
>>903 無効なポインタではないためではないかと
malloc や new では効率化のため、C/C++言語のランタイムがあらかじめ大きめに取得した
領域を切り出して使い、解放するときもC/C++ランタイムのバッファに戻すだけなので、
自分ではメモリを解放したつもりになっていても、OSからは無効領域に見えない。
このようなメモリの有効性確認にはC/C++ランタイムのデバッグ用サービス関数を使う。
_CrtIsValidHeapPointer あたりでググってみれ。
>>906 ありがとうございます。
void CSample1Dlg::OnOK()
{
int* pTemp = NULL;
{
CTest test;
pTemp = test.GetInt();
}
_CrtIsValidHeapPointer(pTemp);
TRACE(_T("Num = %d\n"), *pTemp);
}
とやってみたところ、うまい事_CrtIsValidHeapPointerで落ちてくれました。
>>907 ちょっとまて
_CrtIsValidHeapPointer はチェックするだけなので、
無効なポインタであっても FALSE を返すだけ。
通常は ASSERT マクロと一緒に使い、落とすのは ASSERT の役目。
もう一度、仕様と動作を確認した方がいいぞ。
ググって使用例とか探してみろ。
>>906 効率化という点では、現在はOSに全てを任せるような実装になっている罠。
まあ、デバッグ時は別処理になるので、デバッグ用関数を使う点では同意。
>>909 そうなの?
でも考えてみれば、HeapAlloc なら例としてあげた動作そのものだし、
OS側で頑張って最適化してればそれを特にラップする意味もないか。
指摘してくれてありがとう。
何言ってんのかさっぱりわかんないや (ノ_・。)
(ノ_・。) やいなんかわりぱっさかのんてっ言何
(。・_ヽ)
ぐっじょぶ( <_,` )b
>>908 あ、すいません。ASSERTは単に書き忘れただけです。そこら辺は分かってると思うので……
レスするとき、コピペしないでいちいち手打ちしてるの?
ブラウザでもdabbrev使いたひ
だせ
すいません、配列を使ったキューの作り方を教えてください。キューのデータ数を 保持する変数も必要でしょうか void QIn(char c) { Que[Q++] = c; if (Q > QSize -1) Q = 0; } char QOut(void) { char c; c = Que[P++]; if (P >= Q) P = Q; else if (Q > QSize-1) Q = 0; return c; }
920 :
デフォルトの名無しさん :2007/08/19(日) 08:22:41
Express Editionってプロジェクト内の複数のソースファイルの変数や関数の宣言とか使用箇所にジャンプとかできますか?
できるよ。 つーか、ダウンロードして試せばいいじゃん。
CPUやGPU、HDDなどの温度を取得したいんですが、 どうすればいいんでしょうか?
勉強すればいいよ
何を?
CPUやGPU、HDDなどの温度の取得の仕方
∩_ 〈〈〈 ヽ 〈⊃ } ∩___∩ | | | ノ ヽ ! ! / ● ● | / | ( _●_) ミ/ <こいつ最高にアホ 彡、 |∪| / / __ ヽノ / (___) /
∩_ 〈〈〈 ヽ 〈⊃ } ∩___∩ | | | ノ ヽ ! ! / ● ● | / | ( _●_) ミ/ <こいつ最高にクマ 彡、 |∪| / / __ ヽノ / (___) /
928 :
デフォルトの名無しさん :2007/08/20(月) 08:49:20
おまえもな
モナー
ぬるぽ
>>922 WMIのMSAcpi_ThermalZoneTemperatureまたはWin32_TemperatureProbe
ただし、BIOSにはかなり依存するみたい
猫でもわかるの時計の基礎をリスト通り打ち込んで実行するとエスケープシーケンスが 文字通り表示されてしまうのですがどうしたらいいですか?VS6でコンソールアプリケーション にしています。
ANSI.SYSをだな、、、、 ってOS何よ
XPですけどANSI.SYSをどうするんでしょう
>>935 諦めろ。
NT系で32ビットプログラムがエスケープシーケンスを使えないのは仕様。
もちろん代わりの方法はあるし、その方法は後のほうの章で出てくる。
記事の通りやってみましたが効かず困ってましたが仕様と言うことでここはとばして 先に進もうと思います。 ありがとうございました。
>>936 >1.DOSプログラムの場合 -> C:\SysemRoot\System32\CONFIG.NT , AUTOEXEC.NT
>2.Windowsプログラムは -> C:\SysemRoot\System32\CONFIG.WOW , AUTOEXEC.NT
>となります。
>ですから、DOSプログラムを処理する場合には、CONFIG.NT にはNECのPC9801と違って、
>ansi.sysを組み込んでやる必要があります。
あ?なにが、ですから、だよ。何を、ですから、だ?どこから、ですから、なんだよ。頭おかしーんじゃねーの?
ブログにコメントをつけずにここに書くほうがよっぽどどうかしている。
941 :
デフォルトの名無しさん :2007/08/25(土) 02:07:49
VC++2005 ExpressEditionを使ってます。 お馬鹿な質問かもしれませんが、exeファイルを作成するにはどうすればいいのでしょうか? int main(int argc, char *argv[]) ↑こんな形式で作成しているので、デバッグではなく コマンドプロントから開く必要があるのですが、実行ファイルが作られなくて……orz
F7
943 :
デフォルトの名無しさん :2007/08/25(土) 02:17:24
自己解決しました。d
死ね
生きろ
犯れ
スレ埋めにしては、早すぎだし酷い
しゃぶれよ
ダイアログボックスをxボタンクリックで閉じるにはどうすればいいですか? WM_DESTROYでは釣れないようなのですが。
普通に
>>949 ×ボタンクリックで閉じるには、×ボタン押せばいいんじゃない?
質問の仕方を変えてもう一度どうぞ
>>949 アホが意味不明な言葉使うな
モーダルならEndDialog
なんというかダイアログボックスだけのプログラムなんですけどXボタンを押すと どんなメッセージが来るのかわからないとEndDialog をどこに書けばいいかわからないです。
WM_COMMAND BN_CLICKED IDCANCEL Windowing - Dialog Boxes - Dialog Boxes Overviews - Dialog Box Programming Considerations を一通り読んでおくことを勧める
>>953 正解は954で良いんだけど
どういうメッセージが発生しているのかを調べるにはSpy++という開発ツールがあるから
使えるようになっておいて損は無いよ
IDCANCELだとESCキーと区別できないからWM_CLOSEのがいい
勉強になります。ありがとうございます。
ソースが長くなったのでソースを分割したいのですが ヘッダーファイル一つに関数をたくさん定義して ソースファイルいっぱ作って分割するとエラーがたくさん出ます。 ソース分割の仕方が詳しく載っているサイトってあるでしょうか。 検索してもC言語のソース分割しか無いもので…。
エラーの内容ぐらいちゃんと書こうな
958です。 ソースを分割したら error C2011: '_Game' : 'class' 型の再定義 '_Game' の宣言を確認してください と最初のエラーに出ます。 その下にも100以上エラーが出ます。 その殆どが「定義されていない識別子です」と言う感じです。 環境はOSはXPでVC++2005の無償版です。 誰か分かる方いましたら教えて下さい。 よろしくお願いします。
これはひどい
>>961 再定義してないかどうか確認してください
定義の記述が間違って無いか確認してください
>>961 ヘッダ用のファイルを、次のようになおしましょう。
#ifndef UNKO_BAKA
class _Game
{
〜〜〜〜
};
#else
#define UNKO_BAKA
#endif
964がウンコバカな件w
最初にアンダーバーを付ける識別子は将来予約語として使う可能性があるから 普通はつけないんだぜ。 だからUNKO_BAKAは良い例なんだぜ。 ”_Game”という識別子はお勧めしないんだぜ。
将来というよりも、現時点で既に コンパイラ・ライブラリその他処理系がどしどし使っているし、 むしろそのために予約されているのだし、 お勧めしないではなく、使ってはならない。 少なくともC/C++の規格ではそうなっている。 でもWin32APIのヘッダでも無視しているし、 VC++使っていると無視せざるを得ない状況も度々訪れる罠。
せめて #ifndef UNKO_BAKA #define UNKO_BAKA class _Game { 〜〜〜〜 }; #endif じゃないのか 多重インクルードガードになってねーよ
969 :
964 :2007/09/05(水) 05:01:01
そうでした。 ありがとうございました。
ところで、958の問題は解決したのだろうか?
どうでもいい
>>971 どうでもいいのは確かだが、この数レスって結局958が発端だろ
たしかにそうだけど、、、やっぱりどうでもいいや
958本人の反応がない限りどうでもいい。
例え反応があったとしてもどうでもいい
そんな事より聞いてくれよ 蚊に刺されてかゆいんだが
マジで?ヤバくない?
まずいね、蚊に刺されて痒いってのは。
え、そうなんですか?どうしよう・・・
かくか、薬を塗るか、我慢するか、どれかを選ぶしかないかも
981 :
デフォルトの名無しさん :2007/09/08(土) 12:52:16
アプリケーションの一番左上にMFCアイコンとタイトル文字が表示されますが タイトルを変えたくて文字列リソース(String Table)のIDR_MAINFRAMEの1つめを変えました 「ここの文字列\n〜\n〜\n〜\n〜\n〜\n」 タイトルは一応変わったのですが アイコンとタイトルの横に「-無題」や他のマシンでは「-Untitled」がついてしまいます この横についてくる無題等をはずしたいのですが どうすればいいのでしょうか?
>>981 FWS_PREFIXTITLE、FWS_ADDTOTITLE でググれ。
>>970 あれだ、無償版ってのがいけなかったんだろうw
984 :
デフォルトの名無しさん :2007/09/09(日) 16:27:30
デバッグ用の最適化を全く行っていないコードの 一部分だけ最適化を行うことは可能でしょうか。
986 :
984 :2007/09/09(日) 17:39:47
>>985 optimizeでは最適化を行ったコードの一部を無効化することはできるのですが
逆はできないようです。
(アセンブリを見たり、時間を計測して確認しました)
一部分だけ別ソースにすりゃいい
インラインアセンブラで最適化したコードを埋め込む
989 :
984 :2007/09/09(日) 18:36:47
>>987 別ソースってどういうこと?って思ってたら
ソースファイル単位でコンパイルオプションの設定ができるんですね。
今回最適化したい部分もちょうどソースファイル単位なので
この方法で行こうと思います。
ありがとうございました。
>>988 多少手間がかかりそうなのでそれは避けたいところです。
↓次スレよろ
| 〃∩ ∧__∧ | ⊂⌒ ( ・ω・) | `ヽ_つ ,.ヘ_ヘ | ( ) ↓ u,__っ)
↓ ∩___∩ ↓ | ノ ヽ/⌒) あばばばばばばばばばば ↓ /⌒) (゚) (゚) | .| ↓ / / ( _●_) ミ/ ∩―−、 ↓.( ヽ |∪| / / (゚) 、_ `ヽ ↓ \ ヽノ / / ( ● (゚) |つ おちんちんびろ〜〜〜ん ↓ / / | (入__,,ノ ミ あばあばばばば ↓ | / 、 (_/ ノ ↓ | /\ \ \___ ノ゙ ─――、 ↓ | / ) ) /\ _ ヽ ↓ ∪ ( \ (⌒0 /\ ヽ (_ノ ↓ \,,_) `ヽノ / 、 )O ↓ ( </ / ↓ > ( 〈 ↓ (,,__(,,_ノ
993 :
sage :2007/09/10(月) 10:01:59
VC++6.0でビルドした時に、ビープ音がなるのを防ぎたいと思っているのですが、 どの項目を参照してよいのかが分からずに苦戦しております 唐突で申し訳ありませんが、ご教授願います。
>>993 あまり意識したことなかったけど、確認したら確かに音鳴ってた。
ビープ音とは呼ばないと思うけど。
で、コントロールパネルからサウンドトオーディオのプロパティを開いて、
その中のサウンドの関連付けで制御できるみたい。
Microsoft Developer みたいなカテゴリがあるので、その中。
問題は、初期値だと音が割り当てられてないように見えるのに
音が鳴っていること。
環境の問題かもしれないけど、一旦、別の音を割り当ててから解除
したら鳴らなくなったよ。
995 :
993 :2007/09/10(月) 11:19:27
レスありがとうございます。 何とかやってみます。
その程度で何とかって・・・
うめ
う
ほ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。