Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: mmotop20oo12
Дата сообщения: 08.03.2016 16:03
Здравствуйте, пишу класс кривой Безье. хотел бы узнать как правильно взять часть отрезка. пользуюсь методом, описанным тут: https://learn.javascript.ru/bezier , там t изменяется от 0 до 1, собственное значение t и говорит, какую часть от отрезка нужно взять для продолжения построения, я попробовал так, но в конечном счете иногда выдает отрицательные числа:
координата x1 части отрезка = (x2 отрезка - x1 отрезка) * t;
координата y1 части отрезка = (y2 отрезка - y1 отрезка) * t;
Мне нужно лишь узнать точку, которая стоит на границе этих 2х (разделенных) отрезков. Прошу вашей помощи.
Спасибо!
Автор: NeoAnomaly
Дата сообщения: 08.03.2016 18:02
mmotop20oo12 http://mathprofi.ru/delenie_otrezka_v_dannom_otnoshenii.html
Автор: mmotop20oo12
Дата сообщения: 08.03.2016 22:42
NeoAnomaly
я прочел, формула ясна, но для ее применения нужно знать отношение, собственное вопрос, как мне узнать отношение, если у меня в распоряжении есть только 2 точки (начало и конец) и t, которое изменяется от 0 до 1, с шагом, допусти, в 0,005?

Добавлено:
PS в данном случае t показывает на сколько процентов точка отдалена от начала отрезка, т.е. если t = 0.25 то точка отдалена на 25% от начала отрезка
Автор: bomzzz
Дата сообщения: 09.03.2016 05:58
оказалось sata raid driver ich5 не только на висту ставится без проблем и работает(?), но и на семерку.
Автор: NeoAnomaly
Дата сообщения: 09.03.2016 11:47

Цитата:
PS в данном случае t показывает на сколько процентов точка отдалена от начала отрезка, т.е. если t = 0.25 то точка отдалена на 25% от начала отрезка

mmotop20oo12, собственно я так и не понял: понял ты в итоге или не понял?

На всякий случай:
https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D0%BD%D1%82
а дальше можно подумать о том, что если у тебя одна часть 25%, то другая 75% соответственно, а тут и до вычисления их отношения не далеко

Добавлено:
mmotop20oo12, собственно, сейчас открыл статью, ссылку на которую ты давал, там же есть все формулы для вычисления точки на кривой.
Автор: MihaNix
Дата сообщения: 16.03.2016 15:24
Помогите с чтением из файла в переменную.
Используемый язык си.
файл такого вида hex:
58 58 3E 80 01 00 .. .. .. и т.д.

Первые 2 байта char - указывает, что файл имеет формат тот, что надо.
последующие 4 - размер. В моем случае: 98336 байт

накидал вот такое, чтобы проверить:

Код:
#include <stdio.h>

struct head
{
    unsigned char    a,b;
    unsigned long    size;
    unsigned short    bfReserved1;
    
};

int main()
{
    FILE* f;

    head hd;

    if((f = fopen("XX.XX","rb")) == NULL)
        return -1;
    
    fread(&hd,sizeof(hd),1,f);
    
    printf("%c%c\n",hd.a,hd.b);
    printf("%d\n",hd.size);

    return 0;
}
Автор: ne_viens
Дата сообщения: 16.03.2016 15:44
//...
#pragma pack(push, 2)
struct head
{
unsigned char a,b;
unsigned long size;
unsigned short bfReserved1;

};
#pragma pack(pop)
//...

Что такое middle-endian?
Little от big только по меткам в самом файле можно отличить.
Например в OSX первые 4 байта CA FE BA BE означают little, a BE BA FE CA - big (или наоборот).
Автор: MihaNix
Дата сообщения: 16.03.2016 16:35
ne_viens
midle
Это порядок байт в PDP-11
Автор: ne_viens
Дата сообщения: 16.03.2016 17:22
О, за его аналогом "ДВК" приходилось фортраном баловаться в своё время. Кто бы мог подумать, что там такое извращение внутри
Автор: MihaNix
Дата сообщения: 18.03.2016 01:09
ne_viens

Спасибо!

Про выравнивание немного почитал. Еще правда до конца не осмыслил.

Про порядок big, little нашел - htons(), ntohs(), htonl(), nthol()
Либо bswap если на асме.

А вот как правильно middle-endian конвертировать в big не допер пока.
Автор: ne_viens
Дата сообщения: 18.03.2016 09:12
Там всё просто- процессор быстрее всего грузит int, если он лежит по адресу делящемуся на 4, short - на 2, __int64 - на 8, итд. Вот компилятор и выравнивает их в структуре таким образом. Приходится его подправлять таким образом, если структура неумело создана.

Ещё _byteswap_ulong(), _byteswap_ushort()

//...
    unsigned int a, b;
    
    a = *(unsigned short*)size;
    b = *(unsigned short*)(size + 2);
    a = ((a << 16) | b);
//... это для little endian машины.
Автор: MihaNix
Дата сообщения: 26.03.2016 07:39
Вот снова задачка возникла:
Существует файл, в нем.
Есть массив бит XYZ
X - может принимать значения от 1 до бесконечности
Y - от 1 до бесконечности
Z - от 0 до бесконечности

Чаще всего:
X,Y = от 1 до 8000 бит
Z = 0 бит

Задача - найти все биты 1, которые не граничат с другими 1(по вертикали, горизонтали и вертикали) и преобразовать их в 0.
Задача 2:
Иметь выбор глубины граничащих бит - если соседних битов 1,2,3...n - возможность задавать значение в ручную.

В связи с чем встал вопрос:

Как правильно на СИ работать с отдельными битами, как организовать хотя бы 2х мерный массив X,Y не обязательно кратный 8 битам и производить сортировку в нем?
Как все это делается оптимальным для машины способом и при этом в коде удобочитаемо для человека.

Компилятор у меня как всегда GCC, код для x86.
Автор: mmotop20oo12
Дата сообщения: 30.03.2016 11:41
Здравствуйте я пишу TCP клиент-серверное приложение. Но делаю это на .Net. Но тема с .Net простаивает, поэтому решил задать вопрос тут. что нужно сделать, если клиент резко прервал работу приложения и оно не успело грамотно разъединить сокеты. При нормально отключении, клиент либо сервер отправляет партнеру сообщение, в заголовке которого находится "CloseConnection" и я выполняю следующие команды
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
Эти действия выполнятся с обеих сторон.
А как мне поступить если возникло исключение об жестком разъединении, в каком положении у меня будет находится socket? Как мне правильно обработать сообщение?
Автор: MihaNix
Дата сообщения: 31.03.2016 16:37
mmotop20oo12
вы же дергаете клиента через определенное время, проверяя его работу.
В ответ он вам определенное сообщение присылает так понимаю.
Что мешает обработать как завершение сессии ситуацию, когда клиент не ответил (ответил некорректно).
Так же и в обратном порядке.
Автор: mmotop20oo12
Дата сообщения: 31.03.2016 19:21
MihaNix
класс Socket у меня работает по протоколу TCP, этот протокол уже реализован в библиотеке system.net.sockets; И собственно этот класс сам и проверяет соединение и, если сервер не получит подтверждение от другого сокета, то генерируется исключение(его генерирую не я, а класс Socket). Но я уже решил эту проблему. Мне ничто не мешает закрыть сокет так же, как будто я все равно закрываю его нормально
socket.Shutdown(SocketShutdown.Both);
socket.Close(); тут легально.

Но у меня возник чуть-чуть другой вопрос. Есть ли алгоритм присвоения уникального ID, но что бы он был по возможности быстрый, без перебора и сравнения с другими ID, каждого числа
Автор: 127
Дата сообщения: 31.03.2016 19:31
mmotop20oo12, 8 байт хватит?
#include <Rpc.h>
#pragma comment(lib, "Rpcrt4.lib")
UUID newId;
UuidCreate(&newId);

Добавлено:
тьфу, забыл учетку в хроме сменить... обещал с этого акка не сидеть...
Автор: MERCURY127
Дата сообщения: 31.03.2016 19:35
тест
=====
ок
Автор: mmotop20oo12
Дата сообщения: 01.04.2016 19:19
MERCURY127
Думаю хватит
Автор: Vinidimka
Дата сообщения: 09.04.2016 22:04
Возможно ли программно открывать и закрывать дисковод не полностью?

Такого эффекта можно достичь аппаратно: не дождавшись полного открытия, нажать на кнопку - дисковод начинает закрываться, не дожидаясь полного закрытия нажать на кнопку - дисковод начинает открываться и т.д..
Автор: ne_viens
Дата сообщения: 09.04.2016 23:25
В наши дни комп с дисководом ещё поискать надо.

#include <windows.h>
#include <stdio.h>

main()
{
    DWORD tmp;
    
    HANDLE h = CreateFile("\\\\.\\D:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    DeviceIoControl(h, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, &tmp, NULL);
    Sleep(2000);
    DeviceIoControl(h, IOCTL_STORAGE_LOAD_MEDIA, NULL, 0, NULL, 0, &tmp, NULL);
    CloseHandle(h);
}

Вот и попробуй, работает или нет.
Автор: Vinidimka
Дата сообщения: 09.04.2016 23:58
Работает. Обычно полностью открывает. Обычно полностью закрывает.

Интересует, есть ли код, который позволяет держать дисковод в подвешенном состоянии, ни в открытом и ни в закрытом, чтобы он ездил туда-сюда, но не закрывался и не открывался до конца.
Автор: paparazzo
Дата сообщения: 26.05.2016 14:26
Приветствую! Вопрос по VS, я не особо спец в нюансах, пишу простенькую программку для себя на VS2010, форма, поля, и кнопки делающие расчёт.

Есть comboBox, там при запуске должен быть выбран определенный элемент.

Добавляю такую строку в InitializeComponent(void)

this->comboBox1->SelectedIndex=0;

При перестроении она оттуда удаляется. Почему?
Автор: NeoAnomaly
Дата сообщения: 27.05.2016 08:20
paparazzo, InitializeComponent - это служебный метод дизайнера. Для инициализации можно использовать события формы, например OnLoad
Автор: Garrett
Дата сообщения: 27.05.2016 11:49
paparazzo
Используете MFC? Что означает "при перестроении"?
Автор: paparazzo
Дата сообщения: 28.05.2016 10:02

Цитата:
Используете MFC? Что означает "при перестроении"?


Build или rebuild


Цитата:
Для инициализации можно использовать события формы, например OnLoad


Да, так работает. Спасибо. Просто странно, что в свойствах ComboBox сразу нельзя выбрать какой элемент списка активен, в C++ builder можно...
Автор: Garrett
Дата сообщения: 28.05.2016 18:59
paparazzo
Если используете MFC, то для настройки компонентов надо использовать метод OnInitDialog()

Код:
BOOL CMyTestDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // Set the icon for this dialog. The framework does this automatically
    // when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here

    cBox.SetCurSel(4);

    return TRUE; // return TRUE unless you set the focus to a control
}
Автор: Zatupitel
Дата сообщения: 08.08.2016 03:48
Не наставит ли всемогущий All на путь верный с небольшой задачей.
Есть однотипные устройства работающие по USB через .dll идущие к ним в SDK.
У каждого поставщика разные имена вызываемых функций и может быть разное кол-во параметров и их тип для одних и тех же операций, скажем, чтения, записи и т.д. Каким образом сделать обертку для общения с этим зоопарком, чтобы не плодить кучу похожих функций под разных производителей ?
Автор: Prober
Дата сообщения: 08.08.2016 05:30
Zatupitel, ответ очевиден. Если не нравится куча похожих функций - сделайте одну функцию и внутри неё решайте, к какой конкретно DLL дальше обращаться.
Автор: Zatupitel
Дата сообщения: 08.08.2016 12:10
Prober
Просто вижу навскидку пару решений. В .dll (подключается статически) идут функции скажем называются так:
Dfdsf_readByte()
GHFJK_RreadOneByte()
FG_ReadStreamByte()
Все они читают 1 байт на входе. Но называются по-разному. Первым вариантом предполагал сделать свою функцию, скажем ReadByte и уже в ней в зависимости от подключенного устройства использовать "родной" вызов. Но в случае добавления поддержки очередного устройства придется во все функции вставить проверку и соответственно вызов нужной функции.
Вторым вариантом предполагалось перехватывать вызов функции в .dll и подменять на свою, эдакий hook ставить, либо ковырнуть .dll и в ней прописать алиасы, но это уж совсем не гуд.
Вот и спрашиваю, может кто-то уже сталкивался с такой задачей.

Автор: Abs62
Дата сообщения: 08.08.2016 12:33
Zatupitel
А на классах реализовать не проще? Ну, типа такого:

Код: class DeviceBase {
...
virtual ReadByte()=0;
}

class Device1 : public DeviceBase {
...
virtual ReadByte()
{ return Dfdsf_readByte(); }
}

class Device2 : public DeviceBase {
...
virtual ReadByte()
{ return GHFJK_RreadOneByte(); }
}

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.