Здравствуйте, MikelSV, Вы писали:
MSV>Здравствуйте, night beast, Вы писали:
NB>>Здравствуйте, MikelSV, Вы писали:
NB>>не вижу, чем (TPL a + b + c) принципиально лучше чем MAKE_TPL(a,b,c) NB>>
Над TPL 5 с утра думаю.
Для чисел не подходит T &t; добавил operator+(Tuple& tl, T &t); изменил operator+(T t).
Оператор для 2 переменных вызывается первым и берет переменные, второй оператор подбирает числа.
Проблема в Tuple() + 5, здесь еще нет Tuple& и страбатывает T t, получение данных у первой переменной накрывается.
Буду думать, как выкручиваться.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Здравствуйте, MikelSV, Вы писали:
MSV>Код компилируется, в MSVS и g++, и мне кажется стандарт не против. на codepad.org он работать не захотел, похоже там стоит флаг считать все предупреждения ошибками. удалил char data[0]; заменил все d.data на (&d+1). предупреждение пропало. codepad.org нашел что-то еще. Там походу другой компилятор, надо поставить себе, разобраться, что он хочет.
Проставьте в свойствах проекта запроет на использование расширений. И MSVS, и g++ поддерживают проверку на соответствие стандарту.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, jyuyjiyuijyu, Вы писали:
NB>>>как получить в С++ такого же эффекта я не знаю (на самом деле оно в нем и не нужно)
J>>студия (msvc2008) нормально компилит J>>и в Си и в Си++ режиме J>>такой код J>>
Здравствуйте, MikelSV, Вы писали:
MSV>Над TPL 5 с утра думаю. MSV>Для чисел не подходит T &t; добавил operator+(Tuple& tl, T &t); изменил operator+(T t). MSV>Оператор для 2 переменных вызывается первым и берет переменные, второй оператор подбирает числа. MSV>Проблема в Tuple() + 5, здесь еще нет Tuple& и страбатывает T t, получение данных у первой переменной накрывается. MSV>Буду думать, как выкручиваться.
почитай про rvalue.
в твоем случае достаточно добавить operator +( T const & t ); (будет два оператора+).
для функций с несколькими параметрами это не-помогло бы, поэтому в таких случаях обычно применяют функцию cref, которая переводит rvalue в const &.
в новом стандарте проблему решили.
Здравствуйте, gegMOPO4, Вы писали:
MOP>Здравствуйте, night beast, Вы писали: NB>>зря ты так. ну тренируется человек, кому от этого плохо?
MOP>Это не я, он сам пришёл.
MOP>Код, на самом деле, настолько уныл и безграмотен, что даже на говнокоде не получил хорошей оценки.
покажи, какой плюсовый код получил хорошую оценку там, мы вместе посмеёмся.
Здравствуйте, night beast, Вы писали:
NB>почитай про rvalue. NB>в твоем случае достаточно добавить operator +( T const & t ); (будет два оператора+). NB>для функций с несколькими параметрами это не-помогло бы, поэтому в таких случаях обычно применяют функцию cref, которая переводит rvalue в const &. NB>в новом стандарте проблему решили.
Да, я разобрался. Я пытался делать это через оператор + вне класса. А оказывается не хватало константного. Числа работают. В g++ тоже.
Увидел новые возможности применения: как контейнер для сообщений. Так как выделяется один блок памяти, его можно даже пересылать по сети и поочереди извлекать значения.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Здравствуйте, MikelSV, Вы писали:
MSV>Увидел новые возможности применения: как контейнер для сообщений. Так как выделяется один блок памяти, его можно даже пересылать по сети и поочереди извлекать значения.
я бы не советовал.
ключевое слово: сериализация.
ну и порядок байт/размер чисел на разных машинах может быть разный (хотя судя по mcrc это тебя не сильно волнует )
Макросы — это очень опасная штука, которую стоит использовать, только если без них получается совсем плохо
MSV>#define TPLM Tuple(TPLMOVE) + MSV>#define TPLC Tuple(TPLCOPY) + MSV>#define TPL Tuple() +
Без этих трех вполне можно обойтись — они немного сокращают кол-во символов, зато убивают читабельность
MSV>#define TPLERROR(t) { memcpy(0, 0, 1); }
Этот макрос вы используете только в этом файле — сделайте #undef TPLERROR в конце, раз уж он вам так необходим
вместо memcpy(0,0,1) лучше assert или throw
MSV>#define TPLMOVE 1 // copy to tuple, memset 0 original. = destruct dest, copy to dest. MSV>#define TPLCOPY 2 // copy constructor = destruct dest, copy to dest MSV>#define TPLGET 3 // destruct all values
enum {TPLMOVE, TPLCOPY, TPLGET};
делает тоже самое, но намного безопасней
MSV>#define max(a, b) (((a) > (b)) ? (a) : (b)) MSV>#define min(a, b) (((a) < (b)) ? (a) : (b))
есть функции std::min и std::max
MSV>unsigned int mcrc(char* name, unsigned int sz){
... MSV>return ret; MSV>}
стоит использовать человеко-читаемые имена функций
MSV>struct Tupled{ unsigned int sz, type; void *v; char data[0]; };
MSV>class Tuple{ MSV> int count, set, dusz, dasz; MSV> unsigned char *data; MSV> int type; int adel;