LINUX.ORG.RU
ФорумTalks

Специалистам по C или C++


0

3

Вопрос на засыпку. Можно ли с достаточностью утверждать, что приведенный по ссылке ниже кусок кода на C++ является индусским?

http://pastebin.com/h18t1tNg

(Это не дословное копирование)

Upd. Давайте посылать ему патчи :)

★★★★★

Последнее исправление: ttnl (всего исправлений: 1)

Ответ на: комментарий от Legioner

Я могу опубликовать на суд сообщества c-файл с макросами на ~700 строк, который красиво оборачивает функции libconfig и позволяет сохранять туда структуры, списки структур, вектора скаляров, скаляры - и вся эта херня с ПОЛНОЙ проверкой на все типы ошибок!

И она, бля, РАБОТАЛА абсолютно корректно!

Правда, потом я код этот выкинул и переписал все на функциях, однако в резервуарах он все таки остался.

Кстати, получился очень хороший опыт работы с С-макросами.

bk_ ★★
()
Ответ на: комментарий от bk_

Вот это

#define ENGINE_TYPE_STR(type) type##_STR
с этим
ENGINE_TYPE_STR(*out_size);
даст просто *out_size_STR. В лучшем случае (если компилятор «умный»), получится какой-нибудь 1_STR.

Eddy_Em ☆☆☆☆☆
()
Ответ на: Не конпелировал, но недоумеваю от staseg

Даже примерчик дам:

#define ENGINE_DETECT_TYPE_VIRWARE 	1
#define ENGINE_DETECT_TYPE_TROJWARE 	2
#define ENGINE_DETECT_TYPE_ADWARE	3
#define ENGINE_DETECT_TYPE_PORNWARE	4
#define ENGINE_DETECT_TYPE_RISKWARE	5
#define ENGINE_DETECT_TYPE_MALWARE	6

#define ENGINE_DETECT_TYPE_VIRWARE_STR 		"Virus"
#define ENGINE_DETECT_TYPE_TROJWARE_STR 	"Trojan"
#define ENGINE_DETECT_TYPE_ADWARE_STR		"Adware"
#define ENGINE_DETECT_TYPE_PORNWARE_STR		"Pornware"
#define ENGINE_DETECT_TYPE_RISKWARE_STR		"Riskware"
#define ENGINE_DETECT_TYPE_MALWARE_STR		"Malware"



#define ENGINE_TYPE_STR(type) type##_STR


main()
{
  printf("%s\n", ENGINE_TYPE_STR(ENGINE_DETECT_TYPE_PORNWARE));
}
zdo@mamburu:~/Projects$ gcc kasp.c
kasp.c: In function ‘main’:
kasp.c:21: warning: incompatible implicit declaration of built-in function ‘printf’
zdo@mamburu:~/Projects$ ./a.out 
Pornware

bk_ ★★
()
Ответ на: комментарий от Eddy_Em

Точно, так не работает. тестил на примере постом ниже. Забыл эту деталь.

Приношу всем, кого обосрал, свои извинения.

bk_ ★★
()
Ответ на: комментарий от bk_

Нет, это я понимаю. Тут в компайл-тайм все прекрасно раскрывается. А что раскрывается там я не понимаю совершенно. Можно дать нормальный полный компилируемый пример того, как оно работает с *out_size ?

staseg ★★★★★
()
Ответ на: комментарий от bk_

Да я уж увидел. Передо мной, думаю, извиняться не за что :)

staseg ★★★★★
()

Здесь в свитче запускается каждый раз один и тот же код. проще:

                    error=CALL_SYS_ObjectCreateVeryQuick(this, &str,IID_STRING,PID_ANY,SUBTYPE_ANY );
                    if(PR_SUC(error) && out_size)
                    {
                            sting s;
                            switch(*out_size)
                            {
                            case ENGINE_DETECT_TYPE_VIRWARE: s = "Virus"; break;
                            case ENGINE_DETECT_TYPE_TROJWARE: s = "Trojan"; break;
                            case ENGINE_DETECT_TYPE_ADWARE: s = "Adware"; break;
                            case ENGINE_DETECT_TYPE_PORNWARE: s = "Pornware"; break;
                            case ENGINE_DETECT_TYPE_RISKWARE: s = "Riskware", break;
                            case ENGINE_DETECT_TYPE_MALWARE:
                            default: s = "Malware", break;

                            error=CALL_String_ImportFromBuf( str, &len, s, 0,cCP_ANSI,cSTRING_Z);

                            }
                            if(PR_SUC(error) && len)
                            {

не идеально конечно, но лучше

Andaril
()
Ответ на: комментарий от Legioner

>Куда уж мне до тех, кто пишет код, который архиватором не жмётся :)

«Архиватор» тоже ты набыдлоко^Wнаписал?

В приципе, неудивительно: только быдлокодеры и прочие хомячки называют программу для сжатия «архиватором». Или пытаются «жать» действительно архиватором:)

Led ★★★☆☆
()
Ответ на: комментарий от bk_

После лиспа тяжело возвращаться к нормальной жизни без веществ.

#include <stdio.h>

#define ENGINE_DETECT_TYPE_VIRWARE      1
#define ENGINE_DETECT_TYPE_TROJWARE     2
#define ENGINE_DETECT_TYPE_ADWARE       3
#define ENGINE_DETECT_TYPE_PORNWARE     4
#define ENGINE_DETECT_TYPE_RISKWARE     5
#define ENGINE_DETECT_TYPE_MALWARE      6

const char *TYPE_STR[] = {NULL, "Virus", "Troyan", "Adware", "Pornware",
        "Riskware", "Malware"};

main()
{
int fuck = 2;
  printf("%s\n", TYPE_STR[fuck]);
}

bk_ ★★
()
Ответ на: комментарий от Andaril
include <stdio.h>

#define ENGINE_DETECT_TYPE_VIRWARE      1
#define ENGINE_DETECT_TYPE_TROJWARE     2
#define ENGINE_DETECT_TYPE_ADWARE       3
#define ENGINE_DETECT_TYPE_PORNWARE     4
#define ENGINE_DETECT_TYPE_RISKWARE     5
#define ENGINE_DETECT_TYPE_MALWARE      6

const char *TYPE_STR[] = {NULL, "Virus", "Troyan", "Adware", "Pornware",
        "Riskware", "Malware"};

error =
CALL_SYS_ObjectCreateVeryQuick (this, &str, IID_STRING, PID_ANY, SUBTYPE_ANY);
if (PR_SUC (error) && out_size)
  {
    string type = TYPE_STR[*out_size];
  }

bk_ ★★
()
Ответ на: комментарий от Eddy_Em

>Да ладно вам, я подобного индусокода тонны пишу

В твоём случае - неудивительно. Было бы странно, если бы ты писал по-другому

Led ★★★☆☆
()
Ответ на: комментарий от Andaril

Использование метода табличного доступа с прямой адресацией по индексу.

bk_ ★★
()
Ответ на: комментарий от tailgunner

>6 вызовов, различающихся одним аргументом.

хмм, а я и не обратил даже внимание, что там одна и та же функция вызывается. да, как-то кривовато. в этом случае я б enum со статическим массивом заюзал и выкинул свич ибо он не нужен. хотя с другой стороны мы не знаем контекста этого кода. возможно сделано на перспективу, когда в будущем сей код эволюционирует до вызова разных функций, в зависимости от кейса.

Deleted
()

Есть можно. Код нормальный.

drull ★☆☆☆
()
Ответ на: комментарий от Deleted

о.. тут уже двумя каментами выше такой подход изобразили, только вместо enum'а сделали через дефайны.

Deleted
()

Посмотрел вторую часть. Код - гугно.

drull ★☆☆☆
()
Ответ на: комментарий от bk_

А теперь предположите, что

#define ENGINE_DETECT_TYPE_VIRWARE      10
#define ENGINE_DETECT_TYPE_TROJWARE     22
#define ENGINE_DETECT_TYPE_ADWARE       302
#define ENGINE_DETECT_TYPE_PORNWARE     41
#define ENGINE_DETECT_TYPE_RISKWARE     5
#define ENGINE_DETECT_TYPE_MALWARE      666
Тогда такой подход не сработает. Может, помимо этих есть еще 100500 #define'ов?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от drull

>> Мне главное - чтобы работало, а что там внутри - все равно :)

Не только тебе. Всем так.

У некоторых понятие «работает» несколько шире типично быдлокодерского.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> У некоторых понятие «работает» несколько шире типично быдлокодерского.

Работает = выполняет свою функцию, и вовсе не обязательно смотрится красиво.

drull ★☆☆☆
()
Ответ на: комментарий от drull

>> У некоторых понятие «работает» несколько шире типично быдлокодерского.

Работает = выполняет свою функцию

Приведи список функций.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Приведи список функций.

Выполняет ту функцию, которую задумал разработчик. Тебе привести список всех функций которые я могу задумать?

drull ★☆☆☆
()
Ответ на: комментарий от drull

> Выполняет ту функцию, которую задумал разработчик. Тебе привести список всех функций которые я могу задумать?

Нет. Я просто ждал, будут ли в списке «функции» вроде «быть понятной», «быть легкой в модификации», «быть надежной». Как и ожидалось, ничего этого в списке не было. Вывод сделай сам.

tailgunner ★★★★★
()
Ответ на: комментарий от Led

Чем это мое предположение - говно? Будто у тебя есть лучше :)

Или ты считаешь, что ситуации с такой нумерацией быть не может? Тогда зачем было бы вообще этот switch городить, если все легко решалось бы при помощи массивов?

// кстати, сегодня полчаса бился с функцией qsort, чтобы правильно разыменовать ее указатели (сортировался массив указателей, являющийся членом структуры, которая передавалась в функцию по указателю). Но я, как ты понимаешь, тот еще быдлокодер :)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от bk_

ПОчитайте уж Макконнелла.

Книгу «Совершенный код»? Почитал бы, да мне сначала хочется разобраться с одной задачкой (opengl+gtk, ни в том, ни в другом я не соображаю :) ).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от tailgunner

«Быть понятной» и «быть легкой в модификации» - это опять же индивидуально. Создатель сможет внести нужные поправки в течении считанных минут, а при наличии комментариев их сможет ввести и другой разработчик.

drull ★☆☆☆
()
Ответ на: комментарий от drull

> «Быть понятной» и «быть легкой в модификации» - это опять же индивидуально.

Глупости.

Создатель сможет внести нужные поправки в течении считанных минут

Бгг. Создатель - тоже человек, он тоже забывает. Если приходится возвращаться к программе через несколько месяцев (даже недель) на другом проекте - ее приходится понимать заново.

при наличии комментариев их сможет ввести и другой разработчик.

Зависит 1) от качества комментариев 2) процента копипаста.

tailgunner ★★★★★
()
Ответ на: комментарий от Led

К этому коду может быть только одна серьёзная претензия - вызов функции в свитче. Она решается выносом переменной за оный (только const char *, конечно, а не string).

Если все претензии к коду ограничиваются такой примитивной правкой, то код хороший. Просто потому, что когда мне понадобится что то поправить, я потрачу ровно 30 секунд и сделаю её.

То ли ты не видел настоящего говнокода, то ли ты перфекционист, для которого всё, к чему есть малейшие претензии, надо выкинуть.

Твои придирки к «архиватору» подтверждают последнюю версию.

Обычно это проходит.

Legioner ★★★★★
()
Ответ на: комментарий от Xenesz

Гцц замечательно сжимает :)

Ни разу не встречал бинарник, занимающий меньший объем, чем его исходники (если, конечно, часть исходников не компилируется в отдельную библиотеку).

Eddy_Em ☆☆☆☆☆
()

Да, индусокод.

На C я сто лет не писал. Но в скриптовом языке я бы загнал названия ошибок в ассоциативный массив. А то и вообще избавился бы от этих строк «Virus», «Trojan», а передавал бы в CALL_String_ImportFromBuf константы. Мне что-то подсказывает, что в CALL_String_ImportFromBuf есть аналог этого селекта.

Xellos ★★★★★
()

Странно, что до сих пор никто не вспомнил про enum.

И да, макросы не нужны :)

melkor217 ★★★★★
()
#include <map>

using std::map;

enum WareTypes{ ENGINE_DETECT_TYPE_VIRWARE,
                ENGINE_DETECT_TYPE_TROJWARE,
                ENGINE_DETECT_TYPE_ADWARE,
                ENGINE_DETECT_TYPE_PORNWARE,
                ENGINE_DETECT_TYPE_RISKWARE,
                ENGINE_DETECT_TYPE_MALWARE };

class WareTypesStrings
{
  public:
    static const char* wareStringForType(WareTypes t);
  private:
    static void initMap();
    static bool needInit;
    static map<WareTypes, const char*> stringMap;
};

bool WareTypesStrings::needInit = true;
map<WareTypes, const char*> WareTypesStrings::stringMap;

void WareTypesStrings::initMap()
{
  if(!needInit)
  {
    return;
  }
  stringMap[ENGINE_DETECT_TYPE_VIRWARE] = "Virus";
  stringMap[ENGINE_DETECT_TYPE_TROJWARE] = "Trojan";
  stringMap[ENGINE_DETECT_TYPE_ADWARE] = "Adware";
  stringMap[ENGINE_DETECT_TYPE_PORNWARE] = "Pornware";
  stringMap[ENGINE_DETECT_TYPE_RISKWARE] = "Riskware";
  stringMap[ENGINE_DETECT_TYPE_MALWARE] = "Malware";
  needInit = false;
}

const char* WareTypesStrings::wareStringForType(WareTypes t)
{
  initMap();
  map<WareTypes, const char*>::const_iterator it = stringMap.find(t);
  if(it == stringMap.end())
  {
    return "Unknown";
  }
  return it->second;
}

//=================================================================================

error=CALL_SYS_ObjectCreateVeryQuick(this, &str,IID_STRING,PID_ANY,SUBTYPE_ANY );
if(PR_SUC(error) && out_size)
{
  error = CALL_String_ImportFromBuf(str, &len,
                                    wareTypesStrings::wareStringForType(*out_size)
                                    0, cCP_ANSI,cSTRING_Z);
}
if(PR_SUC(error) && len)
                        {

Странно, что никто не предложил))

dyb4hzvo
()
Ответ на: комментарий от Eddy_Em

Внутри map, по идее, не должно быть switch, он хранит пары ключ/значение отсортированные по возрастанию.

А вобще преимущество такой штуки проявится если требуется получить хранимые внутри строки в нескольких местах кода, а также в том случае если ENGINE_DETECT_TYPE_* будут иметь сильно разнесённые значения (когда массив не катит).

Ну и это С++ головного мозга))

dyb4hzvo
()
Ответ на: комментарий от Eddy_Em

> И чем это будет от switch'а отличаться

тем что _это_ больше, медленнее и нечитабельнее

aho
()
Ответ на: комментарий от Xellos

>Это точно Каспер?

Если Пиратская бухта не врет

ttnl ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.