質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

7814閲覧

Visual C++ ~「ヒープ領域を使い果たしました」というエラーがでる

FumiakiNakao

総合スコア180

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/05/22 03:08

visual studio 2008 Express Edition にて、プロジェクトをビルドする際に、「ヒープ領域を使い果たしました」というエラーがでて、うまくビルドができません

ネットで解決策を調べ、以下のオプションを追加してみたのですが、それでも同じエラーが出ました。

/Zm200

Zm以下の数字を大きくしても結果は変わりませんでした。

以下、必要かはわかりませんが、作成したコードです

c++

1#include <stdio.h> 2#include <windows.h> 3#include <time.h> 4 5 6LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 7 8void RePaint(HWND hWnd, char* szMondai, char* szMoji1, char* szMoji2, char* szCheck, char* szTime); 9int TypeStart(HWND); 10BOOL MyGets(void); 11HFONT MyCreateFont(int nHeight, DWORD dwCharSet, LPCTSTR lpName); 12 13char szClassName[] = "Sample"; // ウィンドウクラス 14char szMondai[32], szMoji1[16], szMoji2[16], szCheck[32], szTime[32]; 15DWORD dwStart, dwEnd; 16BOOL bStart = FALSE, bWeit = FALSE; 17int mode,chart; 18BOOL kaitou,kotae; 19BOOL CallEnd=FALSE, ShutDown=FALSE; 20char tmp_char; 21int n1,n2; 22HFONT hFont1,hFont2,hFont3; 23FILE *fp; 24errno_t error; 25 26 27char str1[2][2] = {"a",""};//課題1用 28char str23[20][2] = {"a","b","c","d","e","f","g","h","i","j",/*"k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",*/ 29 "A","B","C","D","E","F","G","H","I","J"/*,"K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"*/};//課題2,3用 30char str4[25][2] = {"a","b","c","d","e","f","g","h","i","j", 31 "A","B","C","D","E","F","G","H","I","J", 32 "!","#","$","%","&"};//課題4用 33 34 35int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, 36 LPSTR lpsCmdLine, int nCmdShow) 37{ 38 HWND hWnd; 39 MMTIME mm; 40 DWORD dwStart, dwEnd; 41 char str2[100]; 42 int j=0; 43 44 //--------------------------------------------- 45 //ウィンドウクラスの登録 46 //(ここは特に書き換える必要はないと思います) 47 WNDCLASSEX wc; 48 wc.cbSize = sizeof(WNDCLASSEX); 49 wc.style = CS_HREDRAW | CS_VREDRAW; 50 wc.lpfnWndProc = WndProc; //プロシージャ名 51 wc.cbClsExtra = 0; 52 wc.cbWndExtra = 0; 53 wc.hInstance = hCurInst;//インスタンス 54 wc.hIcon = NULL; 55 wc.hCursor = (HCURSOR)LoadImage(NULL, 56 MAKEINTRESOURCE(IDC_ARROW), 57 IMAGE_CURSOR, 58 0, 59 0, 60 LR_DEFAULTSIZE | LR_SHARED); 61 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 62 wc.lpszMenuName = NULL; // メニュー名 63 wc.lpszClassName = (LPCSTR)szClassName; 64 wc.hIconSm = NULL; 65 66 if(!RegisterClassEx(&wc)) 67 return FALSE; 68 69 //ウィンドウの生成 70 hWnd = CreateWindow(szClassName, 71 "猫でもわかる", 72 WS_OVERLAPPEDWINDOW, //ウィンドウの種類 73 CW_USEDEFAULT, //X座標 74 CW_USEDEFAULT, //Y座標 75 240, //幅 76 180, //高さ 77 NULL, //親ウィンドウのハンドル、親を作るときはNULL 78 NULL, //メニューハンドル、クラスメニューを使うときはNULL 79 hCurInst, //インスタンスハンドル 80 NULL); 81 if (!hWnd) 82 return FALSE; 83 ShowWindow(hWnd, nCmdShow); 84 UpdateWindow(hWnd); 85 86 //---------------------------------------------------------------- 87 //ここまでがウインドウ作成の準備 88 89 //フォントの作成(フォントを作成したら,DeleteObjectで削除) 90 hFont1 = MyCreateFont(40, SHIFTJIS_CHARSET, "MS Pゴシック"); 91 hFont2 = MyCreateFont(40, SHIFTJIS_CHARSET, "MS Pゴシック"); 92 hFont3 = MyCreateFont(15, SHIFTJIS_CHARSET, "MS Pゴシック"); 93 94 95 //文字入力 96 //表示位置については,RePaint関数内で決定 97 wsprintf(szMondai, "Modeを選択してください(1-4)"); 98 wsprintf(szMoji1,""); 99 wsprintf(szMoji2,""); 100 wsprintf(szCheck,""); 101 wsprintf(szTime,""); 102 103 //ウインドウの再描画 104 //表示を更新したいとき,この関数を実行 105 RePaint(hWnd, szMondai, szMoji1, szMoji2, szCheck, szTime); 106 107 108 //文字入力を待つ(tmp_charに格納) 109 //1-4の文字が入力されたらループを抜ける 110 while(1){ 111 if(!MyGets()) return FALSE; 112 if(tmp_char == '1' || tmp_char == '2' || tmp_char == '3' || tmp_char == '4'){ 113 break; 114 } 115 } 116 mode = atoi(&tmp_char); 117 118 119 120 wsprintf(str2,"result%d.csv",mode);//ファイル名の設定(result"課題番号".csvというファイルが同じフォルダに作成される) 121 122 error=fopen_s(&fp,str2,"w"); 123 fprintf(fp,"試行回数, 表示1, 表示2, 回答, 時間\n"); 124 125 126 for(j=0;j<10;j++){ 127 128 wsprintf(szMondai, "Mode %d %d回",mode ,j+1); 129 wsprintf(szMoji1,""); 130 wsprintf(szMoji2,""); 131 wsprintf(szCheck,""); 132 wsprintf(szTime,""); 133 134 RePaint(hWnd, szMondai, szMoji1, szMoji2, szCheck, szTime); 135 136 Sleep(1000); 137 MessageBeep(MB_OK); //音を鳴らす 138 139 //ランダムに待ち時間を設定 140 Sleep(1000+(rand()%50)*100); 141 142 //文字を表示 143 TypeStart(hWnd); 144 RePaint(hWnd, szMondai, szMoji1, szMoji2, szCheck, szTime); 145 146 //時間計測開始 147 timeGetSystemTime(&mm, sizeof(MMTIME)); 148 dwStart = mm.u.ms; 149 150 while(1){ 151 if(!MyGets()) return FALSE; 152 if(tmp_char == 'y' || tmp_char == 'u'){ 153 break; 154 } 155 } 156 157 //時間計測終了 158 timeGetSystemTime(&mm, sizeof(MMTIME)); 159 dwEnd = mm.u.ms; 160 161 if(tmp_char == 'y') {wsprintf(szCheck, "あなたの回答 Yes");} 162 else{wsprintf(szCheck, "あなたの回答 No");} 163 164 wsprintf(szTime, "反応時間[%d]ms",dwEnd - dwStart); 165 RePaint(hWnd, szMondai, szMoji1, szMoji2, szCheck, szTime); 166 167 //結果のファイルへの書き込み 168 if(mode==1) fprintf(fp,"%d, %s, "", %c, %d\n",j+1,str1[n1], tmp_char, dwEnd-dwStart); 169 else if(mode==2||mode==3) fprintf(fp,"%d, %s, %s, %c, %d\n",j+1,str23[n1], str23[n2], tmp_char, dwEnd-dwStart); 170 else if(mode==4) fprintf(fp,"%d, %s, %s, %c, %d\n",j+1,str4[n1], str4[n2], tmp_char, dwEnd-dwStart); 171 172 while(tmp_char!='n'){ 173 } 174 175 176 } 177 178 //自作の論理フォントの削除 179 DeleteObject(hFont1); 180 DeleteObject(hFont2); 181 DeleteObject(hFont3); 182 183 //fprintf(fp,"ファイルを閉じましたend\n"); 184 fclose(fp); 185 186 return TRUE; 187 188} 189 190 191 192//画面情報を更新する 193//文字の表示位置などを指定する 194void RePaint(HWND hWnd, char* szMondai, char* szMoji1, char* szMoji2, char* szCheck, char* szTime){ 195 PAINTSTRUCT ps; 196 HDC hdc; 197 198 InvalidateRect(hWnd, NULL, TRUE); 199 hdc = BeginPaint(hWnd, &ps); 200 TextOut(hdc, 0, 0, szMondai, (int)strlen(szMondai)); //2,3の引数でx,y座標を決定 201 SelectObject(hdc,hFont1); //自作の論理フォントに変更 202 TextOut(hdc, 40, 30, szMoji1, (int)strlen(szMoji1)); 203 SelectObject(hdc,hFont2); 204 TextOut(hdc, 100, 30, szMoji2, (int)strlen(szMoji2)); 205 SelectObject(hdc,hFont3); 206 TextOut(hdc, 0, 80, szCheck, (int)strlen(szCheck)); 207 TextOut(hdc, 0, 100, szTime, (int)strlen(szTime)); 208 EndPaint(hWnd, &ps); 209} 210 211 212//文字入力用の関数 213//文字入力されるまで待機(callback関数が呼び出される) 214//tmp_charに格納 215BOOL MyGets(void){ 216 MSG msg; 217 BOOL bRet; 218 219 CallEnd = FALSE; 220 221 while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { 222 if(ShutDown == TRUE){ 223 return FALSE; 224 } 225 else if (bRet == -1 || CallEnd == TRUE) { 226 break; 227 } else { 228 TranslateMessage(&msg); 229 DispatchMessage(&msg); 230 } 231 } 232 233 return TRUE; 234} 235 236 237int TypeStart(HWND hWnd) 238{ 239 //表示する文字の決定 240 241 if(mode == 1){ 242 n1 = 0; 243 wsprintf(szMoji1, "%s", str1[n1]); 244 } 245 else if(mode == 2 || mode == 3){ 246 n1 = rand()%20; 247 wsprintf(szMoji1, "%s", str23[n1]); 248 n2 = rand()%20; 249 wsprintf(szMoji2, "%s", str23[n2]); 250 } 251 else{ 252 n1 = rand()%25; 253 wsprintf(szMoji1, "%s", str4[n1]); 254 n2 = rand()%25; 255 wsprintf(szMoji2, "%s", str4[n2]); 256 } 257 258 return 0; 259} 260 261 262//論理フォントの作成 263HFONT MyCreateFont(int nHeight, DWORD dwCharSet, LPCTSTR lpName) 264{ 265 return( CreateFont(nHeight, 0, 0, 0, 266 FW_DONTCARE, 267 FALSE, FALSE, FALSE, 268 dwCharSet, 269 OUT_DEFAULT_PRECIS, 270 CLIP_DEFAULT_PRECIS, 271 DEFAULT_QUALITY, 272 DEFAULT_PITCH | FF_DONTCARE, 273 lpName)); 274} 275 276 277//ウィンドウプロシージャ 278LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) 279{ 280 switch(msg){ 281 case WM_CHAR: 282 tmp_char = wp; 283 CallEnd = TRUE; 284 break; 285 case WM_DESTROY: 286 ShutDown = TRUE; 287 //自作の論理フォントの削除 288 DeleteObject(hFont1); 289 DeleteObject(hFont2); 290 DeleteObject(hFont3); 291 //fprintf(fp,"ファイルを閉じましたpostquit\n"); 292 fclose(fp); 293 PostQuitMessage(0); 294 break; 295 default: 296 return (DefWindowProc(hWnd, msg, wp, lp)); 297 } 298 return 0; 299}

どなたか、解決策を教えていただけると助かります

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

もとあるプログラムを改変したものだったのですが、もとのプログラムをはりなおして実行したところ、なぜかうまくいきました

投稿2017/05/22 03:24

FumiakiNakao

総合スコア180

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問