Пишем логический элемент И на Qt (чиста абсракциа)

Модератор: Модераторы разделов

TwisT
Сообщения: 265
ОС: Debian

Пишем логический элемент И на Qt

Сообщение TwisT »

Всем доброго времени суток!!!
Дали курсач по многоканальным цифровым системам передачи
ну желающим получить 5 необходимо помимо расчета схемы создать модель всей системы
на алгоритмическом языке, причем что бы можно было смоделировать не только свой вариант но и любой другой
Вот. Если обратить свой бренный взгляд на Qt и ее механизм слотов и сигналов то понимаешь что ничего лучше для написания модели
придумать низя. Влегкую слепил генератор тактовых импульсов и тригера, а вот на классе логического элемента застрял.
Собственно в чем проблема, в схеме у логических элементов "И" и "ИЛИ" число входов варируецо от 2 до 8.
Писать 7 классов для каждого случая не охота, ведь разница в них будет имеено в количестве слотов, принимающих значения из вне.
ниже пример для 8

Код: Выделить всё

#ifndef LogicGate_h
#define LogicGate_h
#include <QObject>

class LogicGate : public QObject{
    Q_OBJECT
  private:
    int in[8];
    int size;
    int out;
    int operationType;
  public:
    void setOperationType(int);
    LogicGate(int num=0;QObject* parent=0);
  public slots:
    void input0(int);
    void input1(int);
    void input2(int);
    void input3(int);
    void input4(int);
    void input5(int);
    void input6(int);
    void input7(int);
  signals:
    void output(int);

};
#endif

Собственно в чем вопрос, существует ли возможность в конструкторе регулировать количество слотов?
Вариант типа набрать нужныи элемент из элементов с 2 входами не предлогать
Формат сигнала подключаемого к слотам: токо значение входного имульса (без индексов и т.п.)
Linux user #432536.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Пишем логический элемент И на Qt

Сообщение Liksys »

А если использовати значение по умолчанию?

Код: Выделить всё

void input(int a1, int a2, int a3=1, int a4=1, int a5=1, int a6=1, int a7=1, int a8=1);
1 - потому, что для И это нейтральный элемент, как 0 для обычного сложения.
А функция тогда была бы такой примерно:

Код: Выделить всё

int logic_and(nt a1, int a2, int a3=1, int a4=1, int a5=1, int a6=1, int a7=1, int a8=1)
{
    return a1 && a2 && a3 && a4 && a5 && a6 && a7 && a8;
}
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Пишем логический элемент И на Qt

Сообщение v04bvs »

Напишите полностью класс для 2 слотов. Я что то не пойму ваш дизайн.
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Пишем логический элемент И на Qt

Сообщение BlackStar »

а нельзя что ли сделать input(char b), где b это байт на входе?
LightLang Team
Спасибо сказали:
TwisT
Сообщения: 265
ОС: Debian

Re: Пишем логический элемент И на Qt

Сообщение TwisT »

2 Darth Lyksys
Мысля хорошая, но не покатит

Вобщем, после долгого раздумья слепил сиё
по поводу использования мьютекса я не уверен ,но на всякий случай заюзал,
хотя вроде сигналы и приходят в порядке их подключения к слотам, но как говорится
береженного root бережет, вот. В конструкторе указываем количество входов для логического элемента
а в конструкторе гл окна приложения конектим выводы тригеров и тактового генератора в к слотам inputX
гле Х - номер входа. Замудренно получилось. Это вообще комунить интересно? могу оформить все элементы
в види типа библиотеки.

ЗЫ: Был сделан выбор п пользу наглядности кола а не оптимальности, т.к. скорость выполнения роли не играет
LogicGate.h

Код:

#ifndef LogicGate_h #define LogicGate_h #include <QObject> #include <QMutex> const unsigned int gatesize=8; class LogicGate : public QObject{ Q_OBJECT private: QMutex mutex; unsigned int in[gatesize]; unsigned int size; unsigned int out; volatile int counter; QString strOut; bool OR; bool AND; bool inverseOutput; void calcOutput(); public: void setInverseOutput(bool); LogicGate(bool,int num=-1,QObject* parent=0); public slots: void input0(int); void input1(int); void input2(int); void input3(int); void input4(int); void input5(int); void input6(int); void input7(int); signals: void output(int); void ioutput(int); void output(QString); }; #endif

LogicGate.cpp

Код:

#include "var.h" #include "LogicGate.h" LogicGate::LogicGate(bool op,int num,QObject* parent) : QObject(parent){ inverseOutput = false; if(op){ AND = true; OR = false; }else{ AND = false; OR = true; } //Количество входов не может быть больше //определенного константой gatesize if(num > gatesize){ size = gatesize; }else{ size = num; } counter = 0; out = 0; strOut = zero; int i; for(i=0;i<gatesize;i++) in[i] = 0; }; //====================00000000000000000======================= void LogicGate::calcOutput(){ //Считаем разельтат лог операции int i; if(AND){ for(i=0;i<size;i++) out = out && in[i]; }else if(OR){ for(i=0;i<size;i++) out = out || in[i]; } //Отладка: Формирование строки if(!inverseOutput){ if(out) { strOut +=one; }else{ strOut +=zero; } }else{ if(out){ strOut +=zero; }else{ strOut +=one; } } emit output(strOut); //Отладка: Формирование строки //Вывод emit output((int)out); //Инверсный вывод emit ioutput((int)!out); counter = 0; } //====================00000000000000000======================= void LogicGate::input0(int IN){ const unsigned int INDEX =0; in[INDEX] = IN; mutex.lock(); counter++; if(counter == size){ counter = 0; this->calcOutput(); } mutex.unlock(); } //====================00000000000000000======================= void LogicGate::input1(int IN){ const unsigned int INDEX =1; in[INDEX] = IN; mutex.lock(); counter++; if(counter == size){ counter = 0; this->calcOutput(); } mutex.unlock(); } //====================00000000000000000======================= void LogicGate::input2(int IN){ const unsigned int INDEX =2; in[INDEX] = IN; mutex.lock(); counter++; if(counter == size){ counter = 0; this->calcOutput(); } mutex.unlock(); } //====================00000000000000000======================= void LogicGate::input3(int IN){ const unsigned int INDEX =3; in[INDEX] = IN; mutex.lock(); counter++; if(counter == size){ counter = 0; this->calcOutput(); } mutex.unlock(); } //====================00000000000000000======================= void LogicGate::input4(int IN){ const unsigned int INDEX =4; in[INDEX] = IN; mutex.lock(); counter++; if(counter == size){ counter = 0; this->calcOutput(); } mutex.unlock(); } //====================00000000000000000======================= void LogicGate::input5(int IN){ const unsigned int INDEX =5; in[INDEX] = IN; mutex.lock(); counter++; if(counter == size){ counter = 0; this->calcOutput(); } mutex.unlock(); } //====================00000000000000000======================= void LogicGate::input6(int IN){ const unsigned int INDEX =6; in[INDEX] = IN; mutex.lock(); counter++; if(counter == size){ counter = 0; this->calcOutput(); } mutex.unlock(); } //====================00000000000000000======================= void LogicGate::input7(int IN){ const unsigned int INDEX =7; in[INDEX] = IN; mutex.lock(); counter++; if(counter == size){ counter = 0; this->calcOutput(); } mutex.unlock(); /*q_atomic_increment(&counter); if(q_atomic_test_and_set_int (&counter,size,0) ) this->calcOutput();*/ } //====================00000000000000000======================= //Отладка void LogicGate::setInverseOutput(bool f){ inverseOutput = f; } //====================00000000000000000=======================
Linux user #432536.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Пишем логический элемент И на Qt

Сообщение v04bvs »

Понятно. Если лень самому писать - советую использовать препроцессор m4, в нём несложно устроить цикл, если знакомы с cpp-препроцессором, освоите быстро (да и вообще инструмент весьма полезный иногда).

Мьютексы не нужны, в Qt (если конечно самому не использовать) нет никакой параллельности, всё исполняется послезовательно.
Спасибо сказали:
TwisT
Сообщения: 265
ОС: Debian

Re: Пишем логический элемент И на Qt

Сообщение TwisT »

2 v04bvs
Спасибо, щас посмотрю что за зверь этот m4
Я мьютекс влепил из за подозрения, что на некоторый слот сигналы будут приходить быстрее чем на дугие
хотя и без него все прекрасно работает
Буду капать дальше, всем спасибо!!!
Linux user #432536.
Спасибо сказали: