★初心者にVisual C++を教えるスレ★ Part35
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/10/27(火) 21:15:13お兄ちゃんお姉ちゃん達が優しく、時には厳しく回答してくれるスレッドです。
■質問するにあたって
・エラーや警告のときはエラーメッセージを書きましょう。
・開発環境も書きましょう、特にWindowsForm、MFC、Win32アプリケーションの区別。
・できるだけ具体的に。
質問の仕方については次のページが大変参考になります。
http://www.hyuki.com/writing/techask.html
■回答するにあたって
・回答する場合はその答えに至るための「コツ」も書いてあげると良いでしょう。
(MSDNのどの項目だとか、何のキーワードでGoogleするとか)
・ネタや煽りは軽く流しましょう。
【過去スレ】
Part34 ttp://pc12.2ch.net/test/read.cgi/tech/1245382769/
Part33 ttp://pc12.2ch.net/test/read.cgi/tech/1235292263/
Part32 ttp://pc11.2ch.net/test/read.cgi/tech/1225422971/
Part31 ttp://pc11.2ch.net/test/read.cgi/tech/1217494948/
0002デフォルトの名無しさん
2009/10/27(火) 21:18:120003デフォルトの名無しさん
2009/10/27(火) 21:26:29■MFC相談室 mfc21d.dll■
http://pc12.2ch.net/test/read.cgi/tech/1250919279/
Win32API質問箱 Build82
http://pc12.2ch.net/test/read.cgi/tech/1253699773/
【C++】 DirectX初心者質問スレ Part26 【C】
http://pc12.2ch.net/test/read.cgi/tech/1256403984/
C言語なら俺に聞け(入門篇) Part 54
http://pc12.2ch.net/test/read.cgi/tech/1254829314/
C++相談室 part74
http://pc12.2ch.net/test/read.cgi/tech/1256397778/
C/C++の宿題片付けます 131代目
http://pc12.2ch.net/test/read.cgi/tech/1255709298/
【初心者歓迎】C/C++室 Ver.69【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1256022655/
0004デフォルトの名無しさん
2009/10/27(火) 21:30:42MSDN ライブラリ
http://msdn.microsoft.com/ja-jp/library/default.aspx
Windows SDK for Windows Server 2008 and .NET Framework 3.5
http://www.microsoft.com/downloads/details.aspx?FamilyID=f26b1aa4-741a-433a-9be5-fa919850bdbf&DisplayLang=en
0005デフォルトの名無しさん
2009/10/27(火) 22:18:300006デフォルトの名無しさん
2009/10/27(火) 22:23:390007デフォルトの名無しさん
2009/10/28(水) 01:32:44一番下のビットを調べればいいような気がしますが、やり方がわかりません
00087
2009/10/28(水) 01:45:36int y = 1;
if((x & y) == 1){
こんな条件式でいいんでしょうか?
0009デフォルトの名無しさん
2009/10/28(水) 02:16:55if (x & 1) { ... }
だけでもいい
0010デフォルトの名無しさん
2009/10/28(水) 02:31:43BOOL IsKisuh( int nValue)
{
if ( nValue == 0) return FALSE;
return ( nValue % 2);
}
0011デフォルトの名無しさん
2009/10/28(水) 04:24:45関数名がキモイ
0012デフォルトの名無しさん
2009/10/28(水) 09:07:11なんで0を例外扱いしているの?
まさか、0を2で割ってはいけないなんて寝惚けたことは言わないよね?
0013デフォルトの名無しさん
2009/10/28(水) 09:10:260014デフォルトの名無しさん
2009/10/28(水) 10:01:440015デフォルトの名無しさん
2009/10/28(水) 13:13:330016デフォルトの名無しさん
2009/10/28(水) 15:06:30ボタンイベント【OnBnClickedButton1()】で、
AfxBeginThread( ThreadFunk1, NULL );
を実行したいです。
その下に、
UINT CStringTestDlg::ThreadFunc1(LPVOID dummy)
{
AfxMessageBox(_T("スレッドが呼ばれた"));
return( 0 );
}
また、TestDlg.hファイルに、
static UINT ThreadFunc1(LPVOID);
を追加しました。
C2065: 'ThreadFunk1' : 定義されていない識別子です。
C2653: 'CStringTestDlg' : 識別子がクラス名でも名前空間名でもありません。
ですが、上記のエラーが出てわかりません。
他のツールソースを見ながら少しずつ出来ることを増やしていこうと勉強中なのですが、
これは他のソースからAfxBeginThreadを勉強しようと思いそれを使用している部分をコピーしました。
エラーが出るので、クラスビューから追加しなければいけないのかとも思いましたが、
UNIT は選択できないため、もしクラスビューから追加するのであればその方法も教えて頂きたいです。
同じ方が見ているかわかりませんが、Part34 949 です。
宜しくお願いします。
0017デフォルトの名無しさん
2009/10/28(水) 15:17:48ThreadFunc1 を宣言してるのに、ThreadFunk1を使おうとしてるから。
k と c な。
おかしいと思ったら変数とかはコピペでもっていってみるといい。
001816
2009/10/28(水) 15:30:20ご指摘ありがとうございます。
盆ミスですみません。
error C2653: 'CStringTestDlg' : 識別子がクラス名でも名前空間名でもありません。
しかし上記にスペルミスはありませんでした。(「TestDlg」検索でたくさんひっかかるのを確認。)
0019デフォルトの名無しさん
2009/10/28(水) 15:43:00それはファイル名からの推測だが、
CTestDlgクラスを作ったのに雑誌通りCStringTestDlgのメンバとして書いてるんだろ。
CStringTestDlg → CTestDlgでどうよ
0020デフォルトの名無しさん
2009/10/28(水) 15:44:23002116
2009/10/28(水) 15:52:01ああああああああああああ。
ありがとうございます。
CStringなんとか と、先入観で勘違いをしていました・・・。
CTestDlgで通りました。
ありがとうございます。
0022デフォルトの名無しさん
2009/10/28(水) 15:57:18>C2065
>C2653
コンパイラ エラー のコードがちゃんと出ているんだから、
ヘルプ(MSDN)で調べるクセをつけといたほうがいいぞ。
考えられる原因も、ちゃんとそこに載っているから。
002316
2009/10/28(水) 16:06:19了解しました。
MSDNもよくみるようにします。
0024デフォルトの名無しさん
2009/10/28(水) 20:56:43プロジェクト : error PRJ0015 : NULL デバイスがシステム内にありません。ビルドを実行できません。
と出てビルド?できません
ググったらhttp://msdn.microsoft.com/ja-jp/library/c22s4fy4.aspxが出てきたんですが
リソースをあけても出てくるので
”NULL デバイスに対する適切な特権がないためにこのエラーが発生することもあります。”
ということなんでしょうか? これをどうすればいいのかわかりません。
0025デフォルトの名無しさん
2009/10/28(水) 21:02:370026デフォルトの名無しさん
2009/10/28(水) 21:34:460027デフォルトの名無しさん
2009/10/29(木) 15:57:03たとえば最初にint A[5]とか宣言した後に6番目の要素を追加するような感じで
メモリ領域を確保とかすれば可能なんでしょうか?
0028デフォルトの名無しさん
2009/10/29(木) 16:27:35いみふ。日本語でOK
0029デフォルトの名無しさん
2009/10/29(木) 16:29:430030デフォルトの名無しさん
2009/10/29(木) 17:15:400031デフォルトの名無しさん
2009/10/29(木) 17:17:21無くても書けるだけであったほうがわかりやすい時は使った方がいい。
0032デフォルトの名無しさん
2009/10/29(木) 17:52:440033デフォルトの名無しさん
2009/10/29(木) 21:46:14�@クラスAの関数内でループさせ、クラスCの関数に配列Bからひとつずつデータを渡して何度も呼び出す
�A配列Bを(グローバルに宣言して)クラスCの関数に受け渡して、クラスCの関数内でループさせる
どちらの方法を使うほうがよりスマートでしょうか?
詳しく書くと、クラスCは描画処理関連のクラスで、描画はクラスCでしか行えません
クラスAの関数で描画用の情報をまとめてローカルな配列Bに入れています
�Aの方が速度的に速そうな気がしますが、�@の方がグローバル宣言しなくていいのでプログラム的に簡単なようにも思います
描画処理自体の回数はどちらも変わらないので、�@の方が良いんでしょうか
003433
2009/10/29(木) 21:49:060035デフォルトの名無しさん
2009/10/29(木) 22:13:10教わった通りのことしかかけない自分で考えることのない人はそれでいいよ
0036デフォルトの名無しさん
2009/10/29(木) 23:23:360037デフォルトの名無しさん
2009/10/30(金) 02:14:08WindowsのGUI自体もほとんど反応しなくなってしまうのですが、どういった要因でフリーズしてしまうのでしょうか。
デスクトップのGUI全体が半死状態になって
Ctrl+Shift+Escでタスクマネージャを起動させてもまともにコントロールが表示されず、Visual C++のプロセスを殺すこともできなくて
PCの再起動かけないといけない状態です。
使用しているソフトはVC++2008EE SP1、XP Home Edition SP3で用いています。
0038デフォルトの名無しさん
2009/10/30(金) 09:58:14それだけの条件では何が起きているかまでは想像しようがありません。ステップオーバーしようとしている関数が悪さをしているのでは?
>>33
クラスAの関数から配列BをクラスCの関数に渡すことはできないの?
構造体の配列でも引き数で渡すことはできますよ。
尤も、配列ではなくvectorにしておけばサイズ情報を別パラメータにしなくていい分よりシンプルになりますが。
0039デフォルトの名無しさん
2009/10/30(金) 11:47:170040デフォルトの名無しさん
2009/10/30(金) 11:51:43>37? だとしたら、動作環境が劣悪なんじゃないの? 特にメモリ容量辺りを見直すべし。
0041デフォルトの名無しさん
2009/10/30(金) 11:56:20仮想メモリというか、ページファイルも含めれば十分にあると思います。
0042デフォルトの名無しさん
2009/10/30(金) 12:12:12OS入れなおしで直ったが・・・
0043デフォルトの名無しさん
2009/11/01(日) 22:10:51004443
2009/11/01(日) 22:23:50「プリコンパイル済みヘッダーがありません」というのが
#include "stdafx.h" を書いていっても消えません
004543
2009/11/01(日) 22:31:14VC++ 2008 Express Editionでした
0046デフォルトの名無しさん
2009/11/02(月) 08:59:08ただの Visual C++ ユーザー、Visual Studio ユーザー
って多いよね。
プログラマではなく、ただの統合環境(IDE)ユーザーでしかない人。
IDEをそれなりに使いこなして、アプリっぽいものを作れる人と、
IDEがあってもなくても、アプリをガツガツ組める人とは
雲泥の差がある。
0047デフォルトの名無しさん
2009/11/02(月) 09:55:35デバッガ使える環境なのに使わないとかありえんだろ。
検索と同じように、コツというものはあるけどな
0048デフォルトの名無しさん
2009/11/02(月) 11:20:14VCは初心者だけど他で経験あるやつ
万年初心者のやつ
初心者といってもいろいろだろ
0049デフォルトの名無しさん
2009/11/02(月) 11:22:18IDEの使い方は必要最小限しか知らない
0050デフォルトの名無しさん
2009/11/04(水) 13:00:07size = GetGlyphOutline(hdc, str[i], GGO_GRAY4_BITMAP, &gm, 0, NULL, &Mat );
こんな感じで使っているのですが、この関数の戻り値がループの初回は460で二回目は0xFFFFFFになります
それぞれの引数を初期化したり定数にしてみたりしましたが変わりません
この関数が0xFFFFFFを返すというのはどういう状況なんでしょうか
0051デフォルトの名無しさん
2009/11/04(水) 13:29:51MSDNによると、
--
戻り値
フラグ GGO_BITMAP、GGO_GRAY2_BITMAP、GGO_GRAY4_BITMAP、GGO_GRAY8_BITMAP または GGO_NATIVE が指定されていて関数が成功した場合、
0 を超える値が返ります。失敗した場合は、GDI_ERROR が返ります。これらのフラグのうちの 1 つが指定されていてバッファサイズまたはアドレスが 0 の場合、必要なバッファのサイズがバイト単位で返ります。
GGO_METRICS フラグが指定されていて関数が失敗した場合、GDI_ERROR が返ります。
--
ということだそうだ。
0052デフォルトの名無しさん
2009/11/04(水) 13:36:380053デフォルトの名無しさん
2009/11/04(水) 13:37:15どうも
#define GDI_ERROR (0xFFFFFFFFL)
ということなので、どうやらGDI_ERRORが返ってきてるようですね
引数変えたりしてもうちょっと試してみます
0054デフォルトの名無しさん
2009/11/04(水) 13:48:55エラーが返ってきてるのがわかったら次はGetLastErrorだろ
0055デフォルトの名無しさん
2009/11/04(水) 15:14:21ここがループ内で変わってるから、違う結果になってるだけだと思う
0056デフォルトの名無しさん
2009/11/04(水) 15:24:280057デフォルトの名無しさん
2009/11/06(金) 03:21:301>c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(32) : error C2059: 構文エラー : '文字列'
1>c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(32) : error C2143: 構文エラー : ';' が '{' の前にありません。
1>c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(32) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
#ifdef __cplusplus
extern "C" {
#endif
インクルードファイルの" extern "C"{ "という部分で何故か怒られます
何かインクルードファイルが足りてないとかでしょうか?
0058デフォルトの名無しさん
2009/11/06(金) 03:28:000059デフォルトの名無しさん
2009/11/06(金) 03:39:420060デフォルトの名無しさん
2009/11/06(金) 03:55:270061デフォルトの名無しさん
2009/11/07(土) 10:12:35プロジェクト共通の名前空間内でusing namespace std;
みたいな使い方してるんだけどStdAfxってこういう使い方でいいんでしょうか?
0062デフォルトの名無しさん
2009/11/07(土) 12:06:180063デフォルトの名無しさん
2009/11/07(土) 13:52:01FindFirstFile() API を呼んで、返ってきた WIN32_FIND_DATA の
nFileSizeHigh および nFileSizeLow メンバを調べる
0064デフォルトの名無しさん
2009/11/07(土) 14:49:11#include <boost/filesystem.hpp>
int main()
{
namespace fs = boost::filesystem;
fs::path p;
std::cin >> p;
if(fs::exists(p)){
if(fs::is_directory(p)){
std::cout << "Directory." << std::endl;
}else{
std::cout << "size: " << fs::file_size(p) << " bytes." << std::endl;
}
}else{
std::cout << "Not found." << std::endl;
}
}
0065デフォルトの名無しさん
2009/11/07(土) 17:46:57if と else の間の文にはより短いほうを記述しなさいって習わなかった?
0066デフォルトの名無しさん
2009/11/07(土) 18:01:28短い方とか聞いたことない。
006762
2009/11/07(土) 20:14:30ありがとうございます
その構造体、調べてみると上位32ビットと下位32ビットを記録するってあるんですが、
32ビット超えててもWIN32APIで扱えるんでしょうか?
006862
2009/11/07(土) 20:15:460069デフォルトの名無しさん
2009/11/07(土) 20:38:06当然32ビット超えなら余裕で大丈夫だろ
0070デフォルトの名無しさん
2009/11/07(土) 21:26:57DirectXも含めた形でコンパイルするにはどうすれば良いでしょうか?
0071デフォルトの名無しさん
2009/11/07(土) 23:32:24そこしか突っ込むところが見つけられなかったんですねw
0072デフォルトの名無しさん
2009/11/08(日) 09:55:40普通にやればいい、どこで困ってんの?
0073デフォルトの名無しさん
2009/11/09(月) 01:25:090074デフォルトの名無しさん
2009/11/09(月) 09:54:45これをスペースまで含んでも入力できるやつに差し替えればいいだけだろう。
0075デフォルトの名無しさん
2009/11/09(月) 10:05:310076デフォルトの名無しさん
2009/11/09(月) 10:13:280077デフォルトの名無しさん
2009/11/09(月) 18:19:31ってことは、ある関数内でchar * str = new char[10]とかで宣言したら、
returnする前にdeleteしないと、ポインタが失われて開放できなくなるんでしょうか?
0078デフォルトの名無しさん
2009/11/09(月) 18:45:430079デフォルトの名無しさん
2009/11/09(月) 19:16:280080デフォルトの名無しさん
2009/11/09(月) 22:32:59ダブルクォーテーションを含んだ文字列を扱うにはどうすればいいんでしょうか
現在は下のように一文字ずつシングルクォーテーションで代入しているんですが
char search[3];
search[0] = '"';
search[1] = ',';
search[2] = 0;
char * strtmp = strstr( str, search);
もっと簡単な方法はあるでしょうか?
それからもうひとつ別の質問ですが、文字列でswitchしたいのですが、switchは整数でしか使えないため、
現在else ifを何度も繰り返してやってる状態です
もっとすっきりした書き方はないでしょうか?
if(element == "TEST1"){ //elementはchar*型です
} else if(element == "TEST2"){
} else if(element == "TEST3"){
} else if...
こんな感じで何度も繰り返してます
0081デフォルトの名無しさん
2009/11/09(月) 22:51:58エスケープシーケンスを使う
"\","
>if(element == "TEST1"){ //elementはchar*型です
elementはCString型かstring型の間違いよな?
せいぜい条件をvectorに入れてfindするくらいか。
0082デフォルトの名無しさん
2009/11/09(月) 23:05:06どうも \を入れれば特殊文字も使えるんですね 勉強になりました
0083デフォルトの名無しさん
2009/11/10(火) 00:30:37>} else if(element == "TEST2"){
>} else if(element == "TEST3"){
この例のように比較すべき文字列の最後の文字だけが異なるのなら、方法はある。
switch()は確かに文字列は扱えない。が、文字なら扱えるのだから。
0084デフォルトの名無しさん
2009/11/10(火) 04:25:18WCHAR * FILENAME;
どこかで
FILENAME = new WCHAR[20];
FILENAME = L"xxx.jpg";
どこかで
delete [] FILENAME;
これでコンパイルして実行すると、deleteしようとしたときに
AssertionFailure:BLOCK_TYPE_IS_VALIDが出ます
何故かdeleteできないようなのですが、どうすればいいでしょうか?
008584
2009/11/10(火) 04:54:36WCHAR FILENAME[20];で宣言して、memcpyで代入したら特に問題なさそうだったのでそちらにします
0086デフォルトの名無しさん
2009/11/10(火) 05:02:420x0100 "XXXXXXXXXXXXXXXXXXXX"
0xf200 "xxx.jpg"
FILENAME = new WCHAR[20]; // FILENAME = 0x0100; FILENAME は確保したメモリアドレスを指す。
FILENAME = L"xxx.jpg"; // FILENAME = 0xf200; FILENAME はL"xxx.jpg"が置いてあるメモリアドレスを指す。
delete [] FILENAME; // 0x0100を解放しなければならないのに、0xf200のアドレスを解放しようとしたのでエラー
つまり、FILENAME = L"xxx.jpg"; がダメ。たとえば以下のようにする。
FILENAME = new WCHAR[20]; // FILENAME = 0x0100; FILENAMEは確保したメモリのアドレスを指す。
wcscpy(FILENAME, L"xxx.jpg"); // 0xf200のアドレスから、0x0100のアドレスに文字列をコピーしてくる。
delete [] FILENAME; // 0x0100に確保したメモリアドレスを解放する。
0087デフォルトの名無しさん
2009/11/10(火) 05:03:270088デフォルトの名無しさん
2009/11/10(火) 09:46:33ありがとうございました
続けて質問ですが、例えば
char str[6] = "123456";
という文字列から、int型の整数123456を導きたい場合はどうすれば良いのでしょうか
double k = 0;
for(i = 0; i < strlen(str); i++)
k += (char[i] - 48) * pow( 10 , strlen(str) - i - 1);
これで多分求められる気がしますが、関数として用意されてるかな?と
0089デフォルトの名無しさん
2009/11/10(火) 09:58:360090デフォルトの名無しさん
2009/11/10(火) 10:16:320091デフォルトの名無しさん
2009/11/10(火) 10:26:55数ヵ月後にもういちど書いてみて、全然違うコードになると思うから。
0092デフォルトの名無しさん
2009/11/10(火) 10:45:220093デフォルトの名無しさん
2009/11/10(火) 10:58:04"123456"という文字列を入れるのにstr[6]はサイズが足りないから、
atoiは動かない可能性がある。
0094デフォルトの名無しさん
2009/11/10(火) 11:02:35Javaとか普通にやってくれるぞ?
もう少し顧客満足度について考えるべき。
0095デフォルトの名無しさん
2009/11/10(火) 11:09:310096デフォルトの名無しさん
2009/11/10(火) 12:35:370097デフォルトの名無しさん
2009/11/10(火) 14:52:48サイズを指定しなければ気を利かしてくれる
0098デフォルトの名無しさん
2009/11/10(火) 15:02:110099デフォルトの名無しさん
2009/11/14(土) 12:56:03気を利かせるってのがそもそもおかしい。
それを認めると、書いた通りに動かない可能性が出て来てしまうではないか。
プログラムはあなたが思ったようには動かないが、あなたが書いたようには動く
0100デフォルトの名無しさん
2009/11/15(日) 02:25:29CreateEventで作ったイベントオブジェクトの状態を知るにはどうすればいいんでしょうか
マルチスレッドにしてWaitForSingleObject()とすればイベントが起きるごとに作業ができるようですが、
マルチスレッドではなく、フレームごとに状態をチェックするようなことはできないのでしょうか
0101デフォルトの名無しさん
2009/11/15(日) 10:07:27■ このスレッドは過去ログ倉庫に格納されています