Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно вызывать функцию, возвращающую дин. Функция, возвращающая динамический масси 
V
    Опции темы
Juice
Дата 24.12.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 13.1.2007

Репутация: нет
Всего: нет



Господа, подскажите, как правильно вызвать функцию, возвращающую динамический массив значений?
Подробнее: надо создать функцию (только чур не подсказывать  smile ), которая бы резала строку по определённым позициям.
Вижу это так:

Код

function SplitByPos (st: string; ar: array of integer):array of string


В самой программе
Код

var MyAr, SimpleAr: array of integer;
...
begin
   SetLength(MyAr,0);
   SetLength(SimpleAr, 2);
   SimpleAr[0]:= 2;
   SimpleAr[1]: = 5;
   MyAr:=splitByPos ('Исходная строка', SimlpeAr);
end;

По моей логике в MyAr должно содержаться 'Ис', 'ход', 'ная строка'.
Это я описАл, как по моему мнению должно работать. На самом деле этот вариант не работает. Тест и номер ошибки не привожу, т.к., мне кажется это не суть важно из-за того, что я либо неправильно объявляю, либо неправильно вызываю. Пытаюсь это в D7 сделать.
PM MAIL   Вверх
profesiachuvak
Дата 24.12.2009, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

Репутация: 1
Всего: 4



Цитата(Juice @  24.12.2009,  23:15 Найти цитируемый пост)
Тест и номер ошибки не привожу


Так а как нам понять, в чём ошибка? Телепатически? С точки зрения синтаксиса тут всё правильно smile 
Хотелось бы увидеть ошибку  и текст самой функции:
 
Код

function SplitByPos (st: string; ar: array of integer):array of string




--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
volvo877
Дата 24.12.2009, 23:43 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 9
Всего: 116



Цитата(profesiachuvak @  24.12.2009,  22:33 Найти цитируемый пост)
С точки зрения синтаксиса тут всё правильно
Неправда... ОТКРЫТЫЙ и ДИНАМИЧЕСКИЙ массив - это совсем разные вещи...
Код
Type
  arrInt = array of integer;
  arrStr = array of string;
function SplitByPos (st: string; ar: arrInt): arrStr;
Вот теперь - правильно (для того куска кода, который привел автор...)
PM MAIL   Вверх
Juice
Дата 25.12.2009, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 13.1.2007

Репутация: нет
Всего: нет



volvo877, удивляюсь, почему у тебя плюсов так мало. Спасибо, заработало.
А не подскажешь ещё синтаксис, как вызвать функцию без передачи ей в качестве параметров предварительно заполненного массива, а задавая конкретные значения? Например 
Код

AnyArray:=SplitByPos (st: string; 2, 5, 7);

PM MAIL   Вверх
Snowy
Дата 25.12.2009, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Код
AnyArray:=SplitByPos (st, [2, 5, 7]);

PM MAIL   Вверх
profesiachuvak
Дата 25.12.2009, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

Репутация: 1
Всего: 4



Цитата(volvo877 @  24.12.2009,  23:43 Найти цитируемый пост)
Неправда... ОТКРЫТЫЙ и ДИНАМИЧЕСКИЙ массив - это совсем разные вещи...


volvo877, В функцию нужно отправлять только динамический массив?




--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
volvo877
Дата 25.12.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 9
Всего: 116



Цитата(profesiachuvak @  25.12.2009,  13:12 Найти цитируемый пост)
В функцию нужно отправлять только динамический массив?
Это автору виднее... Хочешь - отправляй динамический, хочешь - нет...

Но уж если он отправляет динамический (что видно из его кода), то функция должна ожидать динамический, правда? Что для этого надо сделать - я написал выше.

PM MAIL   Вверх
profesiachuvak
Дата 25.12.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

Репутация: 1
Всего: 4



Цитата(volvo877 @  25.12.2009,  14:34 Найти цитируемый пост)
Но уж если он отправляет динамический (что видно из его кода), то функция должна ожидать динамический, правда? Что для этого надо сделать - я написал выше.

Понятно, то есть как решение проблемы можно было описать массив так :
Код

var MyAr, SimpleAr: array [0..3] of integer;

Или описание фун-ции SplitByPos от этого тоже изменилось?


--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
Juice
Дата 25.12.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 13.1.2007

Репутация: нет
Всего: нет



Просто хочется сделать универсальную функцию. Например, если тебе надо разбить строку на две (по определённой позиции), то надо писать функцию SplitNumberOne, где у тебя происходит разбивка на 2 подстроки. Следующую строку надо бить на четыре (по определённой позиции), опять пишем функцию SplitNumberTwo, бьющую входящую строку на 4 подстроки. 
Ну так вот, что бы не писать эти множество функций, проще сделать универсальную функцию, которой передаёшь исходную строку и номера позиций в ней, а она будет возвращать необходимое количество подстрок.
Кроме как передавать функции динамический массив целых, а та, в свою очередь, возвратит динамический массив строк, я не знаю как достичь этой универсальности. А если использовать 
Код
var MyAr, SimpleAr: array [0..3] of integer;
, то это только для частного случая, который, как я написал, не интересует.
PM MAIL   Вверх
Qu1nt
Дата 25.12.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Код

procedure SplitByPos(const Text: AnsiString; const Args: array of const; List: TStringList);
var
  Value: TVarRec;
begin
  if not Assigned(List) then
    { epic fail }
    Exit;
  for Value in Args do
    if Value.VType = vtInteger then
      { do something }
      List.Add(IntToStr(Value.VInteger))
    else
      { fail }
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  List: TStringList;
  Item: AnsiString;
begin
  List := TStringList.Create;
  try
    SplitByPos('text', [1, '2', 3, 4, 5], List);
    for Item in List do
      ShowMessage(Item);
  finally
    List.Free;
  end;
end;


Это сообщение отредактировал(а) Qu1nt - 25.12.2009, 19:36
PM MAIL   Вверх
profesiachuvak
Дата 25.12.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

Репутация: 1
Всего: 4



Цитата(Juice @  25.12.2009,  18:48 Найти цитируемый пост)
то это только для частного случая

Конечно. Динамический массив универсальнее.


--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
bems
Дата 26.12.2009, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(volvo877 @  25.12.2009,  14:34 Найти цитируемый пост)
Но уж если он отправляет динамический (что видно из его кода), то функция должна ожидать динамический, правда?
Не совсем. Если ожидается открытый, то можно передать дианмический. В этом случае и 
Цитата(Snowy @  25.12.2009,  12:42 Найти цитируемый пост)
AnyArray:=SplitByPos (st, [2, 5, 7]);

будет работать. 



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Juice
Дата 26.12.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 13.1.2007

Репутация: нет
Всего: нет



Вызов процедуры вида 
Код

temp2:=SplitByPos('asdf+123456=idkn', [1,3,7]);

не получается. 
Ошибка "[Error] Unit1.pas(39): Incompatible types: 'Set' and 'ArrInt'", ArrInt = array of integer;


Это сообщение отредактировал(а) Juice - 26.12.2009, 17:14
PM MAIL   Вверх
bems
Дата 26.12.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Я ж говорю, окрытый объявляй


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Qu1nt
Дата 26.12.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Чем мой пример не понравился?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0966 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.