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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,657

muton

score 25

該当のソースコード

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"

#define BUFSIZE 256

static double Areal[6] = { 1, 2, 3, 4, 5, 6 };

int PASCAL WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR     lpszCmdLine,
    int       nCmdShow)

{
    Engine *ep;
    mxArray *T = NULL, *a = NULL, *d = NULL;
    char buffer[BUFSIZE + 1];
    double *Dreal, *Dimag;
    double time[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    /*
     * Start the MATLAB engine
     */
    if (!(ep = engOpen(NULL))) {
        MessageBox((HWND)NULL, (LPSTR)"Can't start MATLAB engine",
            (LPSTR) "Engwindemo.c", MB_OK);
        exit(-1);
    }

課題

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    
というエラーが発生してしまいます.
何か対策は考えられますでしょうか.
宜しくお願い致します.
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • LouiS0616

    2019/01/18 20:17

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

    キャンセル

  • muton

    2019/01/18 20:32

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

    キャンセル

  • LouiS0616

    2019/01/18 20:34

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

    キャンセル

回答 2

checkベストアンサー

+2

関数の宣言が

Engine *engOpen(const char *);


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

キャストしましょう。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 20: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
    ```

    キャンセル

  • 2019/01/18 22:44

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

    キャンセル

  • 2019/01/19 09:15 編集

    epistemeさんのおっしゃる通り、engOpenなどが入っているMATLAB Engine(?)のライブラリをリンクする設定をプロジェクトに行う必要があります。

    プロジェクトツリーのプロジェクトを右クリックしてプロパティを開きます。
    「リンク」タブの「追加のファイル」に適切なライブラリを追記します。

    すみません、記憶だけで書いてるので多少不正確かもしれません。

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる