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

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

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

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

Q&A

2回答

2130閲覧

ローカル関数、識別子のエラー

zakky79

総合スコア23

C++

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

0グッド

0クリップ

投稿2017/11/01 05:28

おーぷんMIDIぷろじぇくとのMIDIIOライブラリ1.1を使用させてもらってるのですが、そのライブラリの中の

c++

1int main() { 2 /* MIDI出力デバイスの名前を調べる(UNICODE) */ 3 long __stdcall MIDIOut_GetDeviceNameW(long lID, wchar_t* pszDeviceName, long lLen); { 4 int nRet; 5 MIDIOUTCAPSW tagMIDIOutCaps; 6 memset(&tagMIDIOutCaps, 0, sizeof(MIDIOUTCAPSW)); 7 nRet = midiOutGetDevCapsW(lID, &tagMIDIOutCaps, sizeof(MIDIOUTCAPSW)); 8 if (nRet != MMSYSERR_NOERROR) { 9 return 0; 10 } 11 memset(pszDeviceName, 0, lLen * sizeof(wchar_t)); 12 lLen = MIN(lLen - 1, (long)wcslen(tagMIDIOutCaps.szPname)); 13 wcsncpy(pszDeviceName, tagMIDIOutCaps.szPname, lLen); 14 return lLen; 15 }

で、ビルドを行うと、1行目の{で";"が必要ですと出ます。
その他に、「'MIDIOut_GetDeviceNameW': ローカル関数の定義が正しくありません」や、「識別子が見つかりませんでした」とエラーが出ました。
{の前に;を入れると、識別子が定義されていない箇所が増えました。
これはどう対処するべきなのですか?このライブラリの他のプログラムでも;がない箇所が多いのでどうにか解決したいと思ってます。まだまだ無知なのですがよろしくお願いします。

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

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

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

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

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

guest

回答2

0

こんにちは。

C++にはローカル関数はありませんのでmain()関数の中で関数を定義することはできません。ttyp03さんが書かれているようにmain()の外で定義しましょう。
その結果、未定義識別子が多数発生するということは、#include不足です。適切なヘッダをインクルードすると良い筈です。

投稿2017/11/01 06:57

Chironian

総合スコア23272

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

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

zakky79

2017/11/01 07:09

なるほどなるほど。。。 はたまた質問ですいません。 エラー LNK2019 未解決の外部シンボル __imp_midiOutGetDevCapsW が関数 MIDIOut_GetDeviceNameW で参照されました。 こういうエラーが出たんですが、どうしたらいいですか?リンカーをいじらないとダメということですか?
Chironian

2017/11/01 08:06

他のライブラリを自分のプロジェクトに組み込むための一般的な処理が必要なのだと思います。 ①インクルード・パスの追加 ②ライブラリ・パスの追加 ③ライブラリの追加 この②や③が漏れているはずです。
guest

0

main関数内にライブラリの定義が入ってしまっています。

c++

1int main() { 2 /* MIDI出力デバイスの名前を調べる(UNICODE) */ 3 long __stdcall MIDIOut_GetDeviceNameW(long lID, wchar_t* pszDeviceName, long lLen); { ←これ 4 int nRet;

こうなるのでは。

c++

1/* MIDI出力デバイスの名前を調べる(UNICODE) */ 2long __stdcall MIDIOut_GetDeviceNameW(long lID, wchar_t* pszDeviceName, long lLen); 3 4int main() { 5{ 6 int nRet; 7

投稿2017/11/01 05:33

ttyp03

総合スコア16996

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

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

zakky79

2017/11/01 06:41

こういうことですかね? /* MIDI出力デバイスの名前を調べる(UNICODE) */ long __stdcall MIDIOut_GetDeviceNameW(long lID, wchar_t* pszDeviceName, long lLen) int main() { { int nRet; MIDIOUTCAPSW tagMIDIOutCaps; memset(&tagMIDIOutCaps, 0, sizeof(MIDIOUTCAPSW)); nRet = midiOutGetDevCapsW(lID, &tagMIDIOutCaps, sizeof(MIDIOUTCAPSW)); if (nRet != MMSYSERR_NOERROR) { return 0; } memset(pszDeviceName, 0, lLen * sizeof(wchar_t)); lLen = MIN(lLen - 1, (long)wcslen(tagMIDIOutCaps.szPname)); wcsncpy(pszDeviceName, tagMIDIOutCaps.szPname, lLen); return lLen; } これでビルドすると定義されていない識別子が多く出てエラー出ちゃうんですけど。。。すいません;;
ttyp03

2017/11/01 07:15

http://openmidiproject.osdn.jp/MIDIIOLibrary.html このページにあるサンプルを見た感じでは、MIDIIO.hをインクルードすればよさそうです。 なので1行目にこれ↓を追加してみてください。 #include <MIDIIO.h>
ttyp03

2017/11/01 07:17

むしろそのヘッダーをインクルードすることで、stdcallの行は不要になるかと思います。
zakky79

2017/11/01 08:03

ふむふむ。include追加してみてもエラー出っぱなしだったので、ヘッダーファイルを見ると、緑線で関数定義が見つかりませんと出ていました。これはどうしたらよいのでしょうか。。。質問多くてほんとすいません。
ttyp03

2017/11/01 08:06

先ほどのヘッダーより先に下記も必要かと。 #include <stdio.h> #include <time.h> #include <windows.h> まずはサンプルがコンパイルできるかどうか試してみたほうがよいでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問