Задолбало гццой
От: MikelSV http://www.centerix.ru
Дата: 10.12.09 22:23
Оценка: -3 :))) :)
В то время, когда корабли^W студия собирает проект, g++ упорно придирается к разным моментам.
Например:

ошибка: нет подходящей функции для вызова ‘EVString::EVString(EVString)’
замечание: претенденты: EVString::EVString(EVString&)
замечание:              EVString::EVString(VString)


Разобрался, что EVString::EVString(const EVString&) спасает положение. Но с другой стороны это бред, почему я не могу менять данные?

не получается:
ошибка: некорректное преобразование из ‘int (*)(int, int)’ в ‘void*’
А всего то хотелось получить адрес функции.


И так далее. В основном ошибки, связанные с переводом из одного типа в другой.
Долгая отладка таких, казалось бы простых вещей, которые понимает даже студия (2003 года), создают мнение о гцц, как о тупом компиляторе.
Я так понимаю есть веские основания для всех этих глюков?
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re: Задолбало гццой
От: Кодт Россия  
Дата: 10.12.09 23:02
Оценка: 13 (3) +1
Здравствуйте, MikelSV, Вы писали:

MSV>В то время, когда корабли^W студия собирает проект, g++ упорно придирается к разным моментам.

В то время, когда студия плюёт на стандарт...

MSV>Например:


MSV>
MSV>ошибка: нет подходящей функции для вызова ‘EVString::EVString(EVString)’
MSV>замечание: претенденты: EVString::EVString(EVString&)
MSV>замечание:              EVString::EVString(VString)
MSV>


MSV>Разобрался, что EVString::EVString(const EVString&) спасает положение. Но с другой стороны это бред, почему я не могу менять данные?


С другой стороны, это бред — почему это тебе надо менять временный объект?

У конструктора копирования могут быть две сигнатуры: T::T(T const&) — используется в подавляющем большинстве случаев, и T::T(T&) — редкое исключение, непонятно когда нужное.

Стандартное приведение rvalue — к const lvalue, но студия решила, что можно приводить и к неконстантной ссылке.

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

MSV>не получается:

MSV> ошибка: некорректное преобразование из ‘int (*)(int, int)’ в ‘void*’
MSV>А всего то хотелось получить адрес функции.

По стандарту (и по здравому смыслу — если глянуть чуть шире, чем flat модель памяти) указатели на данные и указатели на функции не пересекаются. Верхним типом для данных является void*, верхним типом для функций — void(*)(void).
Хочешь хранить адрес функции — приводи к void(*)(). Хочешь получить численное значение — приводи к intptr_t.

Следующий вопрос будет "хочу получить адрес функции-члена", там тебя поджидает сюрприз: sizeof(void(A::*)()) > sizeof(void(*)()).


MSV>И так далее. В основном ошибки, связанные с переводом из одного типа в другой.

MSV>Долгая отладка таких, казалось бы простых вещей, которые понимает даже студия (2003 года), создают мнение о гцц, как о тупом компиляторе.
MSV>Я так понимаю есть веские основания для всех этих глюков?

Основание одно: стандарт С++. А "даже студия" отягощена плохой наследственностью (как кода компилятора, так и разных существующих библиотек), там хвосты тянутся с достандартных времён ещё.
Перекуём баги на фичи!
Re: Задолбало гццой
От: rg45 СССР  
Дата: 10.12.09 23:00
Оценка: 9 (1) +3
Здравствуйте, MikelSV, Вы писали:

MSV>В то время, когда корабли^W студия собирает проект, g++ упорно придирается к разным моментам.

MSV>Например:

MSV>
MSV>ошибка: нет подходящей функции для вызова ‘EVString::EVString(EVString)’
MSV>замечание: претенденты: EVString::EVString(EVString&)
MSV>замечание:              EVString::EVString(VString)
MSV>


MSV>Разобрался, что EVString::EVString(const EVString&) спасает положение. Но с другой стороны это бред, почему я не могу менять данные?


Дело тут вот в другом. В данном случае мы имеем дело с копирующими конструкторами, а это отдельная статья. Вот что говорит стандарт о копирующих конструкторах:

12.8/2
A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments (8.3.6).106) [Example: X::X(const X&) and X::X(X&, int=1) are copy constructors.

12.8/3
A declaration of a constructor for a class X is ill-formed if its first parameter is of type X and either there are no other parameters or else all other parameters have default arguments.

Так что гцц в данном случае прав, и максиммум, в чем его можно упрекнуть, так это в неинформативности сообщения об ошибке. Comeau, например, такой случай диагностирует значительно более четко: error: copy constructor for class "A" may not have a parameter of type "A"


MSV>не получается:

MSV> ошибка: некорректное преобразование из ‘int (*)(int, int)’ в ‘void*’
MSV>А всего то хотелось получить адрес функции.

MSV>И так далее. В основном ошибки, связанные с переводом из одного типа в другой.

MSV>Долгая отладка таких, казалось бы простых вещей, которые понимает даже студия (2003 года), создают мнение о гцц, как о тупом компиляторе.
MSV>Я так понимаю есть веские основания для всех этих глюков?

Основания простые — типовая безопасность. Ведь если тебе действительно приспичит что-то во что-то конвертнуть, ты в большинстве случаев, так ил и иначе, найдешь способ это сделать. А вот тем, что компилятор не дает это сделать "в лоб", он оберегает от случайных ошибок и спасибо ему за это, такие ошибки иногда очень трудно ловятся.
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Задолбало гццой
От: rg45 СССР  
Дата: 10.12.09 23:28
Оценка: +1 :)))
Здравствуйте, мыщъх, Вы писали:

М>ничего не скажу на приплюснутую часть (потому как не знаю), но вот даже на чистом си гнусь долбит конкретно, заставляя меня избавляться от вредных привычек писать код непонятный для окружающих. например, студия это понимает нормально (потому как все по стандарту): printf("var_a = %x\n", a, b++);


Эх, да разве ЭТО непонятный код? Вот непонятный код
Автор: kochetkov.vladimir
Дата: 09.11.09
. Можешь спокойно уезжать хоть на год, никто не притронется
--
Справедливость выше закона. А человечность выше справедливости.
Re[14]: Задолбало гццой
От: Кодт Россия  
Дата: 14.12.09 14:58
Оценка: :)))
Здравствуйте, wander, Вы писали:

W>То есть вы отказываетесь учиться?


Скорее, "я хочу писать говнокод и навязывать его моим коллегам — а кривые кирпичи и гнутый компилятор мне мешают это делать".
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[2]: О неконстантных ссылках
От: Николай Ивченков  
Дата: 12.12.09 23:42
Оценка: 4 (1) +1
Roman Odaisky:

RO>Поэтому в C++0x есть третий тип ссылок — rvalue references, которые действуют, как достандартные неконстантные ссылки.


Что интересно, даже в текущей версии черновика (документ N3000) rvalue references довольно плохо проработаны. И это при том, что формулировки связанных с ними правил были впервые предложены в 2005 году — см. N1770 (сами rvalue references были предложены в 2004 году — см. N1690).

И лишь в прошлом месяце появился документ N3010, решающий ряд фундаментальных проблем, связанных с введением в язык rvalue-ссылок.
Re[2]: Задолбало гццой
От: alsemm Россия  
Дата: 11.12.09 08:05
Оценка: +2
Здравствуйте, мыщъх, Вы писали:

М>Здравствуйте, MikelSV, Вы писали:


MSV>>В то время, когда корабли^W студия собирает проект, g++ упорно придирается к разным моментам.

MSV>>Например:

М>ничего не скажу на приплюснутую часть (потому как не знаю), но вот даже на чистом си гнусь долбит конкретно, заставляя меня избавляться от вредных привычек писать код непонятный для окружающих. например, студия это понимает нормально (потому как все по стандарту): printf("var_a = %x\n", a, b++); а вот гнусь грязно ругается.

gcc наткнулся на паттерн говнокода.

М>ага, вот вы уже ругаетесь тоже.

Конечно мы будем ругаться, т.к. нарушено простое правило — отладочный вывод и прочие assert-ы не должны изменять состояние системы.

М>а вот не надо трогать мой код в мое отсуствие. хотели убрать отладочную печать для создания релиза? ну так разбирайтесь почему оно перестало работать (хинт: b не предполается выводить на экран, его предполагается увеличить на единицу).

Нужно уважать время и труд коллег. Тогда и недоразумений не будет.

М>так же гнусю не нравится main(). ему подавай int main(). мелочь, конечно, а как анноит.

В какой-то версии С стандарта, если не указан тип возвращаемого значения функции, то он int. Может, если скормить gcc один из http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options ключей, он ругаться и не будет.
Re[3]: Задолбало гццой
От: Кодт Россия  
Дата: 11.12.09 10:34
Оценка: +1 :)
Здравствуйте, rg45, Вы писали:

R>Эх, да разве ЭТО непонятный код? Вот непонятный код
Автор: kochetkov.vladimir
Дата: 09.11.09
. Можешь спокойно уезжать хоть на год, никто не притронется


Ну я же притрагивался...
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[4]: Задолбало гццой
От: Alexey F  
Дата: 11.12.09 00:00
Оценка: 12 (1)
Здравствуйте, мыщъх, Вы писали:

[...skip...]
М>к слову сказать меня изрядно долбает, что конструкции if (!(f=fopen()) так же вызывают матюги компилятора. умом я понимаю, что многие путают = и ==, поэтому компилятор "услужливо" об этом предупреждает. но дробить на две строки эту конструкцию мне упорно не нравится.
Ругается со скобками (т.е. !(f=fopen())), точно?
Просто у меня на -Wall и -Wextra как раз со скобками (т.е. if ( (...) )) gcc ест и, в случае их отсутствия, даже просит специально поставить — удостовериться, что написано верно:
/* со скобками */
if ( !(f = fopen ( "123", "w" )) )

Сие компилируется без предупреждений.

А это:
/* убрал отрицание; без скобок */
if ( f = fopen ( "123", "w" ) )

Уже ругается:

warning: suggest parentheses around assignment used as truth value

Достаточно обернуть в скобки условие вида a = b, чтобы gcc успокоился . Вот так:
/* убрал отрицание */
if ( ( f = fopen ( "123", "w" ) ) )


М>а если это еще и что-то типа for() if (!(a=max(a, buf[i])) break; то тут у нас получается +3 строки. две из которых фигурные скобки. ну и что:

Аналогично, на -Wall и -Wextra собирается без шума.

Толи кроме -Wall ещё какой флаг стоит (хотя не нашёл отдельного флага, чтобы не был включён в -Wall и взводил бы ругань компилятора на такой код вне зависимости от обрамления скобками), толи версия gcc такая —
Re[8]: Задолбало гццой
От: Fwiffo Россия  
Дата: 12.12.09 00:29
Оценка: 8 (1)
Здравствуйте, Alexey F, Вы писали:

AF>Здравствуйте, MikelSV, Вы писали:


MSV>>Вот не понял мысли. как этим пользоваться? Можно более привычного вида? типа void*f...

MSV>>этот код в линуксе пока не будет использоваться, но как минимум должна сохраняться работа в windows.
AF>Имелось ввиду явно кастить к нужному типу:
AF>
AF>void* f = reinterpret_cast<void*> ( someFunc );
AF>


Нет, имелось в виду именно к числовому типу. Пункт относительно преобразования указателя на функцию в void* появится в следующем стандарте. Comeau это компилирует только начиная с 4.3.10.1 Beta2.
void (*p)();
void* v = reinterpret_cast<void*> ( p ); // error: invalid type conversion
long l = reinterpret_cast<long> ( p ); // Ok
Re[2]: Задолбало гццой
От: Alexey F  
Дата: 10.12.09 23:19
Оценка: 1 (1)
Здравствуйте, мыщъх, Вы писали:

М>ничего не скажу на приплюснутую часть (потому как не знаю)

В этом плане она строже, чем MS VC++.

[...skip...]

М>printf("var_a = %x\n", a, b++); а вот гнусь грязно ругается. ага, вот вы уже ругаетесь тоже. а вот не надо трогать мой код в мое отсуствие. хотели убрать отладочную печать для создания релиза? ну так разбирайтесь почему оно перестало работать (хинт: b не предполается выводить на экран, его предполагается увеличить на единицу).


М>так же гнусю не нравится main(). ему подавай int main(). мелочь, конечно, а как анноит. и я бы не сказал, что объявляя int явно мы избавляемся от ошибок или прививаем себе хороший стиль кодинга. впрочем, к гнусю быстро привыкаешь.

Смотря с какими флагами собирать.
Просто "gcc file.c" на таком коде:
#include <stdio.h>

main () { // без int
    int a = 0, b = 0;
    printf("var_a = %x\n", a, b++);
}

— выдаёт, естественно, тишину.
Если -Wall поставить, конечно, будет ругаться (warning-ми), но можно поставить только те, которые нужны, исключив:
Правда, многовато может флагов получится, по сравнению с обычным выставлением -Wall.

Re[3]: Задолбало гццой
От: Юрий Жмеренецкий ICQ 380412032
Дата: 11.12.09 09:15
Оценка: 1 (1)
Здравствуйте, MikelSV, Вы писали:

MSV>Тогда вопрос посложнее:

MSV>

MSV>нет подходящей функции для вызова ‘MSL::SetVal(EVString, MString&, MSLKValLine&)’
MSV>претенденты: bool MSL::SetVal(EVString&, VString, MSLKValLine&)
MSV>bool MSL::SetVal(EVString&, VString)


MSV>Это уже не конструктор. гцц не умеет считать количество параметров?


MSV>Бред крепчает в:

MSV>

MSV>ошибка: нет подходящей функции для вызова ‘crbil::add(crbi)’
MSV>280: замечание: претенденты: void crbil::add(crbi&)
MSV>284: замечание: void crbil::add(int, char*)
MSV>288: замечание: void crbil::add(int, char*, int, char*)



MSV>Возможно я не понимаю смысла '&'?


Возможно используется аргументы по умолчанию.


MSV>к

MSV>class A{
MSV>...
MSV>bool sendping(crbi &or);
MSV>...
MSV>};


MSV>Пристает с ошибка: expected ‘,’ or ‘...’ before ‘||’ token

MSV>вообще не понятно, чего он хочет.

'or' — это alternative token, синоним для '||'. Вероятно реализовано через макрос, поэтому сообщение невменяемое.
Re: Задолбало гццой
От: TimurSPB Интернет  
Дата: 12.12.09 00:34
Оценка: 1 (1)
Здравствуйте, MikelSV, Вы писали:

MSV>В то время, когда корабли^W студия собирает проект, g++ упорно придирается к разным моментам.

MSV>Например:

MSV>
MSV>ошибка: нет подходящей функции для вызова ‘EVString::EVString(EVString)’
MSV>замечание: претенденты: EVString::EVString(EVString&)
MSV>замечание:              EVString::EVString(VString)
MSV>


MSV>Разобрался, что EVString::EVString(const EVString&) спасает положение. Но с другой стороны это бред, почему я не могу менять данные?


MSV>не получается:

MSV> ошибка: некорректное преобразование из ‘int (*)(int, int)’ в ‘void*’
MSV>А всего то хотелось получить адрес функции.


MSV>И так далее. В основном ошибки, связанные с переводом из одного типа в другой.

MSV>Долгая отладка таких, казалось бы простых вещей, которые понимает даже студия (2003 года), создают мнение о гцц, как о тупом компиляторе.
MSV>Я так понимаю есть веские основания для всех этих глюков?

ГЦЦ суров, но справедлив.
Make flame.politics Great Again!
Re: Задолбало гццой
От: Cyberax Марс  
Дата: 10.12.09 22:42
Оценка: :)
Здравствуйте, MikelSV, Вы писали:

MSV>Разобрался, что EVString::EVString(const EVString&) спасает положение. Но с другой стороны это бред, почему я не могу менять данные?

Скорее всего, у тебя там скорее всего анонимное выражение. Спроси c-smile'а что он об этом думает
Sapienti sat!
Re: Задолбало гццой
От: Fwiffo Россия  
Дата: 10.12.09 22:52
Оценка: +1
Здравствуйте, MikelSV, Вы писали:

MSV>Я так понимаю есть веские основания для всех этих глюков?


Стандарт, вестимо...
Re[4]: Задолбало гццой
От: MikelSV http://www.centerix.ru
Дата: 11.12.09 09:24
Оценка: -1
Здравствуйте, alsemm, Вы писали:

A>В коде случайно не такое:

A>
A>crbil foo;
A>foo.add(crbi());
A>

A>?

Да, это первая операция после объявления переменной.
Код:
cl.add(orb.geto(0));
orb.geto(0) возвращает crbi, так что код в принципе похож.



ЮЖ>'or' — это alternative token, синоним для '||'. Вероятно реализовано через макрос, поэтому сообщение невменяемое.

мда. не догадался. люблю уменьшать названия переменных.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[4]: Задолбало гццой
От: MikelSV http://www.centerix.ru
Дата: 11.12.09 18:55
Оценка: :)
Здравствуйте, wander, Вы писали:

W>Я б вам посоветовал, во благо в первую очередь тех, кому с вами работать, скачать себе стандарт и почитать на досуге про те моменты, которые вам кажутся "бредом" компилятора. Всего несколько мизерных процентов приходятся на самые настоящие глюки, в том время как большинство проблем возникает по вине самого программиста.



дадада, кто написал, тот и виноват.

Вы не поверите:
bool RunFunc(..., Val &retd=(Val&)Val());
ошибка: invalid cast of an rvalue expression of type ‘MCCVal’ to type ‘MCCVal&’

И я пишу в retd. и не интересно, будет ли оно использоваться или разрушится.
Для чего это было сделано история умалчивает, но за такие дела я смотрю на компилятор как на врага.
Стандарты как минимум ограничивают фантазию.


Не могли бы вы дать пример кода для записи адреса функции в переменную для гцц? я потыкался, но ничего хорошего не получилось.
у студии код выглядит так: void*f=write; или void*f=print. один вариант для всех функций.


Также есть подозрение, что гцц неправильно относится к слову timeout.
virtual int timeout(){ ... return 0; }
ошибка: ‘stdscr’ is not a type
ошибка: expected identifier before ‘)’ token


Ругается на совпадение названия класса и функции??
ошибка: declaration of ‘bool Listen::SendData(char*, unsigned int, fdata&)’
ошибка: changes meaning of ‘SendData’ from ‘class SendData’

А читать стандарт, это как читать книгу про устройство мира, вместо того, чтобы посмотреть, как же оно на самом деле устроено.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[11]: Задолбало гццой
От: MikelSV http://www.centerix.ru
Дата: 13.12.09 05:06
Оценка: :)
2 философские мысли:

Хаос вокруг, и логика придумана для ориентирования в этом хаосе.
Гцц же оторвался от реальности и сделал свою логику.
Но хаос то никуда не исчез, а логикой пользоваться уже не получается.
С этого то все конфликты.

Я буду любить то, что не заставляет меня страдать.
А что меня любит и не будет пытаться это делать.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[7]: Задолбало гццой
От: Кодт Россия  
Дата: 14.12.09 12:53
Оценка: +1
Здравствуйте, MikelSV, Вы писали:

A>>Это неправильно. В C строго говоря нельзя конвертировать указатели на функции в указатели другого типа (см. стандарт, лень искать ссылку).

A>>В C++ указатели на разные функции (методы) могут иметь разный размер в разных случаях под одним компилятором на той же OS.

MSV>Это какие же случаи??

MSV>Мне нужен лишь указатель на функцию, 4 байта для 32бит. Просто дайте мне его получить.

Вотще надеяться, что С++ существует только под 32- и 64-битные flat модели памяти.
Вот ещё совсем недавно, в эпоху ДОС, помимо flat (tiny) модели было несколько смешанных моделей — например, данные в одном сегменте, а код в нескольких; или наоборот.
Как следствие, размеры указателей на данные и на код были 16 и 32 (на самом деле 20) битов.
Или возьмём любую гарвардскую архитектуру (микроконтроллеры).
Или, аналогично с ДОС, сегментную модель.

А "дайте мне указатель" — так ты уже определись сперва: тебе нужен указатель или его числовое значение?
В первом случае используй правильный тип void(*)(), во втором — reinterpret_cast<intptr_t> (intptr_t — платформенно-зависимый целочисленный тип, способный вместить в себя void* и void(*)()).
long в качестве intptr_t подойдёт заведомо только на 32-битных платформах.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[15]: Задолбало гццой
От: MikelSV http://www.centerix.ru
Дата: 15.12.09 09:50
Оценка: :)
W>>То есть вы отказываетесь учиться?
Я вообще не люблю учиться. Читать эту кучу литературы.

К>Скорее, "я хочу писать говнокод и навязывать его моим коллегам — а кривые кирпичи и гнутый компилятор мне мешают это делать".

Я вижу в коде бред, идеи, сложность... а вы г^W. наверное каждый видит то, что ищет.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[16]: Задолбало гццой
От: Мишень-сан  
Дата: 15.12.09 10:16
Оценка: +1
Здравствуйте, MikelSV, Вы писали:

MSV>Я вообще не люблю учиться. Читать эту кучу литературы.


В таком случае быть специалистом Вам не светит. В этой куче литературы расписана уйма граблей, чтобы не наступать на них по ндцать раз.
А оператор + с модификацией аргументов есть однозначный говнокод.
Re: Задолбало гццой
От: мыщъх США http://nezumi-lab.org
Дата: 10.12.09 22:38
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>В то время, когда корабли^W студия собирает проект, g++ упорно придирается к разным моментам.

MSV>Например:

ничего не скажу на приплюснутую часть (потому как не знаю), но вот даже на чистом си гнусь долбит конкретно, заставляя меня избавляться от вредных привычек писать код непонятный для окружающих. например, студия это понимает нормально (потому как все по стандарту): printf("var_a = %x\n", a, b++); а вот гнусь грязно ругается. ага, вот вы уже ругаетесь тоже. а вот не надо трогать мой код в мое отсуствие. хотели убрать отладочную печать для создания релиза? ну так разбирайтесь почему оно перестало работать (хинт: b не предполается выводить на экран, его предполагается увеличить на единицу).

так же гнусю не нравится main(). ему подавай int main(). мелочь, конечно, а как анноит. и я бы не сказал, что объявляя int явно мы избавляемся от ошибок или прививаем себе хороший стиль кодинга. впрочем, к гнусю быстро привыкаешь.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[3]: Задолбало гццой
От: Alexey F  
Дата: 10.12.09 23:28
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Правда, многовато может флагов получится, по сравнению с обычным выставлением -Wall.

А вот и их список, из документации по gcc 4.4.2:

‘-Wall’ turns on the following warning flags:

-Waddress
-Warray-bounds (only with ‘-O2’)
-Wc++0x-compat // для C не поставить — будет безболезненно
-Wchar-subscripts
-Wimplicit-int
-Wimplicit-function-declaration
-Wcomment
-Wformat // речь в посте выше шла об этом флаге...
-Wmain (only for C/ObjC and unless ‘-ffreestanding’)
-Wmissing-braces
-Wnonnull
-Wparentheses
-Wpointer-sign
-Wreorder
-Wreturn-type // ...и об этом.
-Wsequence-point
-Wsign-compare (only in C++)
-Wstrict-aliasing
-Wstrict-overflow=1
-Wswitch
-Wtrigraphs
-Wuninitialized
-Wunknown-pragmas
-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wvolatile-register-var

Re[3]: Задолбало гццой
От: мыщъх США http://nezumi-lab.org
Дата: 10.12.09 23:35
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Смотря с какими флагами собирать.

AF>Если -Wall поставить, конечно, будет ругаться (warning-ми),
с -Wall. но на ключи компиляции я влиять не могу. за них отвечает ведущий разработчик проекта, а я пока же рангом пониже буду и потому мне остается только писать такой код, чтобы не было варнингов. к слову сказать меня изрядно долбает, что конструкции if (!(f=fopen()) так же вызывают матюги компилятора. умом я понимаю, что многие путают = и ==, поэтому компилятор "услужливо" об этом предупреждает. но дробить на две строки эту конструкцию мне упорно не нравится. а если это еще и что-то типа for() if (!(a=max(a, buf[i])) break; то тут у нас получается +3 строки. две из которых фигурные скобки. ну и что:
for()
{
a = max(a, buf[i]);
if (a==0) break;
}

оно конечно легче читается, но ведь и места больше занимает ;(
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[2]: Задолбало гццой
От: zaufi Земля  
Дата: 11.12.09 00:34
Оценка:
Здравствуйте, Кодт, Вы писали:


К>У конструктора копирования могут быть две сигнатуры: T::T(T const&) — используется в подавляющем большинстве случаев, и T::T(T&) — редкое исключение, непонятно когда нужное.


transfer ownership например чтобы сделать... редко (даже крайне редко в моей практике), но полезная фича ...
Re[2]: Задолбало гццой
От: MikelSV http://www.centerix.ru
Дата: 11.12.09 08:48
Оценка:
Тогда вопрос посложнее:

нет подходящей функции для вызова ‘MSL::SetVal(EVString, MString&, MSLKValLine&)’
претенденты: bool MSL::SetVal(EVString&, VString, MSLKValLine&)
bool MSL::SetVal(EVString&, VString)



Это уже не конструктор. гцц не умеет считать количество параметров?

Бред крепчает в:

ошибка: нет подходящей функции для вызова ‘crbil::add(crbi)’
280: замечание: претенденты: void crbil::add(crbi&)
284: замечание: void crbil::add(int, char*)
288: замечание: void crbil::add(int, char*, int, char*)



Возможно я не понимаю смысла '&'?
Мне всегда казалось, что & это тоже самое, что и *, только код выглядит как для обычной переменной.
& это Возможности указателя минус сложности работы с указателем.

Ощущается, что использование const & ограничивает меня в возможностях.


И не очень понятен смысл фразы "временный объект", ввиду того, что этот объект даже более постоянен.



Еще один момент, который меня мучает в гцц.

ошибка: вызов перегруженной ‘MString(HLString&)’ имеет неоднозначную трактовку
претенденты: MString::MString(const VString&)
MString::MString(const MString&)
MString::MString(unsigned int) <near match>
...


HLString : public LString
в LString есть operator MString().
и вызывается с тонким намеком (MString)lsret;
По идее здесь все логично.


к

class A{
...
bool sendping(crbi &or);
...
};


Пристает с ошибка: expected ‘,’ or ‘...’ before ‘||’ token
вообще не понятно, чего он хочет.


В общем куча ошибок, которые вообще не понятно как лечить, и главное не делать снова.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[5]: Задолбало гццой
От: SleepyDrago Украина  
Дата: 11.12.09 08:53
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Толи кроме -Wall ещё какой флаг стоит (хотя не нашёл отдельного флага, чтобы не был включён в -Wall и взводил бы ругань компилятора на такой код вне зависимости от обрамления скобками), толи версия gcc такая —


у нас 4.1.х и ругается всегда при -Wall -Wextra -Wformat=...
то есть от количества скобок не зависит. В гугле видел ссылки на гнутый мейл лист где писали что так и задумано.
Re[3]: Задолбало гццой
От: Тот кто сидит в пруду Россия  
Дата: 11.12.09 09:03
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Тогда вопрос посложнее:

MSV>

MSV>нет подходящей функции для вызова ‘MSL::SetVal(EVString, MString&, MSLKValLine&)’
MSV>претенденты: bool MSL::SetVal(EVString&, VString, MSLKValLine&)
MSV>bool MSL::SetVal(EVString&, VString)



MSV>Это уже не конструктор. гцц не умеет считать количество параметров?


MSV>Бред крепчает в:

MSV>

MSV>ошибка: нет подходящей функции для вызова ‘crbil::add(crbi)’
MSV>280: замечание: претенденты: void crbil::add(crbi&)
MSV>284: замечание: void crbil::add(int, char*)
MSV>288: замечание: void crbil::add(int, char*, int, char*)



MSV>Возможно я не понимаю смысла '&'?

MSV>Мне всегда казалось, что & это тоже самое, что и *, только код выглядит как для обычной переменной.
MSV>& это Возможности указателя минус сложности работы с указателем.

MSV>Ощущается, что использование const & ограничивает меня в возможностях.



MSV>И не очень понятен смысл фразы "временный объект", ввиду того, что этот объект даже более постоянен.


Код вызова покажи — разберемся, че там временное, че постоянное, а че не понравилось компилятору.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: Задолбало гццой
От: alsemm Россия  
Дата: 11.12.09 09:05
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Тогда вопрос посложнее:

MSV>

MSV>нет подходящей функции для вызова ‘MSL::SetVal(EVString, MString&, MSLKValLine&)’
MSV>претенденты: bool MSL::SetVal(EVString&, VString, MSLKValLine&)
MSV>bool MSL::SetVal(EVString&, VString)



MSV>Это уже не конструктор. гцц не умеет считать количество параметров?


MSV>Бред крепчает в:

MSV>

MSV>ошибка: нет подходящей функции для вызова ‘crbil::add(crbi)’
MSV>280: замечание: претенденты: void crbil::add(crbi&)
MSV>284: замечание: void crbil::add(int, char*)
MSV>288: замечание: void crbil::add(int, char*, int, char*)


В коде случайно не такое:
crbil foo;
foo.add(crbi());

?
Re[5]: Задолбало гццой
От: Тот кто сидит в пруду Россия  
Дата: 11.12.09 09:53
Оценка:
Здравствуйте, MikelSV, Вы писали:

A>>В коде случайно не такое:

A>>
A>>crbil foo;
A>>foo.add(crbi());
A>>

A>>?

MSV>Да, это первая операция после объявления переменной.

MSV>Код:
MSV>cl.add(orb.geto(0));
MSV>orb.geto(0) возвращает crbi, так что код в принципе похож.

Это и называется временный объект. VC такое тоже научился запрещать, в полном соответствии со стандартом. Мотивация у стандартизаторов была простая — на кой черт разрешать модифицировать временный объект, если им все равно никто воспользоваться не сможет? Это конечно не всегда оправдано, но уж как сделали — так сделали.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Задолбало гццой
От: Sheridan Россия  
Дата: 11.12.09 09:54
Оценка:
Приветствую, мыщъх, вы писали:

м> printf("var_a = %x\n", a, b++); (хинт: b не предполается выводить на экран, его предполагается увеличить на единицу).


А почему хотябы не "{printf("var_a = %x\n", a); b++;}" ?
avalon 1.0rc2 rev 300, zlib 1.2.3
build date: 19.08.2009 14:13:36 MSD +04:00
Qt 4.5.2
Matrix has you...
Re[5]: Задолбало гццой
От: alsemm Россия  
Дата: 11.12.09 09:56
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Здравствуйте, alsemm, Вы писали:


A>>В коде случайно не такое:

A>>
A>>crbil foo;
A>>foo.add(crbi());
A>>

A>>?

MSV>Да, это первая операция после объявления переменной.

MSV>Код:
MSV>cl.add(orb.geto(0));
MSV>orb.geto(0) возвращает crbi, так что код в принципе похож.
Тогда так надо переделать, чтобы не ругался:
crbi tmp = orb.geto(0);
cl.add(tmp);

Почему надо переделать? потому что ссылка(&) — это, по сути, тот же указатель (*), т.е. все, что передается по ссылке должно иметь адрес, tmp адрес имеет, а вот временное значение, кот. возвращается из orb.geto(0) адреса не имеет, след. и передаваться по ссылке не может. Константные же ссылки (const &) могут применяться к выражениям/переменным, адрес которых и не взять. Так что надо либо переделывать сигнатуру crbil::add(), либо вводить временную переменную.
Re[3]: Задолбало гццой
От: wander  
Дата: 11.12.09 10:55
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Тогда вопрос посложнее:

MSV>

MSV>нет подходящей функции для вызова ‘MSL::SetVal(EVString, MString&, MSLKValLine&)’
MSV>претенденты: bool MSL::SetVal(EVString&, VString, MSLKValLine&)
MSV>bool MSL::SetVal(EVString&, VString)



MSV>Это уже не конструктор. гцц не умеет считать количество параметров?


MSV>Бред крепчает в:

MSV>

MSV>ошибка: нет подходящей функции для вызова ‘crbil::add(crbi)’
MSV>280: замечание: претенденты: void crbil::add(crbi&)
MSV>284: замечание: void crbil::add(int, char*)
MSV>288: замечание: void crbil::add(int, char*, int, char*)



MSV>Возможно я не понимаю смысла '&'?

MSV>Мне всегда казалось, что & это тоже самое, что и *, только код выглядит как для обычной переменной.
MSV>& это Возможности указателя минус сложности работы с указателем.

MSV>Ощущается, что использование const & ограничивает меня в возможностях.



MSV>И не очень понятен смысл фразы "временный объект", ввиду того, что этот объект даже более постоянен.




MSV>Еще один момент, который меня мучает в гцц.

MSV>

MSV> ошибка: вызов перегруженной ‘MString(HLString&)’ имеет неоднозначную трактовку
MSV>претенденты: MString::MString(const VString&)
MSV> MString::MString(const MString&)
MSV> MString::MString(unsigned int) <near match>
MSV> ...


MSV>HLString : public LString

MSV>в LString есть operator MString().
MSV>и вызывается с тонким намеком (MString)lsret;
MSV>По идее здесь все логично.


MSV>к

MSV>class A{
MSV>...
MSV>bool sendping(crbi &or);
MSV>...
MSV>};


MSV>Пристает с ошибка: expected ‘,’ or ‘...’ before ‘||’ token

MSV>вообще не понятно, чего он хочет.


MSV>В общем куча ошибок, которые вообще не понятно как лечить, и главное не делать снова.


Я б вам посоветовал, во благо в первую очередь тех, кому с вами работать, скачать себе стандарт и почитать на досуге про те моменты, которые вам кажутся "бредом" компилятора. Всего несколько мизерных процентов приходятся на самые настоящие глюки, в том время как большинство проблем возникает по вине самого программиста.
Re[3]: Задолбало гццой
От: alsemm Россия  
Дата: 11.12.09 13:22
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Приветствую, мыщъх, вы писали:


м>> printf("var_a = %x\n", a, b++); (хинт: b не предполается выводить на экран, его предполагается увеличить на единицу).


S>А почему хотябы не "{printf("var_a = %x\n", a); b++;}" ?

Я тоже поучаствую в конкурсе:
printf("var_a = %x\n", a), b++;

Хотя printf и получился без побочных эффектов ценой всего-лишь переноса скобки в нужное место, аромат не изменился.
Re[5]: Задолбало гццой
От: Fwiffo Россия  
Дата: 11.12.09 19:31
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>дадада, кто написал, тот и виноват.


MSV>Вы не поверите:

MSV>bool RunFunc(..., Val &retd=(Val&)Val());
MSV>ошибка: invalid cast of an rvalue expression of type ‘MCCVal’ to type ‘MCCVal&’

Поверим.

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

MSV>у студии код выглядит так: void*f=write; или void*f=print. один вариант для всех функций.

reinterpret_cast<long>


MSV>Также есть подозрение, что гцц неправильно относится к слову timeout.

MSV>virtual int timeout(){ ... return 0; }
MSV>ошибка: ‘stdscr’ is not a type
MSV>ошибка: expected identifier before ‘)’ token

curses.h:
#define timeout(delay)          wtimeout(stdscr,delay)

При чем здесь компилятор? В Windows.h на макрос min не напарывались?

MSV>Ругается на совпадение названия класса и функции??

MSV>ошибка: declaration of ‘bool Listen::SendData(char*, unsigned int, fdata&)’
MSV>ошибка: changes meaning of ‘SendData’ from ‘class SendData’

Код целиком?

MSV>А читать стандарт, это как читать книгу про устройство мира, вместо того, чтобы посмотреть, как же оно на самом деле устроено.


Подозреваю, что если бы вы с таким подходом писали изначально под gcc, а потом перешли на MSVC, вы столкнулись бы с кучей похожих проблем. "На самом деле устроено" оно в каждом компиляторе по-разному. Для этого стандарт и нужен.
Re[5]: Задолбало гццой
От: A13x США  
Дата: 11.12.09 21:14
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>...

MSV>Не могли бы вы дать пример кода для записи адреса функции в переменную для гцц? я потыкался, но ничего хорошего не получилось.
MSV>у студии код выглядит так: void*f=write; или void*f=print. один вариант для всех функций.

Это неправильно. В C строго говоря нельзя конвертировать указатели на функции в указатели другого типа (см. стандарт, лень искать ссылку).
В C++ указатели на разные функции (методы) могут иметь разный размер в разных случаях под одним компилятором на той же OS.

Можно записывать указатель на функцию в переменную такого же типа.

И вообще — поменьше эмоций. Как правило вопли о том, какой gcc плохой и какой msvc хороший идут от тех, кто мало знаком с первым.
Re[6]: Задолбало гццой
От: MikelSV http://www.centerix.ru
Дата: 11.12.09 21:40
Оценка:
Здравствуйте, Fwiffo, Вы писали:

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

MSV>>у студии код выглядит так: void*f=write; или void*f=print. один вариант для всех функций.

F>
F>reinterpret_cast<long>
F>


Вот не понял мысли. как этим пользоваться? Можно более привычного вида? типа void*f...
этот код в линуксе пока не будет использоваться, но как минимум должна сохраняться работа в windows.

6 ошибок до канадской границы. 3 штуки: 2+2+2 с указателем на функцию.
Изменение имени класса на SendDataS помогло. однако интересный юмор.

Подскажите и я уже запущу эту фигню.
А учитывая, что там идет работа с терминалом, сетью и прочими делами, запуск будет очень интересным.



F>Подозреваю, что если бы вы с таким подходом писали изначально под gcc, а потом перешли на MSVC, вы столкнулись бы с кучей похожих проблем. "На самом деле устроено" оно в каждом компиляторе по-разному. Для этого стандарт и нужен.


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


A>Это неправильно. В C строго говоря нельзя конвертировать указатели на функции в указатели другого типа (см. стандарт, лень искать ссылку).

A>В C++ указатели на разные функции (методы) могут иметь разный размер в разных случаях под одним компилятором на той же OS.

Это какие же случаи??
Мне нужен лишь указатель на функцию, 4 байта для 32бит. Просто дайте мне его получить.

A>И вообще — поменьше эмоций. Как правило вопли о том, какой gcc плохой и какой msvc хороший идут от тех, кто мало знаком с первым.

Да, кто знаком хорошо эмоций выдают мало, смирились.

Гцц нормальный, но долбанутый. Я в общем-то сильно не ругаю, потому как уважаю.
А в студии действительно все намного проще. О студии я помню, что писал в ней код, о гцц, что пытался отладить.
Я был бы просто счастлив, если бы в гцц можно было нормально писать программы. но я не знаю таких средств разработки. может они есть, а я не знаю и до сих пор пишу код в mc?
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[7]: Задолбало гццой
От: Alexey F  
Дата: 11.12.09 22:42
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Вот не понял мысли. как этим пользоваться? Можно более привычного вида? типа void*f...

MSV>этот код в линуксе пока не будет использоваться, но как минимум должна сохраняться работа в windows.
Имелось ввиду явно кастить к нужному типу:
void* f = reinterpret_cast<void*> ( someFunc );


MSV>Это какие же случаи??

Когда берётся указатель на виртуальную функцию-член, например. Вот на моём компиляторе (32-битном) уже не 4 байта, а все 8

MSV>Изменение имени класса на SendDataS помогло. однако интересный юмор.

MSV>Подскажите и я уже запущу эту фигню.
Про SendData больно мало информации.

MSV>Гцц нормальный, но долбанутый.

Интересно, как это можно совмещать?
Право, эту точку зрения я не разделяю.

MSV>А в студии действительно все намного проще. О студии я помню, что писал в ней код, о гцц, что пытался отладить.

MSV>Я был бы просто счастлив, если бы в гцц можно было нормально писать программы. но я не знаю таких средств разработки. может они есть, а я не знаю и до сих пор пишу код в mc?
Вы спрашиваете об IDE, или я что-то не так понял?
Если да, то лично я сейчас пересел на Eclipse + CDT (когда надо что-то быстро проверить, пинаю Code::Blocks — только из-за того, что он быстрее запускается) — посмотрите в эту сторону. Да, если захотите попробовать, то не забудьте пролистать справку — я по первой так не сделал и мучился, не замечая нужные фичи
Re[9]: Задолбало гццой
От: Alexey F  
Дата: 12.12.09 00:37
Оценка:
Здравствуйте, Fwiffo, Вы писали:

F>Нет, имелось в виду именно к числовому типу. Пункт относительно преобразования указателя на функцию в void* появится в следующем стандарте. Comeau это компилирует только начиная с 4.3.10.1 Beta2.

F>
F>void (*p)();
F>void* v = reinterpret_cast<void*> ( p ); // error: invalid type conversion
F>long l = reinterpret_cast<long> ( p ); // Ok
F>


Вот спасибо! А то я всё время до этого думал, что к void* они тоже кастятся.

Топикстартер может всё равно этим воспользоваться (на свой страх и риск: если нет возможности переделать): в принципе, т.к. gcc нормально отнёсся к такому коду, что и ввело в заблуждение меня
Re[5]: Задолбало гццой
От: wander  
Дата: 12.12.09 11:29
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Вы не поверите:

MSV>bool RunFunc(..., Val &retd=(Val&)Val());
MSV>ошибка: invalid cast of an rvalue expression of type ‘MCCVal’ to type ‘MCCVal&’

Отчего же, поверю. Это элементарно.
bool RunFunc(..., Val const & retd = Val());


Такие вещи подразумевают константность временных данных. Это очень редкий случай, когда действительно нужно менять что-то в таких объектах. В первую очередь, если возникает такой гвоздь — причина пересмотреть дизайн программы.

MSV>И я пишу в retd. и не интересно, будет ли оно использоваться или разрушится.

Как исправить — написано выше. Если вам нужно нарушить закон, вы должны будете отвечать за последствия. Нарушать закон можно так:
bool RunFunc(..., Val const & retd = Val())
{
   Val & retd_ = const_cast<Val &>(retd);
}


MSV>Для чего это было сделано история умалчивает

(8.5.3/5)
MSV>но за такие дела я смотрю на компилятор как на врага.
Смотрите лучше так на того, кто это писал.

MSV>Стандарты как минимум ограничивают фантазию.

Стандарты обеспечивают порядок. И не вина GCC, что MSVC выбрал путь анархии.
Re[6]: Задолбало гццой
От: MikelSV http://www.centerix.ru
Дата: 12.12.09 13:22
Оценка:
Здравствуйте, wander, Вы писали:

MSV>>но за такие дела я смотрю на компилятор как на врага.

W>Смотрите лучше так на того, кто это писал.
Не хочу так смотреть на себя.

MSV>>Стандарты как минимум ограничивают фантазию.

W>Стандарты обеспечивают порядок. И не вина GCC, что MSVC выбрал путь анархии.
Не чувствую, что сохранение порядка главная причина.


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

Проблема все с теми же:
ошибка: вызов перегруженной ‘MString(HLString&)’ имеет неоднозначную трактовку
претенденты: MString::MString(const VString&)
MString::MString(const MString&)
MString::MString(unsigned int) <near match>
...


HLString : public LString
в LString есть operator MString().

---
теперь вызывается с (MString&)lsret; но это как вы можете увидеть явный вылет, зато гцц не ругается.
operator MString() -> MString& -> неверный указатель на память.

Вызов при котором даже в студия вылетает, что естественно:
Drawn((MString&)(HLString()+"Uncnown command '"+comm+"'\r\n\r\n"));
При:
void Drawn(const MString &vs);

Нормальный код, без '&', гцц не принимает, вот не может понять, во что преобразовать. .
Drawn((MString)(HLString()+"Uncnown command '"+comm+"'\r\n\r\n"));


Чем здесь можно помочь компилятору?
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[7]: Задолбало гццой
От: wander  
Дата: 12.12.09 14:18
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Здравствуйте, wander, Вы писали:


MSV>>>но за такие дела я смотрю на компилятор как на врага.

W>>Смотрите лучше так на того, кто это писал.
MSV>Не хочу так смотреть на себя.

MSV>>>Стандарты как минимум ограничивают фантазию.

W>>Стандарты обеспечивают порядок. И не вина GCC, что MSVC выбрал путь анархии.
MSV>Не чувствую, что сохранение порядка главная причина.


MSV>Программа запускается, но это сохранение порядка толкает на создание кривого кода.


Верите вы или нет, но качество кода в первую очередь зависит от того как именно написана программа. Если в программе постоянно используются такого рода хаки (как с конст_каст например в примере выше), то рано или поздно это случится (вылет). И не важно что у вас за компилятор. Поэтому я и говорю — когда возникают такого рода проблемы — нужно пересматривать дизайн.

MSV>Проблема все с теми же:

MSV> ошибка: вызов перегруженной ‘MString(HLString&)’ имеет неоднозначную трактовку
MSV> претенденты: MString::MString(const VString&)
MSV> MString::MString(const MString&)
MSV> MString::MString(unsigned int) <near match>
MSV> ...


MSV>HLString : public LString

MSV>в LString есть operator MString().

MSV>---

MSV>теперь вызывается с (MString&)lsret; но это как вы можете увидеть явный вылет, зато гцц не ругается.
MSV>operator MString() -> MString& -> неверный указатель на память.

Покажите хотя бы кусок цельного кода. Так не ясно что вы пытаетесь сотворить.

MSV>Вызов при котором даже в студия вылетает, что естественно:

MSV>Drawn((MString&)(HLString()+"Uncnown command '"+comm+"'\r\n\r\n"));

Покажите как operator+ реализован.
Re[7]: Задолбало гццой
От: wander  
Дата: 12.12.09 14:23
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Здравствуйте, wander, Вы писали:


MSV>>>но за такие дела я смотрю на компилятор как на врага.

W>>Смотрите лучше так на того, кто это писал.
MSV>Не хочу так смотреть на себя.

А вот надо. Самокритика в нашей профессии — верный путь к вершинам профессионализма.
Re[8]: Задолбало гццой
От: MikelSV http://www.centerix.ru
Дата: 12.12.09 15:20
Оценка:
Здравствуйте, wander, Вы писали:

MSV>>HLString : public LString

MSV>>в LString есть operator MString().

MSV>>---

MSV>>теперь вызывается с (MString&)lsret; но это как вы можете увидеть явный вылет, зато гцц не ругается.
MSV>>operator MString() -> MString& -> неверный указатель на память.

W>Покажите хотя бы кусок цельного кода. Так не ясно что вы пытаетесь сотворить.


MSV>>Вызов при котором даже в студия вылетает, что естественно:

MSV>>Drawn((MString&)(HLString()+"Uncnown command '"+comm+"'\r\n\r\n"));

W>Покажите как operator+ реализован.




Кода много, не знаю, что именно показывать.

В данном случае единственный вариант реализации operator+ может быть:
HLString& operator+(const MString& string){...}
Это строковый класс, он прибавляет текст у уже записанному в нем.
Собственно тут все просто, класс собирает текст в строку и возвращает ее через operator MString().

Кстати этот код работает:
Drawn((HLString()+"Uncnown command '"+comm+"'\r\n\r\n").operator MString());
Но я за то, чтобы компилятор сам догадывался о типах и не нужно было дописывать .operator MString().

В Drawn текст ждут в виде const MString&.
Все просто.

В случае:
Drawn((MString)(HLString()+"Uncnown command '"+comm+"'\r\n\r\n"));
гцц не понимает указания.

По идее главная ошибка в том, что гцц не понимает, в каком типе передавать из HLString& в MString.
У HLString есть:
operator MString();
operator char*();

Этакая слепота. Ну не могу поверить, что он не может понять, что нужно передать из HLString& 'operator MString()' в MString 'MString(const MString&)'.
Варианты для гцц также мучил в студии. Все нормально понимаются. Жесткое следование стандартам — зло.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[9]: Задолбало гццой
От: wander  
Дата: 12.12.09 22:10
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Кода много, не знаю, что именно показывать.


MSV>В данном случае единственный вариант реализации operator+ может быть:

MSV>HLString& operator+(const MString& string){...}
Это далеко не единственный вариант ошибочной реализации operator+ и подобных ему операторов.
MSV>Это строковый класс, он прибавляет текст у уже записанному в нем.
Суть operator+ в создании нового объекта посредством объединения двух имеющихся (конкатенации).
Возьмем например:
a = 2 + 2

Было бы маразмом полагать, что первое слагаемое после этого станет равным 4. Это две константы. Так какого, простите, перепуга вы ожидаете другого поведения с вашими строками? Если вы пишете
some_class1(5) + some_class2(4)

— это тоже самое. Поэтому,
во-первых, operator+, operator- и иже с ними никогда не должны возвращать ссылку, если только вы не хотите устроить себе грабли на ровном месте.
во-вторых, семантика описанного вами оператора соответствует operator+=, вот он, да, он возвращает ссылку, только это совсем другая песня.
в-третьих, функция operator+ должна быть свободной. Во избежание неожиданных эксцессов в вариантах с перестановкой слагаемых.
Итого:
my_string operator+(my_string const & a, other_string const & b) // const, ибо мы не изменяем слагаемые, мы формируем из них результат
{
    my_string result(a.size() + b.size());
    // операции по объединению строк
    return result; // в результате my_string, ибо мы прибавляем к ней
}

other_string operator+(other_string const & a, my_string const & b) // const, ибо мы не изменяем слагаемые, мы формируем из них результат
{
    other_string result(a.size() + b.size());
    // операции по объединению строк
    return result; // в результате other_string, ибо мы прибавляем к ней
}

other_string const & res = other_string("bla-bla") + my_string("bla-bla"); // будет работать
other_string res = other_string("bla-bla") + my_string("bla-bla"); // будет работать

my_string const & res = my_string("bla-bla") + other_string("bla-bla"); // ок
my_string res = my_string("bla-bla") + other_string("bla-bla"); // ок

my_string & res = my_string("bla-bla") + other_string("bla-bla"); // бамс, ошибка!

Я заметил, что вы пропускаете мимо ушей все что я пишу. Поэтому советую вам обратиться в главу 11 — Перегрузка Операторов, русского издания книги Б. Страуструпа "Язык программирование С++. 3е издание", для вдумчивого чтения и подтверждения всего, что я выше написал.

MSV>Собственно тут все просто, класс собирает текст в строку и возвращает ее через operator MString().

Вы правы, все очень просто. Можно например посмотреть реализацию такого же механизма в библиотеке QT. Добавлю, что если придерживаться правил, которые я описал выше оператор приведения вам и вовсе не понадобится.

MSV>Кстати этот код работает:

MSV>Drawn((HLString()+"Uncnown command '"+comm+"'\r\n\r\n").operator MString());
MSV>Но я за то, чтобы компилятор сам догадывался о типах и не нужно было дописывать .operator MString().

Теперь к вашим баранам, откройте для себя mutable:
class MString;

class HLString
{
public:
    HLString()
    {}
    HLString(char const * str)
        : buf_(str)
    {}
    HLString const & add(char const * str) const
    {
        buf_ += str;
        return *this;
    }
    HLString const & add(HLString const & str) const
    {
        buf_ += str.data();
        return *this;
    }
    std::string const & data() const
    {
        return buf_;
    }
    HLString const & add(MString const & str) const;
private:
    // для буфера использовал стандартную строку, здесь показана только суть
    mutable std::string buf_; // mutable позволит менять данные в константных объектах
};


class MString
{
public:
    MString()
    {}
    MString(char const * str)
        : buf_(str)
    {}
    MString const & add(char const * str) const
    {
        buf_ += str;
        return *this;
    }
    MString const & add(MString const & str) const
    {
        buf_ += str.data();
        return *this;
    }
    std::string const & data() const
    {
        return buf_;
    }
    MString const & add(HLString const & str) const;

private:
    // для буфера использовал стандартную строку, здесь показана только суть
    mutable std::string buf_; // mutable позволит менять данные в константных объектах
};


MString const & MString::add(HLString const & str) const
{
    buf_ += str.data();
    return *this;
}

HLString const & HLString::add(MString const & str) const
{
    buf_ += str.data();
    return *this;
}

void Drawn(MString const & a)
{
    std::cout << a.data() << std::endl;
}

int main()
{
    HLString comm("test");

    Drawn(MString().add("Unknown command '").add(comm).add("'\r\n\r\n"));

    return 0;
}


MSV>Варианты для гцц также мучил в студии. Все нормально понимаются. Жесткое следование стандартам — зло.


Зло — это нарушение стандартов студией. Если бы язык был в ней правильно реализован с самого начала, то всего этого бардака не было бы.
Ведь все это сделано не просто так, а потому что иначе — нелогично. Пример с оператором+ ясно это показывает.
Re: О неконстантных ссылках
От: Roman Odaisky Украина  
Дата: 12.12.09 22:32
Оценка:
Странно, что приходится объяснять это, в двадцать первом-то веке.

Когда в C++ появились ссылки, код типа этого:
void f(int& c);
f(42);

был допустим. Создавалось временное значение, и ссылка привязывалась к нему. Целью этого было, надо полагать, единообразие; а если тебя интересует измененный объект, так передавай именованное значение, а не временное.

Очень скоро стало ясно, что эта фича есть багогенератор, например:
void increment(int& x)
{
    ++x;
    cout << x << endl;
}

int i = 42;
increment(i);      // 43
cout << i << endl; // 43

double d = 42;
increment(d);      // 43
cout << d << endl; // 42

потому что изменения применялись только ко временному объекту. Даже Borland® C++™ 3.1 выдает warning на такие конструкции.

Поэтому C++98 разрешает привязку ссылок к rvalue только для константных типов. Впрочем, старый подход всё же позволял делать некоторые полезные вещи. Например, деструктивные операции, когда конечное состояние объекта неважно. Поэтому в C++0x есть третий тип ссылок — rvalue references, которые действуют, как достандартные неконстантные ссылки. Итак, X& и X&& позволяют применять к объекту неконстантные операции, X const& и X&& привязываются ко временным объектам.

За подробностями — в стандарт, в «Design and Evolution of C++» и в любимый поисковик.
До последнего не верил в пирамиду Лебедева.
Re[10]: Задолбало гццой
От: MikelSV http://www.centerix.ru
Дата: 13.12.09 03:57
Оценка:
Здравствуйте, wander, Вы писали:

W>Здравствуйте, MikelSV, Вы писали:


Это *опа.

Класс HLString сделан специально для сбора строки.
В нем специално сделан operator+.
Для пвозможности просто написать: "text"+val+"text"+val...
Предлагаете "text"+=val+="text"+=val... ? эт бред.

W>Drawn(MString().add("Unknown command '").add(comm).add("'\r\n\r\n"));

А, ну да. ну это просто бесит. почему не в 3 строки?? это конечно логично, но тупо.

HLString сделан для ускорения. И легко зкменяется на MString()+"text"+val+"text"+val...
Но я борюсь за каждую операцию с памятью. ^_^


W>my_string & res = my_string("bla-bla") + other_string("bla-bla"); // бамс, ошибка!

Да, снова этот глюк.
В моем случае все сводится к MString;
По странному стечению обстоятельств студия его решает.
HLString::operator MString();
Код писался так, чтобы он работал.

Я не понимаю одну вещь: если программа будет вылетать, я буду ее исправлять. Но этот бред с попытками запретить мне что-то делать.
Это называется "делай как сказали и не дергайся". Это уже напоминает школу и особо долбанутых учителей.

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

Большинство своих ошибок я исправил, так как в принципе понял логику гцц, я потихоньку отступал, но здесь гцц чуть ли не вытер ноги о мою логику.
Пессимистическая программка. Она убивает мою в будущее и закрывает возможности для творчества.

mutable не внушают.


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


MSV>>Варианты для гцц также мучил в студии. Все нормально понимаются. Жесткое следование стандартам — зло.


W>Зло — это нарушение стандартов студией. Если бы язык был в ней правильно реализован с самого начала, то всего этого бардака не было бы.

W>Ведь все это сделано не просто так, а потому что иначе — нелогично. Пример с оператором+ ясно это показывает.

(печально) Программирование — творчество, стандарты — зло.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[11]: Задолбало гццой
От: dsorokin Россия  
Дата: 13.12.09 07:44
Оценка:
2MikelSV

Слова

MSV> В данном случае единственный вариант реализации operator+ может быть:

MSV> HLString& operator+(const MString& string){...}

и

MSV> Теперь как аргумент против гцц я могу добавить что он логичен на столько же сколько и туп.


как-то не вяжутся друг с другом. Странно, что оператор сложения работает и не валит программу.

Ради любопытства хочу спросить, а сколько килобайт у вас такого кода?
Re[12]: Задолбало гццой
От: MikelSV http://www.centerix.ru
Дата: 13.12.09 09:03
Оценка:
Здравствуйте, dsorokin, Вы писали:

D>2MikelSV


D>Слова


MSV>> В данном случае единственный вариант реализации operator+ может быть:

MSV>> HLString& operator+(const MString& string){...}

D>и


MSV>> Теперь как аргумент против гцц я могу добавить что он логичен на столько же сколько и туп.


D>как-то не вяжутся друг с другом. Странно, что оператор сложения работает и не валит программу.

А почему он должен валить то?

D>Ради любопытства хочу спросить, а сколько килобайт у вас такого кода?

1,95 МБ. хмм, многовато.
1,57 МБ без автонагенерированного.
только .cpp и .h.

Это нечто вроде стандартной библиотеки. На основе нее пишутся программы. Весь код, который можно использовать повторно сваливается сюда.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[11]: Задолбало гццой
От: wander  
Дата: 13.12.09 09:53
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Здравствуйте, wander, Вы писали:


W>>Здравствуйте, MikelSV, Вы писали:


MSV>Это *опа.


MSV>Класс HLString сделан специально для сбора строки.

MSV>В нем специално сделан operator+.
MSV>Для пвозможности просто написать: "text"+val+"text"+val...
MSV>Предлагаете "text"+=val+="text"+=val... ? эт бред.
Я не предлагаю ничего. Я просто объяснил семантику, которую будут ожидать те, кто когда либо будут читать ваш код. Если вы продолжите писать в таком непонятном стиле, то вы столкнетесь серьезными трудностями.

W>>Drawn(MString().add("Unknown command '").add(comm).add("'\r\n\r\n"));

MSV>А, ну да. ну это просто бесит. почему не в 3 строки?? это конечно логично, но тупо.
А никто не запрещает поменять add на operator+ в принципе. Вот вы почему так реагируете? Когда я писал про опреатор+, я хотел показать вам, как будет себя вести человек, который вынужден будет смотреть ваш код. Это не очевидно, что оператор+ работает c модификацией аргумента. Вы понимаете сколько граблей расставляете?

MSV>HLString сделан для ускорения. И легко зкменяется на MString()+"text"+val+"text"+val...

MSV>Но я борюсь за каждую операцию с памятью. ^_^

W>>my_string & res = my_string("bla-bla") + other_string("bla-bla"); // бамс, ошибка!

MSV>Да, снова этот глюк.
MSV>В моем случае все сводится к MString;
MSV>По странному стечению обстоятельств студия его решает.
Одно хочу сказать, большинство компиляторов себя так не ведут. Значит студия в меньшинстве. А значит вам придется мирится с этим, если вы хотите писать сопровождаемые программы, которые собирались бы везде, где нужно. Это то, что, возможно, дается не всем, но стремиться к этому нужно. Иначе грош цена вам как специалисту.

MSV>Я не понимаю одну вещь: если программа будет вылетать, я буду ее исправлять. Но этот бред с попытками запретить мне что-то делать.

MSV>Это называется "делай как сказали и не дергайся". Это уже напоминает школу и особо долбанутых учителей.
Это называется делай так, чтобы другие тебя поняли. Вы программист. Значит рано или поздно вам придется работать в команде и считаться с опытом других.

MSV>Теперь как аргумент против гцц я могу добавить что он логичен на столько же сколько и туп.

Вам не нравится, что для того, чтобы сделать как "хочется" в С++ нужно предварительно потратить некоторые усилия (сюда относятся все паттерны, которые приходится реализовывать руками, тогда как в других языка они встроены либо во фреймворк, либо в сам язык)? Тогда возможно С++ — это язык не для вас. И ГЦЦ тут не при чем.

MSV>Большинство своих ошибок я исправил, так как в принципе понял логику гцц, я потихоньку отступал, но здесь гцц чуть ли не вытер ноги о мою логику.

Это получилось, потому что логики нет. В программировании логика одна — математическая.

MSV>Пессимистическая программка. Она убивает мою в будущее и закрывает возможности для творчества.

Вы сами убиваете свое будущее. Не знаю, мягче не скажешь. Возможности для творчества есть всегда, нужно только осмотреться.

MSV>mutable не внушают.

mutable — стандартное решение этой задачи. Оно будет работать везде. И ваш код поймут все. И вы соберете эту программу на любой платформе, где есть стандартный С++. Если это не внушает, то тогда я уже не знаю что вам нужно.

MSV>Как хорошо, что еще до стандартизации работы с памятью не добрались, хоть там можно почувствовать себя свободным и творить все, что вздумается.

Стандартизация до работы с памятью добралась и диктуется условиями конкретной операционной системы. Если вы заканчивали техническую специальность, то возможно помните предмет "Операционные системы", где все стандарты по организации памяти были рассмотрены.

MSV>(печально) Программирование — творчество, стандарты — зло.

Программирование — творчество, я тоже так считаю. Но мы работает не в сферическом вакууме. Мы работает в реальном мире и вынуждены считаться с его законами, с физическими и социальными. О тех и других я упоминал выше.
Re[13]: Задолбало гццой
От: dsorokin Россия  
Дата: 13.12.09 10:53
Оценка:
Здравствуйте, MikelSV, Вы писали:

D>> Странно, что оператор сложения работает и не валит программу.

MSV> А почему он должен валить то?

Он не должен возвращать ссылку. Это — антипаттерн. Поведение отличное от того, что ожидается от оператора сложения. Ошибка дизайна. Более того, мина замедленного действия.

D>> а сколько килобайт у вас такого кода?

MSV> 1,57 МБ без автонагенерированного.

Для Си++ это не так много. Но в этом есть хорошая новость. Значит, подвести под стандарты — вполне реальная задача
Re[12]: Задолбало гццой
От: MikelSV http://www.centerix.ru
Дата: 13.12.09 11:57
Оценка:
Здравствуйте, wander, Вы писали:

W>Здравствуйте, MikelSV, Вы писали:


MSV>>Здравствуйте, wander, Вы писали:


W>>>Здравствуйте, MikelSV, Вы писали:


MSV>>Это *опа.


MSV>>Класс HLString сделан специально для сбора строки.

MSV>>В нем специално сделан operator+.
MSV>>Для пвозможности просто написать: "text"+val+"text"+val...
MSV>>Предлагаете "text"+=val+="text"+=val... ? эт бред.
W>Я не предлагаю ничего. Я просто объяснил семантику, которую будут ожидать те, кто когда либо будут читать ваш код. Если вы продолжите писать в таком непонятном стиле, то вы столкнетесь серьезными трудностями.

W>>>Drawn(MString().add("Unknown command '").add(comm).add("'\r\n\r\n"));

MSV>>А, ну да. ну это просто бесит. почему не в 3 строки?? это конечно логично, но тупо.
W>А никто не запрещает поменять add на operator+ в принципе. Вот вы почему так реагируете? Когда я писал про опреатор+, я хотел показать вам, как будет себя вести человек, который вынужден будет смотреть ваш код. Это не очевидно, что оператор+ работает c модификацией аргумента. Вы понимаете сколько граблей расставляете?

Реагирую по тому, что это дело жестко пересекается с моим мнением и я не могу ничего сделать для нужного для меня решения. [психология, собственно]

Drawn((HLString()+"Uncnown command '"+comm+"'\r\n\r\n"));
Хм, по идее логика скажет, что тут сложение строк и передача в функцию.
При просмотре это не вызовет никаких вопросов.

Если человек начнет писать он должен будет взглянуть на код этого класса или в описание. Либо при первых ошибках.
Помнится для кпк я делал #define HLString MString. вообще решает все проблемы.

Для нормального программиста, который рискнет заниматься моим кодом, это не будет самым сложным.
Нет здесь проблем с пониманием другими. Если появятся, будем искать решение.

MSV>>Теперь как аргумент против гцц я могу добавить что он логичен на столько же сколько и туп.

W>Вам не нравится, что для того, чтобы сделать как "хочется" в С++ нужно предварительно потратить некоторые усилия (сюда относятся все паттерны, которые приходится реализовывать руками, тогда как в других языка они встроены либо во фреймворк, либо в сам язык)? Тогда возможно С++ — это язык не для вас. И ГЦЦ тут не при чем.
(только смех) Я люблю долго и упорно писать и отлаживать свой бред, главное не биться о стену. И к счастью обычно у меня больше одного варианта решения.


W>Это получилось, потому что логики нет. В программировании логика одна — математическая.

Хохохо, дожили.
Недавно доказывал, что в программировании почти не использую математику.
Для меня логика, она и в Африке логика, и к математике никак не привязана.
Я бы сказал, что в программировании логика объектная.
а если вы в объектах пользуетесь математикой, то это ваши личные проблемы.


MSV>>mutable не внушают.

W>mutable — стандартное решение этой задачи. Оно будет работать везде. И ваш код поймут все. И вы соберете эту программу на любой платформе, где есть стандартный С++. Если это не внушает, то тогда я уже не знаю что вам нужно.
Я не пойму свой код, этого достаточно. отказаться от того, чем пользовался и тут же взять аналог, явно не лучше. это даже не называется, а обзывается, нехорошими словами.


MSV>>Как хорошо, что еще до стандартизации работы с памятью не добрались, хоть там можно почувствовать себя свободным и творить все, что вздумается.

W>Стандартизация до работы с памятью добралась и диктуется условиями конкретной операционной системы. Если вы заканчивали техническую специальность, то возможно помните предмет "Операционные системы", где все стандарты по организации памяти были рассмотрены.
Те стандарты меня особо не интересуют, пока меня кормя^W снабжают кусками памяти и не говорят, как я с ними должен работать.


MSV>>(печально) Программирование — творчество, стандарты — зло.

W>Программирование — творчество, я тоже так считаю. Но мы работает не в сферическом вакууме. Мы работает в реальном мире и вынуждены считаться с его законами, с физическими и социальными. О тех и других я упоминал выше.
У меня еще осталось желание не соблюдать стандарты. Скоро это кончено пройдет, но скоро это не сейчас.

D>Он не должен возвращать ссылку. Это — антипаттерн. Поведение отличное от того, что ожидается от оператора сложения. Ошибка дизайна. Более того, мина замедленного действия.

Я кажется не помню, что такое паттерн, и не знаю, кто ожидает. Я ожидаю другого, того, чему меня научил с++.
Вот пока она не взорвалась я хочу успеть на ней посидеть.

D>Для Си++ это не так много. Но в этом есть хорошая новость. Значит, подвести под стандарты — вполне реальная задача

Оно полностью под стандартами студии и где-то на 60-70% под гцц. недостающий процент работа с окнами.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[13]: Задолбало гццой
От: wander  
Дата: 13.12.09 13:47
Оценка:
Здравствуйте, MikelSV, Вы писали:

MSV>Для нормального программиста, который рискнет заниматься моим кодом, это не будет самым сложным.

MSV>Нет здесь проблем с пониманием другими. Если появятся, будем искать решение.

Если у каждого своя логика — то ничего не получится.

MSV>(только смех) Я люблю долго и упорно писать и отлаживать свой бред, главное не биться о стену. И к счастью обычно у меня больше одного варианта решения.


W>>Это получилось, потому что логики нет. В программировании логика одна — математическая.

MSV>Хохохо, дожили.
MSV>Недавно доказывал, что в программировании почти не использую математику.
MSV>Для меня логика, она и в Африке логика, и к математике никак не привязана.
MSV>Я бы сказал, что в программировании логика объектная.

Ну давайте каждый напридумывает себе кучу терминов и мы вообще перестанем друг друга понимать.
К слово сказать, мат.логика это не тоже самое что математика. В частности логика булева, без которой невозможно написать ни одну программу является разделом мат. логики. Хоть бы в википедию заглянули. Детский сад, ей богу.

MSV>Я не пойму свой код, этого достаточно. отказаться от того, чем пользовался и тут же взять аналог, явно не лучше. это даже не называется, а обзывается, нехорошими словами.


То есть вы отказываетесь учиться?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.