関数の名前の拡張子を削除しようとしていますが、型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])
ないが、
いけない
'(のwchar_t *)p_str [II]' - > '((wchar_t *)p_str)[ii] ' - http://en.cppreference.com/w/c/language/operator_precedenceを参照してください。 –
" *ここにはオブジェクトや構造体はありません。あなたの 'void *'が指しているものは、C言語では* object *ですが、 'void'は不完全な型ですので、コンパイラはサイズを知りません。したがって、インデックスを作成できません。索引付けは、キャストよりも優先順位が高くなります。 paranthesesを使用して最初に完全な型にキャストし、索引付けが機能します。 –
@FelixPalmen:わかっています。どうもありがとうございました。まさに!!! – Oosutsuke