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

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

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

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

C++

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

Q&A

解決済

2回答

5200閲覧

C++における”初期化中 :~から~ に変換できません”というエラー

muton

総合スコア31

Visual Studio

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

C++

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

0グッド

0クリップ

投稿2019/01/18 08:10

該当のソースコード

C++

1#include <windows.h> 2#include <stdlib.h> 3#include <stdio.h> 4#include <string.h> 5#include "engine.h" 6 7#define BUFSIZE 256 8 9static double Areal[6] = { 1, 2, 3, 4, 5, 6 }; 10 11int PASCAL WinMain(HINSTANCE hInstance, 12 HINSTANCE hPrevInstance, 13 LPSTR lpszCmdLine, 14 int nCmdShow) 15 16{ 17 Engine *ep; 18 mxArray *T = NULL, *a = NULL, *d = NULL; 19 char buffer[BUFSIZE + 1]; 20 double *Dreal, *Dimag; 21 double time[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 22 23 /* 24 * Start the MATLAB engine 25 */ 26 if (!(ep = engOpen(NULL))) { 27 MessageBox((HWND)NULL, (LPSTR)"Can't start MATLAB engine", 28 (LPSTR) "Engwindemo.c", MB_OK); 29 exit(-1); 30 }

課題

Visualstudio201でMATLAB Engineアプリケーションをコンパイルしたいと考えています. しかし上記の mxArray *T = NULL, *a = NULL, *d = NULL; の部分で 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー C2440 '初期化中': 'void *' から 'mxArray *' に変換できません。 Project6 c:\users\owner\source\repos\project6\project6\enginedemo.cpp 30 エラー (アクティブ) E0144 型 "void *" の値を使用して型 "mxArray *" のエンティティを初期化することはできません Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.cpp 30 エラー (アクティブ) E0144 型 "void *" の値を使用して型 "mxArray *" のエンティティを初期化することはできません Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.cpp 30 エラー (アクティブ) E0144 型 "void *" の値を使用して型 "mxArray *" のエンティティを初期化することはできません Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.cpp 30 if (!(ep = engOpen(NULL))) { の部分で 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー C2664 'Engine *engOpen(const char *)': 引数 1 を 'void *' から 'const char *' へ変換できません。 Project6 c:\users\owner\source\repos\project6\project6\enginedemo.cpp 38 エラー (アクティブ) E0167 型 "void *" の引数は型 "const char *" のパラメーターと互換性がありません Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.cpp 38 というエラーが発生してしまいます. 何か対策は考えられますでしょうか. 宜しくお願い致します.

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

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

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

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

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

LouiS0616

2019/01/18 11:17

C言語としてビルドしてやった方が早いような気がしますが、それじゃダメなんでしょうか。
muton

2019/01/18 11:32

ありがとうございます. c言語としてコンパイルするとは.cppの部分を.cに変更してビルドを行うということで宜しいでしょうか.
LouiS0616

2019/01/18 11:34

おそらくそれで大丈夫です。
guest

回答2

0

ベストアンサー

関数の宣言が

C++

1Engine *engOpen(const char *);

である一方で、その引数にvoid *型であるNULLを渡していることが原因です。

キャストしましょう。

C++

1if (!(ep = engOpen((const char *)NULL))) {

投稿2019/01/18 08:18

kazto

総合スコア7196

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

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

muton

2019/01/18 09:09

回答ありがとうございます. if (!(ep = engOpen(NULL))) {を if (!(ep = engOpen((const char *)NULL))) { に変更することで エラー (アクティブ) E0167 型 "void *" の引数は型 "const char *" のパラメーターと互換性がありません というエラーは発生しなくなりました 後は mxArray *T = NULL, *a = NULL, *d = NULL; においての エラー C2440 '初期化中': 'void *' から 'mxArray *' に変換できません というエラーに対してはどのような対策が考えられますでしょうか. ご教授お願い致します.
kazto

2019/01/18 09:28

同じです。キャストしましょう。
muton

2019/01/18 09:43

回答ありがとうございます. mxArray *T = NULL, *a = NULL, *d = NULL; の部分をキャストを下記の様に行ってもエラーは発生してしまいます.何度も申し訳ございません. mxArray *T = (const char *)NULL, *a = (const char *)NULL, *d = (const char *)NULL; 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー C2440 '初期化中': 'const char *' から 'mxArray *' に変換できません。 Project6 c:\users\owner\source\repos\project6\project6\enginedemo.cpp 30 エラー (アクティブ) E0144 型 "void *" の値を使用して型 "mxArray *" のエンティティを初期化することはできません Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.cpp 30 エラー (アクティブ) E0144 型 "void *" の値を使用して型 "mxArray *" のエンティティを初期化することはできません Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.cpp 30 エラー (アクティブ) E0144 型 "void *" の値を使用して型 "mxArray *" のエンティティを初期化することはできません Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.cpp 30
kazto

2019/01/18 11:11

違います。変数がmxArray *なのだから、それにキャストしなければいけません。
muton

2019/01/18 11:16

回答ありがとうございます. (const char *)mxArray *T = NULL, *a = NULL, *d = NULL; ということでしょうか? そうすると,型名は使用できない等のエラーが生じてしまいます. 無知ですいませんが,何卒宜しくお願い致します.
kazto

2019/01/18 11:19

mxArray *T = (mxArray *)NULL; です。キャストとは、変数に値を代入するときに型を変換する命令です。
muton

2019/01/18 11:30

mxArray *T = (mxArray *)NULL, *a = (mxArray *)NULL, *d = (mxArray *)NULL; としたところ,以下の様なリンクエラーが発生してしまいました.これは何か対策など考えられますでしょうか ``` 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー LNK1120 14 件の未解決の外部参照 Project6 C:\Users\owner\source\repos\Project6\Release\Project6.exe 1 エラー LNK2001 外部シンボル ""int __cdecl engEvalString(struct engine *,char const *)" (?engEvalString@@YAHPAUengine@@PBD@Z)" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル "_mxGetPr" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル "_mxGetPi" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル ""int __cdecl sprintf(char *,char const *,...)" (?sprintf@@YAHPADPBDZZ)" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル ""int __stdcall MessageBoxA(void *,char const *,char const *,unsigned int)" (?MessageBoxA@@YGHPAXPBD1I@Z)" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル ""int __cdecl engPutVariable(struct engine *,char const *,struct mxArray_tag const *)" (?engPutVariable@@YAHPAUengine@@PBDPBUmxArray_tag@@@Z)" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル "_mxCreateDoubleMatrix_730" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル ""struct mxArray_tag * __cdecl engGetVariable(struct engine *,char const *)" (?engGetVariable@@YAPAUmxArray_tag@@PAUengine@@PBD@Z)" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル ""int __cdecl engClose(struct engine *)" (?engClose@@YAHPAUengine@@@Z)" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル ""struct engine * __cdecl engOpen(char const *)" (?engOpen@@YAPAUengine@@PBD@Z)" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル ""void * __cdecl memcpy(void *,void const *,unsigned int)" (?memcpy@@YAPAXPAXPBXI@Z)" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル ""int __cdecl engOutputBuffer(struct engine *,char *,int)" (?engOutputBuffer@@YAHPAUengine@@PADH@Z)" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル "_mxDestroyArray" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 エラー LNK2001 外部シンボル ""void __cdecl exit(int)" (?exit@@YAXH@Z)" は未解決です。 Project6 C:\Users\owner\source\repos\Project6\Project6\enginedemo.obj 1 ```
episteme

2019/01/18 13:44

ライブラリが足りてない。
kazto

2019/01/19 02:19 編集

epistemeさんのおっしゃる通り、engOpenなどが入っているMATLAB Engine(?)のライブラリをリンクする設定をプロジェクトに行う必要があります。 プロジェクトツリーのプロジェクトを右クリックしてプロパティを開きます。 「リンク」タブの「追加のファイル」に適切なライブラリを追記します。 すみません、記憶だけで書いてるので多少不正確かもしれません。
guest

0

C++ における NULL の型は void* では__ありません__。 C では NULLvoid* である__かもしれません__。

私の手元に Visual Studio が無いので推測ではありますが、 C のヘッダを include したことによって C の NULL が導入されたことによる不整合だと思います。 stdlib.h, stdio.h, string.h を C++ で include するのは推奨されないスタイルで、 かわりに cstdlib, cstdio, cstring を使うのが望ましいとされています。 cstdlib などに含まれる NULL は C++ の NULL なのでエラーにはならないはずです。

また、 NULL はそういった過去との互換性の都合で若干の特殊なふるまいをするので、特にポインタであるということ表したいのであれば現在の C++ では nullptr が使えます。

投稿2019/01/18 11:45

SaitoAtsushi

総合スコア5444

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問