LINUX.ORG.RU

QT C++ объявление объектов

 ,


1

4

Либо я совсем дурак,либо у QT какйто свой C++

QObject *a[3];
if(a[0]){....код...}

Если объект не объявлен то [код] не выполняется,логично.

QObject *a[3];
a[0]=new QObject();
if(a[0]){....код...}

Тут [код] выполняется.

Если объявить QObject *a[3]; в заголовочном файле То if(a[0]) всегда будет true,т.е. почемуто считается что объект объявлен?

НО Если объявить в заголовочном файле QObject *a; И проверить if(a){....код...} Будет ВЕРНО(т.е. отвечать false если не объявлен) работать,ПОЧЕМУ?

Конечно есть вариант что я забыл/недоучил С++

Также добавлю-у меня пол программы щас отвалилось из-за этого,причем qt я не обновлял,обновил только gcc,и старый бинарник работает,а новый компилируется и падает. Что за магия такая?

Спасибо за помощь.



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

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

и нули у всех элементов массива могут быть при определенных условиях(и версии компилятора естетсвенно).

Феерично :3

anonymous
()
Ответ на: комментарий от tester9999

Все в этом треде первокурсники не более

почему не школьники?

(кроме меня естественно).

али школьник таки ты?

Вы понятия не имеете о работе С++

конечно не имеем

и в том что эта проблема действительно QT-спецефичная.
QT

ну ты понял.

Stvad
()
Ответ на: комментарий от trex6

Достойный вборс, достойное продолжение. Годный троллинг.

Дата регистрации: 15.07.2012

Не, похоже и вправду дебил.

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

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

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

Ты неповеришь...

Поверю, но повторю: это поведение не гарантируется стандартом. Хочешь писать код, который работает только

при определенных условиях(и версии компилятора естетсвенно).

- успехов тебе в борьбе со здравым смыслом.

Все в этом треде первокурсники не более(кроме меня естественно).

Так ты просто потроллить зашел?

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

Результат обязательно будет различаться.

Нет. gcc объявляет нулями массив,как и написано в первом посте,и не зависит от ОС/или кол-ва запусков.

tester9999
() автор топика
Ответ на: комментарий от m0rph

Поверю, но повторю: это поведение не гарантируется стандартом.

Я тут уже раз 10 намекнул на msvc (и силанг)

Так ты просто потроллить зашел?
потроллить

Презираю жаргон.

tester9999
() автор топика
Ответ на: комментарий от tester9999

Презираю жаргон.

потесть

бинарник

Скомпилял

баги

рандома

ORLY?

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

Винда поддерживает стандарты линукса?

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

Нет, это как раз замечательно.

P.S. Вопрос на засыпку, в какой строчке и какого стандартна описано предполагаемое вами поведение (заполнение нулями не инициализированного массива) ?

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

при чем тут факты, разные компиляторы(и разных версий) выдают разный код, на месте неинициализированного указателя может находится ВСЕ ЧТО УГОДНО. Или нули, или отличное от нуля значение (как у тубя получается в "...Если объявить в заголовочном файле QObject *a; И проверить if(a){....код...} Будет ВЕРНО")

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

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

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

Компилятор МС так делает,этого достаточно чтобы считать стандартом.

0_o

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

Плохо что линукс не поддерживает стандарты винды.

Ну бред же. У меня МСВЦ под рукой и из-за твоей странной уверенности даже проверил - в неинициализированных массивах мусор, в том числе, в дебажной сборке. Хотя это и без эксперементального подтверждения понятно должно быть.

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

Компилятор МС так делает

Это ложное утверждение.

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

Жутко интересно, что случилось с предыдущими 9998 тестерами ?

зы. Если очень долгая история, то хотя бы по 1,3,5,7,8,12,13 и 666-тому проясните ситуацию . Спасибо.

ilovewindows ★★★★★
()

Компилятор МС так делает,этого достаточно чтобы считать стандартом.

Санитааааааааары!!!

PaRuSoft ★★★★
()

Господа, скастуйте уже на этого дурака/толстяка модераторов. Уныние же.

anonymous
()
Ответ на: комментарий от tester9999

Толстовато, но тут должно прокатить.

trex6 ★★★★★
()

Иди нахер из программирования.

Chaser_Andrey ★★★★★
()

Люди, вы обдолбались? Глобальные переменные помещаются в bss и забиваются нулями.

ТС, покажи код полностью, так как не понятно, что значит объявить в .h-файле. Потому что объявить в данном случае это написать extern.

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

Лучше я программу на C# или джаве перепишу

Точно точно. CLR там за тебя всё проинициализирует, продумает и соптимизирует. Бросай плюсы.

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

man undefined behaviour и не пори больше чушь, пожалуйста

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

Жутко интересно, что случилось с предыдущими 9998 тестерами ?

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

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

Все в этом треде первокурсники не более(кроме меня естественно).

личинка д'артаньяна глаголет! всем ниц

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

Элтон Джон так делает,этого достаточно чтобы считать стандартом.

отговаривать не будем, только смотри, стандарт смазать не забудь, иначе поцарапаешь )

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

Спасибо за тред) Подняло настроение

observer ★★★
()

Не спорь и не доказывай чушь. Лучше перечитай спокойно и внимательно что тебе насоветовали.

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

Я выше уже ответил что это не так,и зависит это от компилятора-и точнее gcc.

Малыш, обратись-ка ты к опытному эвтанологу, срочно.

anonymous
()

Клоун, забанься сам. Лучше всего - об стену.

anonymous
()
Ответ на: комментарий от vzzo

УРА УРА!!!! У нас есть победитель,это правильный ответ!!!

На самом деле так и есть.

И весь фокус был не в мусоре(как некоторые яро тут отстаивали) а в том что в С++ члены классов не забиваются нулями(именно по стандарту),у меня переменные объявлены как члены классов.

И да-статик или екстерн от этого помогут(т.е. забьют нулями без инициализации(в коде))

(я это понял после создания темы,было весело всеравно)

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

tester9999
() автор топика
Ответ на: комментарий от tester9999

И весь фокус был не в мусоре(как некоторые яро тут отстаивали) а в том что в С++ члены классов не забиваются нулями(именно по стандарту),у меня переменные объявлены как члены классов.

И да-адекватность лора чувствуется,никто несказал ведь...эх вы.

tester9999
() автор топика
Ответ на: комментарий от tester9999

Ты только что сам сказал 1 в 1 то, что тебе доказывали выше. И чем «незабивание нулями» отличается по смыслу от «содержит случайное значение(мусор)»?

разные опции для gcc дают разный результат

что тебе и говорили

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

QObject *a[3] непроинициализирован и там мусор, отличный от нуля

ТС, в самом деле, у тебя там мусор, или кто-то за тебя туда будет в каждую дыру нули писать? а производительность? вдруг тебе не надо массив размером с гигабайт забивать нулями, а если нет, то почему тогда из трех элементов - да?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от tester9999

если говорить про QObject *a[3] в заголовке или где-либо ещё, то это сто пудоф мусор, причем за такой подход в написании программ надо йайки отрывать

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от tester9999

Ну вот потом и программируй всю жизнь со статиком и экстерном.

bhfq ★★★★★
()

В винде, кстати, на минимальном приоритете постоянно крутится поток-обнулятор памяти, из-за которого такие проблемы могут скрываться

unC0Rr ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Бред написал. Мусор только если это локальная переменная без статика или екстерна. Если эта глобальная-мусора там нет,яж для тебя объяснил выше...

tester9999
() автор топика
Ответ на: комментарий от tester9999

хорошо... возможно был не прав, даже наверное не прав

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

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Не может, это либо инициализированные глобальные в сегменте data прямо в файле программы, либо неинициализированные в сегменте bss , которые загрузчик по умолчанию забивает нулями . ТС мозг выносит - привел огрызок кода с локальной переменной , а в голове у него член, пардон, класса.

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

в любом случае когда пишешь код, то странно полагаться на подобные объявления или хаки, в которых не уверен что работают они

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

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

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

почему до сих пор не скастовали специалистов по quick time?

+1 Хоть тулкит правильно называй с которым работаешь, а то я думаю что там за объекты в Quick Time да ещё и на лоре :) За не инициализированные переменные надо морально убивать на месте, а лучше сразу физически...

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