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

в функциональных языках дял этого используется специальный тип 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
nil для записи
    #39790030
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНу так nil и возвращай.

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

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

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

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

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

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

только это

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

А не так, как сейчас в Delphi RTL - половина функций возвращает/принимает TArray<string>, а половина - TStringDynArray;
И несмотря на буквально совпадающее определение типов - взаимодействовать отказываются (без явного тайпкаста в каждом поле)
...
Рейтинг: 0 / 0
nil для записи
    #39790120
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если запись со значениями по умолчанию считать пустой, то можно Result := Default(TMyRec);
Ну или флаг в записи сделать True или False... Default всегда положит туда False, а при возврате реально класть True
...
Рейтинг: 0 / 0
nil для записи
    #39790135
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В зависимости от содержимого записи можно использовать "пустую" константу типа 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
nil для записи
    #39790143
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем случае, все равно должна быть определена константа недопустимой записи. Если при возврате индекса недопустимое значение по логике само определяется как -1, то в случае записи его придется определять отдельно для каждого типа записи. Собственно, как и для любого другого типа внутри контейнера - любое значение, которое принимает тип, допустимо и как элемент контейнера.
...
Рейтинг: 0 / 0
nil для записи
    #39790148
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2любое значение, которое принимает тип, допустимо и как элемент контейнера.
Собственно, именно поэтому существует два типа методов поиска -
* IndexOf: 0..N если успех и -1 если не найдено
* Find: <T> если успех и exception если не найдено.
Т.к. привыкнув писать list.Find(some condition).SomeField := foo, можно больно получить по шапке загадочным AV в случае ненахождения элемента.
...
Рейтинг: 0 / 0
nil для записи
    #39790155
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Собственно, именно поэтому существует два типа методов поиска
Я давно принял для себя соглашение: метод FindXXXXX возвращает XXXXX либо nil, метод GetXXXXX возвращает XXXXX либо exception. Как правило, Get реализован через Find. Но в результате чертовски удобно, универсально, читабельно и при необходимости одно легко меняется на другое, не трогая окружающего кода.
...
Рейтинг: 0 / 0
nil для записи
    #39790182
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВасилий 2Собственно, именно поэтому существует два типа методов поиска
Я давно принял для себя соглашение: метод FindXXXXX возвращает XXXXX либо nil, метод GetXXXXX возвращает XXXXX либо exception. Как правило, Get реализован через Find. Но в результате чертовски удобно, универсально, читабельно и при необходимости одно легко меняется на другое, не трогая окружающего кода.
Да, нормально, только предполагает nil-уемость результата (а также недопустимость nil в контейнере). Т.е. для XML, например, - хорошо, а вот для списка с любыми возможными элементами не подойдет
...
Рейтинг: 0 / 0
nil для записи
    #39790210
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochСмотря буквари чего.

Для функциональных языков, где указателей нет вообще, и как следствие нет никаких nil и Nullable<T>, в букварях пишут про тип Option<T> :-)в тру-функциональщине это называется Алгебраический тип данных
но тормозит это тоже нехило, так что от лукавого
даром не нать такого в системных языках
...
Рейтинг: 0 / 0
nil для записи
    #39790321
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
nil для записи
    #39791439
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2* Find: <T> если успех и exception если не найдено.
Т.к. привыкнув писать list.Find(some condition).SomeField := foo, можно больно получить по шапке загадочным AV в случае ненахождения элемента.

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

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

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

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

AV - это если оно nil возвращает, а по вашему оно "возвращает" exception
Я имел в виду, если возвращать nil или некий невалид
...
Рейтинг: 0 / 0
nil для записи
    #39791774
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик СемёнЕсли вы говорите о массиве, то что возвращает функция? Индекс в массиве? Если да, пусть возвращает -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
nil для записи
    #39792624
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)AriochСмотря буквари чего.

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

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


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