2017-07-26 208 views
1

関数の名前の拡張子を削除しようとしていますが、型wchar_tまたはchar(for)内にキャストvoid wchar_tまたはchar型へのポインタエラーがありました:式は、キャスト時に完全なオブジェクト型へのポインタにする必要があります。voidポインタ

Expression must be a pointer to a complete object type.

ここでは、問題のインスタンスを単独で表示するサンプルコードを示します。

int RemoveExtension(
    void *p_str,  /* Name      */ 
    bool isWchar  /* true:wchar_t, false:char */ 
) { 
    int ii, len; 

    // Get length 
    len = (isWchar) ? wcslen((wchar_t *)p_str) : strlen((char *)p_str); 

    // Remove extension 
    /* wchar_t */ 
    if(isWchar) { 

     for(ii = 0; ii < len; ii++) { 
      if(L'.' == (wchar_t *)p_str[ii]) { //Error here 
       (wchar_t *)p_str[ii] = L'\0';  //Error here 
       break; 
      } 
     } 
    } 
    /* char */ 
    else { 

     for(ii = 0; ii < len; ii++) { 
      if('.' == (char *)p_str[ii]) {  //Error here 
       (char *)p_str[ii] = '\0';   //Error here 
       break; 
      } 
     } 
    } 

    return 0; 
} 

このエラーの内容を理解できません。ここにはオブジェクトや構造体はありません。私はあなたが正確にそのエラーを取得する理由を知っているが、this表に従って 表現

(wchar_t *)p_str[ii]((wchar_t *)p_str)[ii](wchar_t *)(p_str[ii])

ないが、

いけない

+1

'(のwchar_t *)p_str [II]' - > '((wchar_t *)p_str)[ii] ' - http://en.cppreference.com/w/c/language/operator_precedenceを参照してください。 –

+1

" *ここにはオブジェクトや構造体はありません。あなたの 'void *'が指しているものは、C言語では* object *ですが、 'void'は不完全な型ですので、コンパイラはサイズを知りません。したがって、インデックスを作成できません。索引付けは、キャストよりも優先順位が高くなります。 paranthesesを使用して最初に完全な型にキャストし、索引付けが機能します。 –

+0

@FelixPalmen:わかっています。どうもありがとうございました。まさに!!! – Oosutsuke

答えて

1

は、おそらくそれはあなたが望むものを

+0

私は理解しています。どうもありがとうございました。 +1 – Oosutsuke

2

にはありませんエラーメッセージを理解するには、2つのことを知る必要があります。

  1. タイプがどこかに格納されている値は、オブジェクトとなります。変数によってオブジェクトが識別され、ポインタがオブジェクトを指すはずです。
  2. Cの型は完全でも不完全であってもかまいません。その区別は、の完全なタイプの場合、そのタイプのオブジェクトのサイズが分かっています。 が不完全なタイプの場合は不明です。サイズを知らずに、例えば。次の配列要素のオフセットを計算するためにサイズが必要なため、インデックス作成は不可能です。 void不完全な型の特殊ケースである:それは今までに完了することができない、それは不明だから(void *汎用のポインタ型あるとあらゆるタイプのオブジェクトを指す場合があります)。

だから、あなたのコンパイラはちょうどあなたがタイプvoid *のポインタにインデックスにしようとしているためp_str[ii]が無効であることを示しています。


問題の原因は単純です:インデックスは、ちょうどこの問題を解決するために括弧を使用するので、キャストよりも優先順位が高い:

((wchar_t *)p_str)[ii] 
+0

明確な説明をいただきありがとうございます! +1 – Oosutsuke

関連する問題