[image]

[Конкурс] Транслятор языка

 
1 7 8 9 10 11 12 13
+
-
edit
 

Balancer

администратор
★★★★★
tarasv> А кстати как поживает под Linux IDEA?

Интерфейс совершенно ненативный и какой-то кривой, явно несистемный рендеринг шрифтов. А главное - эта IDE не свободная, так что я с ней и не разбирался. Поставил (до сих пор 7.0.x какая-то стоит), посмотрел и забыл :)
   
US Mishka #26.08.2008 02:45  @Реконструктор#20.08.2008 16:56
+
-
edit
 

Mishka

модератор
★★★
Реконструктор> Разумеется. Задумка была под конец развертывать "программу" в списочно-линейный или индексно-линейный вид, что приведет к вымираню многих временных вещей, в т.ч. и этой декларации.
Реконструктор> А сейчас, домашнее задание: Почему мусор из памяти выполнятся не будет, и что конкретно произойдет, если напишем m_pOperators[OP_COUNT+1]->Execute()?
Припозднился я. Не знал про это топик. :)

Гриш, ты фигню толкаешь. У тебя строка m_pOperators[OP_COUNT] объявляет массив указателей на тип m_pOperators. Помятуя о том, что в С++ нет понятия встроенного "массив" — это просто кусок памяти размеров с OP_COUNT указателей. Указатель — встроенный тип. Значит всегда есть кандидат типа:
5.2.1 Subscripting [expr.sub]
1 A postfix expression followed by an expression in square brackets is a postfix expression. One of the expressions shall have the type “pointer to T” and the other shall have enumeration or integral type. The result is an lvalue of type “T.” The type “T” shall be a completely-defined object type.56) The expression E1[E2] is identical (by definition) to *((E1)+(E2)). [Note: see 5.3 and 5.7 for details of * and + and 8.3.4 for details of arrays. ]
 


Вот следующая цитата показывает почему ты не сможешь переопределить глобальный []:

[quote]
13.5.5 Subscripting [over.sub]
1 operator[] shall be a non-static member function with exactly one parameter. It implements the subscripting syntax
postfix-expression [ expression ]
Thus, a subscripting expression x[y] is interpreted as x.operator[](y) for a class object x of type T if T::operator[](T1) exists and if the operator is selected as the best match function by the overload resolution mechanism (13.3.3).]
[/quote]

Вот кандидаты:

[quote]
13 For every cv-qualified or cv-unqualified object type T there exist candidate operator functions of the form
T* operator+(T*, ptrdiff_t);
T& operator[](T*, ptrdiff_t);
T* operator-(T*, ptrdiff_t);
T* operator+(ptrdiff_t, T*);
T& operator[](ptrdiff_t, T*);
[/quote]

Выбор происходит по
13.6 Built-in operators [over.built]
1 The candidate operator functions that represent the built-in operators defined in clause 5 are specified in
this subclause. These candidate functions participate in the operator overload resolution process as
described in 13.3.1.2 and are used for no other purpose.
 




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

Т.е. её семантика останется такой же, как и была. Или прямое обращение за пределы "массива". Проверки выхода за пределы — нет. Поэтому всё будет зависеть от того, что там лежит сразу за. Будет кака, может сразу прерывание вылезти (в случае виртуальной таблицы, т.е., если у тебя есть хоть один виртуальный метод) — может обнаружиться раньше и может быть будет прерывание. Для простого класса — методы будут вызваны статически, а им в качестве нулевого параметра, будут передано дерьмо.

Читай стандарт, пункты 13.5, 13.6, 13.3, 8.3.2.
   
BG Реконструктор #26.08.2008 10:29  @Mishka#26.08.2008 02:45
+
-
edit
 
Mishka> Т.е. её семантика останется такой же, как и была. Или прямое обращение за пределы "массива". Проверки выхода за пределы — нет. Поэтому всё будет зависеть от того, что там лежит сразу за. Будет кака, может сразу прерывание вылезти (в случае виртуальной таблицы, т.е., если у тебя есть хоть один виртуальный метод) — может обнаружиться раньше и может быть будет прерывание. Для простого класса — методы будут вызваны статически, а им в качестве нулевого параметра, будут передано дерьмо.
Mishka> Читай стандарт, пункты 13.5, 13.6, 13.3, 8.3.2.

Хорошо, более простое задание (на тему как работают объекты в C++). Что будет, если выполнить:

((COperator*)rand())->Execute();

и что будет когда:

((COperator*)NULL)->Execute();

Не в конкретном случае, а в принципе.
   
+
-
edit
 
BG Реконструктор #26.08.2008 12:17
+
-
edit
 
Гм... Стоит ли делать новый виток?...
   
RU Kernel3 #26.08.2008 13:38  @Реконструктор#26.08.2008 10:29
+
-
edit
 

Kernel3

аксакал

Реконструктор> Хорошо, более простое задание (на тему как работают объекты в C++). Что будет, если выполнить:
((COperator*)rand())->>Execute();
Реконструктор> и что будет когда:
((COperator*)NULL)->>Execute();
Реконструктор> Не в конкретном случае, а в принципе.
В принципе, будет жопа 2 раза. Тебе же, в свою очередь, домашнее задание: выяснить, почему в плюсовом коде не стоит применять сишный оператор преобразования типа.
   
US Mishka #26.08.2008 14:58  @Реконструктор#26.08.2008 10:29
+
-
edit
 

Mishka

модератор
★★★
Реконструктор> Хорошо, более простое задание (на тему как работают объекты в C++). Что будет, если выполнить:
((COperator*)rand())->>Execute();
Реконструктор> и что будет когда:
((COperator*)NULL)->>Execute();
Реконструктор> Не в конкретном случае, а в принципе.

Гоша, читай стандарт. Там написано. Разыменование NULL-а — undefined.

Certain other operations are described in this International Standard as undefined (for example, the effect of dereferencing the null pointer). [Note: this International Standard imposes no requirements on the behavior of programs that contain undefined behavior. ]
 


Это значит, что может и разыменоваться и продолжить выполнение.

Глобальный объект (в предыдущем случае) не обязан быть инициирован, хотя многие компиляторы делают это. Поэтому там может находится не NULL, а вполне себе значение.
   
US Mishka #26.08.2008 16:40  @Татарин#04.08.2008 23:26
+
-
edit
 

Mishka

модератор
★★★
Татарин> Число значащих цифр (точность числа) есть сумма количества цифр дробной и целой части множителя (нули справа целой части - не считаются).
Татарин> 1.1B3 (две значащих цифры)
Татарин> 111В2 (одна значащая цифра)
Э, одна?

Про лево ничего не сказано, значит 00001111B2 — 8 значащих? 10000E0B10 — одна значащая?

Татарин> Точность результатов вычислений определяется точностью задания чисел. Точность результатов вычислений может быть повышена в процессе вычислений согласно простому правилу: при сложении или вычитании берётся наибольшая точность операндов.

Немного противоречиво — 1.11E0B10+22.2E0B10 — точность и там, и там 3 (точнее значащие 3). Какую выбрать здесь 21.3 или 1.31(потеря значащей цифры — это не число или как?), а может 21.31?

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

Татарин> B[A] = 2 (при выполнениии A = 1.01Е2В2, программа должна выполнить "B101 = 2")

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

Татарин> {} - все операторы, что внутри этих скобок считаются одним оператором (например, if(a=3){print(a);print(b);}

Тут не понятки. Вроде, скобки не являются оператором. Зачем тогда запятая перед последней скобкой?

Татарин> Размеры окна/экрана вывода - на усмотрение программиста, внутренние "программные" координаты с каждым выводом точки пересчитываются так, чтобы все точки всегда находились внутри экрана, всё изображение всегда внутри окна/экрана. Максимальное значение использованого когда-либо цвета соответсвует белому, минимальное - чёрному, цвета всех точек пересчитываются при каждом выводе.

Не задан (не специфицирован) алгоритм пересчёта. Значит просто использование части экрана (масштабирование 1) тоже подходит. Т.е. увеличивать не надо. Более того, алгоритм пересчёта может быть такой, что все точки будут отображены строго в одну — и будет соотвествовать спецификации. Т.е. эту часть реализовывать надо только количество точек, ключи и их цвета, чтобы поддержать unplot (позиций не надо).

Татарин> unplot(переменная) - удаляет с экрана все точки с ключом переменная.
Их может быть несколько?

Татарин> Программа всегда состоит из одного оператора.

т.е. {} иногда даже не нужны? :)
   

Vale

Сальсолёт
★☆
>процессе вычислений согласно простому правилу: при сложении или вычитании берётся наибольшая точность операндов.

Кгхм. Скорее уж наименьшая...
   
CA tarasv #26.08.2008 17:40  @Реконструктор#26.08.2008 10:29
+
-
edit
 

tarasv

аксакал

Реконструктор> Хорошо, более простое задание (на тему как работают объекты в C++). Что будет, если выполнить:
((COperator*)rand())->>Execute();
Реконструктор> и что будет когда:
((COperator*)NULL)->>Execute();
Реконструктор> Не в конкретном случае, а в принципе.

Мишка если что поправит но ЕМНИП наличие guard region в С++ не гарантируется - это свойство среды исполнения а не языка.
   
US Сергей-4030 #26.08.2008 18:03  @Mishka#26.08.2008 16:40
+
-
edit
 

Сергей-4030

исключающий третье
★★
Mishka> Тут не понятки. Вроде, скобки не являются оператором. Зачем тогда запятая перед последней скобкой?

Ситуация разрешилась таким образом: решили, что есть пустой оператор, поэтому такой код валидный.

Татарин>> Размеры окна/экрана вывода - на усмотрение программиста, внутренние "программные" координаты с каждым выводом точки пересчитываются так, чтобы все точки всегда находились внутри экрана, всё изображение всегда внутри окна/экрана. Максимальное значение использованого когда-либо цвета соответсвует белому, минимальное - чёрному, цвета всех точек пересчитываются при каждом выводе.
Mishka> Не задан (не специфицирован) алгоритм пересчёта. Значит просто использование части экрана (масштабирование 1) тоже подходит. Т.е. увеличивать не надо. Более того, алгоритм пересчёта может быть такой, что все точки будут отображены строго в одну — и будет соотвествовать спецификации. Т.е. эту часть реализовывать надо только количество точек, ключи и их цвета, чтобы поддержать unplot (позиций не надо).

Это, собственно, все равно в конкурс не вошло, потому, что Реконструктор это не реализовал. В моей реализации всегда "фактическая" область растягивается/сжимается чтобы заполнить все окно вывода.

Татарин>> unplot(переменная) - удаляет с экрана все точки с ключом переменная.
Mishka> Их может быть несколько?

У меня - plot() с уже определенным индексом переносит точку из старой позиции в новую.

Татарин>> Программа всегда состоит из одного оператора.
Mishka> т.е. {} иногда даже не нужны? :)

Да, один оператор без скобок это корректная программа. У меня реализовано неверно, кстати - я ожидаю хотя бы один непустой оператор. А по спецификациям пустой файл - корректная программа.
   
US Сергей-4030 #26.08.2008 18:04
+
-
edit
 

Сергей-4030

исключающий третье
★★
Кстати, от бесконечной точности мы отказались впоследствии, числа просто приводятся к double. Это не есть проблема (тем более, в JDK есть имплементация бесконечной арифметики, с исходниками), но это нудно.
   
US Mishka #26.08.2008 18:16  @Сергей-4030#26.08.2008 18:03
+
-
edit
 

Mishka

модератор
★★★
Сергей-4030> Ситуация разрешилась таким образом: решили, что есть пустой оператор, поэтому такой код валидный.
Тогда надо говорить об ограничителе, скорее. :)

Сергей-4030> Это, собственно, все равно в конкурс не вошло, потому, что Реконструктор это не реализовал. В моей реализации всегда "фактическая" область растягивается/сжимается чтобы заполнить все окно вывода.

Согласись, что рисовать точку (одну и всегда) рисовать гораздо удобнее. А внутри поодерживать структуры для тэгов.

Сергей-4030> У меня - plot() с уже определенным индексом переносит точку из старой позиции в новую.

Да, я просто увидел тэги позже, чем написал вопрос. Просто, удалить одну точку из "серии" нельзя. Что не удобно, но тут не об этом спорили. :)

Сергей-4030> Да, один оператор без скобок это корректная программа. У меня реализовано неверно, кстати - я ожидаю хотя бы один непустой оператор. А по спецификациям пустой файл - корректная программа.

:)
   

Mishka

модератор
★★★
tarasv> Мишка если что поправит но ЕМНИП наличие guard region в С++ не гарантируется - это свойство среды исполнения а не языка.

Дык, undefined — я уже выше запостил. Кстати, NULL не всегда 0. У нас были и 0xFFFFFFFF — специально, чтобы генерилось аппаратное прерывание по отсутствию физического адреса при попытке разыменовать, а не всякие там варианты на чтение, а не на запись.
   

tarasv

аксакал

>>процессе вычислений согласно простому правилу: при сложении или вычитании берётся наибольшая точность операндов.
Vale> Кгхм. Скорее уж наименьшая...

Не понял :( результат 1,1 - 1 = 0 это разве хорошо?
   
+
-
edit
 

Balancer

администратор
★★★★★
tarasv> Не понял :( результат 1,1 - 1 = 0 это разве хорошо?

1,1±0,1 - 1±1 = 0±1 :)

Вообще, есть вполне чёткие правила расчёта точности вычислений. Помню, нам на физике в своё время оценки снижали за каждую лишнюю цифру :)

Хотя сами правила я уже, конечно, подзабыл, более 15 лет прошло.
   
US Сергей-4030 #26.08.2008 19:01  @Mishka#26.08.2008 18:16
+
-
edit
 

Сергей-4030

исключающий третье
★★
Сергей-4030>> Ситуация разрешилась таким образом: решили, что есть пустой оператор, поэтому такой код валидный.
Mishka> Тогда надо говорить об ограничителе, скорее. :)

Нет, все-таки разделитель. Потому, что код

{
print(1);
print(2)
}

тоже валидный.

Сергей-4030>> Это, собственно, все равно в конкурс не вошло, потому, что Реконструктор это не реализовал. В моей реализации всегда "фактическая" область растягивается/сжимается чтобы заполнить все окно вывода.
Mishka> Согласись, что рисовать точку (одну и всегда) рисовать гораздо удобнее. А внутри поодерживать структуры для тэгов.

Я, честно говоря, не понял, что ты имеешь в виду. :( Татарин хотел, чтоб при любом масштабе общая картина была видна. Что значит "тэги" в данном случае?

Сергей-4030>> У меня - plot() с уже определенным индексом переносит точку из старой позиции в новую.
Mishka> Да, я просто увидел тэги позже, чем написал вопрос. Просто, удалить одну точку из "серии" нельзя. Что не удобно, но тут не об этом спорили. :)

Ну, это просто очень низкоуровневый графический примитив.
   
+
-
edit
 

tarasv

аксакал

tarasv>> Не понял :( результат 1,1 - 1 = 0 это разве хорошо?
Balancer> 1,1±0,1 - 1±1 = 0±1 :)

Вот вот наглядный пример для Вале ;) - кто хочет язык с такой арифметикой пусть поднимет руку :P .

Balancer> Вообще, есть вполне чёткие правила расчёта точности вычислений. Помню, нам на физике в своё время оценки снижали за каждую лишнюю цифру :)

В ядре языка обычно принято арифметику а не метрологию имплементировать ;)
   
+
-
edit
 

Balancer

администратор
★★★★★
Balancer>> 1,1±0,1 - 1±1 = 0±1 :)
tarasv> Вот вот наглядный пример для Вале ;) - кто хочет язык с такой арифметикой пусть поднимет руку :P .

Я когда-то давно для Си++ просто писал такой набор классов с перегрузкой операторов :) Но к тому времени, как пришло в голову написать, практическая надобность уже отпала :)
   
US Mishka #26.08.2008 19:59  @Сергей-4030#26.08.2008 19:01
+
-
edit
 

Mishka

модератор
★★★
Сергей-4030> тоже валидный.

ага.

Сергей-4030> Я, честно говоря, не понял, что ты имеешь в виду. :( Татарин хотел, чтоб при любом масштабе общая картина была видна. Что значит "тэги" в данном случае?

Ну, там 4-й параметр, который потом используется в unplot. А одна точка — поскольку алгоритм масштабирования не специфицирован, то масштабирование всего в одну точку. :)
   
US Сергей-4030 #26.08.2008 21:12  @Mishka#26.08.2008 19:59
+
-
edit
 

Сергей-4030

исключающий третье
★★
Сергей-4030>> тоже валидный.
Mishka> ага.
Сергей-4030>> Я, честно говоря, не понял, что ты имеешь в виду. :( Татарин хотел, чтоб при любом масштабе общая картина была видна. Что значит "тэги" в данном случае?
Mishka> Ну, там 4-й параметр, который потом используется в unplot. А одна точка — поскольку алгоритм масштабирования не специфицирован, то масштабирование всего в одну точку. :)

В смысле, когда имеем только одну точку (или ноль точек), то тогда масштаб не определен? Четвертый параметр просто имя точки.
   
US Mishka #26.08.2008 22:25  @Сергей-4030#26.08.2008 21:12
+
-
edit
 

Mishka

модератор
★★★
Сергей-4030> В смысле, когда имеем только одну точку (или ноль точек), то тогда масштаб не определен? Четвертый параметр просто имя точки.

Это две разные особенности. :) Если я правильно понял намерения Татарина, то у это не у точки имя, а у набора точек имя. Поэтому можно целый набор и похерить. В частности, можно давать X координату в качестве имени, тогда удалять будем по столбцам, а, если Y, то по строкам.

Вторая особенность — не задан алгоритсм масштабирования. Поэтому я и говорю, что достаточно рисовать одну точку. Требования спецификации по масштабированию и перерисовки легко соблюсти. :F
   
US Сергей-4030 #26.08.2008 22:43  @Mishka#26.08.2008 22:25
+
-
edit
 

Сергей-4030

исключающий третье
★★
Сергей-4030>> В смысле, когда имеем только одну точку (или ноль точек), то тогда масштаб не определен? Четвертый параметр просто имя точки.
Mishka> Это две разные особенности. :) Если я правильно понял намерения Татарина, то у это не у точки имя, а у набора точек имя. Поэтому можно целый набор и похерить. В частности, можно давать X координату в качестве имени, тогда удалять будем по столбцам, а, если Y, то по строкам.

Вроде как все-таки нет, Татарин имел в виду, что у каждой точки свое имя.

Mishka> Вторая особенность — не задан алгоритсм масштабирования. Поэтому я и говорю, что достаточно рисовать одну точку. Требования спецификации по масштабированию и перерисовки легко соблюсти. :F

Насколько я понял (и вроде, Татарин подтвердил), надо отображать прямоугольник (minx,miny,maxx,maxy) где minx - минимальная координата x среди всех точек и т.п в прямоугольник (0,0,factx,facty) где factx<=ширина окна, facty<=высота окна, и factx*facty - максимально для заданных ограничений. Само преобразование должно быть вида:

fx(x) = a*x + b1
fy(y) = a*y + b2

т.е. должно быть линейным и юниформным для обеих координат.
   
RU Balancer #27.08.2008 12:44  @Реконструктор#26.08.2008 12:17
+
-
edit
 

Balancer

администратор
★★★★★
Реконструктор> Гм... Стоит ли делать новый виток?...

Это не виток, это я просто нарезаю разжиревшую тему.
   
1 7 8 9 10 11 12 13

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru