Вопрос № 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 Комментарий оценки: СПАСИБО ЧТО НАШЛИ ВРЕМЯ ОТВЕТИТЬ НА МОЙ ВОПРОС