Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 34 из 87<  1 ... 31  32  33  34  35  36  37 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 11.07.2004
Откуда: Воронеж
Помогите дописать:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DCB          *dcb;
COMMTIMEOUTS  ct;
HANDLE port;
   dcb=(DCB*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DCB));
   dcb->DCBlength=sizeof(DCB);
   BuildCommDCB("baud=115200 parity=N data=8 stop=1",dcb);
   dcb->fNull=TRUE;

   ct.ReadIntervalTimeout=10;
   ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
   ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

port=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

   if(port==INVALID_HANDLE_VALUE) {
      ShowMessage("порт не открыт");
      ExitProcess(1); }
   SetCommState(port,dcb);
   SetCommTimeouts(port,&ct);
   HeapFree(GetProcessHeap(),0,dcb);

 CloseHandle(port);
}

Нужно дописать посыл строки из Edit1 а потом считывание строки и вывод в Edit2.

зы: препод гад, я в С++ не бум бум а заставляет, и дал мне неделю разобраться во всем, завтра типа надо резельт показывать :((((

_________________
Удачи и мудрости.



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
Koval ну так в чём проблема?
Код:
DWORD act_write;
WriteFile(port,<строка>,<длинна строки>,&act_write,NULL);

Чтение тоже самое, только функция ReadFile.

зы: устройство, с которым ведётся обмен, должно быть настроено также как и COM-порт. Точнее наоборот: COM-порт нужно настроить в соответствии с устройством.


 

Member
Статус: Не в сети
Регистрация: 11.07.2004
Откуда: Воронеж
mein писал(а):
Koval ну так в чём проблема?

В этом:
Цитата:
[C++ Error] KursUnit1.cpp(46): E2034 Cannot convert 'AnsiString' to 'const void *'
[C++ Error] KursUnit1.cpp(46): E2342 Type mismatch in parameter 'lpBuffer' (wanted 'const void *', got 'AnsiString')

я никак не вкурю как преобразование типов в С++ делать видимо он на типы ругается.

Вот код где ошибка:
Код:
DWORD act_write;
WriteFile(port,Edit1->Text,2,&act_write,NULL);


зы: DWORD act_write тут будет число фактически принятых или переданных байт?

_________________
Удачи и мудрости.


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
Koval писал(а):
я никак не вкурю как преобразование типов в С++ делать видимо он на типы ругается

попробуй вместо Edit1->Text написать Edit1->Text.c_str() .
Koval писал(а):
DWORD act_write тут будет число фактически принятых или переданных байт?

переданных.


 

Member
Статус: Не в сети
Регистрация: 11.07.2004
Откуда: Воронеж
mein
Во работает :)

Такой код будет корректен? :
Код:
   DWORD act_write;
            WriteFile(port,Edit1->Text.c_str(),Edit1->Text.Length(),&act_write,NULL);


а конкретно параметр длинны строки:
Код:
Edit1->Text.Length()


ReadFile я так понял теже параметры имеет, только естественно функцию другую выполняет, но тут заковыка как отловить приход ответа, то есть как организовать сам цикл ожидания и немедленную реакцию на приход символов?

_________________
Удачи и мудрости.


 

Тут как и всегда есть много способов.
Один из самых прямых, без использование сложных механизмов,
Код:
 while(1)
{
      Sleep(500);//спим пол секунды чтобы не загружать процессор
      int cout_of_read = ReadFile(...);//читаем один символ
      if(count_of_read) break;
}
вот примерно
тот код который поможет ожидать символ.

другой способ это установки маски ком порта на ожидание символа, который мона установить в DCB структру отвечает поле EvtChar какой именно символ,
далее функция WaitCommEvent(hFile,&flag,0); где DWORD flag=EV_RXFLAG, Указатель я думаю для интерактивности с потоками, ну это не важно, данную функцию можеш посмотреть в МСДНе поподробнее.

ну и третий который я знаю и самы лучший как я думаю(так как поток не блокируется и ожидание моментальное) это с перегрузкой файла, OVERLAPPED, примера кода с сабой нету , вспоминать неочень могу ошебится. Помню что если открытьфайл и указать структуру OVERLAPPEDто функции ReadFile и WriteFile будут неблокироваться, а исолняться моментально, не пытаясь выполнить поставленную задачу, ну а в структуре OVERLAPPED будет HANDLE event, который мона использовать для ожидания, тоесть примерно это выглядело так
Код:
 OVERLAPPED ov; ov.hEvent = CreateEvent(0,0,0,0);
HANDLE my_event_to_terminate= CreateEvent(0,0,0,0);
HANDLE handles[2]={overlapped.hEvent ,my_event_to_terminate};
...
 здесь гдето инициализация и всё такое
...
while(1)
{
    ReadFile(...);// чиатем символ или буфер в зависимости от задачи
    int i_wait_event = WaitForMultipleObjects(2,handles,false,-1);
    if(i_wait_event==1) break; // гдето в другом потоке выполнелся код SetEvent(my_event_to_terminate);
    ...
         //агоритм сбора получаемых данных (в неём обычно есть критерии для выхода из цикла например количество прочитаных байт либо прочитан спец символ)
    ..
}


 

Member
Статус: Не в сети
Регистрация: 11.07.2004
Откуда: Воронеж
mcgeenerman писал(а):
int cout_of_read = ReadFile(...);//читаем один символ

я так понял тут читается символ в буфер и в переменную cout_of_read записывается число считанных символов?

mcgeenerman писал(а):
if(count_of_read) break;

а тут я не совсем понял что происходит, по логике если cout_of_read равна единице то остановка цикла?
зы: cout_of_read и count_of_read разные переменные или ты ошибся?

_________________
Удачи и мудрости.


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Я уже писал, что пользуюсь классами библитеки QT, в частности QPoint и QPolygon. QPolygon - наследуется от vector<QPoint> - что логично, то есть он завязан на QPoint. Пару дней назад выяснил, что оператор сравнения, определенный для QPoint работает не всегда, хотелось бы его перегрузить, но так чтобы не перекомпилировать всю библиотеку и в то же время чтобы он работал как для просто QPoint, так и для элементов QPolygon. Можно ли это как-нибудь сделать?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Ну допустим можно, но какие есть гарантии того, что везде будет отрабатывать твой оператор? Это раз, во-вторых если библиотекта уже собрана, перегружай хоть по нескольку раз - толку 0.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Тупо переписал оператор, выдает ошибку, что operator already has a body. То есть выхода никакого из этого нет? А то неудобно в каждом условии писать длинное выражение. А целостность библиотеки нарушать тоже неохота.
Добавлено спустя 1 час, 4 минуты, 42 секунды
че-то я стормозил :) просто написал функцию, ей и пользуюсь).
Код:
inline bool equal(const QPointF &p1, const QPointF &p2)
{
   return fabs(p1.x() - p2.x())<eps && fabs(p1.y() - p2.y())<eps;
}

Добавлено спустя 6 часов, 15 секунд
Сейчас прочитал, что на Паскаль и С - первые языки высокого уровня, на которых били написаны компиляторы самих себя. Вопрос, а чем тогда компилировались исходные тексты компиляторов??


 

Member
Статус: Не в сети
Регистрация: 09.08.2005
Откуда: Земля
Люди хелп, помогите дописать прогу по структурам
Условие:
шаблонн STUDENT
...-NAME фамилилия и инициалы(симв массив)
...-GROUP номер группы(int)
...-SES успеваемость, массив из 5 эл(int)

Написать прогу:
1 Вввод с клавы данных в массив stud1, состоящий из 10 эл-ов типа STUDENT
2 Вывод на экран:
..* Всей инфы по возрастанию поля GROUP
..* Вывод на дисплей фамилий и номеров групп для всех студентов, если средний бал студента больше 4.0, если таких нет то сообщить об этом

Пока только такие шаги (создание и заполнение структуры):
Код:
#include<stdio.h>
#include<math.h>
main (void)
{ struct STUDENT {char NAME[20];int GROUP,SES[5];} ;

int k,i,j;
struct STUDENT stud1[10];

while (k<1||k>10) {printf("Kol-vo stydentov = ");scanf("%d",&k);}

for(i=0;i<k;i++)
{ printf("%d Student\n",i+1);
printf(" Familia i inicialu (bez probelov) : ");
scanf("%s",stud1[i].NAME);

printf(" Nomer gryppu : ");
scanf("%d",&stud1[i].GROUP);

printf(" 5 ocenok po osnovnum predmetam : ");
for(j=0;j<5;j++) scanf("%d",&stud1[i].SES[j]);
}

return(0);


Вот только здесь фамилия и инициалы должны быть не разделены, а я не знаю можно ли так делать. И как тогда потом с выводом фамилий.


Заранее спасибо


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Такой вопрос, может кто-нибудь знает, в c# при ипользовании оператора присваивания для поля класса, и при обращении к нему есть ли такая возможность задавать методы set и get? Чтобы как в C++ не мучатся с шаблонами?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman ты о свойствах в C#?

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
может быть, я вот именно не знаю C#.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman твоего вопроса не понял, вообщем поясни детальнее, если вопрос еще актуален.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Я имел в виду, автоматический вызов геттеров и сеттеров при обращении к члену класса(свойству). Есть ли это в c#?
То есть я пишу:
Код:
object.prop=5;

А фактически вызывается сеттер. И чтобы такая возможность была встроена в ЯП.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Геттеры, сеттеры, где ты такого начитался :) Да, в С# есть самые настоящие property.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Появился вопрос. Скорее он по алгоритмам, нежели по языку. Есть структура данных, в виде дерева(то есть есть один или несколько root-items, и в них вложены другие). Для элемента дерева выполняется соотношение item<parentItem. Все элементы лежат в контейнере. Можно ли как-то отсортировать их по иерархии? Нужно учитывать, что могут быть параллельные ветви, при этом "двоюродные" элементы, то есть находящиеся на одной ступени иерархии, но имеющие разных родителей в отсортированном контейнере должны лежать друг за другом, а только после них - их "дети".
Есть ли какие-то стандартные алгоритмы для этих целей, и где можно почитать про это? Просто не хочется выдумывать велосипед :)


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
kexman Определи универсальный оператор < (т.е. для любых объектов, вне зависимости из одной они ветви или нет) и используй std::sort.


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Билли Бонс
Да я думал над этим, проблема в том, что условие < выполняется только для элемента и его родителя(прародителя, прапрародителя ...) А допустим для элемента и его "дяди" оно не выполняется, а нужно, чтобы после сортировки дядя был выше чем его племянник(то есть дядя должен быть вместе с родителем элемента).
Ну да ладно в общем-то я уже придумал рекурсивный алгоритм для этого)
Добавлено спустя 1 час, 7 минут, 17 секунд
Билли Бонс
Весь вечер вчера думал над этим алгоритмом сортировки:) Что самое интересное оказалось, логика моей программы такова, что исходные данные получаются уже сортированными в любом случае :) Вот так тоже получается :) А так бы сам алгоритм сортировки был ресурсоемким, ди и еще операция сравнения двух элементов на больше-меньше тоже содержит в себе целый цикл.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 34 из 87<  1 ... 31  32  33  34  35  36  37 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan