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

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


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

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

Выпуск № 559
от 21.10.2006, 08:05

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


Вопрос № 58973: Здравствуйте! У меня вопрос по использованию gotoxy() Код в приложении сырой, но интересует, в принципе, только void printa(int **matrix, int n, int sx, int sy) (где sx и sy - координаты начала вывода) В общем, наплевав на gotoxy(), ...
Вопрос № 58995: Уважаемые эксперты, помогите новичку в С. У меня 2 вопроса: 1. Есть код: ////////////// #include <stdio.h> void main() { float i; float h; i=50; h=1/i; printf(" h = %f ",h); ...
Вопрос № 58998: Здравствуйте. У меня такой вопрос. Какие действия надо предпринять, чтобы имя экспортируемой из DLL функции было нормальным, т.е. если есть функция Load, то чтобы она была Load, а не, скажем, Load@@YAHXZ? Спасибо!...
Вопрос № 59005: Доброго времени суток уважаемые эксперты! Пишу на Visual C++ 6.0 и столкнулся с такой проблемый. Не пойму как определять указатели на CALLBACK функции определённые в классе, чтобы вызвать например с помощью EnumWindows? Пример и пояснение...
Вопрос № 59014: Здравствуйте, уважаемые эксперты! У меня довольно громоздкий вопрос. Дело в том, что класс TThread в С++ Builder очень глючный и поэтому многие склоняются к испольнованию ф-ций API. Я решил сделать свою реализацию подобного класса, инкапс...
Вопрос № 59015: Доброго вечера, господа Эксперты! Суть вопроса: ввести типы enum масть и стоимость. С их помощью описать структуру карта. Сложить и проверить функцию, которая, проверяет, или бёт одна карта другую, с учётом козырной масти. ...

Вопрос № 58.973
Здравствуйте! У меня вопрос по использованию gotoxy()
Код в приложении сырой, но интересует, в принципе, только
void printa(int **matrix, int n, int sx, int sy)
(где sx и sy - координаты начала вывода)
В общем, наплевав на gotoxy(), вывод следующей строки начинается с левого края экрана. Помогитее разобраться, пожалуйста!

Приложение:

Отправлен: 15.10.2006, 14:38
Вопрос задал: Mini Cooper (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: ADSota
Здравствуйте, Mini Cooper!

1. Вместо printf нужен cprintf
2. В процедуре wnd(4) используется окно большой высоты, Си для ДОС такого сделать не может (13+23) - или меняй видеорежим на 43 или 50 строк или переделывай программу для консоли Виндовс или уменьшь окно.

---------
Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Специалист)
Ответ отправлен: 16.10.2006, 09:11


Вопрос № 58.995
Уважаемые эксперты, помогите новичку в С.
У меня 2 вопроса:
1.
Есть код:
//////////////
#include <stdio.h>
void main()
{
float i;
float h;
i=50;
h=1/i;
printf(" h = %f ",h);
scanf("%f",i);
}
//////////////
Выводит, как и ожидается, что-то вроде 0.020000
Если заменить строку "float i;" на "int i;", то выводит 0.000000
Как сделать, чтобы i оставалась типа int, а программа выводила то, что нужно.
2.
Код:
/////////////
#include <stdio.h>
void main()
{
double eps;
scanf("%f",&eps);
printf(" %f ",eps);

scanf("%f",eps);
}///////////
Вводим, например, 0.001, выводится 0.000000. Как правильно, все таки, записать значение в

переменную eps?

И где, вообще, можно про такого рода вещи в C почитать?

Приложение:

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

Отвечает: Алексеев В.В.
Здравствуйте, Werebear!
1. Чтобы деление float/int возвращало float, нужно сначала int преобразовать к float. Тогда:
int i=50;
float h;
h=1/(float)i;
2. У вас несовпадение типов. Если хотите использовать %f - то ставьте везде float, если нужен double то ставится %lf.
Тогда:
double eps;
scanf("%lf",&eps);
printf(" %lf ",eps);
У меня (gcc) привело к ожидаемым результатам. На борланде не проверял, но ИМХО там тоже самое.

Ответ отправил: Алексеев В.В. (статус: 1-ый класс)
Ответ отправлен: 15.10.2006, 18:01
Оценка за ответ: 5
Комментарий оценки:
Спасибо, помогло.

Отвечает: UnRe@l
Здравствуйте, Werebear!
На второй вопрос:

// Win32 Console Application.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
double eps;
cin>>eps;
cout<<eps<<endl;
cin>>eps;
}

Проще использовать потоковый ввод-вывод. Узнать о нём можно, например, здесь http://rsdn.ru/.
Удачи!
---------
Cogito, ergo sum (c) R. Descartes (1596-1650)
Ответ отправил: UnRe@l (статус: 1-ый класс)
Ответ отправлен: 16.10.2006, 07:11
Оценка за ответ: 3
Комментарий оценки:
Ну да - проще. Но мне надо управиться именно через scanf & printf. Задание такое.


Вопрос № 58.998
Здравствуйте. У меня такой вопрос. Какие действия надо предпринять, чтобы имя экспортируемой из DLL функции было нормальным, т.е. если есть функция Load, то чтобы она была Load, а не, скажем, Load@@YAHXZ?
Спасибо!
Отправлен: 15.10.2006, 18:00
Вопрос задал: Azemtsov (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Vaga
Здравствуйте, Azemtsov!
Необходим .def файл примерно следующего содержания:

LIBRARY MyDll
EXPORTS
Load = Load@@YAHXZ PRIVATE
---------
Ошибка становится ошибкой, когда рождается как истина. Станислав Ежи Лец
Ответ отправил: Vaga (статус: 4-ый класс)
Ответ отправлен: 15.10.2006, 19:35

Отвечает: dentist
Здравствуйте, Azemtsov!
не совсем понятно в чём проблема и вы не указали как на данный момент объявляются экспортируемые функции и в какой среде вы работаете.

однако принято, экспорт делать так (MSVC++):

в модуле:
extern "C" __declpsec(dllexport) ... Load(...) {...};

в include-файле:

#if defined(__cplusplus)
extern "C" {
#endif

... Load(...);

#if defined(__cplusplus)
} // extern "C"
#endif

далее к проекту использующему эту библиотеку подключаете автоматически созданый .lib и header-файл.
---------
"Software is like sex, it's better then it's free" (c) Linus Torvalds
Ответ отправил: dentist (статус: 5-ый класс)
Ответ отправлен: 16.10.2006, 09:45


Вопрос № 59.005
Доброго времени суток уважаемые эксперты!
Пишу на Visual C++ 6.0 и столкнулся с такой проблемый.
Не пойму как определять указатели на CALLBACK функции определённые в классе, чтобы вызвать например с помощью EnumWindows?
Пример и пояснение в приложении(программа консольная).

Приложение:

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

Отвечает: Bob Johnson
Здравствуйте, Link!
никак. callback функция не должна быть членом класса.
но решение существует - любой callback функции передается пользовательское число, которое вполне может быть указателем на класс, т.е. она сможет вызвать нужный его метод, а начальную callback функцию можно тоже определить в классе, но как static.
class myclass
{
...
static BOOL CALLBACK EWndProc (HWND h, LPARAM id)
{
return ((myclass*)id)->EWndProcNonStatic (h);
}

BOOL EWndProcNonStatic (HWND h);
}

...
EnumWindows (&EWndProc, (LPARAM)this);
Ответ отправил: Bob Johnson (статус: Академик)
Россия, Калуга
WWW: Программирование
----
Ответ отправлен: 15.10.2006, 21:42
Оценка за ответ: 5


Вопрос № 59.014
Здравствуйте, уважаемые эксперты!
У меня довольно громоздкий вопрос.
Дело в том, что класс TThread в С++ Builder очень глючный и поэтому многие склоняются к испольнованию ф-ций API.
Я решил сделать свою реализацию подобного класса, инкапсулирующего API-вызовы, и сразу столкнулся с проблемой:
Я хочу в качестве поточной ф-ции вызывать один из методов моего класса, но компилятор выдает ошибку - нельзя присваивать адрес метода класса, можно только если он объявлен как static, но это не годится, я хочу обращаться внутри этого метода к любым членам класса (а не конкретного экземляра класса).
Как с этим бороться?

Приложение:

Отправлен: 15.10.2006, 20:28
Вопрос задал: Evkwarrior (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Tek
Здравствуйте, Evkwarrior!
Можно например описать какую-нибудь глобальную функцию TreadProc() и объявить ее же со спецификатором friend в классе CLASS_THREAD_CS
Либо - поскольку это решение лично мне всегда казалось на оченно красивым, то можно из этой глобальной функции TreadProc() вызывать public-метод ThreadProcedure нужного объекта класса. А для этого в TreadProc - передавать указатель на конкретный объект.
Правда в обоих случаях получается введение глобальной функции.

---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано
Ответ отправил: Tek (статус: 1-ый класс)
Ответ отправлен: 16.10.2006, 09:16
Оценка за ответ: 4
Комментарий оценки:
"Правда в обоих случаях получается введение глобальной функции"

Отвечает: Bob Johnson
Здравствуйте, Evkwarrior!
Опиши функцию старта потока как static метод класса. При запуске потока в качестве user-defined параметра передавай this класса, а в функции через тайпкаст параметра к типу твоего класса вызывай уже любой другой метод.
Ответ отправил: Bob Johnson (статус: Академик)
Россия, Калуга
WWW: Программирование
----
Ответ отправлен: 16.10.2006, 18:37
Оценка за ответ: 4
Комментарий оценки:
Неужели никак нельзя обойтись без внешних функций?


Вопрос № 59.015
Доброго вечера, господа Эксперты! Суть вопроса: ввести типы enum масть и стоимость. С их помощью описать структуру карта. Сложить и проверить функцию, которая, проверяет, или бёт одна карта другую, с учётом козырной масти.
Отправлен: 15.10.2006, 21:02
Вопрос задал: Petrov (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: NextStep / www2
Здравствуйте, Petrov!

Не знаю как у Вас с английским, потому идентификаторы типов, структур, переменных и функций пишу по-русски транслитом.

Приложение:

---------
Нет правил без исключений, правило без исключения - это исключение из правил.

Ответ отправил: NextStep / www2 (статус: Студент)
Ответ отправлен: 16.10.2006, 06:38


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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

В избранное