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

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

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2015, 14:12   #1
SeemaN_tm
Пользователь
 
Регистрация: 03.02.2011
Сообщений: 16
По умолчанию Передача массива в функцию.

Всем привет. Не уверен, но всё же надеюсь что вы сможете мне в этом помочь.

Вот сам код:
Код:
program Project5;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type ArrayOfByte = Array Of Byte;

Function math1(Const a: Array Of Byte): Integer;
Var Index: Integer;
  Begin
    Result := 0;
    for Index := Low(a) to high(a) do
        Inc(Result, a[Index]);
  End;

Function math2(Const a: ArrayOfByte): Integer;
Var Index: Integer;
  Begin
    Result := 0;
    for Index := Low(a) to high(a) do
        Inc(Result, a[Index]);
  End;


begin
  Writeln('Math1: '+IntToStr(Math1([1,2,3,4,5,6,7,8,9])));
//  Writeln('Math2: '+IntToStr(Math2([1,2,3,4,5,6,7,8,9])));
  sleep(5000);
end.
Подскажите, что нужно для того, чтоб функцию Math2 можно было бы вызвать как Math1 и возможно ли вообще что то реализовать подобное ?

Последний раз редактировалось Stilet; 11.02.2015 в 14:15.
SeemaN_tm вне форума Ответить с цитированием
Старый 11.02.2015, 14:28   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

попробуйте приведение типов AttayOfByte([...])
Человек_Борща вне форума Ответить с цитированием
Старый 11.02.2015, 14:35   #3
SeemaN_tm
Пользователь
 
Регистрация: 03.02.2011
Сообщений: 16
По умолчанию

Это пробовалось, ругается.
[DCC Error] Project5.dpr(28): E2089 Invalid typecast
SeemaN_tm вне форума Ответить с цитированием
Старый 11.02.2015, 15:04   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Math2(VarArrayOf([1,2,3,4,5,6,7,8,9]))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.02.2015, 16:58   #5
SeemaN_tm
Пользователь
 
Регистрация: 03.02.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Math2(VarArrayOf([1,2,3,4,5,6,7,8,9]))
Я не понял, это оператор встроенный в делфи или же предлагаешь написать отдельную функцию ?
Если оператор, то подскажи что подключаешь в Uses

Я пока что сделал так:
Код:
program Project5;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type ArrayOfByte = Array Of Byte;
type ArrayOfByte2x = Array Of Array Of Byte;

Function math1(Const a: Array Of Byte): Integer;
Var Index: Integer;
  Begin
    Result := 0;
    for Index := Low(a) to high(a) do
        Inc(Result, a[Index]);
  End;

Function math2(Const a: Array of ArrayOfByte): Integer;
Var Index: Integer;
Var dIndex: Integer;
  Begin
    Result := 0;
    WriteLn(IntToStr(LenGth(a)));
    WriteLn(IntToStr(LenGth(a[0])));
    for Index := Low(a) to high(a) do
      for dIndex := Low(a[Index]) to High(a[Index]) do
         Inc(Result, a[Index, dIndex]);
  End;

Function SetToArrayOfByte (Const a: Array Of Byte): ArrayOfByte;
  Begin
    SetLenGth(Result, LenGth(a));
    Move(a[0],Result[0],Length(Result));
  End;


begin
  Writeln('Math1: '+IntToStr(Math1([1,2,3,4,5,6,7,8,9])));
  Writeln('Math2: '+IntToStr(Math2([SetToArrayOfByte([1,2,3,5,6,7,8,9]),SetToArrayOfByte([9,8,7,6,5,4,3,2,1]),SetToArrayOfByte([9,8,7,6,5,4,3,2,1])])));
  sleep(5000);
end.
Так теперь можно указывать двумерный массив функции Math3.
Пока без надобности, но потом думаю продумать как передавать в функцию трёх и более мерные массивы.

Последний раз редактировалось Stilet; 12.02.2015 в 08:07.
SeemaN_tm вне форума Ответить с цитированием
Старый 11.02.2015, 17:08   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

http://valera.asf.ru/delphi/help/nam...ame=VarArrayOf
uses Variants (D7)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.02.2015, 17:43   #7
SeemaN_tm
Пользователь
 
Регистрация: 03.02.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Мне кажется или полезного от этого оператора маловато ?
Считай подключение модуля и увеличение размера кода при использовании этого оператора. Но и на этом благодарю. Посмотрим, может когда нить пригодится.

Так хотелось бы сотворить нечто подобное:
Код:
Function NameFunc(Cons Arr: Array of Array of Byte): Boolean;
И вызывать функцию:
Код:
NameFunc([[1,2],[4,3,8],[98,32],[8],[7,3,10,54,13]])
Кратко и понятно.
SeemaN_tm вне форума Ответить с цитированием
Старый 12.02.2015, 01:04   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

такой вопрос тут уже жевали. искали отличия разных способов передачи данных в качестве аргументов функций: открытые массивы и динамические массивы (даже многомерные).

здесь как раз тот же случай.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 12.02.2015, 01:54   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от SeemaN_tm Посмотреть сообщение
Так хотелось бы сотворить нечто подобное:
Код:
Function NameFunc(Cons Arr: Array of Array of Byte): Boolean;
И вызывать функцию:
Код:
NameFunc([[1,2],[4,3,8],[98,32],[8],[7,3,10,54,13]])
Кратко и понятно.
Имхо, странное какое-то желание. Ну если бы речь шла бы о каком-то интерпретирующем языке. И то в этом случае не совсем понятно такое глубинное (читай подсознательное) желание. Но в Паскале/Дельфи желание вставить в код программы вызов процедуры с параметрами-константами, заданными на этапе написания/компиляции программы? Для чего? Не понимаю.
northener на форуме Ответить с цитированием
Старый 14.02.2015, 00:17   #10
SeemaN_tm
Пользователь
 
Регистрация: 03.02.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Имхо, странное какое-то желание. ......
Ну надеюсь смогу развеять непонимание.
Выше приведённый мною пример был упрощен для понимания того, что меня интересует. Цели, преследуемые таким способом вызова функции опущены за ненадобность, а вот принцип того что мне надо оставлен и на мой взгляд выделен.

Если уж на столько интересно для чего это надо, то поведаю.
Мне нужно было написать функцию, в которую я мог бы передавать некий код и задавать логику её действия.

Собственно в данный момент, функцию которая мне была нужна я уже реализовал.
Дословный ей перевод и смысл - СмещениеКБайту.
Имеет она такой внешний вид.
Код:
Function RollToByte(Const ByteArray: ArrayOfByte; Const ToBytes, fRollBytes, tRollBytes: Array Of ArrayOfByte; Var Index: Integer): Boolean;
В константе ByteArray передаётся сам код, в моём случае это код HTML-страници.
В переменную Index передаю позицию символа с которого начинать, она же используется для получения позиции после выполнения функции.
В константе ToBytes передаются последовательности байтов (символов) до которых проводить "смещение".
В константе fRollBytes (или fromRollByte) и константе tRollByte (или toRollByte) передаются пары последовательностей байтов.

Вот пример её использования при выделении тега из кода HTML-документа.
Код:
        RollToByte(cHTMLCode, [SetArrayOfByte([62{>}])],
                              [SetArrayOfByte([34{"}]),
                               SetArrayOfByte([39{'}]),
                               SetArrayOfByte([40{(}]),
                               SetArrayOfByte([123{фигурная скобка}]),
                               SetArrayOfByte([91{[}]),
                               SetArrayOfByte([47{/},42{*}])
                              ],
                              [SetArrayOfByte([34{"}]),
                               SetArrayOfByte([39{'}]),
                               SetArrayOfByte([41{)}]),
                               SetArrayOfByte([125{обратная фигурная скобка}]),
                               SetArrayOfByte([93{]}]),
                               SetArrayOfByte([42{/},47{*}])
                              ], ReadIndex);
Уверен что вопросов возникло ещё больше, а как с пониманием ?

Последний раз редактировалось SeemaN_tm; 14.02.2015 в 00:20.
SeemaN_tm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача массива в функцию и возврат массива из функции Gstar C# (си шарп) 6 14.10.2012 00:38
Передача массива в функцию Garmon Общие вопросы C/C++ 6 23.09.2012 08:03
передача массива в функцию Fatal Error Общие вопросы C/C++ 7 09.07.2012 17:45
Произведение элементов массива в функции (передача массива в функцию) (Delphi) Toxa16 Помощь студентам 1 23.04.2011 04:42
передача массива в функцию JOFRIF Общие вопросы C/C++ 8 02.08.2009 12:46