1

コード: (CANoe 8.5.98 32 ビットで実行)

/*@!Encoding:1252*/
includes {
}
variables {
    /* Windows HRESULT error type enum.                         */
    enum HRESULT_Types {
        S_OK            /* Operation successful                 */ = 0x00000000,
        S_FALSE         /* No error occured, oper. unsuccessful */ = 0x00000001,
        E_NOTIMPL       /* Not implemented                      */ = 0x80004001,
        E_NOINTERFACE   /* No such interface supported          */ = 0x80004002,
        E_POINTER       /* Pointer that is not valid            */ = 0x80004003,
        E_ABORT         /* Operation aborted                    */ = 0x80004004,
        E_FAIL          /* Unspecified failure                  */ = 0x80004005,
        E_UNEXPECTED    /* Unexpected failure                   */ = 0x8000FFFF,
        E_ACCESSDENIED  /* General access denied error          */ = 0x80070005,
        E_HANDLE        /* Handle that is not valid             */ = 0x80070006,
        E_OUTOFMEMORY   /* Failed to allocate necessary memory  */ = 0x8007000E,
        E_INVALIDARG    /* One or more arguments are not valid  */ = 0x80070057
    };
    msTimer Timer10ms;
}

on start {
    setTimer(Timer10ms, 10);
}

on timer Timer10ms {
    long hr = S_OK;
    hr = func1();
    if(hr == S_OK) {
        setTimer(Timer10ms, 10);
    }
}

long func1() {
    return S_OK;
}

コンパイラ エラー:

システム L7、C3: オペランド タイプに互換性がありません。

私はこれまでに何をしましたか:

  • S_OK の二重宣言はありません。

  • S_OK 列挙型にコメントを付けようとしたunknown symbol 'S_OK'ところ、コンパイラは、コード内で S_OK を記述したすべての場所に表示されました。

  • SS_OK代わりに書くことができS_OK、エラーなしでコンパイルされます。

  • 私は書くことができS_OK = 0、同じエラーが表示されます。

  • 私は書くことができS_OK, ...、同じエラーが表示されます。

お役立ち情報:

Windows API から CANoe 環境にいくつかの機能を実装する dll を作成しました。もちろん、S_OK の typedef はありますが、CAPL dll は非常に制限的であるため、他の typedef やグローバル変数にはアクセスできません。そのため、この単純な列挙型を実装したかったのです。


コンパイラがこれを正しくコンパイルしたくない理由を誰かが説明できますか? 私にはわかりません。このエラーは私には奇妙に思えます(定義内の型に互換性がありません¯\_(ʘ ͟ʖʘ)_/¯)。

4

1 に答える 1

1

問題は をfunc1()返すことですlongS_OK、列挙定数です。したがって、「オペランドの型に互換性がありません」というエラーが発生します。エラーを修正するには、次の 2 つのオプションがあります。

  1. S_OKにキャストlong:
long func1() {
    return (long)S_OK;
}
  1. (推奨) 戻り値の型を次のように変更しenum HRESULT_Typesます。
enum HRESULT_Types func1() {
    return S_OK;
}

列挙型に関連付けられた変数を宣言/定義することもできます。

on timer Timer10ms {
    enum HRESULT_Types hr = S_OK; // instead of 'long hr = S_OK' if using option 2
    ....
}
于 2016-07-15T09:20:34.873 に答える