Перевод строки в число
Если на форме только поле Edit1 и кнопка Butto1, то код
int n=StrToInt(Edit1->Text);
срабатывает без ошибок, но если на форме много компонентов, то выскакивают ошибки:
[C++ Warning] atlwin.h(1579): W8017 Redefinition of 'MESSAGE_HANDLER' is not identical
[C++ Error] Unit1.cpp(68): E2034 Cannot convert 'AnsiString' to 'const char *'
[C++ Error] Unit1.cpp(68): E2342 Type mismatch in parameter 'IpSrc' (wanted 'const char *', got 'AnsiString')
Если на форме только поле Edit1 и кнопка Butto1, то код
int n=StrToInt(Edit1->Text);
срабатывает без ошибок, но если на форме много компонентов, то выскакивают ошибки:
[C++ Warning] atlwin.h(1579): W8017 Redefinition of 'MESSAGE_HANDLER' is not identical
[C++ Error] Unit1.cpp(68): E2034 Cannot convert 'AnsiString' to 'const char *'
[C++ Error] Unit1.cpp(68): E2342 Type mismatch in parameter 'IpSrc' (wanted 'const char *', got 'AnsiString')
приведенные ошибки к приведенному коду никак не соответсвуют
Вот код обработчика:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int n=StrToInt(Edit1->Text);//строка № 68
Label1->Caption=IntToStr(n*n);
/*
[C++ Warning] atlwin.h(1579): W8017 Redefinition of 'MESSAGE_HANDLER' is not identical
[C++ Error] Unit1.cpp(68): E2034 Cannot convert 'AnsiString' to 'const char *'
[C++ Error] Unit1.cpp(68): E2342 Type mismatch in parameter 'IpSrc' (wanted 'const char *', got 'AnsiString')
*/
}
Ответ на решение данной проблемы нашёл, если заменить
int n=StrToInt(Edit1->Text);
на
int n=Edit1->Text.ToInt();
Но почему в данном случае функция не работает? Всё дело в ней, потому как при переборе возможных вариантов выскочила ошибка, говорящая о какойто внешней ссылке 'StrToIntA'.
А вообще существуют расшифровки ошибок Билдера и способы их устранения, потому как краткий комментарий возле ошибк, иногда, мало о чём говорит.
И тоже немного странноые вещи видел - в простой программе, где одна форма, с какого-то момента требуется писать Form1->Edit1->Text;
СтрТоИнт (в проэкт инклюдится ещё одна функция с такимже названием, но с другими параметрами вызова как минимум их 2(в 2007 с++): стандартная (из SysUtils int StrToInt(string Sconst); и из shlwapi.h int StrToInt(LPCTSTR lpSrc); - вторая кстати ругается соответствующе:
[BCC32 Error] Unit1.cpp(20): E2034 Cannot convert 'AnsiString' to 'const char *'
[BCC32 Error] Unit1.cpp(20): E2342 Type mismatch in parameter 'lpSrc' (wanted 'const char *', got 'AnsiString'))
)
Попробуй заменить
int n=StrToInt(Edit1->Text);//строка № 68
на
int n=StrToInt(Edit1->Text.c_str());//строка № 68
З.Ы. StrToIntA прописана в shlwapi.h так:
#define StrToInt StrToIntA
поэтому стртоинт сразу идёт на стртоинта и использование namespace както int n=Sysutils::StrToInt(Edit1->Text); приведёт к ошибке что стртоинта не является функцией в сисутилз
Вывод: чтобы всё заработало надо добавить одну строчку:
#undef StrToInt
и будет тебе счастье
СтрТоИнт (в проэкт инклюдится ещё одна функция с такимже названием, но с другими параметрами вызова как минимум их 2(в 2007 с++): стандартная (из SysUtils int StrToInt(string Sconst); и из shlwapi.h int StrToInt(LPCTSTR lpSrc); - вторая кстати ругается соответствующе:
[BCC32 Error] Unit1.cpp(20): E2034 Cannot convert 'AnsiString' to 'const char *'
[BCC32 Error] Unit1.cpp(20): E2342 Type mismatch in parameter 'lpSrc' (wanted 'const char *', got 'AnsiString'))
)
Попробуй заменить
int n=StrToInt(Edit1->Text);//строка № 68
на
int n=StrToInt(Edit1->Text.c_str());//строка № 68
З.Ы. StrToIntA прописана в shlwapi.h так:
#define StrToInt StrToIntA
поэтому стртоинт сразу идёт на стртоинта и использование namespace както int n=Sysutils::StrToInt(Edit1->Text); приведёт к ошибке что стртоинта не является функцией в сисутилз
Вывод: чтобы всё заработало надо добавить одну строчку:
#undef StrToInt
и будет тебе счастье
Если написать:
int n=StrToInt(Edit1->Text.c_str());//строка №68
то ругается по-другому:
[C++ Warning] atlwin.h(1579): W8017 Redefinition of 'MESSAGE_HANDLER' is not identical
[Linker Error] Unresolved external 'StrToIntA' referenced from C:\...адрес UNIT1.OBJ
Как я понял, строка:
#undef StrToInt
аннулирует функцию StrToInt(), чтобы не было конфликта с функцией аналогичного названия, но другими параметрами?
Но #undef StrToInt - это лишняя строка кода, может по-проще использовать функцию ToInt() ?
И тоже немного странноые вещи видел - в простой программе, где одна форма, с какого-то момента требуется писать Form1->Edit1->Text;
В данном случае Form1-> не помогает
[QUOTE=BCB Help]
Converts an AnsiString that represents an integer (decimal or hex notation) to a number with Boolean success code.
Unit
SysUtils
Category
type conversion routines
extern PACKAGE bool __fastcall TryStrToInt(const AnsiString S, int &Value);
Description
TryStrToInt converts the string S, which represents an integer-type number in either decimal or hexadecimal notation, into a number, which is assigned to Value. If S does not represent a valid number, TryStrToInt returns false; otherwise TryStrToInt returns true.
[/QUOTE]
Но #undef StrToInt - это лишняя строка кода, может по-проще использовать функцию ToInt() ?
В билдере такое понятие как лишняя строка кода отсутствует принципиально. У тебя и так приложение только с одной формой со старта будет весить кб 500. так что строчкой больше строчкой меньше....
нехватает #pragma link "чётотам" что такое чётотам трудно сказать, в моём примере это shlwapi.lib а тебе надо самому смотреть...
Redefinition of 'x' is not identical (W8017)
(Command-line option to suppress warning: -w-dup)
Your source file redefined the macro 'ident' using text that was not exactly the same as the first definition of the macro.
The new text replaces the old.
'MESSAGE_HANDLER' переопределяется с другими параметрами.