Вопрос № 62322: Можно ли задать размер символьного массива, в процессе ввода в него текста(т.е. размер массива равен количевству введенных букв)?...Вопрос № 62351: Здравствуйте, господа эксперты! Пожалуйста, помогите!!!
Подскажите, в каких регистрах процессора должно возвращаются значение ассемблерной функции вызываемой из программы на С++.
Приведите пожалуйста пример с возвращением типа char, unsigned ...Вопрос № 62385: Уважаемые эксперты, помогите пожалуйста разобраться. Я начал изучать Visual C++ по книге "...Освой самостоятельно за 21 день",
и в определенных местах кода:
strcpy(pRs->m_szAddress, (LPCTSTR)m_strAddress);
компилято...Вопрос № 62472: Здравствуйте, уважаемые эксперты.
Я имею опыт работы с Borland С++ Builder. Сейчас хочу перейти на Visual С++ В связи с этим вопрос:
Имеет ли смысл сейчас изучать библиотеку MFC для визуального программирования или лучше сразу учиться писать...
Вопрос № 62.322
Можно ли задать размер символьного массива, в процессе ввода в него текста(т.е. размер массива равен количевству введенных букв)?
Приложение:
Отправлен: 12.11.2006, 17:46
Вопрос задал: Rekonkista (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Алексеев В.В.
Здравствуйте, Rekonkista!
Увы, так, как написали Вы, писать нельзя. Если Вы используете Си-строки то либо нужно заранее указать размер строки:
char Text[256];
gets(Text);
Или использовать инициализацию строки при создании (компилятор самостоятельно вычислит размер):
char Text[]="Hello!";
Третий путь - выделять память под строку динамически:
//в переменную size сначала читается длина строки в файле
char* Text=(char*)malloc(size*sizeof(char));
gets(Text);
И последний (кажется) способ - использовать строки С++ (класс std::string) и потоки файлового ввода и вывода. Если, конечно, это возможно.
Ответ отправил: Алексеев В.В. (статус: 1-ый класс)
Ответ отправлен: 12.11.2006, 19:22
Отвечает: Хватов Сергей
Здравствуйте, Rekonkista!
Нет - размер массива при его объявлении указывать придётся.
Кроме того - не используйте gets - он может залезть за границу буфера, какой бы длинный он ни был. Используйте fgets.
В GNU libc есть функция С getline, которая сама аллокирует буфер подходящей длины. Правда я не знаю, насколько она стандартная.
И если вы пишете на C++, лучше работать с std::string и std::iostream и использовать функцию C++ getline
Приложение:
Ответ отправил: Хватов Сергей (статус: 8-ой класс)
Ответ отправлен: 13.11.2006, 10:41
Вопрос № 62.351
Здравствуйте, господа эксперты! Пожалуйста, помогите!!!
Подскажите, в каких регистрах процессора должно возвращаются значение ассемблерной функции вызываемой из программы на С++.
Приведите пожалуйста пример с возвращением типа char, unsigned char, int, float. В 16 и 32 битном варианте.
Заранее благодарен Pavel Nasirov.
Отправлен: 12.11.2006, 20:52
Вопрос задал: Pashokq (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Eugene L
Здравствуйте, Pashokq!
16 бит, 32 бит - (char, unsigned char) - возврат в al
16 бит int - возврат в ax
32 бит int - возврат в eax
float скорее всего через стек сопроцессора, точно не помню
Примерно вот так должна выглядеть внешняя процедура на ассемблере (32bit)
Например простая функция (утрированный пример, без локальных переменных):
DWORD func1(DWORD a) {
return a;
}
Для совместимости с С++ на ассемблере следует представить:
func1 proc
push ebp ; начало стекового кадра
mov ebp, esp
mov eax, [ebp+8] ; возвращает 1й аргумент
mov esp, ebp
pop ebp
ret
func1 endp
Ответ отправил: Eugene L (статус: 1-ый класс)
Ответ отправлен: 12.11.2006, 23:49
Вопрос № 62.385
Уважаемые эксперты, помогите пожалуйста разобраться. Я начал изучать Visual C++ по книге "...Освой самостоятельно за 21 день",
и в определенных местах кода:
strcpy(pRs->m_szAddress, (LPCTSTR)m_strAddress);
компилятор выдает ошибку:
Error C2664 'strcpy' : cannot convert parameter 2 from 'LPCTSTR' to
'const char*'
где CString m_strAddress;
CHAR m_szAddress [256];
затрудняюсь разобраться почему.
Спасибо за возможный ответ.
Yuri-M.
Отправлен: 13.11.2006, 01:29
Вопрос задал: Yuri-M (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 3)
Отвечает: Алексеев В.В.
Здравствуйте, Yuri-M!
Я не уверен на 100% т.к. не работаю с VC++, но вижу, что вы пытаетесь сконвертировать класс строки к const char*. Для стандартной библиотеки стандарт запрещает выполнять подобное преобразование, всвязи с чем у класа std::string существует метод c_str(), который возвращает const char*. Попробуйте найти аналогичный метод у класса CString или сконвертировать его к std::string,а затем вызвать c_str().
Ответ отправил: Алексеев В.В. (статус: 1-ый класс)
Ответ отправлен: 13.11.2006, 06:55
Отвечает: Torsten
Здравствуйте, Yuri-M!
Все дело в поддержке UNICODE.
Стандартная библиотека Си (функция strcpy() оттуда) работает только с обычными строка типа char *, у которых 1 символ в строке занимает 1 байт.
В Unicode версии 1 символ занимает 2 байта и поэтому методы работы с ним и обычный строкой отличаются.
Разработчики windows придумали всяких фишек облегчающих им создания приложений как с обычными строками так и для UNICODE. LPCTSTR это макрос, который в зависимости от настроек проекта представляет строку как обычную или UNICODE.
Что же касается вашей проблемы. Стандартная библиотека Си не может работать с UNICODE и будет выдавать ошибку при малейшом несовпадении типов. Даже если UNICODE отключен и в ходе компиляции макрос LPCTSTR подставит обычную строку, то ошибка появится если установить UNICODE.
Хотя компилятор в данном случае слишком сильно придирается. Либо Unicode у вас установлен в чем я сомневаюсь, потому что в этом случае ошибка должна была быть такой:
cannot convert parameter 2 from 'LPCWSTR' to'const char*'
Здесь уже буква W, вместо T. В этом и смысл макроса LPCTSTR. Если UNICODE включен заменит LPCTSTR (const TCHAR *) на LPCWSTR (constr WCHAR * ), а если нет то на LPCSTR (const char *).
Вообщем чтобы обойти эту ошибку преобразую в LPCSTR, а не в LPCTSTR.
--------- #define MAGIC_NUMBER 0xdeface
Ответ отправил: Torsten (статус: 2-ой класс)
Ответ отправлен: 13.11.2006, 10:27
Отвечает: John Paramol
Здравствуйте, Yuri-M!
Используйте lstrcpy.
А вместо CHAR лучше TCHAR.
Успехов!
Ответ отправил: John Paramol (статус: 3-ий класс)
Ответ отправлен: 13.11.2006, 18:35
Отвечает: Ross
Здравствуйте, Yuri-M!
Попробуйте написать так strcpy(pRs->m_szAddress,m_strAddress.GetString());
Ответ отправил: Ross (статус: 2-ой класс)
Ответ отправлен: 13.11.2006, 19:15
Вопрос № 62.472
Здравствуйте, уважаемые эксперты.
Я имею опыт работы с Borland С++ Builder. Сейчас хочу перейти на Visual С++ В связи с этим вопрос:
Имеет ли смысл сейчас изучать библиотеку MFC для визуального программирования или лучше сразу учиться писать под NET
Какие электронные учебники по MFC/.NET вы могли бы посоветовать?
Заранее благодарен за ответы)
Отправлен: 13.11.2006, 17:01
Вопрос задал: Svanshe (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: yatagan
Здравствуйте, Svanshe!
очень советую тебе обратить свое внимание на библиотеку Qt:
http://www.citforum.ru/programming/qt/
если интересно -- спрашивай, удачи.
--------- Україна понад усе!
Ответ отправил: yatagan (статус: 4-ый класс)
Ответ отправлен: 14.11.2006, 11:12