🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual Studio

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

C++

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

Q&A

解決済

2回答

7563閲覧

Visual Studioでテトリスのソースファイルをコンパイルしたいです

kihara-shinken

総合スコア6

Visual Studio

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

C++

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

0グッド

0クリップ

投稿2019/10/21 07:21

編集2019/10/21 07:52

前提・実現したいこと

C++初心者です。
テトリスの作成をしています。
以下のサイトを参考に、サイトにあるソースファイルをVisual Studioでコンパイルしようとしましたが、失敗してエラーがでてしまいました。
エラーコードから検索して調べたのですが、原因が特定できずに困っております。

参考にしているサイト
http://www13.plala.or.jp/kymats/study/game_other/SPACE_TETRIS/st1.html
ソースコード
http://www13.plala.or.jp/kymats/program/SPACE_TETRIS/SPACE_TETRIS.cpp

発生している問題・エラーメッセージ

エラーメッセージ
警告 C6387 'hMutex' は '0' である可能性があります: この動作は、関数 'WaitForSingleObject' の指定に従っていません。 SpaceTetris C:\USERS\USER\SOURCE\REPOS\SPACETETRIS\SPACETETRIS\SPACETETRIS.CPP
警告 C6387 'hMutex' は '0' である可能性があります: この動作は、関数 'ReleaseMutex' の指定に従っていません。 SpaceTetris C:\USERS\USER\SOURCE\REPOS\SPACETETRIS\SPACETETRIS\SPACETETRIS.CPP
警告 C6387 'hMutex' は '0' である可能性があります: この動作は、関数 'CloseHandle' の指定に従っていません。これが行われる可能性のある以前の行 360 を参照してください SpaceTetris C:\USERS\USER\SOURCE\REPOS\SPACETETRIS\SPACETETRIS\SPACETETRIS.CPP 361
警告 C28251 'WinMain' に対する整合性のない注釈: このインスタンスには 注釈なし が含まれます。c:\program files (x86)\windows kits\10\include\10.0.18362.0\um\winbase.h(933) を参照してください。 SpaceTetris C:\USERS\USER\SOURCE\REPOS\SPACETETRIS\SPACETETRIS\SPACETETRIS.CPP 563
エラー LNK2019 未解決の外部シンボル _main が関数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) で参照されました。 SpaceTetris C:\Users\User\source\repos\SpaceTetris\SpaceTetris\MSVCRTD.lib(exe_main.obj) 1
エラー LNK1120 1 件の未解決の外部参照 SpaceTetris C:\Users\User\source\repos\SpaceTetris\Debug\SpaceTetris.exe 1

該当のソースコード

C++
ソースコード http://www13.plala.or.jp/kymats/program/SPACE_TETRIS/SPACE_TETRIS.cpp

#include<time.h> // winmm.lib をリンクする #pragma comment(lib,"winmm") // エラー #define ERR -1 // ピースの横と縦のマス数 #define PIECE_WIDTH 4 #define PIECE_HEIGHT 4 /* フィールドの横と縦のマス数 */ #define FIELD_WIDTH 14 #define FIELD_HEIGHT 24 // マスのピクセル数 #define CELL_WIDTH 20 #define CELL_HEIGHT 20 /* MovePiece 関数の引数 */ #define PIECE_LEFT 2 #define PIECE_RIGHT 4 #define PIECE_DOWN 8 BYTE field[FIELD_WIDTH][FIELD_HEIGHT]={0}; /* ゲームフィールド */ DWORD fColor[FIELD_WIDTH][FIELD_HEIGHT]={0}; // ゲームフィールドの色 BYTE piece[PIECE_WIDTH][PIECE_HEIGHT]={0}; /* 現在移動中のブロック */ DWORD pColor[PIECE_WIDTH][PIECE_HEIGHT]={0}; // 現在移動中のブロックの色 POINT location={0,0}; /* 現在移動中のブロックの位置 */ BYTE next[PIECE_WIDTH][PIECE_HEIGHT]={0}; // 次のブロック DWORD nColor[PIECE_WIDTH][PIECE_HEIGHT]={0}; // 次のブロックの色 DWORD score=0; // 獲得点数 DWORD playTime=0; // プレイ時間 BOOL GameOver=FALSE; // TRUE となるのはゲームオーバーからリプレイするまで #define MUTEX_NAME "MutexObject of SPACE TETRIS" // ミューテックスオブジェクトの名前 #define WM_MUTEX WM_APP // メインスレッドにミューテックスの所有権取得を要求するメッセージ /* piece[][] 内のブロックの最上部の位置を返す */ int GetPieceTop(void) { for(int y=0;y<PIECE_HEIGHT;y++){ for(int x=0;x<PIECE_WIDTH;x++){ if(piece[x][y]){ return y; } } } return ERR; } /* piece[][] 内のブロックの最下部の位置を返す */ int GetPieceBottom(void) { for(int y=PIECE_HEIGHT-1;y>=0;y--){ for(int x=0;x<PIECE_WIDTH;x++){ if(piece[x][y]){ return y; } } } return ERR; } /* piece[][] 内のブロックの左側の位置を返す */ int GetPieceLeft(void) { for(int x=0;x<PIECE_WIDTH;x++){ for(int y=0;y<PIECE_HEIGHT;y++){ if(piece[x][y]){ return x; } } } return ERR; } /* piece[][] 内のブロックの右側の位置を返す */ int GetPieceRight(void) { for(int x=PIECE_WIDTH-1;x>=0;x--){ for(int y=0;y<PIECE_HEIGHT;y++){ if(piece[x][y]){ return x; } } } return ERR; } コード

以下長いので省略させていただきます。全様は文字数オーバーしてしまいますので、リンクを参照しっただければ幸いです。申し訳ございません。

試したこと

新規プロジェクトでファイルの設定を変えてみたりしましたが、特に変化はありませんでした。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2019,Windows 10 Homeを使用しています。

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

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

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

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

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

Zuishin

2019/10/21 07:42

プロジェクトや MAKEFILE を使っていますか?
y_waiwai

2019/10/21 07:48

コードはそれでは読めないので、質問を編集し、<code>ボタンを押し、出てきた’’’の枠の中にコードを貼り付けてください
kihara-shinken

2019/10/21 07:50

ご質問ありがとうございます。 答えになっているか、わかりませんが最初の新規プロジェクトの設定で”コンソールアプリ”というものを選んでそこにソースコードを入力し、実行しております。
kihara-shinken

2019/10/21 07:51

Code修正いたします。少々お待ちくださいませ。
dodox86

2019/10/21 07:53

参考にされたサイトのコードはWinMainを呼び出しているので、おそらくWindowsデスクトップアプリケーションのプロジェクトで作成しないとダメだと思います。
dodox86

2019/10/21 07:55

invoke_mainは、Visual Studioのランタイムライブラリのスタートアップ関数だと思います。
kihara-shinken

2019/10/21 07:57

>dodox86様 ご回答ありがとうございます。 なるほど、、、くWindowsデスクトップアプリケーションのプロジェクト>ですね。 そちらで試してみます。
kihara-shinken

2019/10/21 08:08

>dodox86様 たびたび申し訳ございません。くWindowsデスクトップアプリケーションのプロジェクト>を選択し、プロジェクトを開始したのですが、最初からコードが入っている画面から始まりました。 これにソースコードを張り付ければよいのでしょうか?
dodox86

2019/10/21 08:20

Visual Studio 2019で試してみましたが、以前のVisual Studio と少し違って、少し面倒になってますね。回答の方に書きます。
kihara-shinken

2019/10/21 08:32

>dodox86様 ありがとうございます!
dodox86

2019/10/21 09:07

> 以前のVisual Studio と少し違って、少し面倒になってますね。 。。。と言うほどではありませんでした。自動生成されるファイルが若干増えてましたが。作業手順は、回答欄をご覧ください。
guest

回答2

0

ベストアンサー

質問者さんがサンプルとして利用したソースファイルは、Visual Studio 2019にて以下の手順でビルドできます。

ソースコード中で、ゲームの背景に「andromeda.bmp」と言うビットマップファイルを使っているので、あらかじめ用意してください。適当な、好きな画像のビットマップファイルで良いと思います。

C++

1// ソースコードの該当箇所 2 case WM_CREATE: 3 // 背景画像をロードする 4 hBitmap = (HBITMAP)LoadImage((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), 5 "andromeda.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 6

ビルド方法:
0. Visual Studio 2019 の「新しいプロジェクトの作成(N)」で、「Windows デスクトップアプリケーション - C++」を選ぶ。
0. 選んだら適当なプロジェクト名で作成する。自動的にwWinMain関数が定義されている *.cpp ファイルが開くので、もとのソースコードを全部消す。
0. 該当のソースコード「http://www13.plala.or.jp/...」の内容を全て貼り付けて保存する。
0. プロジェクトのプロパティで、「構成(C):」を「すべての構成」、「プラットフォーム(P):」を「すべてのプラットフォーム」に指定する。(つまり、以降の設定をすべてに適用するようにする)
0. プロジェクトのプロパティで、「構成プロパティ」-->「詳細」-->「文字セット」を選び、「マルチバイト文字セットを使用する」を指定する。
プロジェクトの設定1
0. プロジェクトのプロパティで、「C/C++」→「プリコンパイル済みヘッダー」-->「プリコンパイル済みヘッダー」を選び、「プリコンパイル済みヘッダーを使用しない」を指定する。
プロジェクトの設定2
0. ビルドして実行する。実行の前に、あらかじめ背景画像となる「andromeda.bmp」を実行時のカレントディレクトリ下に置いてください。通常は下図の設定で指定された、プロジェクトのディレクトリです。
プロジェクトの設定3

※上記の設定はVisual Studio 2019より前のバージョンでも有効で、既存のC/C++ソースコードを使うような場合でも使えるので、覚えておくと良いです。

投稿2019/10/21 09:05

編集2019/10/21 12:01
dodox86

総合スコア9254

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

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

dodox86

2019/10/21 09:09

投稿して後で思い直してみると、teratailでの過去の回答に、同様なものが既にいくつかあったかもしれません。
dodox86

2019/10/21 09:19

「プリコンパイル済みヘッダーを使う」は、機能を理解した上で使う限りは便利だと思います。相当数のincludeをしない限り、体感でメリットはそれほど無いでしょうけど。
kihara-shinken

2019/10/21 09:57

>dodox86様 詳細な回答誠に感謝いたします。 すぐに試させていただきます。
kihara-shinken

2019/10/21 10:03

ありがとうございました!無事、コンパイルすることができました。 このあとはソースコードをいじって遊んでみたいと思います
kihara-shinken

2019/10/21 10:18

>dodox86 もし、許していただけるのであれば追加で質問させてください。 ただ、 debugモードではうまくいくのですが、releaseモードだとうまくいかないのですが、なにか原因はお分かりになりますでしょうか?
dodox86

2019/10/21 10:21

お役に立てて何よりです。サンプル提供もとの作者様に感謝しつつ、ご自分で色々やってみると良いです。
dodox86

2019/10/21 10:22

お、コメントすれ違いました。ちょっとReleaseで動かしてみます。
kihara-shinken

2019/10/21 10:26

>dodox86様 ありがとうございます。 本当に感謝しております。
dodox86

2019/10/21 10:27

こちらではReleaseビルドでも問題なく動きますね。環境の違いかな。(Windows 7 64ビット) 起動してすぐNGですか。それとも特有の操作でNGでしょうか。シブいデバッグ作業になりますが、そこらへんをご自分で解決するのも、勉強になると思います。OutputDebugStringと言うAPIを使うと、Releaseビルドでもデバッグ端末に出力できます。どこまで動いているかなど確認すると良いです。
dodox86

2019/10/21 10:31

Releaseビルドにするとメモリの使い方やタイミングがセンシティブ?になって、潜在的な問題が発現しやすくなったりします。ランタイムライブラリのせいもあるかもしれません。
kihara-shinken

2019/10/21 10:33

>dodox86様 起動してすぐエラーが39エラーでてしまいます。 承知いたしました。いろいろいじってみるしかないようです。 もうちょっと調べてみます。 いろいろ、ありがとうございました。
guest

0

警告というのはとりあえず無視しといて、

エラー LNK2019 未解決の外部シンボル _main が関数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) で参照されました。

mainという名前の関数が存在していない、というエラーですな。

まずはこれをどうにかしましょう。

投稿2019/10/21 07:34

y_waiwai

総合スコア88038

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

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

kihara-shinken

2019/10/21 07:42

ご回答ありがとうございます。mainという関数が存在しないということは、すなわちなにかしらのこの関数を定義するような宣言をしなければいけないということでよろしいでしょうか(初心者過ぎて理解が追い付いているのか心配ですが)?
y_waiwai

2019/10/21 07:46

それはそのソースコードがどういうものかがわからんのでなんとも言えません。 そこのサイトにビルド法は載ってないでしょうか
maisumakun

2019/10/21 07:47

WinMainがファイルにはあるので、プロジェクト設定を間違えてしまったのかもしれないですね。
kihara-shinken

2019/10/21 07:54

ビルド法は載っていなかったです。
kihara-shinken

2019/10/21 07:55

>maisumakun様 プロジェクトの設定ですが、C++のコンソールアプリを使用しています。それに該当のコードをのせて実行いたしました。
maisumakun

2019/10/21 07:57

WinMainを見ると、ウィンドウも作成していますので、「コンソールアプリ」は適切ではありません。「Win32アプリ」のような設定を選んでプロジェクトを再作成してみてください。
kihara-shinken

2019/10/21 08:09

>maisumakun様 ご回答がありがとうございます。 「Win32アプリ」の設定を探してやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問