Как бы такое в умный контейнер положить
От: Мёртвый Даун Россия  
Дата: 08.02.19 08:21
Оценка:
Есть порядка 20 различных параметров X возможно разного типа. Какие то из них IN, какие то OUT, какие то IN/OUT, одни обязательные, другие нет (т.е. могут быть не указаны). Все они друг от друга зависят.

Т.е. в лоб это можно написать так,

bool CalculateA(IN int p0,
               IN char* p1,
               IN char* p2,
               IN double p3,
               INOUT double* p4,
               INOUT int* p5,
               OUT char* p6,
               OUT double* p7,
               OUT int* p8
              )
{
    // какие то расчеты по какому то известному алгоритму.
}

bool CalculateB(IN int p0,
               IN char* p1,
               IN double p2,
               INOUT double* p3,
               INOUT int* p4,
               OUT char* p5,
               OUT double* p6
              )
{
    // какие то расчеты по какому то известному алгоритму.
}


Функций таких много и писать такие развесистые функции по 20 параметров не хочется.

Подкиньте идеи по красивше сделать. C++03/C++11.
Спасибо.

UPD: почитал тут в соседнем топике про Ranges. Очень крута, наверное это бы мне подошло. Но не дадут заюзать в проекте.
UPD2: забыл сказать, функции эти будут лежать в Win32 DLL, которая ничего не знает о структурах и интерфейсе приложения. По сути просто расчетная библиотека там будет.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Отредактировано 08.02.2019 9:00 Мёртвый Даун . Предыдущая версия . Еще …
Отредактировано 08.02.2019 8:26 Мёртвый Даун . Предыдущая версия .
Отредактировано 08.02.2019 8:22 Мёртвый Даун . Предыдущая версия .
Re: Как бы такое в умный контейнер положить
От: Amygdala Россия  
Дата: 08.02.19 08:32
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

1)
struct InputData
{
int p0;
char* p1;
char* p2;
double p3;
double* p4;
int* p5;
}

struct OutputData
{
char* p6;
double* p7;
int* p8;
}

bool CalculateA(const InputData*, OutputData*)

2)
class ACalculator
{
public:
void SetParam1(int)
void SetParam2(double);
void SetParam3(char);

bool Calc();

int GetResult1();
double GetResult2();
char GetResult3();

}
Re: Как бы такое в умный контейнер положить
От: Carc Россия http://www.amlpages.com/home.php
Дата: 08.02.19 08:33
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Есть порядка 20 различных параметров X возможно разного типа. Какие то из них IN, какие то OUT, какие то IN/OUT, одни обязательные, другие нет (т.е. могут быть не указаны). Все они друг от друга зависят.


МД>Т.е. в лоб это можно написать так,


МД>
МД>bool CalculateA(IN int p0,
МД>               IN char* p1,
МД>               IN char* p2,
МД>               IN double p3,
МД>               INOUT double* p4,
МД>               INOUT int* p5,
МД>               OUT char* p6,
МД>               OUT double* p7,
МД>               OUT int* p8
МД>              )
МД>{
МД>    // какие то расчеты по какому то известному алгоритму.
МД>}

МД>bool CalculateB(IN int p0,
МД>               IN char* p1,
МД>               IN double p2,
МД>               INOUT double* p3,
МД>               INOUT int* p4,
МД>               OUT char* p5,
МД>               OUT double* p6
МД>              )
МД>{
МД>    // какие то расчеты по какому то известному алгоритму.
МД>}
МД>


МД>Функций таких много и писать такие развесистые функции по 20 параметров не хочется.


МД>Подкиньте идеи по красивше сделать. C++03/C++11.

МД>Спасибо.
struct PARAM{int p0,
               char* p1,
               char* p2,
               double p3,
               double* p4,
               int* p5,
               char* p6,
               double* p7,
               int* p8
             };

bool CalculateA(PARAM& param)
{
...
}
Aml Pages Home
Re[2]: Как бы такое в умный контейнер положить
От: Мёртвый Даун Россия  
Дата: 08.02.19 08:57
Оценка:
Здравствуйте, Amygdala, Вы писали:

A>2)

A>class ACalculator
A>{
A>public:
A> void SetParam1(int)
A> void SetParam2(double);
A> void SetParam3(char);

Я так и думал, но не хочу стопицот геттеров/сеттеров
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[3]: Как бы такое в умный контейнер положить
От: Amygdala Россия  
Дата: 08.02.19 09:09
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Я так и думал, но не хочу стопицот геттеров/сеттеров


Тогда, если скорость не шибко критична, можно какой-нибудь json-подобную структуру передачи параметров организовать. И пихать все через человеко-читаемые строки.

Тогда любая такая фукнция будет иметь вид

bool Calc(const StringData* indata, StringData* outData)

А уж заполняешь и читаешь все через StringData. Типа

StringData myData;
myData.AddField("FieldName", value);
...

после вычислений
myData1.GetValueByKey("resDoulbe");

Это даже будет и по скорости не критично, у меня как-то в одном из проектов все нормально работало и не тормозило с таким подходом

у этого подхода есть огромный плюс — передавать можно между чем угодно и куда угодно, хоть по сети, хоть в другой язык или компоненту
Отредактировано 08.02.2019 10:32 Amygdala . Предыдущая версия .
Re: Как бы такое в умный контейнер положить
От: andrey.desman  
Дата: 08.02.19 09:46
Оценка: +1
Здравствуйте, Мёртвый Даун, Вы писали:

МД>UPD2: забыл сказать, функции эти будут лежать в Win32 DLL, которая ничего не знает о структурах и интерфейсе приложения. По сути просто расчетная библиотека там будет.


C API что ли?
Re: Как бы такое в умный контейнер положить
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 08.02.19 10:24
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Подкиньте идеи по красивше сделать. C++03/C++11.

Абстрактуню фабрику калькуляторов можно сделать, при желании что-то можно через шаблоны и специализацию задавать. Ну и эта, int p0 надо бы типизировать как-то, полагаю, половина параметров флаги или ччто-то подобное.
Sic luceat lux!
Re: Как бы такое в умный контейнер положить
От: TimurSPB Интернет  
Дата: 08.02.19 10:30
Оценка: -1
МД>Есть порядка 20 различных параметров X возможно разного типа.
МД>эти будут лежать в Win32 DLL, которая ничего не знает о структурах и интерфейсе приложения.

Исходя из этого получается что придётся таки писать функции с кучей параметров. Можно только посоветовать сделать IN параметры const и посочувствовать.
Make flame.politics Great Again!
Re: Как бы такое в умный контейнер положить
От: kov_serg Россия  
Дата: 08.02.19 16:51
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Есть порядка 20 различных параметров X возможно разного типа. Какие то из них IN, какие то OUT, какие то IN/OUT, одни обязательные, другие нет (т.е. могут быть не указаны). Все они друг от друга зависят.


Я бы не заморачивался но добавл бы управление и логирование происходящего.
struct Control {
    Trace trace;
    Cancel cancel;
};
/*
    TimeoutCancel timelimit(1000);
    Control control[1];
    control->trace=trace_to_console;
    control->cancel=timelimit;
*/
struct CalculateA_arguments {
    IN int p0;
    IN char *p1,*p2;
    IN double p3;
    INOUT double* p4;
    INOUT int* p5;
    OUT char* p6;
    OUT double* p7;
    OUT int* p8;
} CalculateA_arg;
/* usage example:

    CalculateA_arg arg[1];
    arg->p0=0;
    arg->p1="p1";
    arg->p2="p2";
    //...
    CalculateA(arg,control);
    //...

*/
int API CalculateA(CalculateA_arg *arg,Control *control);

// ... и так 20 раз

//-----------------------------------------------------------------
// каждый расчет в своём файле 
int API CalculateA(CalculateA_arg *arg,Control *control) {
    int result=0;
    if (control) {
        control->trace("begin calculation\n");
        control->trace("p0=%d\n",p0);
        //...
    }
    for(;;) {
        if (control && control->cancel()) { result=1; break; }
        if (control) control->trace("inside infinite loop");
    }
    if (control) {
        if (result==0) control->trace("success");
        else control->trace("bad news for everyone");
    }
    return result;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.