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

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

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

Восстановить пароль

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 16.05.2012, 21:04   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию Получить в ответ от функции массив

Задача:
Передать функции данные в переменной типа string, которая содержит в себе: 000#001#002#003#. Функция должна прислать в ответ массив с переменными типа string и прочими если они есть. Примерный вид:
mas[].txt0 := 000;
mas[].txt1 := 001;
mas[].txt2 := 002;
mas[].txt3 := 003;
mas[].txt4 := True;
Далее в процедуре, из которой вызывали функцию пройтись по полученному массиву и раскидать данные.

Код:
type
  TMyData = record
    txt0: string;
    txt1: string;
    txt2: string;
    txt3: string;
    bool: Boolean;
  end;
...
function Test(s: string): {Возврат массива. Как прописать?};
var
  i: Integer;
begin
  // Парсинг
  i := High(MyData) + 2;
  SetLength(MyData, i);

  Mas[i].txt0 := Copy(s, 1, Pos('#', s) - 1);
  Delete(s, 1, Pos('#', s));
  Mas[i].txt1 := Copy(s, 1, Pos('#', s) - 1);
  Delete(s, 1, Pos('#', s));
  Mas[i].txt2 := Copy(s, 1, Pos('#', s) - 1);
  Delete(s, 1, Pos('#', s));
  Mas[i].txt3 := Copy(s, 1, Pos('#', s) - 1);
  Delete(s, 1, Pos('#', s));
  Mas[i].bool := StrToBool(Copy(s, 1, Pos('#', s) - 1));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Test('000#001#002#003#0#');
end;
Shouldercannon вне форума
Старый 16.05.2012, 21:08   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
type TMyDataArr =array of TMyData;

function Test(s: string): TMyDataArr;
begin
  setlength(result, ...);
.....
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума
Старый 16.05.2012, 22:27   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Код:
TMyDataArr = array of TMyData;
Undeclared identifier: 'TMyData'
Shouldercannon вне форума
Старый 16.05.2012, 22:35   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

TMyDataArr = array of Integer; //или другого дельфийского или вашего типа

ADD увидел ваш TMyData. Обїявление TMyDataArr после объявления TMyData поставьте
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.05.2012 в 22:37.
Аватар вне форума
Старый 16.05.2012, 22:47   #5
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
ADD увидел ваш TMyData. Обїявление TMyDataArr после объявления TMyData поставьте
Тобишь местами поменять?
Код:
TMyData = array of TMyDataArr;
Код:
type
  TMyDataArr = array of string;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Test(s: string): TMyDataArr;
var
  i: Integer;
begin
  SetLength(Result, 0);

  i := High(Result) + 2;
  SetLength(Result, i);
  Result[i - 1] := Copy(s, 1, Pos('@', s) - 1);
  Delete(s, 1, Pos('@', s));

  i := High(Result) + 2;
  SetLength(Result, i);
  Result[i - 1] := Copy(s, 1, Pos('#', s) - 1);
  Delete(s, 1, Pos('#', s));

  i := High(Result) + 2;
  SetLength(Result, i);
  Result[i - 1] := Copy(s, 1, Pos('$', s) - 1);
  Delete(s, 1, Pos('$', s));

  i := High(Result) + 2;
  SetLength(Result, i);
  Result[i - 1] := Copy(s, 1, Pos('%', s) - 1);
  Delete(s, 1, Pos('%', s));

  i := High(Result) + 2;
  SetLength(Result, i);
  Result[i - 1] := Copy(s, 1, Pos('&', s) - 1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Test('000@001#002$003%0&');
end;
С функцией на половину разобрался. Теперь нужно в процедуре данные из массива разложить по полочкам. Понимаю, что и в процедуре нужно создать массив и пробежаться по нему.

Последний раз редактировалось Shouldercannon; 17.05.2012 в 00:27.
Shouldercannon вне форума
Старый 17.05.2012, 10:23   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Я бы написал примерно так:
Код:
function Test(s: string): TMyDataArr;
var
  i, L: Integer;
  Cut: string;
begin
  SetLength(Result, 0); // сомневаюсь что надо, но ибо резалт лок. перем., лучше оставим
  Cut := '';
  for i := 1 to Length(s) do
  if s[i] in ['@', '#', '$', '%', '&'] then // если надо, подбавить разделителей
  begin
    L := Length(Result);
    SetLength(Result, L + 1);
    Result[L] := Cut;
    Cut := '';
  end
  else
    Cut := Cut + S[i];
end;
phomm вне форума
Старый 17.05.2012, 11:01   #7
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Хороший пример. Теперь загвостка в рассортировке данных, полученный в виде массива из функции в процедуре, из которой вызывали функцию. Для процедуры тоже нужно создавать массив?

Последний раз редактировалось Shouldercannon; 17.05.2012 в 12:22.
Shouldercannon вне форума
Старый 17.05.2012, 11:14   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Нет, значение из функции надо присвоить переменной этого же типа, и обращаться с полученным массивом через эту переменную.
phomm вне форума
Старый 17.05.2012, 11:25   #9
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  Answer: array of string;
  i: Integer;
begin
  SetLength(Answer, 2);
  Answer := Test('000@001#002$003%0&'); // Incompatible types
end;
Бред с ошибкой.

Последний раз редактировалось Shouldercannon; 17.05.2012 в 11:50.
Shouldercannon вне форума
Старый 17.05.2012, 13:51   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
Answer: array of string;
...
Цитата:
Код:
function Test(s: string): TMyDataArr;
Цитата:
Бред с ошибкой.
ну разумеется. типы то РАЗНЫЕ.
Это раз. а во-вторых, размер массива уже задаётся в самой функции..
попробуйте так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  Answer: TMyDataArr ;
begin
  Answer := Test('000@001#002$003%0&'); 
end;

p.s. код не проверял...
Serge_Bliznykov вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить полный ответ от Socket Shouldercannon Работа с сетью в Delphi 3 09.03.2012 23:05
Отправить и получить ответ Andrey85 Работа с сетью в Delphi 1 03.01.2011 02:58
Получить ответ сервера TWebBrowser. .while Работа с сетью в Delphi 2 13.07.2010 20:51
Как получить из функции массив LOST94 Общие вопросы C/C++ 6 28.03.2010 13:47
Отправить AT команду модему и получить ответ Никки Общие вопросы Delphi 3 24.06.2008 17:15