Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 159 • Страница 4 из 8<  1  2  3  4  5  6  7  8  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Root
FPC не в *NIX а в том, под что соберешь..
_ManiaC_ А ты извратами типа gc классов не пользуешься? Т.е. тебе .NET Framework не требуется?

_________________
Цель жизни - d20 по жизни...



Партнер
 

Junior
Статус: Не в сети
Регистрация: 24.03.2004
struct test_t {
int *buffer;
test_t(int *value, const size_t valueSize)
{buffer = (int*)malloc(valueSize);};
~test_t()
{free(buffer);}
};

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
Статус: Не в сети
Регистрация: 07.10.2003
Откуда: Russia, Moscow
r9500_nonpro И к чему это?

_________________
В поиске включайте "Искать все слова". Избегайте многоточий.
Зачем нужен разгон? http://tsc.overclockers.ru


 

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.
Это не функция, а директива компилятора.


 

Junior
Статус: Не в сети
Регистрация: 24.03.2004
typedef struct test_t {
... tagTest_t;

vector <tagTest_t> vec(10);

опять бред какой-то. подробней.

Добавлено спустя 5 минут, 25 секунд:
Description

The sizeof operator has two distinct uses:

sizeof unary-expression

sizeof (type-name)

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 раз(а).

 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
r9500_nonpro
Ой ли?
Ладно, привожу тебе реальный пример.
Куски будут опущены.
Код:
struct frame_buffer {
 void *buffer;
 int bufSize;
 frame_buffer(void *bufPtr, const int  bSize) {
  ...
 }
 ~frame_buffer() {
  free(buffer);
 }
};
typedef  struct frame_buffer tagFrameBuffer;
const void *emptyBufer[10] = {0,0,0,0,0,0,0,0,0,0};
#define emptyBufferSize 10
.....
vector <tagFrameBuffer(emptyBufer,emptyBufferSize)> bufVec(64); // 64 элемента проинитеных пустым фреймом

и тут начинается "оба-на, колечко..." Конструктор вызван 64 раза, а деструктор 65!!!!!!
Глюпий борланд попытался при инстанцировании темплейта vector попытался вычислить sizeof самым кривым способом!
Остальные компиляторы все слопали на ура.

Дело в том, что при инстанцировании vector я могу указать количество элементов, котоые я уже хочу иметь. Что я и делаю.


 

Junior
Статус: Не в сети
Регистрация: 24.03.2004
Avaddon
где написано в стандарте, что ЭТО должно работать
Цитата:
vector <tagFrameBuffer(emptyBufer,emptyBufferSize)> bufVec(64);

Если там это есть - думаю сделаю рабочую версию этого кода на билдере 6.


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
r9500_nonpro писал(а):
Avaddon
где написано в стандарте, что ЭТО должно работать

ЭТО - это что? вызов конструктора или аллокирование элементов?
когда ты пишешь
vector <struct_t> vec(64);
это аналогично
vector <struct_t()> vec(64);
т.е. осуществляется вызов конструктора по умолчанию. Ничто не запрещает мне использовать любой другой конструктор.


 

Junior
Статус: Не в сети
Регистрация: 24.03.2004
В стандарте этот синтакс где? Дома еще Страуструп. Посмотрю.
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


Черным по серому сказано, что я могу использовать копирующий конструктор, что я и делаю.

_________________
Цель жизни - d20 по жизни...


 

Junior
Статус: Не в сети
Регистрация: 24.03.2004
Avaddon
прошу для начала разъяснить чем же некорректно работет sizeof в билдере. с чего начали.
c vector - сам попробую... времени просто не хватает... напряги.


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
r9500_nonpro
В чем заключается ошибка.
Если в качестве парамера sizeof (хотя бы косвенного, как в примере через vector) передается не конструктор по умолчанию (т.е. не просто имя класса), то присходит следущее:
1. Ни один из конструкторов не выполняется (это и правильно)
2. Размер вычисляется правильно.
3. Происходит вызов деструктора (что непонятно, и может привести к ошибке).
Как я сказал, при создании проинитенного вектора, деструктор вызывается n+1 раз, что может привести к ошибке. Ни один другой компилятор так не поступает.

_________________
Цель жизни - d20 по жизни...


 

Junior
Статус: Не в сети
Регистрация: 24.03.2004
Avaddon
сейчас откомпилил с вектором. без багов. пытаюсь потестить.
насчет sizeof - ну некорректный для него это синтакс. ну об этом же в хелпе написано - ну нельзя так его звать sizeof (class(100));
думаю, программистам борланда в голову не приходило фиксить компилер, ведь мало кто додумается так вызывать sizeof. ведь очевидно - sizeof(size_t(x,y)) == sizeof(size_t) == sizeof (int*)


касаемо vector - >>>>
//*
struct test_t {
int *buffer;
test_t(int *value=NULL, const size_t valueSize=666)
{buffer = (int*)malloc(valueSize*sizeof(int)); buffer[valueSize-1]=valueSize;};
~test_t()
{free(buffer);}
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
vector <test_t> z(5);
ShowMessage(z.begin()->buffer[665]);
z.clear();
ShowMessage("ok");
}

нормально все работает.

на vector <test_t(0,666)> z(5); компилер матерится. что тоже в общем нормально

Код:
Synopsis

#include <vector>
template <class T, class Allocator = allocator<T> >
class vector ;


Последний раз редактировалось r9500_nonpro 19.05.2004 10:38, всего редактировалось 14 раз(а).

 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
r9500_nonpro
Да компиляция нормально, а вот выполнение.. :(

_________________
Цель жизни - d20 по жизни...


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Цитата:
FPC не в *NIX а в том, под что соберешь..

Я смотрел FPC под Вин. Под *NIX я его не юзал, но думаю ягодки одного поля. А под *NIX'ом уже есть компилер Паскаля. Точнее, Pascal-to-C конвертер. И откуда взяли, что я говорил, что FPC под *NIX???
Цитата:
Все косяки делают РУКИ , а не компиляторы.

Не совсем. Даже в компилерах ошибки находят :)
Цитата:
скомпилять проект из VC1 в VC7.NET!!!

:lol:

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Root
Цитата:
Кто в последний раз юзал сторонний компилер паскаля? а? Или кто-нибудь кроме Дельфей что-нить паскалевское знает?
(FPC, паскаль в *NIX:) и еще ПАРА других)

вот отуда и взял
..Если компилятор не обнаружил в вашем проекте ошибок - скажите системному программисту, он исправит ошибки в компиляторе.. (с) Теория ошибок

_________________
Цель жизни - d20 по жизни...


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Avaddon
А запятая зачем поставлена? Как перечисление :wink: , а не уточнение :beer:

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
Root
:) не заметил.

_________________
Цель жизни - d20 по жизни...


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Хорошая дискуссия. Модераторам просьба не резать. Интересно ведь , что же на самом деле не то. Жаль нету Билдера чтобы проверить, а на паскаль сие не переводится :)


 

Member
Статус: Не в сети
Регистрация: 07.10.2003
Откуда: Russia, Moscow
Интересное обсуждение, но здесь не чат. Избегайте малосодержательных постов. Боюсь, чистить придется.

_________________
В поиске включайте "Искать все слова". Избегайте многоточий.
Зачем нужен разгон? http://tsc.overclockers.ru


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 159 • Страница 4 из 8<  1  2  3  4  5  6  7  8  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan