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

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


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

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

Выпуск № 600
от 03.12.2006, 00:05

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


Вопрос № 64398: Здравствуйет Эксперты. У меня такая задача надо написать прогу для FreeBSD которая мониторила бы заданный файл в системе и одновременно подключала удаленных пользователей по сокету и если этот файл изменился(размер) отправляла бы им сообщение. Я ...
Вопрос № 64413: Доброго времени суток уважаемые эксперты. Подскажите пожалуйста как по указателю на обьект void* p определить определить тип объекта я че-то не соображу никак способ std::size_t size= static_cast<std::size_t>(*p); и std::size_t size= si...
Вопрос № 64414: не могли бы Вы расписать принцип работы?...
Вопрос № 64479: Здравсвуйте! Помогите пожалуйста... есть многоугольник Polygon(p, n-1) p-массив точек n-их кол-во мне надо вращать его относительно точки (x,y) - вот как я делаю f++; for(int i=0; i<n; i++) { x1=x+(p[i].x-x)*c...
Вопрос № 64498: ГОСПОДА С ЧЕГО НАЧИНАТЬ УЧИТЬ С++ ПОСОВЕТУЙТЕ А ТО ЛИТЕРАТУРЫ МНОГО А ТОЛКУ ОТ ЕЕ МАЛО ...

Вопрос № 64.398
Здравствуйет Эксперты.
У меня такая задача надо написать прогу для FreeBSD которая мониторила бы заданный файл в системе и одновременно подключала удаленных пользователей по сокету и если этот файл изменился(размер) отправляла бы им сообщение. Я только начитающий прораммист под unix платформы поэтому не очень понимаю схему взоимодействия процессов. Я понимаю что надо создать 2-а процесса один для файла другой для подключения клиентов но реализовать... Раскажите как это сделать и если не трудно то приблизительную схему проги на C++(именно процессов).
Отправлен: 27.11.2006, 12:08
Вопрос задал: Gray (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Хватов Сергей
Здравствуйте, Gray!

По-моему, основные сложности тут будут в других местах, да и реализовывал бы я такую задачу по-другому - с помощью thread-ов или на большом event loop с select() в его начале.
А если с отдельными процессами, то запускать их лучше по одному для каждого клиента.

Но процедура запуска процесса не очень сложная: fork()+exec*()
В два этапа потому, что сын от отца много чего наследует и открытые файлы в том числе, и это можно использовать (например, настроить pipe), но прямо так оставить сыну ваш открытый файл нельзя - его надо закрыть и открыть ещё раз.

fork() без exec() вообще-то тоже допустим, но смысла почти не имеет, так что програм придётся писать две - одна анализирует файл и запускает экземпляры второй, которые уже его рассылают.

vfork()-ом (если он ещё жив) надо пользоваться осторожно, так что поначалу лучше его не трогать.

Приложение:

Ответ отправил: Хватов Сергей (статус: 9-ый класс)
Ответ отправлен: 27.11.2006, 13:20
Оценка за ответ: 5
Комментарий оценки:
Спасибо но я же написал что начинающий программист по unix-ы по этому неплохо было бы если бы вы поподробнее расказывали.

Отвечает: Sergijj
Здравствуйте, Gray!

Отправляю Вам (см. приложение) псевдокод, иллюстрирующий работу с процессами под Вашу задачу. А именно:
1. Создаётся процесс, который занимается мониторингом.
2. Налажен интерфейс между двумя процессами (так как дочерний и материнский процессы имеют разделяемую память).
3. Уничтожаются оба процесса.

Используя тот же метод можно создать и дочерний процесс, слушающий сокеты и/или работающий с клиентами и пр...

Обращаю внимание, что код довольно общий и, как правильно сказал Хватов Сергей, при уничножении дочернего процесса, чтобы не плодить зомби, скорее всего придётся вставить задержку.

Постарался всё сделать предельно просто и ясно, но если возникли вопросы - обращайтесь.

P.S.: Кодировка коментариев - DOS (IBM-866).

P.P.S.: В следующий раз учтите, что в системе RusFAQ существует ограничение на размер отправляемого сообщения, поэтому если попросите переслать большие объёмы информации - указывайте свой email.

Успехов!

Приложение:

---------
Стучитесь! И Вас откопают...

Ответ отправил: Sergijj (статус: 6-ой класс)
Ответ отправлен: 28.11.2006, 11:29
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо! Из вашего примера я понял основные принципы.


Вопрос № 64.413
Доброго времени суток уважаемые эксперты. Подскажите пожалуйста как по указателю на обьект void* p определить определить тип объекта я че-то не соображу никак
способ std::size_t size= static_cast<std::size_t>(*p);
и std::size_t size= sizeof(*p);
не проходят cbulder ругается [C++ Error] newSmallObj.cpp(25): E2109 Not an allowed type

void* p указывает на произвольные обьекты

а проблема в следущем надо вернуть оператор с двумя аргументами а известен один второй надо как-то узнать
по технологии RTTI.. я делал
код в приложении
при этом компилятор ругается

[C++ Error] newSmallObj.cpp(33): E2451 Undefined symbol 'type_info'
[C++ Error] newSmallObj.cpp(33): E2451 Undefined symbol 'typ_class'
а еще не понимает typeid(* p)
[C++ Error] newSmallObj.cpp(33): E2109 Not an allowed type
всего три ошибки
кто знает может надо как-то переопределить тип void

Приложение:

Отправлен: 27.11.2006, 13:10
Вопрос задал: Texnokrat (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: dentist
Здравствуйте, Texnokrat!
есть стандартная функция _msize
но она распростроняется только на блоки памяти проинициализированные функциями malloc, calloc и realloc.

size_t _msize(void * p);
возврощает размер в байтах.
объявлена в <malloc.h>

ЗЫ: как спросили, так и ответили
---------
"Software is like sex, it's better then it's free" (c) Linus Torvalds
Ответ отправил: dentist (статус: 6-ой класс)
Ответ отправлен: 27.11.2006, 14:53
Оценка за ответ: 4
Комментарий оценки:
спасибо
но мне нужно определить тип объекта по void* p а уж зная тип определить размер не трудно
может есть способ как-то переопределить VOID и проблема исчезнет ?

Отвечает: John Paramol
Здравствуйте, Texnokrat!
объект type_info создать невозможно, т.к. все его конструкторы являются private.
Если очень нужно, можно сделать так:
std::type_info *typ_class = (std::type_info*)&(typeid(p));
Но, т.к typeid возвращает локальный объект type_info, то указатель typ_class нельзя будет использовать за пределами текущей области видимости.
Имя класса объекта можно узнать так: typ_class->name();
Или просто typeid(p).name();
Но как вы узнаете размер объекта по имени его класса?
Вобще-то, dentist правильно посоветовал.
Можно также использовать WinAPI-шные
LocalSize/HeapSize/GlobalSize, но это если работать с
LocalAlloc/HeapAlloc/GlobalAlloc.
Успехов!
---------
1=2, at values 1 large enough
Ответ отправил: John Paramol (статус: 4-ый класс)
Ответ отправлен: 27.11.2006, 23:37


Вопрос № 64.414
не могли бы Вы расписать принцип работы?

Приложение:

Отправлен: 27.11.2006, 13:14
Вопрос задал: Mashenka (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Tek
Здравствуйте, Mashenka!
scanf("%d",&a); - ввод числа в десятичной записи
scanf("%d",&new_system); - соответственно основание требуемой системы исчисления
itoa(a,new_chislo,new_system); - эта в функция в качестве третьего параметра и принимает основание системы исчисления и возвращает запись числа в указанной системе как строку(текст), так что отпадает необходимость в ручных преобразованиях
---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: 2-ой класс)
Ответ отправлен: 27.11.2006, 13:28

Отвечает: Перл-Харбор
Здравствуйте, Mashenka!
Тут все просто смотри комментарии.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h> // прототипы функций
void main() // главная функция, с которой начинается код
{
char new_chislo[15];; // объявление массива из 15 байт
int a, new_system,ost;// еще две переменные типа int
printf("Введите число ");// вывод текста, приглашение ввести число
scanf("%d",&a);// принять это число в переменную a
printf("Введите размерность новой системы исчиления ");// выводится текст с просьбой ввести размерность
scanf("%d",&new_system);// ввели число в переменную new_system
char *p=itoa(a,new_chislo,new_system); // переводим число в новую систему счисления
printf("%s ",p); // выводим число в новой системе счисления, оно содержится по адресу в p
}

---------
Поддаться, что бы победить.
Ответ отправил: Перл-Харбор (статус: 1-ый класс)
Ответ отправлен: 27.11.2006, 15:48


Вопрос № 64.479
Здравсвуйте!

Помогите пожалуйста...

есть многоугольник Polygon(p, n-1) p-массив точек n-их кол-во
мне надо вращать его относительно точки (x,y) - вот как я делаю
f++;
for(int i=0; i<n; i++)
{
x1=x+(p[i].x-x)*cos(f)+(p[i].y-y)*sin(f);
y1=y-(p[i].x-x)*sin(f)+(p[i].y-y)*cos(f);
p[i].x=x1;
p[i].y=y1;
}

Проблема в том что при вращение он незначительно дифформируется и через некоторое время уменьшается до прямой...

В чем моя ошибка и как мне можно исправить? Или как сделать по другому зная токо кол-во точек их начальные координаты и координаты токи относительно которой будет вращение?

Второй вопрос: Как мне сделать растяжение и сжатие этого же много угольника относительно его середины по оси Х и У? (зная начальные точки и их кол-во, ну и например коэффициент сжатия, растяжения)?

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

Отвечает: John Paramol
Здравствуйте, Минус!
Вам нужно работать с точками, координаты которых будут храниться в вещественном виде,
т.к. при возрастании количества операций растет погрешность вычислений.
Можно, например, определить такой тип:
typedef struct tagFPOINT
{
double x;
double y;
tagFPOINT(double _x, double _y) : x(_x),y(_y) {}
tagFPOINT() {}
} FPOINT;
- точка в вещественных координатах.
Можно также сделать по-другому. Иметь массив начальных точек и массив точек повернутого полигона.
Рассчет проводить с точками из первого, а записывать результат во второй. Тогда можно использовать и целочисленные координаты. Но с вещественными все равно лучше.
Вот пример функции масштабирования относительно точки (x,y):
p-исходный массив, n-количество точек, pOut-конечный массив, Zoom-вектор масштабирования
void Resize(FPOINT *p, int n, FPOINT *pOut, FPOINT Zoom)
{
for(int i=0; i<n; ++i)
{
x1=x+(p[i].x-x)*Zoom.x;
y1=y+(p[i].y-y)*Zoom.y;
pOut[i].x=x1;
pOut[i].y=y1;
}
}
Удачи!
---------
1=2, at values 1 large enough
Ответ отправил: John Paramol (статус: 4-ый класс)
Ответ отправлен: 27.11.2006, 22:13


Вопрос № 64.498
ГОСПОДА С ЧЕГО НАЧИНАТЬ УЧИТЬ С++ ПОСОВЕТУЙТЕ А ТО ЛИТЕРАТУРЫ МНОГО А ТОЛКУ ОТ ЕЕ МАЛО
Отправлен: 27.11.2006, 22:07
Вопрос задал: TITANUM (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: PROD
Здравствуйте, TITANUM!
решай задачи. звучит жестоко, но наиболее эфективно.
учишь основы, а потом придумываешь себе проблему и начинаешь ее решать.
основы практически везде написаны достаточно хорошо. но толку будет мало если не будешь применять это на практике
Ответ отправил: PROD (статус: 5-ый класс)
Ответ отправлен: 27.11.2006, 22:30
Оценка за ответ: 4

Отвечает: Vaga
Здравствуйте, TITANUM!
Бьерн Страуструп. Язык программирования С++

---------
Ошибка становится ошибкой, когда рождается как истина. Станислав Ежи Лец
Ответ отправил: Vaga (статус: 6-ой класс)
Ответ отправлен: 27.11.2006, 23:35
Оценка за ответ: 4

Отвечает: Jite
Здравствуйте, TITANUM!

Бьерн Страуструп "Введение в С++" Специальное издание.

Книга автора языка, максимальное соответствие стандарту.

Читайте. Все, что непонятно - спрашивайте у экспертов. Решайте примеры сами, в случае затруднений - также обращайтесь к экспертам. Пишите программы - и снова при сложностях обращайтесь за советом. Лучшего пути, чем этот, просто не существует. :-)

---------
В программировании нет замены уму, опыту, вкусу и здравому смыслу.
Ответ отправил: Jite (статус: 1-ый класс)
Ответ отправлен: 28.11.2006, 08:40
Оценка за ответ: 5

Отвечает: Перл-Харбор
Здравствуйте, TITANUM!
Да книг много, а толку мало. Тебе должен подходить стиль повествования в книге. Что тебе будет удобней и понятней читать. Могу посоветовать книгу У.Савич С++ во всей полноте.

---------
Поддаться, что бы победить.
Ответ отправил: Перл-Харбор (статус: 1-ый класс)
Ответ отправлен: 29.11.2006, 18:21
Оценка за ответ: 4
Комментарий оценки:
СПАСИБО ЧТО НАШЛИ ВРЕМЯ ОТВЕТИТЬ НА МОЙ ВОПРОС


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

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

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

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

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

В избранное