Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 586
от 18.11.2006, 17:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 423, Экспертов: 51
В номере:Вопросов: 4, Ответов: 8


Вопрос № 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное