Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / nil для записи / 24 сообщений из 24, страница 1 из 1
22.03.2019, 13:15
    #39790016
amadeus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
Есть ли что-то аналогичное nil для записей? Нужно возвратить из функции nil в том случае, если в массиве записей отсутствует значение с указанным индексом.
...
Рейтинг: 0 / 0
22.03.2019, 13:18
    #39790023
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
Ну так nil и возвращай. Только результат функции объяви как указатель.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.03.2019, 13:22
    #39790028
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
нет

в функциональных языках дял этого используется специальный тип Option - по сути запись + флаг её наличия, но при этом разные типы данных - https://en.wikipedia.org/wiki/Option_type

в языках типа C# используется Nullable<T>, и его портировали в Delphi например в составе Spring4D
Но это не совсем то: http://twistedoakstudios.com/blog/Post1130_when-null-is-not-enough-an-option-type-for-c


Можно просто возвращать указатель на запись.
Включи типизированные указатели (давно пора в Delphi их по умолчанию включать) и радуйся жизни. Единственное только - надо будет заморачиваться с освобождением памяти. Как там у нас с деструкторами record'ов?

Я иногда даже в var-параметры nil передаю. Хак, конечно, но иногда удобный.
...
Рейтинг: 0 / 0
22.03.2019, 13:22
    #39790030
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
Dimitry SibiryakovНу так nil и возвращай.

он же из функции хочет - память может потечь....

это ж вам не Rust, это Delphi, явного "хозяина" у переменных нет
...
Рейтинг: 0 / 0
22.03.2019, 13:47
    #39790041
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
Если тебе кровь из носу надо знать о null - функция должна возвращать boolean, а сам рекорд выводи в out параметер.

А так, nullable типы толькотв следующей дельфе обещают.
...
Рейтинг: 0 / 0
22.03.2019, 13:53
    #39790045
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
если даже и сделают, наждежнее все равно со стороны брать, по крайней мере в первый 5 лет
...
Рейтинг: 0 / 0
22.03.2019, 14:04
    #39790050
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
rgreatnullable типы толькотв следующей дельфе обещают.

Эти nullable типы ничто иное как запись в булевским "нет значения" и собственно
пользовательским типом. С тем же успехом он может добавить флаг "облом" в свою собственную
запись уже сейчас.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.03.2019, 14:23
    #39790075
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
rgreatА так, nullable типы толькотв следующей дельфе обещают.
Какой только гадости ни тащат...
...
Рейтинг: 0 / 0
22.03.2019, 14:25
    #39790082
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
amadeusЕсть ли что-то аналогичное nil для записей? Нужно возвратить из функции nil в том случае, если в массиве записей отсутствует значение с указанным индексом.
Парнишка, строчно все бросай и берись за буквари.
...
Рейтинг: 0 / 0
22.03.2019, 14:37
    #39790091
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
Смотря буквари чего.

Для функциональных языков, где указателей нет вообще, и как следствие нет никаких nil и Nullable<T>, в букварях пишут про тип Option<T> :-)
...
Рейтинг: 0 / 0
22.03.2019, 14:44
    #39790097
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
Dimitry Sibiryakovrgreatnullable типы толькотв следующей дельфе обещают.

Эти nullable типы ничто иное как запись в булевским "нет значения" и собственно
пользовательским типом. С тем же успехом он может добавить флаг "облом" в свою собственную
запись уже сейчас.

только это

1) стандартный унифицированный способ "добавить флаг"
2) стандартная ошибка при попытке использовать отсутсвующее значение
3) использование значения по стандартному имени, или вообще без имени (implicit type-cast)

А не так, как сейчас в Delphi RTL - половина функций возвращает/принимает TArray<string>, а половина - TStringDynArray;
И несмотря на буквально совпадающее определение типов - взаимодействовать отказываются (без явного тайпкаста в каждом поле)
...
Рейтинг: 0 / 0
22.03.2019, 15:00
    #39790120
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
Если запись со значениями по умолчанию считать пустой, то можно Result := Default(TMyRec);
Ну или флаг в записи сделать True или False... Default всегда положит туда False, а при возврате реально класть True
...
Рейтинг: 0 / 0
22.03.2019, 15:15
    #39790135
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
В зависимости от содержимого записи можно использовать "пустую" константу типа const NullMyRec: TMyRec = (); и функцию/метод IsNull(const rec: TMyRec), которая бы проверяла наличие необходимых полей, буде таковые имеются. Общего рецепта нет (ну, вернее, возвращать-то можно, а вот проверка на пустоту исключительно на самом юзере). Также можно вместо нулевой константы, если она допустима, взять запись, забитую невалидными данными. Например, $FF-ами - но - это только если в записи нет управляемых типов.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
type
  TRec = record
    a: byte;
    s: Double;
  end;
  PRec = ^TRec;
const
  InvRec: TRec = (); // будет заполнена позже

implementation

{$R *.dfm}

function IsInvRec(const rec: TRec): Boolean;
begin
  Result := CompareMem(@rec, @InvRec, SizeOf(TRec));
end;

// функция, которая может вернуть невалидную запись
function GetRec: TRec;
begin
  Result := InvRec;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
  r: TRec;
begin
  FillChar(PRec(@InvRec)^, SizeOf(TRec), $FF); // иниц константу; для реального кода надо в секцию init модуля
  r := GetRec;
  if IsInvRec(r) then ShowMessage('Boo');
end;
...
Рейтинг: 0 / 0
22.03.2019, 15:22
    #39790143
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
В общем случае, все равно должна быть определена константа недопустимой записи. Если при возврате индекса недопустимое значение по логике само определяется как -1, то в случае записи его придется определять отдельно для каждого типа записи. Собственно, как и для любого другого типа внутри контейнера - любое значение, которое принимает тип, допустимо и как элемент контейнера.
...
Рейтинг: 0 / 0
22.03.2019, 15:27
    #39790148
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
Василий 2любое значение, которое принимает тип, допустимо и как элемент контейнера.
Собственно, именно поэтому существует два типа методов поиска -
* IndexOf: 0..N если успех и -1 если не найдено
* Find: <T> если успех и exception если не найдено.
Т.к. привыкнув писать list.Find(some condition).SomeField := foo, можно больно получить по шапке загадочным AV в случае ненахождения элемента.
...
Рейтинг: 0 / 0
22.03.2019, 15:31
    #39790155
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
Василий 2Собственно, именно поэтому существует два типа методов поиска
Я давно принял для себя соглашение: метод FindXXXXX возвращает XXXXX либо nil, метод GetXXXXX возвращает XXXXX либо exception. Как правило, Get реализован через Find. Но в результате чертовски удобно, универсально, читабельно и при необходимости одно легко меняется на другое, не трогая окружающего кода.
...
Рейтинг: 0 / 0
22.03.2019, 16:05
    #39790182
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
softwarerВасилий 2Собственно, именно поэтому существует два типа методов поиска
Я давно принял для себя соглашение: метод FindXXXXX возвращает XXXXX либо nil, метод GetXXXXX возвращает XXXXX либо exception. Как правило, Get реализован через Find. Но в результате чертовски удобно, универсально, читабельно и при необходимости одно легко меняется на другое, не трогая окружающего кода.
Да, нормально, только предполагает nil-уемость результата (а также недопустимость nil в контейнере). Т.е. для XML, например, - хорошо, а вот для списка с любыми возможными элементами не подойдет
...
Рейтинг: 0 / 0
22.03.2019, 16:55
    #39790210
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
AriochСмотря буквари чего.

Для функциональных языков, где указателей нет вообще, и как следствие нет никаких nil и Nullable<T>, в букварях пишут про тип Option<T> :-)в тру-функциональщине это называется Алгебраический тип данных
но тормозит это тоже нехило, так что от лукавого
даром не нать такого в системных языках
...
Рейтинг: 0 / 0
22.03.2019, 22:17
    #39790321
Foxpc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
Dimitry SibiryakovНу так nil и возвращай. Только результат функции объяви как указатель.


+

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function Test(i : integer) : PData;
begin
   if i = 1 then
     result := @data;
   else
     result := nil;
end;

...
var
 a : PData;

a := Test(x);
if a <> nil then
   ... a.data;
...
Рейтинг: 0 / 0
26.03.2019, 12:53
    #39791439
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
Василий 2* Find: <T> если успех и exception если не найдено.
Т.к. привыкнув писать list.Find(some condition).SomeField := foo, можно больно получить по шапке загадочным AV в случае ненахождения элемента.

Откуда тут AV возьмётся ?

AV - это если оно nil возвращает, а по вашему оно "возвращает" exception
...
Рейтинг: 0 / 0
26.03.2019, 15:18
    #39791607
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
amadeusЕсть ли что-то аналогичное nil для записей? Нужно возвратить из функции nil в том случае, если в массиве записей отсутствует значение с указанным индексом.

Если вы говорите о массиве, то что возвращает функция? Индекс в массиве? Если да, пусть возвращает -1 если не нашла.
...
Рейтинг: 0 / 0
26.03.2019, 17:57
    #39791771
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
AriochВасилий 2* Find: <T> если успех и exception если не найдено.
Т.к. привыкнув писать list.Find(some condition).SomeField := foo, можно больно получить по шапке загадочным AV в случае ненахождения элемента.

Откуда тут AV возьмётся ?

AV - это если оно nil возвращает, а по вашему оно "возвращает" exception
Я имел в виду, если возвращать nil или некий невалид
...
Рейтинг: 0 / 0
26.03.2019, 18:04
    #39791774
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
Кроик СемёнЕсли вы говорите о массиве, то что возвращает функция? Индекс в массиве? Если да, пусть возвращает -1 если не нашла.
Очевидно, что ТС хочет Container.Find: TRecord

Вообще поскольку за возвратом "нулевого" или "невалидного" значения записи, скорее всего, последует проверка на "нулевость", особой проблемы не наблюдаю.
Как, имхо, хочет ТС
Код: pascal
1.
2.
3.
4.
var rec: TRec;
..
rec := Container.Find(condition);
if not IsNullRec(rec) then...



Как это можно сделать без всяких хаков и усилий и даже короче
Код: pascal
1.
2.
3.
var rec: TRec;
..
if not Container.Find(condition, rec) then...



А вообще классическая ситуация - ТС куда-то слился, а старожилы вторую неделю что-то между собой пережевывают))
...
Рейтинг: 0 / 0
27.03.2019, 21:37
    #39792624
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nil для записи
kealon(Ruslan)AriochСмотря буквари чего.

Для функциональных языков, где указателей нет вообще, и как следствие нет никаких nil и Nullable<T>, в букварях пишут про тип Option<T> :-)в тру-функциональщине это называется Алгебраический тип данных
но тормозит это тоже нехило, так что от лукавого
даром не нать такого в системных языкахвот не надо придумывать. ADT это несущественные накладные расходы, как возврат структуры - не более

Софтварер выше прав, если есть исключения, АДТ не нужны (они используются вместо)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / nil для записи / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]