Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
fssf11
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 181
1

Чем заменить switch

31.03.2017, 03:41. Просмотров 1128. Ответов 23
Метки нет (Все метки)

Подскажите пожалуйста , имеется вот такая конструкция
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 char *bufOut = new char[pRecSize * pCol]; // Адрес буфера для присылаемых записей.
 
 ..........   буфер заполняется .............
 
 char *p = bufOut; 
 
for (long i = 0; i < pStr; i++)//идем по строкам
    {
 
        for (int j = 0; j < pCol ; ++j)// идем по колонкам
        {
 
            switch (infCol[j].type)// в зависимости от типа колонки преобразовываем в соответствующий тип
            {
             ........
            }
 
            p += infCol[j].len;
 
        }
то есть это такой разбор строки байтов в зависимости от типа (тип лежит в infCol[j].type )

подскажите как чем можно заменить такую конструкцию , ибо вот эта очень медленная
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2017, 03:41
Ответы с готовыми решениями:

Чем можно заменить Switch -- case ?
Доброго времени суток, уважаемые форумчане! Помогите решить проблему с case. В этой программе нужно...

Оператор switch. В чем ошибка?
Почему Свитч не отрабатывает? После ввода ans1 выводиться вопрос для цикла ДуВаил. Где я торможу?...

Заменить два числа половиной их суммы и удвоенным произведением. (С помощью switch)
Даны вещественные числа x и y, не равные друг другу. Меньшее из этих двух чисел заменить половиной...

Чем заменить функцию gets?
Задача с informatics Змей Горыныч оказался в лабиринте и хочет выбраться из него как можно...

Чем заменить calloc?
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;cstdlib&gt; #include &lt;iomanip&gt; #include &lt;conio.h&gt;...

23
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5223 / 2608 / 715
Регистрация: 18.10.2014
Сообщений: 4,536
31.03.2017, 03:59 2
Цитата Сообщение от fssf11 Посмотреть сообщение
подскажите как чем можно заменить такую конструкцию , ибо вот эта очень медленная
Ничего медленного в switсh нет и никакая замена switch на что-либо другое не сделает ваш код быстрее. Если ваш код медленно работает, то менять придется весь подход. А уж на уровне алгорима ли, на уровне реализации ли - из вашего огрызка кода не ясно.
1
fssf11
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 181
31.03.2017, 04:27  [ТС] 3
то менять придется весь подход.
это циклы прийдется заменить или как ?

Добавлено через 3 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если ваш код медленно работает, то менять придется весь подход. А уж на уровне алгорима ли, на уровне реализации ли - из вашего огрызка кода не ясно.
пояснение такое в буфере лежат байты без типа то есть тип как бы char надо разобрать этот массив в таблицу
пробллема в том что каждая колонка свой тип

Добавлено через 1 минуту
TheCalligrapher, подскажите пожалуста может существует какой то алгоритм разбора последовательности байтов в зависимости от типа
0
Kastaneda
Jesus loves me
Эксперт С++
5050 / 3068 / 351
Регистрация: 12.12.2009
Сообщений: 7,752
Записей в блоге: 2
Завершенные тесты: 1
31.03.2017, 08:36 4
Цитата Сообщение от fssf11 Посмотреть сообщение
подскажите пожалуста может существует какой то алгоритм разбора последовательности байтов в зависимости от типа
Что значит тип байта? Тип байта это ведь и есть байт.

Постановка задачи непонятная, выше уже написали, что switch не тормозит, значит дело в другом. Чтобы подсказать как это можно ускорить, нужно понять задачу.
2
31.03.2017, 08:36
fssf11
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 181
31.03.2017, 12:29  [ТС] 5
Цитата Сообщение от Kastaneda Посмотреть сообщение
Что значит тип байта? Тип байта это ведь и есть байт.
интерпретация байта, байт он и есть байт , но как этот байт интерпретируется а последовательность байтов вообще может там по два байта или 4байта или может строка на 256байт

Добавлено через 6 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
Постановка задачи непонятная, выше уже написали, что switch не тормозит, значит дело в другом. Чтобы подсказать как это можно ускорить, нужно понять задачу.
если описать словами то примерно так
имеется буфер

char *bufOut = new char[pRecSize * pCol]; // Адрес буфера для присылаемых записей.

в нем находится пачка данных , которые надо преобразовать в таблицу , у таблцы у каждого столбика свой тип данных
информация о том какого размера каждый столбик прилетает
в виде структуры infCol
в ней имеется тип infCol[j].type
и размер infCol[j].len в байтах каждого столбика

Добавлено через 1 час 39 минут
структура infCol приходит на шаг раньше чем прилетает пачка в буфер вернее как бы в структура всегда соответствует пачке находящиеся в данный момент в буфере и имеется количество строк и колонок , поетому приступая к разбору буфера есть все необходимые параметры

как то так
0
altmax
186 / 53 / 19
Регистрация: 23.12.2016
Сообщений: 159
Завершенные тесты: 1
31.03.2017, 13:34 6
Цитата Сообщение от fssf11 Посмотреть сообщение
это циклы прийдется заменить или как ?
Запустить программу в профайлере или вручную наставить cout << clock() чтобы выявить самое медленное место. В 80% случаев оно оказывается вообще не там, где думали. Но cout сама по себе тоже медленно работает и вносит большие погрешности, если много выводов на экран, это тоже надо учитывать.
1
fssf11
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 181
01.04.2017, 01:40  [ТС] 7
Цитата Сообщение от altmax Посмотреть сообщение
Запустить программу в профайлере или вручную наставить cout << clock() чтобы выявить самое медленное место. В 80% случаев оно оказывается вообще не там, где думали.
полностью с вами согласен , сейчас попробую сделать

Добавлено через 3 минуты
Цитата Сообщение от altmax Посмотреть сообщение
Но cout сама по себе тоже медленно работает и вносит большие погрешности, если много выводов на экран, это тоже надо учитывать.
да это тоже точно , а куда и как тогда можно сохранить результат типа как в массив чтобы потом одним махом вывести на экран , например в С++/CLI есть DataTable а в чистом С++ , как? в структуру а как динамически задать типы полей структуре
0
Renji
2329 / 1703 / 514
Регистрация: 05.06.2014
Сообщений: 4,937
01.04.2017, 02:22 8
Цитата Сообщение от fssf11 Посмотреть сообщение
а куда и как тогда можно сохранить результат типа как в массив чтобы потом одним махом вывести на экран
std::stringstream устроит?
C++
1
2
3
std::stringstream stream;
stream<<1234<<"test";
cout<<stream.str()<<std::endl;
1
fssf11
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 181
01.04.2017, 06:41  [ТС] 9
Цитата Сообщение от Renji Посмотреть сообщение
std::stringstream устроит?
да точно , набирает в себя 300 строк доли сек.
а вот потом 5сек вывод идет на экран
0
fssf11
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 181
03.04.2017, 04:14  [ТС] 10
Вопрос актуален , если есть у кого мысли , подскажите, хоть в двух словах саму идею
0
Fulcrum_013
1487 / 1245 / 143
Регистрация: 14.12.2014
Сообщений: 10,938
Завершенные тесты: 3
03.04.2017, 06:00 11
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ничего медленного в switсh нет и никакая замена switch на что-либо другое не сделает ваш код быстрее. Если ваш код медленно работает, то менять придется весь подход. А уж на уровне алгорима ли, на уровне реализации ли - из вашего огрызка кода не ясно.
Тормозная это штука. Даже если там под капотом бинарный поиск в сортированном массиве то по сравнению с индирект переходом это все равно гораздо тормознее. Особенно при большом количестве вариантов. Логарифмическая сложность конечно хорошо но константная лучше.
Цитата Сообщение от fssf11 Посмотреть сообщение
Вопрос актуален , если есть у кого мысли , подскажите, хоть в двух словах саму идею
В общем делается примерно так - набор полиморфных классов или функций- конвертеров. Массив указателей на них формируется перед самим циклом парсинга. Дальше в цикле вместо свича просто вызов соответствующего конвертера (либо функции по указателю либо виртуального метода что в общем то практически одно и то же). Ну и оптимизировать алгоритмы конверсии не забываем. подозреваю основной тормоз таки в самой конверсии а не в диспетчеризации. Свич он при том что в общем случае не всегда является наиболее быстрым из возможных вариантов диспетчеризации, но точно не самый медленный. Да и сама диспетчеризация очень редко когда до нескольких процентов от общего времени выполнения дотягивает. хоть свичами хоть индирект вызовами.

Добавлено через 16 минут
Цитата Сообщение от fssf11 Посмотреть сообщение
а вот потом 5сек вывод идет на экран
Ну консоль вообще тормозная штука. Имитирует телетайп. А у него обычно скорость 300 бод у продвинутых 600 бод т.е. темп вывода 600 символов в секунду. А быстрее все равно без толку не то что прочитать, даже примерный объем выводимых строк и даже раскраску ежели оно разноцвеченное особо уловить не успеешь. На то и консоль, она же BDRA в терминах 60-х - т.е. устройство быстрой печати. В GUI приложениях такой вывод будет мгновенным, потому как они рассчитаны на то что вывод можно проскроллировать и прочитать позже.

Добавлено через 14 минут
Цитата Сообщение от fssf11 Посмотреть сообщение
а в чистом С++ , как
А что значит в чистом? Имеется в виду unmanaged? Так что в Managed что в Unmanaged все GUI зависит от фреймверка. Если мелкомягкие к MFC не удосужились прикрутить таблицы которые у всех есть более 20 лет, то как бы мелкомягкие далеко не единственный и далеко не ведущий производитель как фреймверков так и компиляторов и средств разработки. Особенно это касается именно С++ и вообще профессиональных средств разработки. Не тянут они конкуренцию в этой области и никогда не тянули. Особенно в плане С++ особенно в плане unmanaged который у мелкомягких вообще существует только потому что нужен для внутренних нужд причем далеко не GUI-направления. Посему при том что компиятор более мене современный, IDE,визуальная разработка и фреймверки остались на уровне начала 90-х. Вообще в плане средств разработки ниша мелкомягких -скриптовые языки и тулсы для доткомов и выпускников ускоренных курсов.
1
fssf11
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 181
03.04.2017, 08:02  [ТС] 12
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Тормозная это штука. Даже если там под капотом бинарный поиск в сортированном массиве то по сравнению с индирект переходом это все равно гораздо тормознее. Особенно при большом количестве вариантов. Логарифмическая сложность конечно хорошо но константная лучше.
вот примерно догадывался я , что что то не так , сформулировать не могу, ОК полностью согласен,

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
В общем делается примерно так - набор полиморфных классов или функций- конвертеров. Массив указателей на них формируется перед самим циклом парсинга.
тут я понял, только разве вызов функ-ции или класса не накладней будет по времени выполнения, хотя в ClickHouse примерно так и сделано , (или типа того потому что там в цикле что то типа куда то передается )

Добавлено через 7 минут
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Дальше в цикле вместо свича просто вызов соответствующего конвертера (либо функции по указателю либо виртуального метода что в общем то практически одно и то же).
вот это я тоже понял , на словах, а вот исполнить уже начал колебатся , примерно , гляньте так ? в мнемоКоде
C++
1
2
3
4
5
 цикл(поСтрокам)
{
   ф-цияРазборСтрокиПоСтолбикам( строкаCharов, структураСтолбиков   );
 
}
Добавлено через 5 минут
а вот как механизм подстановки или как сказать , как применить функции преобразователи ,
например я заготавливаю 12 функций на каждый тип своя,
потом как нарисовал выше в цикле перебираю строки которые прилетели в буфер и на каждую строку вызываю
ф-цияРазборСтрокиПоСтолбикам( строкаCharов, структураСтолбиков );
хотя структураСтолбиков она не меняется на протяжении всего цикла поэтому ее лучше ее не передавать каждый раз

Добавлено через 3 минуты
и вот на очередной строке я вызываю
ф-цияРазборСтрокиПоСтолбикам( строкаCharов );

и реализация функции
ф-цияРазборСтрокиПоСтолбикам( строкаCharов )
{

}
и вот тут то я стою дальше просто не знаю

Добавлено через 4 минуты
словами я знаю
надо в зависимости от типа столбика полученного из структураСтолбиков
вызвать ту функцию которая преобразовывает указанное кол-во char-ов
(длина столбика тоже указана в структураСтолбиков ) в этот тип

Добавлено через 6 минут
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну и оптимизировать алгоритмы конверсии не забываем.
про это вообще туго , кроме этого метода не чего не нашел
если как говорится не побрезгуете посмотрите
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#define HYCFG_WIN32
 
#include "hscli.h"
#include <iostream>
#include <memory>
 
#define SIZE_HCSQLDSTINFOT      128
 
void main() {
     
    int      err      = 0 ; // Код ошибки
    int      pdb      = 0 ; // Адрес памяти, куда будет записан идентификатор   соединения.
    int      pOper    = 0 ; // Адрес памяти, куда будет записан идентификатор   оператора.
 
    int      pCol     = 0 ; // количество колонок
    long     pStr     = 0 ; // количество строк  hcRECNO
    unsigned cntOp    = 0 ; // Размер считанной информации в байтах, в ф-ции "Получить информацию об операторе".
    unsigned pRecSize = 0 ; // Размер читаемой записи в байтах, в ф-ции "Открытие результатов для чтения" .
 
    hcSqlParmT Init = { sizeof(Init) }; // Адрес структуры с параметрами инициализации
  
    err = hcSqlInit(&Init)        ; // Инициализация клиентской части  
    err = hcSqlCheckInit()        ; // Проверка завершения инициализации  
    err = hcSqlAllocConnect(&pdb) ;//  Создать соединение
    err = hcSqlConnect(pdb, "tcpip:/localhost:13000", "HTADMIN", "PASSWORD")    ; //Установить связь с СУБД  
    err = hcSqlAllocStmt(pdb, &pOper)  ; // Создать оператор  
    err = hcSqlSetStmtAttr(pOper, HSCLI_ATTR_FLD_VERBOSE, (void*)1, 0) ; // ф-ция "Изменение параметров оператора" получаем расширенную инф.о полях
    err = hcSqlExecDirect(pOper, "fix all;select * from TAB4;"); // Выполняем SQLзапрос  
 
    err = hcSqlNumResultCols (pOper, &pCol     )    ; // Получить кол-во колонок результата
    err = hcSqlRowCount      (pOper, &pStr     )    ; // Получить кол-во строк   результата
    err = hcSqlOpenResults   (pOper, &pRecSize )    ; // Открытие результатов для чтения
 
    hcSqlDstInfoT *infCol = new hcSqlDstInfoT[pCol] ; // Структура "Информация о колонках результата" 
 
    err = hcSqlGetStmtAttr(pOper, HSCLI_STMT_DST_INFO, 0, infCol, pCol * SIZE_HCSQLDSTINFOT, &cntOp) ;// Получить информацию об операторе
      
    char *bufOut = new char[pRecSize * pStr]; // Адрес буфера для присылаемых записей.
 
    unsigned cntOut = 0;
     
     err = hcSqlReadResults(pOper, 0, bufOut, pRecSize * pStr, &cntOut);// Чтение результатов
 
    char *p = bufOut;
     
    for (long i = 0; i < pStr; i++)//идем по строкам
    {
 
        for (int j = 0; j < pCol ; ++j)// идем по колонкам
        {
 
            switch (infCol[j].type)// в зависимости от типа колонки преобразовываем в соответствующий тип
            {
                case HSCLI_ET_CHAR: // 0 Массив символов длиной не более заданной 
                {
                     std::string s(p, infCol[j].len);
                     std::cout << s.c_str() << "  "; 
                }
                break;
 
                case HSCLI_ET_ARRA: // 1 Массив байтов заданной длины 
                    std::cout << *reinterpret_cast<unsigned char *>(p) << "  ";
                    break;
 
                case HSCLI_ET_BYTE: // 2 Элемент - unsigned char (короткое целое)  short
                 std::cout << *reinterpret_cast<unsigned char *>(p) << "  ";
                  break;
 
                case HSCLI_ET_INTR: // 3 Элемент - signed short  
                    std::cout << *reinterpret_cast<signed short *>(p) << "  ";
                    break;
 
                case HSCLI_ET_WORD: // 4 Элемент - unsigned short  
                  std::cout << *reinterpret_cast<unsigned short *>(p) << "  ";
                    break;
 
                case HSCLI_ET_DATE: // 5 Дата    - unsigned short  
                     std::cout << *reinterpret_cast<unsigned short *>(p) << "  ";
                    break;
 
                case HSCLI_ET_NMBR: //6  Номер   - 3-х байтовое целое без знака  
                                    // std::cout << *reinterpret_cast<  *>(p);
                    break;
 
                case HSCLI_ET_LONG: //7 Элемент - long int 
                    std::cout << *reinterpret_cast<long int *>(p) << "  ";
                    break;
 
                case  HSCLI_ET_DWRD: // 8 Элемент - unsigned long int  в БД это dword          
                     std::cout << *reinterpret_cast<unsigned long int *>(p) << "  ";
                    break;
 
                case HSCLI_ET_FLOA: //  9  Элемент - float
                    std::cout << *reinterpret_cast<float *>(p) << "  ";
                    break;
 
                case HSCLI_ET_CURR: //  10 Деньги (double)  
                    std::cout << *reinterpret_cast<double *>(p) << "  ";
                    break;
 
                case HSCLI_ET_DFLT: // 11 Элемент - double  
                    std::cout << *reinterpret_cast<double *>(p) << "  ";
                    break;
 
                case HSCLI_ET_QINT: //  12 Элемент - signed __int64 
                    std::cout << *reinterpret_cast<signed __int64 *>(p) << "  ";
                    break;
                case HSCLI_ET_QWRD: //  13 Элемент - unsigned __int64 
                    std::cout << *reinterpret_cast<unsigned __int64 *>(p) << "  ";
                    break;
            }
 
            p += infCol[j].len;
 
        }
 
        std::cout << std::endl;
    }
 
    hcSqlCloseResults(pOper); // Закрытие доступа к результатам
    hcSqlFreeConnect(pdb);    // Освободить соединение
    hcSqlDone();              // Завершение работы
     
    std::system("pause");
}
  
//  std::cout << "ф-ция  hcSqlGetStmtAttr  с параметром HSCLI_STMT_DST_INFO  = " << err << endl;
//  std::cout << "Размер считанной информации в байтах.     cntOp            = " << cntOp << endl;
//  std::cout << "...............столбик № " << i + 1 << "   ......................................" << endl;
//  std::cout << "Порядковый номер алиаса aliasno = "            << Kol[i].aliasno << endl;
//  std::cout << "Номер поля в таблице fieldno = "               << Kol[i].fieldno << endl;
//  std::cout << "Тип выражения, константа HSCLI_ET_??? type = " << Kol[i].type << endl;
//  std::cout << "Длина поля в байтах len = "                    << Kol[i].len << endl;
//  std::cout << "Смещение поля относительно начала логической записи off = " << Kol[i].off << endl;
//  std::cout << "Имя кодификатора.только для coder(MYCODER, code). coder = " << Kol[i].coder << endl;
//  std::cout << "Имя поля в таблице, fname = "              << Kol[i].fname << endl;
//  std::cout << "Формат выражения CURS_OUTEXPR func = "     << Kol[i].func << endl;
//  std::cout << "Переименование поля, asname = "            << Kol[i].asname << endl;
//  std::cout << "Ключевитость поля,  key = "                << Kol[i].key << endl;
//  std::cout << "Сквозной номер поля в результате resno = " << Kol[i].resno << endl;
//  std::cout << "................................................................." << endl;
//}

это очень даже рабочий код, относительно , т.е. на больших объемах уже все это долго варится,

Добавлено через 7 минут
сейчас в захлеб глотаю https://habrahabr.ru/post/259031/ и https://ru.wikipedia.org/wiki/%D0%9C...82%D0%BE%D0%B4

Добавлено через 10 минут
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну консоль вообще тормозная штука.
вывод на консоль это пока временной , сама цель это приготовить класс или школу (в смысле несколько классов)
на чистом С++ по возможности в том смысле чтобы потом по возможности можно было бы попробывать под Linux,

а потом класс этот упаковать в DLL ,
и эта DLL-обертка как раз и будет служить

прослойкой
между
"старой HyTech dll-кой на Си"
и
"C#WPF"

вот как то так если интересно
0
Fulcrum_013
1487 / 1245 / 143
Регистрация: 14.12.2014
Сообщений: 10,938
Завершенные тесты: 3
03.04.2017, 08:24 13
Цитата Сообщение от fssf11 Посмотреть сообщение
прослойкой
между
"старой HyTech dll-кой на Си"
и
"C#WPF"
Если нужно серьезно с базами данных работать выбросьте этот непотреб С# и WPF. Если в GUI фреймверке из коробки нету компонентов для работы с БД то это непотреб отставший от жизни лет на 20 как минимум. Для сравнения посмотрите как с этим вопросом обстоят дела к примеру в С++ Builder.
Цитата Сообщение от fssf11 Посмотреть сообщение
на чистом С++ по возможности в том смысле чтобы потом по возможности можно было бы попробывать под Linux,
Embarcodero кстати в следующей версии билдера которая должна вот-вот выйти анонсировали разработку под линукс. И они это могут сделать реально. Первая рабочая попытка адаптации билдера под линукс успешно загнулась в начале 00-ых в следствие отсутствия востребованности как разработки GUI приложений под линукс так и отсутствия востребованности линукса в крупных корпорациях.

Добавлено через 2 минуты
Цитата Сообщение от fssf11 Посмотреть сообщение
это очень даже рабочий код, относительно , т.е. на больших объемах уже все это долго варится,
Тут однозначно консоль тормозит. Больше нечему.
1
fssf11
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 181
03.04.2017, 10:42  [ТС] 14
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Если нужно серьезно с базами данных работать выбросьте этот непотреб С# и WPF.
позвольте позвольте , если уж сидим на винде то как говорится и нужно по их правилам гонять, если отделить механику работы с СУБД а интерфесу интерфес (как говорится кесареву кесарево, а котлеты отдельно )
то будет даже гуд , по скорости хрен кто впоймает

Добавлено через 2 минуты
вообщем буду пробовать , а там глядеть , ну интерфейс то на до начем то рисовать , ни в консоле то работать , на дворе 22 век , а соотношение быстрота красота и удобство разработки в одном флаконе вы больше не найдете

Добавлено через 5 минут
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Для сравнения посмотрите как с этим вопросом обстоят дела к примеру в С++ Builder.
незнаю как то может дело вкуса, но как то не лежит у меня к нему

Добавлено через 1 минуту
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Если в GUI фреймверке из коробки нету компонентов для работы с БД то это непотреб отставший от жизни лет на 20 как минимум.
вот тут Вы тоже не угадали какие 20 , ей уже более 30 , а если считать со времени зачатия то и все лет 50 - 60

Добавлено через 1 минуту
вот поэтому я и хочу сделать для нее удобный и красивый руль (движок то сам еще лет 100 послужит)

Добавлено через 2 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Embarcodero кстати в следующей версии билдера которая должна вот-вот выйти анонсировали разработку под линукс.
был бы он бесплатный , я понимаю что можно и на патченом сидеть , но все равно как бы незнаю,

Добавлено через 2 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Тут однозначно консоль тормозит. Больше нечему.
ОК спасибо , успокоили , ну а всеже подскажите еще по диспечеризации через функции, я сейчас уже дочитываю материал
но как то наверно до завтра не разгребу

Добавлено через 41 минуту
Fulcrum_013, вот нашел как бы мой случай чуть ли один почти в один https://habrahabr.ru/company/xakep/blog/257891/
и даже пример есть но что то не могу его осилить
0
Fulcrum_013
1487 / 1245 / 143
Регистрация: 14.12.2014
Сообщений: 10,938
Завершенные тесты: 3
03.04.2017, 15:54 15
Цитата Сообщение от fssf11 Посмотреть сообщение
позвольте позвольте , если уж сидим на винде то как говорится и нужно по их правилам гонять
Их правила в виде winApi без обертки в виде того или иного ООП фреймверка массировано использовать невозможно, хотя бы потому как этот лисапед с квадратными колесами пилился под использование через обертку. Билдер вернее фреймверки в его комплекте - наиболее продвинутые из таких оберток.
Цитата Сообщение от fssf11 Посмотреть сообщение
а соотношение быстрота красота и удобство разработки в одном флаконе вы больше не найдете
Ну это найтить можно хотя это и редкость. Другое дело что абсолютной универсальности подобных решений не может быть в принципе. А быстрота красота удобство в плане GUI и СУБД - как раз для этого билдер и создавался и это его основное назначение. Единственный недостаток - фреймверк слишком сильно паскалем воняет.
Цитата Сообщение от fssf11 Посмотреть сообщение
если отделить механику работы с СУБД а интерфесу интерфес (как говорится кесареву кесарево, а котлеты отдельно )
Ну правильно. В VCL в этом плане мухи отдельно котлеты отдельно. Так же как и мясо отделено от костей еще до помола. 3-уровневая система связности - компоненты доступа непосредственно к БД (DataSet,)компоненты редактирования/отоброжения полей/таблиц (DBControls) и компоненты связи DataSet с DBControls (DataSource). при этом все связи и настройки делаются на 99% визуально. Код приходится писать только если есть динамическое изменение настроек.

Добавлено через 4 минуты
Цитата Сообщение от fssf11 Посмотреть сообщение
незнаю как то может дело вкуса, но как то не лежит у меня к нему
То просто инструмент совсем другого уровня нежели мелкомягкие.. Первой реакцией после предшествующих борландовских фреймверков тоже было "а где тут в пункты меню коды команд задавать и где метод в который свич их обрабатывающий пихать?". Оказалось все гораздо проще - делегат пункту и весь этот мозготрах с кодами команд и их диспетчеризацией исключается.

Добавлено через 4 минуты
Цитата Сообщение от fssf11 Посмотреть сообщение
вот нашел как бы мой случай чуть ли один почти в один https://habrahabr.ru/company/xakep/blog/257891/
и даже пример есть но что то не могу его осилить
Просто не совсем то читаете что нужно. Для примеру порекомендовал бы посмотреть реализацию классов TVariant TField и TDataSet в VCL
1
fssf11
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 181
04.04.2017, 05:30  [ТС] 16
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Просто не совсем то читаете что нужно. Для примеру порекомендовал бы посмотреть реализацию классов TVariant TField и TDataSet в VCL
ОК , опуская все лирику , вот это сейчас посмотрю

Добавлено через 4 часа 1 минуту
вот еще нашел https://refactoring.guru/ru/replace-conditional-with-polymorphism
0
Fulcrum_013
1487 / 1245 / 143
Регистрация: 14.12.2014
Сообщений: 10,938
Завершенные тесты: 3
04.04.2017, 20:20 17
Цитата Сообщение от fssf11 Посмотреть сообщение
ОК , опуская все лирику , вот это сейчас посмотрю Добавлено через 4 часа 1 минуту
вот еще нашел https://refactoring.guru/ru/replace-...h-polymorphism
Ну да это концепция. Но это только вершина айсберга.
1
fssf11
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 181
05.04.2017, 10:30  [ТС] 18
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну да это концепция. Но это только вершина айсберга.
да это точно , не прошло и пол года как я это понял

Добавлено через 4 часа 6 минут
ребята помогите с этой концепцией
0
fssf11
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 181
06.04.2017, 23:52  [ТС] 19
вопрос еще актуален, если кто знает подскажите
0
DU3
281 / 233 / 114
Регистрация: 07.09.2016
Сообщений: 587
07.04.2017, 00:09 20
мне задача так до конца и не стала понятна.
из всех возможных вариантов диспетчиризации свитч наверно самый быстрый. но такой подход херово расширается и поддерживается.
если вас беспокоят тормоза - надо профилировать. ну или тупой замер, когда вызываемые зарезолвленные функции просто пустые. а потом не пустые. соотнести одно с другим. там будет понятно, какой процент времени жрет сама диспетчиризация, и какой процент - код функций. подозреваю, что время на диспетчиризацию будет на столько мало, что на него не даже внимания обращать не надо будет.
1
07.04.2017, 00:09
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2017, 00:09

Чем заменить calloc?
field = (int**)calloc(4, sizeof(int*)); for (int i = 0; i&lt;4; i++) field = (int*)calloc(4,...

чем заменить mysql
я использую mysql в программе, но мне нужно чтобы данные хранились не на сервере а локально в...

Чем заменить cin?
как можно иначе динамически инициализировать переменную. чтобы не применять cin ? например cout...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru