Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Можно ли подавить проверку на GOTO через объявление переменной в g++?  (Прочитано 31725 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« : 19-03-2010 23:58 » 

Мне необходимо перетащить код использующий goto под g++. А g++ жалуется на переходы через объявление переменной.
Кто-нибудь знает, можно ли эту проверку подавить? Или хотя бы превратить в warning'и?
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 20-03-2010 09:54 » 

Sashok, что такое "переходы через объявление переменной"?

Покажи пример кода. На использование goto g++ с параметром -Wall не говорит ни слова.


А переписать данный фрагмент никак нельзя?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #2 : 20-03-2010 14:24 » 

RXL, в том-то и беда, что переписывать нельзя. Начальство получило этот код из исследовательского отдела как "работающий". Он действительно без проблем компилируется под Visual Studio. А нам надо под g++. Но начальник говорит, что, если я код перепишу, то поддреживать надо будет нам, а оно(начальство) этого не желает. Вот я и долбаю всех вопросами то по поводу strncpy_s и _countof, то по поводу переходов.  
Фрагмент кода сейчас переслать не могу, проблема с VPN. В понедельник с работы вышлю. Но идея следующая:
Код:
...
if(ret != 0) goto CLEANUP;
...
int var;
...
CLEANUP:
...

Вызывает даже с флагом -Wall такую диагностику:

BSpline.cpp: 305: error: jump to label 'cleanup
BSpline.cpp: 280: error: from here
BSpline.cpp: 291: error: crosses initialization of `int var'


PS. Кстати, если есть какая-нибудь информация про библиотеки, поддерживающие Микрософтовские расширения С++ вроде тех, что я упоминал, тоже буду благодарен.
« Последнее редактирование: 20-03-2010 16:32 от Вад » Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 20-03-2010 14:32 » 

Sashok, Нельзя напрямую переносить код с студии в GСС. Тем более код, который писался без учета кроссплатформенности. В студии слишком много введений MS, которые не стандартны А в данном случае, может стоит поднять все объявления переменных наверх?.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 20-03-2010 14:41 » 

Кстати твой пример у меня не вызвал никаких нариканий.
Цитата
g++ --version
g++ (GCC) 4.4.1 20090725 (Red Hat 4.4.1-2)
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #5 : 20-03-2010 14:44 » 

Finch, я готов подписаться под каждым твоим словом.
Только реальность заставляет чесать левой рукой правое ухо. Жаль
Я же говорю, есть исследовательский отдел, который ни за что не отвечает, а нам надо давать готовый продукт. Но большое начальство, подчеркиваю, большое, считает, что, если исследовательский отдел написал код, на его подгонку ни средств, ни времени отводить не надо.
Если бы не эти коллизии, я бы просто переписал все, что не идет, и дело с концом!

К твоему последнему сообщению: у меня g++ 3.4.? (? - не помню)

Да, еще дополнение: у меня не Линукс, у меня Sun.
Записан

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

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 20-03-2010 15:20 » 

Sashok, у тебя может 'goto BLABLABLA;' находиться в одной функции, а 'BALBLABLA' в другой?
Или попробуй переставить 'int var' в начало функции.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 20-03-2010 18:21 » 

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

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 20-03-2010 18:39 » 

А если код не работает на g++ - его нельзя вернуть в этот исследовательский отдел как "нерабочий"? Раз они отвечают за код, пусть и с совместимостью сами воюют.

По крайней мере, если исследовательский отдел написал нерабочий (или не всюду рабочий) код - как можно его в проект вставлять? А если оно скомпилируется, но будет работать некорректно?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 20-03-2010 18:45 » 

Вад, Скорее всего в тех задании ни слова не было про кроссплатформенность. Вот они и написали для Студии.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 20-03-2010 18:48 » 

Ну, я мыслю так: мне дают код, я пытаюсь компилировать на g++, не компилируется. Заношу баг: "не могу скомпилировать на g++". Конечно, это работает только там, где подобные вещи общеприняты - я ж не знаю, как у Sashok на работе процесс поставлен.

Это хорошо, что код дали. А дали бы бинарные библиотеки? Динамические? А потом как хочешь их из соляриса линкуй Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 20-03-2010 18:50 » 

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

Лично я в C++ никогда не ставлю объявления посреди кода. Только в начале блока, либо вообще стараюсь делать по правилам Си - объявлять все переменные в начале функции.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 20-03-2010 18:51 » 

Согласен, и я понимаю начальника, который не хочет нести ответственность за поддержку чужого кода: вот так один раз влезешь в правку чужих багов, и потом всю дорогу голова болеть должна.
Записан
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #13 : 20-03-2010 20:14 » 

По поводу кода и другого отдела: может быть если долго и всерьез жаловаться, они со временем  откроют финансирование и доработают его до кроссплатформенного состояния, но это никак не поможет нам сдать наш код в первом полугодии. Жаль
Они действительно писали, как им удобнее. Мало того, часть написана вообще на С#. То, что мы переделываем с С# называется "рефакторизацией" (хотя там полное переписывание с добавлением новых функций). На это время отвели, хотя и мало.

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

Резюмируя, если мне удастся решить эту проблему и проблему из соседней темы (strncpy_s...), не беспокоя высокое начальство, мое местное начальство будет считать меня героем и спасителем. Улыбаюсь Что отнюдь не лишнее при интересной(!) работе и высокой безработице. А если не удастся... ну, до конца проекта точно не уволят, но спасителем не буду.
« Последнее редактирование: 20-03-2010 20:18 от Sashok » Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 20-03-2010 20:18 » 

Sashok, честно говоря я не понимаю - кто принял этот код? С какого перепугу он стал "работающим"? Неужели его просто "спускают" и типа дальше сами...


Интересная работа - это хорошо. Тонус мозга надо держать точно так же, как и тонус мышц. Но постоянное напряжение вредно - как своему мозгу, так и производственному процессу: кто-то, кто дает задания и перемещает результаты между отделами, должен узнать о происходящем, понять свои ошибки и сделать выводы.
« Последнее редактирование: 20-03-2010 20:25 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #15 : 20-03-2010 20:47 » 

RXL, код приняли до того, как я начал здесь работать. Да, подход у большого начальства такой: "Кстати, вот у исследовательского отдела есть работающий код, используйте его. Время и деньги, соответсвтенно, на эту часть не нужны". Кстати, как мне сказал начальник, большое начальство с трудом убедили, что C# нельзя перевести в C++ для Unix с помощью выбора соответствующего пункта меню в Visual Studio.
Исследовательский отдел проверяет свой код на мелких примерах под Visual Studio, и там он действительно работает.
Я работаю на позиции контрактора, так что "беги туда, тащи это". Все равно интересно! Но явно не та позиция, чтобы давать указания высокому начальнику.
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 20-03-2010 21:00 » 

Цитата: RXL
Лично я в C++ никогда не ставлю объявления посреди кода. Только в начале блока, либо вообще стараюсь делать по правилам Си - объявлять все переменные в начале функции

Это отличная привычка. Мне кажется, только новички разбрасывают объявления переменных по телу функции. Я вот вообще пишу на Си, поэтому даже соблазна не испытываю объявлять переменные где попало. Бывает правда одно исключение из этого правила - когда используешь условные директивы типа #if #ifdef и т.д.. Но тут оправдано, т.к. если кусок кода не будет скомпилирован, то  не нужна и переменная, которая используется исключительно в этой части кода.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 20-03-2010 21:13 » 

resource, у меня вообще преобладает стиль Си, т.к. он мне больше нравится, хоть и в C++ легче работать со строками и всякими STL. Си - это просто и надежно. Считаю, что не зная основ учиться высоким материям нельзя - знание будет неполным.

Sashok, я почему-то не завидую тебе. Извиняюсь, что я тут развел офтоп, но сколько платят за такую работу? И не могу понять твою текущую географию: твой IP принадлежит AT&T, без детальных уточнений.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 20-03-2010 21:18 » 

Цитата: RXL
Си - это просто и надежно

Точнее выразиться, просто невозможно
Записан
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #19 : 21-03-2010 00:42 » 

resource, у меня вообще преобладает стиль Си, т.к. он мне больше нравится, хоть и в C++ легче работать со строками и всякими STL. Си - это просто и надежно. Считаю, что не зная основ учиться высоким материям нельзя - знание будет неполным.
Вот! И я из той же категории программистов. Улыбаюсь

Sashok, я почему-то не завидую тебе. Извиняюсь, что я тут развел офтоп, но сколько платят за такую работу? И не могу понять твою текущую географию: твой IP принадлежит AT&T, без детальных уточнений.

Насчет географии все просто, я никогда и не скрывал. Я же здесь на форуме лет 5 назад очень часто появлялся, даже о своих горных походах постоянно сообщал. Короче, Америка. А провайдер у меня действительно AT&T.
Сколько платят? Трудно сравнивать в разных странах... Так что могу сказать, что, если не учитывать инфляции, на 30% больше, чем мне когда-либо платили раньше.
Но главное даже не это. Мне реально интересно. Это не банк какой-нибудь, где деньги со счета на счет переводить надо, и не кредитная карточка, где, если у тебя рейтинг такой-то надо предложить тебе кредит под 2%, а если такой-то - под 3%. Здесь есть математика, причем в разных группах разная, и не только у исследователей, но и у нас тоже. Я вот сейчас в свободное время, пока в электричке еду, пишу для своей группы популярную статью о сплайнах и кривых Безье. Мне так легче самому разбираться.  Ага
Если предложат постоянную работу, пойду не задумываясь, хотя там, конечно, деньги совершенно не те. И уж тогда буду стараться исподволь подвести начальство к мысли, что ему выгоднее, если мы это все будем делать сами, не пользуясь "трудами" исследовательского отдела.
Фу-у-у, целая исповедь получилась.
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 21-03-2010 17:59 » 

RXL, в том-то и беда, что переписывать нельзя. Начальство получило этот код из исследовательского отдела как "работающий". Он действительно без проблем компилируется под Visual Studio. А нам надо под g++. Но начальник говорит, что, если я код перепишу, то поддреживать надо будет нам, а оно(начальство) этого не желает. Вот я и долбаю всех вопросами то по поводу strncpy_s и _countof, то по поводу переходов.  
Фрагмент кода сейчас переслать не могу, проблема с VPN. В понедельник с работы вышлю. Но идея следующая:
Код:
...
if(ret != 0) goto CLEANUP;
...
int var;
...
CLEANUP:
...

Вызывает даже с флагом -Wall такую диагностику:

нет условий для вчитывания в тему, но если ответ ещё интересует, то надо делать так

Код:
...
if(ret != 0) goto CLEANUP;
...


{
     int var;
}
...
CLEANUP:
...

то есть ставим блок {} , а где будет использована переменная - это уже по смыслу. Обойти блок {} goto всегда может (то же касается switch)
« Последнее редактирование: 21-03-2010 18:01 от Алексей1153++ » Записан

Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #21 : 21-03-2010 19:51 » 

Алексей1153++, да, это я знаю.
Мы как-то незаметно отклонились от темы. Вопрос-то был не в том, как переписать код. Вопрос был в том, можно ли подавить диагностику таких вещей в g++.
Если уж вопрос встанет о переписывании кода, я вообще уберу goto - не люблю я их... Ага
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 21-03-2010 21:41 » 

Думаю, что никак.
Параметр -fpermissive может сделать зависимую ошибку предупреждением, но подавить саму ошибку кросс-инициализации не выходит.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #23 : 22-03-2010 04:58 » 

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

Если уж вопрос встанет о переписывании кода, я вообще уберу goto - не люблю я их... Ага

это да )) Но лучше не трогай - потом глюки править себе дороже. Вот новый код надо писать уже с учётом
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #24 : 22-03-2010 05:49 » 

Sashok, не слушай его, смело ломай код Улыбаюсь я всегда так делаю, за некоторое количество лет, что я программирую пришел к выводу, что с кодом надо быть жестче иначе, старый код никогда не подвергнется хоть минимальному рефакторингу, но это ИМХО Улыбаюсь а не руководство к действию
Записан

Странно всё это....
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 22-03-2010 06:27 » 

Абсолютно согласен. Тут или ломать, или вообще забыть про него. Я бы именно так поставил вопрос перед начальством. Потому что непонятно как-то, чего им надо. Хотят и рыбку съесть и........ на gcc пересесть. Чтоб код компилился gcc, когда его под студию писали? Попроще бы нашли себе занятие
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #26 : 22-03-2010 08:23 » 

LogRus, Sashok, Слушай, слушай:) Если есть время +  ещё мало пользователей программы, то да - надо править. Иначе - не надо Улыбаюсь А то поддерживать глюки замучаешься


Совсем другое дело - оставить интерфейс старый, а начинку написать свою заново
Записан

Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #27 : 22-03-2010 11:21 » new

LogRus, resource, Алексей1153++, спасибо. Улыбаюсь
Я в общем тоже не первый год работаю (желающие могут посмотреть мои статьи здесь на форуме лет 5-7 назад  Ага ) и в данном случае соглашусь с LogRus и resource.

Код для внутреннего пользования, продуктом является то, что код делает, а не сам код. Так что либо я его не буду трогать вообще (если найду как обмануть компилятор), либо уж буду править так, чтобы самому за него отвечать со спокойной совестью. Кстати, феномен того, что код с заплатами начинает выдвигать свои требования и что с ним надо пожестче я тоже наблюдал не раз.

Алексей1153++, насчет сути (перескакиваю конструкторы) я согласен. Беда в том, что Мелкомягкие такое допускают и не жалуются, а получившееся дерьмо расхлебывать мне...  Я зол!

resource, а начальство - оно всегда хочет все сразу и забесплатно...

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

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines