Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2022, 15:48   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 478
По умолчанию Массив конкретной длинны в параметрах процедуры

Код:
type
  aaa= array [0..3] of Integer;
Код:
Function ddd(const q: aaa):string;
И дальше пробую разные варианты, но компилятор отказывается принимать все
Код:
  Label2.Caption:=ddd( [1, 2, 3, 4] );
Код:
  Label2.Caption:=ddd(1, 2, 3, 4);
Код:
  Label2.Caption:=ddd( aaa(1, 2, 3, 4) );
Код:
  Label2.Caption:=ddd( aaa[1, 2, 3, 4] );
Если написать так, то примется первый вариант
Код:
Function ddd(const q: array [0..3] of Integer):string;
А как сделать так, чтобы приняло при конкретной длине массива?
Kronos913 вне форума Ответить с цитированием
Старый 29.09.2022, 20:33   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,174
По умолчанию

https://programlife.ru/delphi/delphi...cpogr281827209
macomics вне форума Ответить с цитированием
Старый 29.09.2022, 20:52   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 478
По умолчанию

Эту статью видео. Но конкретно своего вопроса там не нашел
Kronos913 вне форума Ответить с цитированием
Старый 29.09.2022, 21:01   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,174
По умолчанию

Не читал ее до конца. Думал там есть описание
Код:
procedure myProc(argArr: array of const);
macomics вне форума Ответить с цитированием
Старый 29.09.2022, 22:02   #5
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 478
По умолчанию

Вообще, для чего все это:

Процедуре нужно вызывать под-процедуру. При этом, скопировав туда 4 своих параметра

Так я думаю, объединить эти параметры в массив. Чтобы во внешнюю процедуру передавалось [число1, число2, число3, число4], а во внутреннюю - ссылку на этот массив

Чтобы меньше было операций по дублированию чисел
Kronos913 вне форума Ответить с цитированием
Старый 29.09.2022, 23:52   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,174
По умолчанию

Если количество значений фиксировано, тогда лучше передавать их как параметры. Если число значений больше 3-х, тогда стоит объединить их в структуру и передавать ее по ссылке. В массив объединяются параметры, которые нужны как массив.
macomics вне форума Ответить с цитированием
Старый 30.09.2022, 16:41   #7
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 478
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Если число значений больше 3-х, тогда стоит объединить их в структуру и передавать ее по ссылке.
Через массив? Или как?
Kronos913 вне форума Ответить с цитированием
Старый 30.09.2022, 16:46   #8
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,174
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Через массив? Или как?
В структуру это значит в структуру. Массив это значит массив. Я предельно точно выразился.

Код:
type
  TRecord = record // Структура выровненная на 4 байта или 8 байт для 64-битных компиляторов
    value1: Byte; // 1 байт
    value2: Integer; // 4 байта
    value3: SmallInt; // 2 байта
    value4: LongInt; // 4 байта
    value5: Int64; // 8 байта
    value6: Extended; // 10 байта
    value7: Cardinal; // 4 байта
  end; // 40 байт
  TPackedRecord = packed record // Структура выровненная на 1 байт
    value1: Byte; // 1 байт
    value2: Integer; // 4 байта
    value3: SmallInt; // 2 байта
    value4: LongInt; // 4 байта
    value5: Int64; // 8 байта
    value6: Extended; // 10 байта
    value7: Cardinal; // 4 байта
  end; // 33 байт

// Или наоборот (выравнивание). Надо перепроверить. WinAPI используют преимущественно packed record, а там все выравнено вручную (используются зарезервированные поля)
Код:
type
  TArray = array [0 .. 6] of Integer; // Массив

Последний раз редактировалось macomics; 30.09.2022 в 17:08.
macomics вне форума Ответить с цитированием
Старый 30.09.2022, 17:22   #9
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 478
По умолчанию

Только вопрос в том, как сделать так, чтобы можно было или массив, или рекорд сформировать не отдельно перед вызовом, а в строке вызова процедуры?
Kronos913 вне форума Ответить с цитированием
Старый 30.09.2022, 17:31   #10
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,174
По умолчанию

Для формирования Record используйте inline функцию. Для массива -

Цитата:
Сообщение от macomics Посмотреть сообщение
Код:
procedure myProc(argArr: array of const);
или
Код:
procedure myProc(var Buffer);
macomics вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Варианты параметров (Строка или массив строк в параметрах) Kronos913 Общие вопросы Delphi 1 07.02.2022 21:35
TStrings в параметрах Kronos913 Общие вопросы Delphi 8 21.05.2021 22:43
Об использовании this в параметрах методов hoz Общие вопросы .NET 10 13.12.2015 18:50
Объекты в параметрах функций romantik2011 PHP 3 28.07.2011 21:07
Как проверить наличие в конкретной папке DLL, а потом на вход каждой подать массив байт,и на выходе тоже. Sanches_Ramires Общие вопросы .NET 1 02.02.2009 15:02