Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.09.2012, 10:20
Stal12 Stal12 вне форума
Прохожий
 
Регистрация: 07.09.2012
Сообщения: 1
Репутация: 10
По умолчанию Можно ли решить такую задачу на дельфи?

Есть массивы константы:
WaitModem:array[0..1]of string=('Нет','Есть');
SyncTx:=array[0..2]of string=('Отсутствует','Внутренняя','Внешняя');
И т.п.

Как передать в подпрограмму такой массив, если у них различная длина?
Подпрограмма должна делать примерно следующее:
возвращает строку по нужному индексу:
Result:=NameArray[n]; //например - Внутренняя

Решение с открытыми массивами работает, но овчинка выделки не стоит.
Надо каждый раз задавать длину массива, инициализировать и т.п.
В итоге, куча "лишнего" текста... По длине получается, выгоднее иметь кучу специализированных подпрограмм.
Ответить с цитированием
  #2  
Старый 07.09.2012, 10:25
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Stal12
Есть массивы константы:
WaitModem:array[0..1]of string=('Нет','Есть');
SyncTx:=array[0..2]of string=('Отсутствует','Внутренняя','Внешняя');
И т.п.

Как передать в подпрограмму такой массив, если у них различная длина?
Подпрограмма должна делать примерно следующее:
возвращает строку по нужному индексу:
Result:=NameArray[n]; //например - Внутренняя

Решение с открытыми массивами работает, но овчинка выделки не стоит.
Надо каждый раз задавать длину массива, инициализировать и т.п.
В итоге, куча "лишнего" текста... По длине получается, выгоднее иметь кучу специализированных подпрограмм.
Зачем каждый раз задавать длину массива и что-то там инициализировать?:
Код:
const
  WaitModem:array[0..1]of string=('Нет','Есть');

function Func(A: array of String; Index: Integer): String;
begin
  Result:=A[Index];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Func(WaitModem, 1));
end;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Stal12 (07.09.2012)
  #3  
Старый 07.09.2012, 11:45
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Одно НО - пригодилась бы проверка на выход за границы массива. Иначе пользователь обязательно добьется использования Func(WaitModem, 2). Когда все массивы разной длины, такое вполне может произойти.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #4  
Старый 07.09.2012, 11:47
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Bargest
Одно НО - пригодилась бы проверка на выход за границы массива. Иначе пользователь обязательно добьется использования Func(WaitModem, 2). Когда все массивы разной длины, такое вполне может произойти.
:
Код:
function Func(A: array of String; Index: Integer): String;
begin
  if (Index >= Low(A)) and (Index <= High(A)) then
  begin
    Result := A[Index];
  end else
  begin
    raise Exception.Create('Выход за пределы диапазона');
  end;
end;
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:23.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025