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

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


Информационный Канал Subscribe.Ru

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

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

Выпуск № 233
от 04.11.2005, 14:42

Администратор:Калашников О.А.
В рассылке:Подписчиков: 228, Экспертов: 32
В номере:Вопросов: 5, Ответов: 14


Вопрос № 28499: Помогите написать программу: Определить класс, в котором описать С-строку из 100 символов. Добавить в класс конструктор по умолчанию, который должен инициализировать строку случайными значениями. Также определить в классе функцию-член, котор...
Вопрос № 28511: Здравствуйте уважаемые експерты. Пишу прогу на С++ с использованием ассемблерной вставки, в которой необходимо использовать мат.сопроцессор. После приминения операции сравнения fcom необходимо скопировать управлящий код в регистр флагов. Пр...
Вопрос № 28530: Здравствуйте , подскажите , как в борланде си++ заставить формуу не перерисовываться , при перемещении , скроллинге , итп.. спасибо...
Вопрос № 28541: Как в C#/C++ преобразовывать типы данных, например из string в int, float, char, short, long и наоборот. Спасибо....
Вопрос № 28543: Здравствуйте, Уважаемые Эксперты. Вы не могли бы мне рассказать про параметры функции CharToOem а то найти нигде не могу. ...

Вопрос № 28.499
Помогите написать программу:

Определить класс, в котором описать С-строку из 100 символов. Добавить в класс конструктор по умолчанию, который должен инициализировать строку случайными значениями. Также определить в классе функцию-член, которая выводит строку на экран. Перегрузить для данного класса операторы потокового ввода вывода (<<, >>)

Мой компилятор выдает следующие ошибки:

[Linker Error] Unresolved external 'str::~str()' referenced from C:AD6PROVERKA.OBJ
[Linker Error] Unresolved external 'str::vivod()' referenced from C:AD6PROVERKA.OBJ
Отправлен: 29.10.2005, 16:04
Вопрос задал: Rewer8 (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Bob Johnson
Здравствуйте, Rewer8!
Ты задекларировал ~str() и vivod(), но забыл их описать. в cpp файле где-нибудь опиши, например:
str::vivod ()
{
printf ("...");
}

и т.д.
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 29.10.2005, 18:07

Отвечает: estiGi
Здравствуйте, Rewer8!
Непонятно, тебе нужно помочь написать программу или исправить ошибки линковки? Эти ошибки вылазят, потому ты объявил, но не определил две функции (по крайней мере, линковщик об этом ничего не знает).
Т.е. тебе нужно их определить:
str::~str () {}
void str::vivod () {}
Этого достаточно, чтобы программы заработала (если vivod возвращает не void, то нужно, конечно, написать правильно). Еще такая ошибка может возникнуть, если линковщик не может найти *.cpp файл, в котором функции определены, либо ты не подключил dll, в которой определены эти функции, или в *.mmp - файл не занесены исходники, или... - причина в любом случае одна. Но это так, на будущее, сейчас у тебя ошибка должны быть первая.
Заметь, что ошибка не выскочит, пока ты не вызовешь эту функцию. Т.е. создав объект, линковщик требует определение объявленного деструктора, а вызвав в программе функцию vivod, линковщик, соответсвенно, требует ее определения.
пс
обычно пишется еще номер ошибки, например, как в твоем случае может быть - LNK2019 - то подробное описание ошибки можно найти в МСДН - по этому номеру
Ответ отправил: estiGi (статус: 4-ый класс)
Отправлен: 29.10.2005, 23:55

Отвечает: Raptor1
Здравствуйте, Rewer8!
А где же код? Судя по ошибкам ты еще на описал тело функций vivod и деструктора класса.
Ответ отправил: Raptor1 (статус: 9-ый класс)
Отправлен: 30.10.2005, 11:26


Вопрос № 28.511
Здравствуйте уважаемые експерты. Пишу прогу на С++ с использованием ассемблерной вставки, в которой необходимо использовать мат.сопроцессор. После приминения операции сравнения fcom необходимо скопировать управлящий код в регистр флагов.

Проблема в том, что инструкция fstsw, копирующая ключевое слово в рег ax, является инструкцией проца 80286+, у меня же по умолчанию стоят настройки под 8086. Соответсвенно эта инструкция не выполняется. Подскажите как можно решить эту проблему.
Заранее всем благодарен.

Приложение:

Отправлен: 29.10.2005, 20:38
Вопрос задал: Юра (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Raptor1
Здравствуйте, Юра!
Обычно в настройках компилятора (Borland C++3.1, Visual C++) можно указывать для какого процессора генерируется код, а так как компилятор ты не указал, то ищи эти настройки сам, если не выйдет то есть в С++ такая волшебная команда emit которая вставляет команду непосрественно в программу без компиляции, но код fstsw тебе надо поискать в справочниках. Опять же на 8086 компьютере твоя программа все равно работать не будет, ну нет там такой команды.
Ответ отправил: Raptor1 (статус: 9-ый класс)
Отправлен: 30.10.2005, 11:26
Оценка за ответ: 5

Отвечает: Boriss
Здравствуйте, Юра!
Да нет, не прав Raptor1 - будет! Дело не в том, для какого процессора пишите, а какой выполняет! "Недостающие" команды можно сделать с помощью db:
db 0df, 0e0h - в данном случае
Если нет под рукой хорошего справочника, то пишите на ассемблере чистом.
Вот как можно проверить коды ... (Дебаггер покажет тождественность)

Приложение:

---------
Прорвемся! (Быть может :(( )

Ответ отправил: Boriss (статус: Профессор)
Отправлен: 01.11.2005, 17:49


Вопрос № 28.530
Здравствуйте , подскажите , как в борланде си++ заставить формуу не перерисовываться , при перемещении , скроллинге , итп..
спасибо
Отправлен: 30.10.2005, 10:09
Вопрос задал: __Cheat3r (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jadd
Здравствуйте, __Cheat3r!
А смысл? Ок, раз уж хочется. Можно подсунуть свою оконную процедуру и ловить там WM_PAINT и при приходе этого сообщения просто ываливаться без вызова DefWindowProc. Но учтите, что кнопки и всякие боксы тоже окна и у каждого из них есть своя петля сообщений. В этом случае помогает локальный хук на главный поток окна и при определенном условии просто игнорировать его. За последствия Вам придется самому отвечать :)
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Практикант)
Отправлен: 30.10.2005, 11:28


Вопрос № 28.541
Как в C#/C++ преобразовывать типы данных, например из string в int, float, char, short, long и наоборот. Спасибо.
Отправлен: 30.10.2005, 13:36
Вопрос задал: Yarking (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: Jadd
Здравствуйте, Yarking!
Есть несколько способов. Все типы преобразуются явно или неявно. Например, очевидно, что string к int тьребует явного преобразования. Делается это с помощью функции из stdlib int atoi( const char *string ); Обратное преобразование делается с помощью функции обратной этой: char *_itoa(int value, char *string, int radix); или через функцию типа sprintf. Строка в float, long, double переводятся функциями:

double atof( const char *string );
long atol( const char *string );

К char привести не сложно, т.к. в понимании c/c++ строка - это указатель на область памяти типа char, соответственно символ можно получить по индексу в строке.

---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Практикант)
Отправлен: 30.10.2005, 13:55
Оценка за ответ: 4
Комментарий оценки:
А как привязать эту библиотеку в проект?

Отвечает: estiGi
Здравствуйте, Yarking!
Во первых, в С++ нет типа string. string - это класс из библиотеки STL. Потом, что значит - преобразовать строку в число? Какой в этом смысл ты видишь? Строка по сути - это массив символов, как это ты его переведешь в число, тем более в дробное? Каким ты результат видишь? :) Если взять например 4х-байтовый long, то можно чтобы это число хранило четыре ANSI-символа или 2 юникодных. Можно записать в int адрес строки, а потом вернуть, но это извращение. Если нужно держать адрес, то держи его в указателе на свой тип или в void*.
Именно string из STL так просто ты не преобразуешь с числу, потому что у класса std::string нет оператора преобразования к числу (странно, правда? :) )

Что касается C#, то там можно преобразовывать типы к классу object и обратно, потому что они все от него наследуются - это называется упаковка/распаковка (boxing/unboxing). Например так:
string str = "Text";
object obj = str;
string str2 = (string)obj;
Но это не преобразование типов, это нормальное свойство классов, и оно вытекает из законов ООП.
Ответ отправил: estiGi (статус: 4-ый класс)
Отправлен: 30.10.2005, 19:43
Оценка за ответ: 4
Комментарий оценки:
Так как же мне из textbox'a взять число, умножить, сложить, поделить и опять положить в textbox?

Отвечает: Raptor1
Здравствуйте, Yarking!
В с++ проще всего с помощью sscanf spintf
Ответ отправил: Raptor1 (статус: 9-ый класс)
Отправлен: 02.11.2005, 23:40


Вопрос № 28.543
Здравствуйте, Уважаемые Эксперты.
Вы не могли бы мне рассказать про параметры функции CharToOem а то найти нигде не могу.
Отправлен: 30.10.2005, 14:21
Вопрос задал: Чурсанов Евгений Ильич (статус: 4-ый класс)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jadd
Здравствуйте, Чурсанов Евгений Ильич!
BOOL CharToOem(LPCTSTR lpszSrc, LPSTR lpszDst);

lpszSrc - указатель на строку, которую нужно конвертить,
lpszDst - указатель на буфер, куда будет помещена сконверченая строка.

Результат: всегда ненулевой, кроме случаев, когда во второй параметр передается адрес строки, переданной в первом параметре для версии wide-char. В этом случае результат будет нулевым, а функция GetLastError() вернет ERROR_INVALID_ADDRESS.

Надеюсь все ясно теперь стало? MSDN рулит.

---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Практикант)
Отправлен: 30.10.2005, 14:34
Оценка за ответ: 5

Отвечает: kalash-lox
Здравствуйте, Чурсанов Евгений Ильич!
BOOL CharToOem( LPCTSTR lpszSrc, LPSTR lpszDst);
1-ый параметр строку которую конвертируем
2-ой куда пишем результат
Ответ отправил: kalash-lox (статус: Заблокирован)
Отправлен: 30.10.2005, 15:13
Оценка за ответ: 5

Отвечает: Sager
Здравствуйте, Чурсанов Евгений Ильич!
CharToOem:
BOOL CharToOem(LPCTSTR lpszSrc, LPSTR lpszDst);
LPCTSTR lpszSrc - это указатель на строку, кот. будешь конвертировать
LPSTR lpszDst - это указатель на строку, где будет результат конвертации.
Ответ отправил: Sager (статус: Студент)
Отправлен: 30.10.2005, 17:30
Оценка за ответ: 5

Отвечает: estiGi
Здравствуйте, Чурсанов Евгений Ильич!
А ты искать пытался? :)
Если нет локального установленного МСДН, используешь сеть:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/strings/stringreference/stringfunctions/chartooem.asp
И в параметрах ничего сложного нету.
первый - буфер, который нужно конвертировать
второй - буфер, куда записать конвертированную строку
Можно использовать один и тот же:
char buff [100] = "Моя строка для конвертирования кодировки";
CharToOem (buff, buff);
Теперь в buff уже строка с OEM-кодировкой
Ответ отправил: estiGi (статус: 4-ый класс)
Отправлен: 30.10.2005, 19:09
Оценка за ответ: 5
Комментарий оценки:
Пытался. У себя на компьютере в нескольких сотнях метров учебников по С++.

Отвечает: Raptor1
Здравствуйте, Чурсанов Евгений Ильич!
BOOL CharToOem(
LPCTSTR lpszSrc, // string to translate
LPSTR lpszDst // translated string
);
Parameters
lpszSrc [in] Pointer to the null-terminated string to translate.
lpszDst [out] Pointer to the buffer for the translated string. If the CharToOem function is being used as an ANSI function, the string can be translated in place by setting the lpszDst parameter to the same address as the lpszSrc parameter. This cannot be done if CharToOem is being used as a wide-character function.
Return Values
The return value is always nonzero.

Ответ отправил: Raptor1 (статус: 9-ый класс)
Отправлен: 02.11.2005, 23:40


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

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

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

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

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


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


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Rambler's Top100 Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Архив рассылки
Отписаться
Вспомнить пароль

В избранное