2016-09-05 2 views
0

Я никогда не мог обернуть голову вокруг указателей, строк, символов и т. Д. Мне нужно помогите с этой ошибкой. Вот фрагмент кода ...Ошибка C2664: «Стратегия :: Интерфаз»: невозможно преобразовать параметр 2 из «char *» в «char» [] '

string H = "פטיש"; 
string G = "Σφυρί"; 

bool Interphase(int argc, char * args[]); //DLL import from Analytical.a 

char * Hcopy = new char[H.length() + 1]; 
std::strcpy(Hcopy, H.c_str()); 
char * Gcopy = new char[G.length() + 1]; 
std::strcpy(Gcopy, G.c_str()); 

while (Interphase(147, Hcopy) == true || Interphase(148, Gcopy) == true)//C2664 here! 
    {// Do stuff...} 

Пожалуйста, обратите внимание, что код изменен, чтобы отразить только ошибку.

Кроме того, как компилировать в Visual Studio 2012 Окончательной без

Warning C4566: character represented by universal-character-name '\u05E9' cannot be represented in the current code page (1252) 

Спасибо.

+0

Предупреждения полезны! Не игнорируйте их! Предупреждение, которое вы пытаетесь удалить, является полезным предупреждением: '' פטיש "' не может быть представлен как массив 'char'. Это, скорее всего, даст вам неправильные результаты. – Rakete1111

+1

Почему вы используете указатели и C-строки? Это 2016 год, а не 1972 год! Почему бы просто не называть 'Interphase (147, & H [0])' и 'Interphase (148, & G [0])'? (Вы уверены, что аргументы 'argc' верны?) –

+0

@LightnessRacesinOrbit Wikipedia C++: «Сначала появился \t 1983« ОК. – Downvoter

ответ

0

Ваша ошибка:

Error C2664: 'Strategy::Interphase' : cannot convert parameter 2 from 'char *' to 'char *[]'

означает, что вы даете char* к функции, которая ожидает char*[].

bool Interphase(int argc, char * args[]); 

Обратите внимание на второй аргумент, это указатель на массив (или массив массивов, или указатель на указатель).

Ваш код может быть изменен, чтобы дать ему адрес указателя:

while (Interphase(1, &Hcopy) == true || Interphase(1, &Gcopy) == true) 
    // ... 

, но я сомневаюсь, что это как имеется в виду API, которые будут использоваться.

Я не знаком с этой функцией, но я предполагаю, что это используется больше как:

const char** args = {"arg1", "arg2"}; 
Interphase(2, args); 

Ваше предупреждение:

Warning C4566: character represented by universal-character-name '\u05E9' cannot be represented in the current code page (1252)

означает, что char не может содержать не-ASCII-символы.

Если вы используете Юникод, вы должны использовать широкие символы и строки (wchar_t и wstring), чтобы разрешить большие числа. В противном случае у вас будет overflow и, скорее всего, обертка.

Ссылка на comparison between string and wstring.


В качестве примечания, вы действительно не должны использовать строки C-стиля (char*). Используйте вместо этого std::string. Причина:

  • Нужно освободить их самостоятельно (код утечки памяти, как есть)
  • небезопасный апи (нуждаясь пройти размер вместе с данными)
+1

Фактически 'std :: string' store Unicode code points, закодированные в UTF-8. –

+2

@Bob__: Общая глупость. 'std :: string' хранит байты и не имеет встроенной кодировки вообще. –

+0

@Ivan Итак, мой вопрос заключается в том, как передавать строки в Interphase(); функции в dll. Также изменение с строки на wstring только изменяет ошибку на ошибку C2664: «Стратегия :: Интерфаз»: невозможно преобразовать параметр 2 из 'wchar_t *' в 'char * []' – loumbut5

Смежные вопросы