size_t arg_size = sizeof (test_t); // OK result = 4 (int*)
size_t arg_size = sizeof (test_t(NULL,666)); //access violation. Но и код - БРЕД. компилер не должен понимать такую ахинею. Если должен - прошу линки на соотв. требования к компилерам.
Единственное, что не получилось написать на билдере до сих пор - это драйвер. Нормальный. Stand-alone.
Последний раз редактировалось r9500_nonpro 18.05.2004 9:44, всего редактировалось 1 раз.
Member
Статус: Не в сети Регистрация: 15.04.2004 Откуда: Москва
armadillo Это я приводил пример кривости Борландового компилера
r9500_nonpro size_t arg_size = sizeof (test_t(NULL,666)); //access violation. Но и код - БРЕД. компилер не должен понимать такую ахинею.
Ой-ли? Скажи мне, в чем я не прав?
Согласен, что это код не есть образец для подражания, а как быть в таком случае:
typedef struct test_t {
... tagTest_t;
vector <tagTest_t> vec(10);
Прогони это через борланд и порадуйся..
В стандарте ISO/IEC 14882 1998 (http://mrst.narod.ru/c-cpp/14882-98.rar) четко сказано, когда должен вычисляться sizeof.
Это не функция, а директива компилятора.
The result in both cases is an integer constant that gives the size in bytes of how much memory space is used by the operand (determined by its type, with some exceptions). The amount of space that is reserved for each type depends on the machine.
In the first use, the type of the operand expression is determined without evaluating the expression (and therefore without side effects). When the operand is of type char (signed or unsigned), sizeof gives the result 1. When the operand is a non-parameter of array type, the result is the total number of bytes in the array (in other words, an array name is not converted to a pointer type). The number of elements in an array equals sizeof array/ sizeof array[0] .
If the operand is a parameter declared as array type or function type, sizeof gives the size of the pointer. When applied to structures and unions, sizeof gives the total number of bytes, including any padding.
You cannot use sizeof with expressions of function type, incomplete types, parenthesized names of such types, or with an lvalue that designates a bit field object.
The integer type of the result of sizeof is size_t.
You can use sizeof in preprocessor directives; this is specific to C++Builder.
In C++, sizeof(classtype), where classtype is derived from some base class, returns the size of the object (remember, this includes the size of the base class).
Цитата:
В стандарте ISO/IEC 14882 1998 (http://mrst.narod.ru/c-cpp/14882-98.rar) четко сказано, когда должен вычисляться sizeof. Это не функция, а директива компилятора.
вот что есть по асму
#77
собсно если юзать корректный синтакс - можно получить корректный код.
Последний раз редактировалось r9500_nonpro 18.05.2004 10:11, всего редактировалось 2 раз(а).
и тут начинается "оба-на, колечко..." Конструктор вызван 64 раза, а деструктор 65!!!!!!
Глюпий борланд попытался при инстанцировании темплейта vector попытался вычислить sizeof самым кривым способом!
Остальные компиляторы все слопали на ура.
Дело в том, что при инстанцировании vector я могу указать количество элементов, котоые я уже хочу иметь. Что я и делаю.
Member
Статус: Не в сети Регистрация: 15.04.2004 Откуда: Москва
r9500_nonpro писал(а):
Avaddon где написано в стандарте, что ЭТО должно работать
ЭТО - это что? вызов конструктора или аллокирование элементов?
когда ты пишешь
vector <struct_t> vec(64);
это аналогично
vector <struct_t()> vec(64);
т.е. осуществляется вызов конструктора по умолчанию. Ничто не запрещает мне использовать любой другой конструктор.
В стандарте этот синтакс где? Дома еще Страуструп. Посмотрю.
The sizeof operator has two distinct uses:
sizeof unary-expression
sizeof (type-name)
об этом знает билдер. o sizeof (class(100)) - он знать не должен. Если должен - покажите где. Попробую реализовать.
Member
Статус: Не в сети Регистрация: 15.04.2004 Откуда: Москва
r9500_nonpro
Цитата:
В стандарте этот синтакс где? Дома еще Страуструп. Посмотрю.
Еще раз спрашиваю, "Этот синтаксис" это какой?
Инстанцирование вектора с некоторым количеством элементов?
Читаем хелп от билдака:
Код:
Description
vector<T, Allocator> is a type of sequence that supports random access iterators. In addition, it supports amortized constant time insert and erase operations at the end. Insert and erase in the middle take linear time. Storage management is handled automatically. In vector, iterator is a random access iterator referring to T. const_iterator is a constant random access iterator that returns a const T& when dereferenced. A constructor for iterator and const_iterator is guaranteed. size_type is an unsigned integral type. difference_type is a signed integral type.
Any type used for the template parameter T must provide the following (where T is the type, t is a value of T and u is a const value of T):
Copy constructors T(t) and T(u) Destructor t.~T() Address of &t and &u yielding T* and const T* respectively Assignment t = a where a is a (possibly const) value of T
Черным по серому сказано, что я могу использовать копирующий конструктор, что я и делаю.
Avaddon прошу для начала разъяснить чем же некорректно работет sizeof в билдере. с чего начали.
c vector - сам попробую... времени просто не хватает... напряги.
Member
Статус: Не в сети Регистрация: 15.04.2004 Откуда: Москва
r9500_nonpro В чем заключается ошибка.
Если в качестве парамера sizeof (хотя бы косвенного, как в примере через vector) передается не конструктор по умолчанию (т.е. не просто имя класса), то присходит следущее:
1. Ни один из конструкторов не выполняется (это и правильно)
2. Размер вычисляется правильно.
3. Происходит вызов деструктора (что непонятно, и может привести к ошибке).
Как я сказал, при создании проинитенного вектора, деструктор вызывается n+1 раз, что может привести к ошибке. Ни один другой компилятор так не поступает.
Avaddon сейчас откомпилил с вектором. без багов. пытаюсь потестить.
насчет sizeof - ну некорректный для него это синтакс. ну об этом же в хелпе написано - ну нельзя так его звать sizeof (class(100));
думаю, программистам борланда в голову не приходило фиксить компилер, ведь мало кто додумается так вызывать sizeof. ведь очевидно - sizeof(size_t(x,y)) == sizeof(size_t) == sizeof (int*)
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
Цитата:
FPC не в *NIX а в том, под что соберешь..
Я смотрел FPC под Вин. Под *NIX я его не юзал, но думаю ягодки одного поля. А под *NIX'ом уже есть компилер Паскаля. Точнее, Pascal-to-C конвертер. И откуда взяли, что я говорил, что FPC под *NIX???
Цитата:
Все косяки делают РУКИ , а не компиляторы.
Не совсем. Даже в компилерах ошибки находят
Цитата:
скомпилять проект из VC1 в VC7.NET!!!
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Member
Статус: Не в сети Регистрация: 15.04.2004 Откуда: Москва
Root
Цитата:
Кто в последний раз юзал сторонний компилер паскаля? а? Или кто-нибудь кроме Дельфей что-нить паскалевское знает? (FPC, паскаль в *NIX:) и еще ПАРА других)
вот отуда и взял
..Если компилятор не обнаружил в вашем проекте ошибок - скажите системному программисту, он исправит ошибки в компиляторе.. (с) Теория ошибок
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Хорошая дискуссия. Модераторам просьба не резать. Интересно ведь , что же на самом деле не то. Жаль нету Билдера чтобы проверить, а на паскаль сие не переводится
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения