OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 21:33

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




Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 22 Июнь, 2010 15:01 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Sql/Docu/DB писал(а):
PROCEDURE (t: Table) Read (row: INTEGER; VAR data: ANYREC)
NEW, ABSTRACT
Reads the row'th row of the result table into the interactor data.
... Pointers must not be NIL with the exception of POINTER TO ARRAY OF CHAR. If such a pointer is NIL or the bound array is too small to receive the corresponding string, a new array of suitable length is allocated automatically...
Говорится, что новый литерный массив создаётся автоматически если исходный либо NIL, либо неподходяще малого размера.

Однако, абстрактный интерфейс SqlDrivers таков, что массивы будут создаваться всегда
Цитата:
DEFINITION SqlDrivers;

...
String = POINTER TO ARRAY OF CHAR;

Table = POINTER TO ABSTRACT RECORD
...
(t: Table) ReadVarString (row, column: INTEGER; OUT str: String), NEW, ABSTRACT
END;
В SqlOdbc3.Table.ReadVarString есть замечание:
Цитата:
IF str = NIL THEN NEW(str, 1) END; (* allow recycling of string by making parameter a VAR again? *)
Т.е. так было сделано специально. Есть мысли, почему?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Июнь, 2010 17:15 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Введение OUT-ссылки в язык было ошибкой: проконтролировать либо невозможно, либо надо поменять язык так, что станет не эффективно (как в C#). Вон в Обероне-07 есть только VAR и CONST ссылки и это правильно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Июнь, 2010 18:09 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Нда, пожалуй...
но у меня такое подозрение, что IN и OUT чисто косметический эффект имеют, а так - оба эквивалент VAR... можно в компилятор глянуть.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Июнь, 2010 18:12 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
OUT указатели зануляются

дописал:
IN - косметич. экв-н VAR (CONST в О7)
OUT - приводит к генерации доп. кода (инициализация указателей нулями), поэтому не эквив-н.

С тем, что без неявных занулейний лучше и достаточно только CONST/VAR - согласен. Уже наступал на грабли, когда ожидал зануления OUT BOOLEAN-а


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Июнь, 2010 18:16 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
При входе?
Тогда проверка может быть на NIL при выходе, в принципе... это не накладно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 23 Июнь, 2010 11:49 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Зачем рантаймовая проверка на NIL при выходе?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 23 Июнь, 2010 12:02 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Не понял, для чего.

NIL - одно из допустимых значений указателя.
Значит, через OUT-параметр я имею право вернуть и NIL, в том числе. Более того, многие процедуры так и делают (CommStreams.NewStream, например).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 23 Июнь, 2010 13:29 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Наверное следует пояснить, что в общем случае процедуре не всегда удаётся создать объект, который следует вернуть в OUT-параметре. В этом случае процедура вернёт NIL. Проверка может понадобиться в вызывающем блоке, после вызова процедуры.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 8 ] 

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


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB