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

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


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

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

Выпуск № 334
от 26.02.2006, 09:21

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


Вопрос № 35790: Добрый день ув. эксперты. Нужна помощ. Работаю в Buider C++. У меня несколько кнопок вызывают одну функцию Form1::OnClikButton(TObject *Sender). Как можно узнать какая кнопка вызвала данную функцию? Может мне помочь переменная Sen...
Вопрос № 35795: Уважаемые эксперты, у меня стоит следующая задача, организовать обмен данными между серверным (на базе Unix) и клиентским (Windows)приложениями. И тут встала проблема преобразования таких типов данных как int, time_t, double из формата Windows в форм...
Вопрос № 35799: Здравствуйте, господа эксперты! Можно ли указателю на функцию присвоить указатель на метод класса? Если можно, то кал это делается? Допустим у меня есть указатель на функцию int (pcodelet*)(int a, char* c) и класс class Foo{ ...
Вопрос № 35818: Здравствуйте эксперты. Нуждаюсь в динамическом массиве структур, содержащих динамические массивы. Однако в реализации не хочет работать добавление структур. Пробовал с векторами - тоже самое. Подскажите в чём здесь дело и чем можно за...
Вопрос № 35826: Доброго времени суток господа эксперты!!! Помогите в решении одного вопроса. Надо расчитать факториал. Я написал его реализацию этого расчета так (см. приложение) И все вроде нормально работает только вот одно но. До числа 16 эта...
Вопрос № 35853: Здравствуйте! У меня есть файл в формате txt, pdf, doc и т.д. Не составляет труда написать программу, которая бы открывала данные файлы в любом текстовом режиме и отображала бы информацию хранящуюся в этих файлах. Вопрос: у меня есть файлы в ...

Вопрос № 35.790
Добрый день ув. эксперты.
Нужна помощ.
Работаю в Buider C++.
У меня несколько кнопок вызывают одну функцию Form1::OnClikButton(TObject *Sender).
Как можно узнать какая кнопка вызвала данную функцию?
Может мне помочь переменная Sender, отправляемая как аргумент в функцию?
Отправлен: 20.02.2006, 10:48
Вопрос задал: AllexZ (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Jadd
Здравствуйте, AllexZ!
да может. Sender - инициатор события. На билдере не пишу, но в С++ можно использовать RTTI для приведения. А в Sender есть функция, которая вернет имя класса объекта ClassName. По ней можно проверить.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 20.02.2006, 11:01
Оценка за ответ: 4

Отвечает: Татьяна
Здравствуйте, AllexZ!
Ну вообще говоря, когда вы нажимаете на кнопку Sender и есть та самая кнопка, на которую нажали. Все что вам надо сделать это преобразовать
если у вас массив кнопок и вам нужно, например определить индекс просто можете проверить
if (Button[i] == Sender){...}
Все просто
Желаю удачи

---------
Нет ничего невозможного!!!
Ответ отправила: Татьяна (статус: Студент)
Отправлен: 20.02.2006, 19:52


Вопрос № 35.795
Уважаемые эксперты, у меня стоит следующая задача, организовать обмен данными между серверным (на базе Unix) и клиентским (Windows)приложениями. И тут встала проблема преобразования таких типов данных как int, time_t, double из формата Windows в формат Unix и обратно. Подскажите как это можно с удобством организовать, либо подкиньте какую-нибудь реально полезную ссылку по этому вопросу. Заранее благодарен за ответ.
Отправлен: 20.02.2006, 12:02
Вопрос задал: Воробьев Дмитрий Владимирович (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Muad Dib
Здравствуйте, Воробьев Дмитрий Владимирович!
Вообще преобразование форматов актуально для Строк - потому что в Unix и в Windows отличаются символы конца строки. Перечисленные вами типы вообще не отличаются.
Ответ отправил: Muad Dib (статус: 5-ый класс)
Отправлен: 20.02.2006, 12:42
Оценка за ответ: 3
Комментарий оценки:
Для строк согласен, однако, что касается int, double, то это не так. Поскольку даже порядок следования байт в слове для каждого указанного типа данных в Windows и Unix различен.

Отвечает: yatagan
Здравствуйте, Воробьев Дмитрий Владимирович!
если ты не возражаешь против относительной высокоуровневости, то используй кроссплатформенную библиотеку Qt (http://prog.org.ru/forum/topic_765.html). классная штука, сокеты конечно есть, пишеш код под какой-то одной платформой, компилируешь, запускаешь другую платформу и компилируешь под ней. не надо задумываться над представлением данных. ну это конечно не подходит, если хочешь все писать с нуля. удачи!
---------
Україна понад усе!
Ответ отправил: yatagan (статус: 4-ый класс)
Отправлен: 21.02.2006, 19:34
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо за совет, у меня конечно проект уже наполовину готов, но обязательно поробую.


Вопрос № 35.799
Здравствуйте, господа эксперты!
Можно ли указателю на функцию присвоить указатель на метод класса?
Если можно, то кал это делается?
Допустим у меня есть указатель на функцию int (pcodelet*)(int a, char* c) и класс
class Foo{

public:
int method(int a, char*c)
};

Сделать прямиком: Foo *foo = new Foo; pcodelet = foo->method;, не получается.
Отправлен: 20.02.2006, 12:41
Вопрос задал: Skolod (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Straight
Здравствуйте, Skolod!

Вы вот так присваивайте:
int ( Foo:: * pcodelet ) (int a, char*c) = Foo::method;

А вызывайте вот так:
(foo->*pcodelet)(1,"my cool string");

Приложение:

Ответ отправил: Straight (статус: 8-ой класс)
Отправлен: 20.02.2006, 14:17


Вопрос № 35.818
Здравствуйте эксперты.
Нуждаюсь в динамическом массиве структур, содержащих динамические массивы.
Однако в реализации не хочет работать добавление структур.
Пробовал с векторами - тоже самое.
Подскажите в чём здесь дело и чем можно заменить подобный код(в приложении).

Приложение:

Отправлен: 20.02.2006, 18:03
Вопрос задал: L0k1 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: X-MAN
Здравствуйте, L0k1!
Не знаю, почему у вас не получилось с векторами!!!
Если мне нужен динамический массив из динамических массивов, я всегда использую vector.
В приложении переделанная программа с векторами.

Приложение:

Ответ отправил: X-MAN (статус: 3-ий класс)
Отправлен: 20.02.2006, 23:24


Вопрос № 35.826
Доброго времени суток господа эксперты!!!

Помогите в решении одного вопроса.
Надо расчитать факториал.
Я написал его реализацию этого расчета так (см. приложение)
И все вроде нормально работает только вот одно но. До числа 16 эта функция считает правильно но при значениях 17, 18, 20, 21, 22, 24, 26 и т.д. она выдает отрицательный результат. Почему понять немогу, может я чето не то делаю так вы поправте.

Работаю на С++Builder'e

Приложение:

Отправлен: 20.02.2006, 19:02
Вопрос задал: Ujin Antikvar (статус: 5-ый класс)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Ataman N. N.
Здравствуйте, Ujin Antikvar!
Проблема заключается в типе int (слишком маленький он для таких целей). Для функции факториал используйте тип данных больший нежели int, например long int.
Ответ отправил: Ataman N. N. (статус: 7-ой класс)
Отправлен: 20.02.2006, 19:09

Отвечает: Татьяна
Здравствуйте, Ujin Antikvar!
Ну если дополнить предыдущий ответ, я думаю вы знаете, что для знака числа используется старший бит, т.е. он будет 1 - если число отрицательное, поэтому как только он заполняется (число больше максимального положительного), то оно становится отрицательным, т.е. для решения необходимо по крайней мере использовать unsigned тип
---------
Нет ничего невозможного!!!
Ответ отправила: Татьяна (статус: Студент)
Отправлен: 20.02.2006, 19:22
Оценка за ответ: 5

Отвечает: Muad Dib
Здравствуйте, Ujin Antikvar!

А после числа 16 результат выходит за границы int
Ответ отправил: Muad Dib (статус: 5-ый класс)
Отправлен: 20.02.2006, 19:38

Отвечает: PROD
Здравствуйте, Ujin Antikvar!

все просто - 17! очень большое число и выходит за рамки переменной.
Вы используете int для хранения значения факториала, а у int предел ~32600 (точно не помню). 17! намного больше 32000, вот вы и получаете нетот результат.
А отрицательный он вот почему:
для хранения переменной типа int отводится 4байта=32бита (в некоторых системах больше). Первый бит отвечает за знак числа (если только это не unsignet int).
когда вы вычисляете слижком большое число его бинарное представление займет больше 32бит, например 33бита. но при сохранении запишутся только 32, а лишнее либо выкидывается, либо записывается уже в чужую память (мало вероятно).
вот и получаете не то что хотите.
Решение:
примитиивное - использовать более большие переменные (long int, unsignet, double и т.д.) но и у них будет конец, так что 60! вам посчитать не удастся.
сложное - либо резать ваше большое число на кусочки и распихивать по переменным (в массив), либо придумывать новый тип (как вариант массив) с динамически выделеямой памятью
Ответ отправил: PROD (статус: 4-ый класс)
Отправлен: 20.02.2006, 20:35
Оценка за ответ: 5
Комментарий оценки:
Спасибо!!!
Но я уже все переделал и теперь могу вычислить факториал даже 60. Код в мини-форуме. Предел вычисления данной функции является факториал 1754

Отвечает: Denn
Здравствуйте, Ujin Antikvar!
Дело в том что тип int имеет диапазон -2^31...+2^31. 17! больше макс. положительного числа и попадает в отрицательный диапазон. Это тонкости двоичной арифметики. Можно использовать unsigned int 0...2^32. Если мало используй int64. Если все равно мало, то не обойтись без дробных типов: float или extended. У последнего размер аж 80 бит.
---------
Мир всему миру
Ответ отправил: Denn (статус: 1-ый класс)
Отправлен: 23.02.2006, 09:59

Отвечает: Fox_ozersk
Здравствуйте, Ujin Antikvar!
Происходит, как я думаю, переполнение типа int, который Вы используете для хранения факториала числа.
Проверьте размер типа int, который Вы используете в своей функции подсчёта факториала, и величины 15! и 16!
Вместо int попробуйте использовать более большие типы данных, например - long long (int64)
---------
Чтобы писать программы голова не нужна, нужна клавиатура !
Ответ отправил: Fox_ozersk (статус: 1-ый класс)
Отправлен: 24.02.2006, 13:50


Вопрос № 35.853
Здравствуйте!
У меня есть файл в формате txt, pdf, doc и т.д. Не составляет труда написать программу, которая бы открывала данные файлы в любом текстовом режиме и отображала бы информацию хранящуюся в этих файлах.
Вопрос: у меня есть файлы в формате .avi, .midi, mp3 и т.д. Как открыть их, что бы прослушать звуковую информацию?
(без использования проигрывателей :-))), естественно)
Отправлен: 20.02.2006, 23:50
Вопрос задал: Retcom (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: estiGi
Здравствуйте, Retcom!
Один способ знаю - использовать набор функций MCIWnd...
Этим ты встраиваешь проигрыватель в свое окно.
Подробнее тут: http://windowssdk.msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_mciwnd_reference.asp
Ответ отправил: estiGi (статус: Студент)
Отправлен: 21.02.2006, 12:41

Отвечает: X-MAN
Здравствуйте, Retcom!
Можно использовать DirectShow!
Всё очень просто и удобно: проигрываются все медиафайлы, для которых есть установленные в системе кодеки!
В приложении пример с самым необходимым минимумом...

P.S. Не забудьте прилинковать файл strmiids.lib. Удачи...

Приложение:

Ответ отправил: X-MAN (статус: 3-ий класс)
Отправлен: 21.02.2006, 23:47
Оценка за ответ: 5
Комментарий оценки:
Спасибо огромное


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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.14 (бета) от 09.02.2006
Яндекс Rambler's Top100

В избранное