Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Техник
315 / 173 / 26
Регистрация: 09.10.2009
Сообщений: 3,101
1

Использование разных массивов в одной процедуре

28.10.2014, 14:00. Показов 879. Ответов 16
Метки нет (Все метки)

Всем привет, столкнулся с такой задачей:

Есть процедура Redraw_XY(ArrayX,ArrayY);

Где по замыслу ArrayX,ArrayY - это имена массивов, которые могут быть заданы пользователем.

Вопрос в том, как присвоить ArrayX и ArrayY - имя переменной массива ...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2014, 14:00
Ответы с готовыми решениями:

Использование одной Com компоненты в 2 разных формах
Есть задача: надо инициализировать COM-компонент в одной форме, а использовать в другой. Т.е. при...

Использование одной переменной в разных методах + Scanner
Всем привет! Вот решил начать писать на Java. Вот возникли проблемы: 1)Нужно использовать...

Использование одной и той же кнопки в двух разных местах
Существует необходимость использования одной и той же кнопки в двух разных местах, можно ли...

Глобальное определение структур (использование одной структуры в разных юнитах)
Учусь программировать по немногу. Вычитал о том что хорошо иметь отдельный юнит для хранения всех...

16
Native x86
Эксперт Hardware
4901 / 2796 / 821
Регистрация: 13.02.2013
Сообщений: 9,026
28.10.2014, 14:05 2
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
Redraw_XY(const ArrayX, ArrayY: array of Integer);
var
  i: Integer;
begin
  for i:= 0 to Length(ArrayX)-1 do // открытые массивы всегда индексируются с нуля до Length-1
    ...
end;
...
var
  Arr: array[0..10] of Integer;
begin
  Redraw_XY(Arr, [-1, 0, 1, 2, 3]); // пример передачи массива из переменной и константного массива
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31244 / 20423 / 7961
Регистрация: 22.10.2011
Сообщений: 35,455
Записей в блоге: 6
28.10.2014, 14:07 3
На кой Length() - 1, есть есть High()?
0
Native x86
Эксперт Hardware
4901 / 2796 / 821
Регистрация: 13.02.2013
Сообщений: 9,026
28.10.2014, 14:11 4
UI, а какая разница? Тем более High неизбежно приведет к мысли о Low, и чего доброго натолкнет на мысль, что Low может вернуть что-то отличное от нуля.
0
Эксперт Python
4543 / 1969 / 354
Регистрация: 17.03.2012
Сообщений: 9,892
Записей в блоге: 5
28.10.2014, 14:13 5
Цитата Сообщение от DenProx Посмотреть сообщение
ArrayX,ArrayY - это имена массивов,
Цитата Сообщение от DenProx Посмотреть сообщение
ArrayX и ArrayY - имя переменной массива ...
Что за путаница с многоточием в конце?
Как вы собираетесь присваивать имя (строку) массиву, возможно, какого-то другого типа?
ArrayX,ArrayY - это имена параметров. В другой области видимости массив будет иметь другое имя.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31244 / 20423 / 7961
Регистрация: 22.10.2011
Сообщений: 35,455
Записей в блоге: 6
28.10.2014, 14:20 6
Цитата Сообщение от quwy Посмотреть сообщение
Тем более High неизбежно приведет к мысли о Low
Кстати, правильная идея. Лучше всего работать с массивом через Low/High. И не делать работу компилятора, заменяя Low() на 0. Для того они и существуют, эти функции...
0
Техник
315 / 173 / 26
Регистрация: 09.10.2009
Сообщений: 3,101
28.10.2014, 14:21  [ТС] 7
Цитата Сообщение от dondublon Посмотреть сообщение
ArrayX,ArrayY - это имена параметров.
Вот как риз и нужно указать процедуре, что в данный момент используется тот или иной массив.

Например ранее уже объявлены массивы:

Delphi
1
2
3
4
5
6
7
8
9
showarray_1_1: array [1..10003] of Integer;
  showarray_1_2: array [1..10003] of Integer; 
  showarray_1_3: array [1..10003] of Integer;
  showarray_1_4: array [1..10003] of Integer; 
 
  showarray_2_1: array [1..10003] of Integer; 
  showarray_2_2: array [1..10003] of Integer; 
  showarray_2_3: array [1..10003] of Integer; 
  showarray_2_4: array [1..10003] of Integer;
В зависимости от того, какой массив пользователь пожелает использовать, нужно чтобы в процедуру передавались значения от конкретного массива.

Т.е. вместо ArrayX,ArrayY, нужно подставить в процедуре любой массив из предложенных
0
Эксперт Python
4543 / 1969 / 354
Регистрация: 17.03.2012
Сообщений: 9,892
Записей в блоге: 5
28.10.2014, 14:29 8
DenProx, а, понятно.
Тогда сами массивы объедините в какую-либо структуру, по обстоятельствам (массив|список|словарь).
Чтобы нужный массив можно было выбрать через идентификатор.
0
Native x86
Эксперт Hardware
4901 / 2796 / 821
Регистрация: 13.02.2013
Сообщений: 9,026
28.10.2014, 14:30 9
Цитата Сообщение от DenProx Посмотреть сообщение
В зависимости от того, какой массив пользователь пожелает использовать, нужно чтобы в процедуру передавались значения от конкретного массива.
Ну, собственно решение именно этой задачи я и привел. Только внутри процедуры Redraw_XY массивы будут выглядеть как array [0..10002] of Integer, т.е. со смещением на одну позицию.

Если количество элементов в ваших массивах всегда одинаковое, то объявите тип, и используйте его и при объявлении и в процедуре:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type
  TShowArray = array[1..10003] of Integer;
 
procedure Redraw_XY(const ArrayX, ArrayY: TShowArray);
begin
  ...
end;
 
var
  showarray_1_1, showarray_1_2, showarray_1_3, showarray_1_4, 
  showarray_2_1, showarray_2_2, showarray_2_3, showarray_2_4: TShowArray
 
begin
  Redraw_XY(showarray_1_1, showarray_2_1);
В этом случае внутри процедуры массивы будут выглядеть так же, как и в основном блоке программы.
0
Техник
315 / 173 / 26
Регистрация: 09.10.2009
Сообщений: 3,101
28.10.2014, 14:38  [ТС] 10
quwy, а как тогда в процедуру передавать имена массивов?

Вот идея с Идентификатором, мне пока кажется наиболее подходящей
0
Native x86
Эксперт Hardware
4901 / 2796 / 821
Регистрация: 13.02.2013
Сообщений: 9,026
28.10.2014, 14:43 11
Цитата Сообщение от DenProx Посмотреть сообщение
а как тогда в процедуру передавать имена массивов?
У вас имена "showarray_x_y" в виде строк что ли? Тогда непосредственно никак.
Можно, конечно, сделать TStringList, в который в строке сохранять имя, а в связанном указателе -- указатель на массив, но, сдается мне, тут попахивает неправильной архитектурой приложения.
0
Техник
315 / 173 / 26
Регистрация: 09.10.2009
Сообщений: 3,101
28.10.2014, 14:56  [ТС] 12
Видимо придется более обширно описать задачу) Вижу меня не так поняли .

Вот например:

Есть Два списка (от 1 до 5), для X и Y.
Пользователь например выбирает для Х=1, для Y=2

http://f6.s.qip.ru/LHJwjtkI.png

каждая цифра соответствует определенному массиву.

1 = showarray_1
2 = showarray_2
3 = showarray_3
4 = showarray_4
5 = showarray_5

После того, как пользователь выбрал для Х=1, для Y=2, в процедуру должны передаться соответственно : Redraw_XY(showarray_1,showarray_2);

Если бы пользователь выбрал Х=4, для Y=4, то в процедуру должны передаться Redraw_XY(showarray_4,showarray_4);
0
Эксперт Python
4543 / 1969 / 354
Регистрация: 17.03.2012
Сообщений: 9,892
Записей в блоге: 5
28.10.2014, 15:34 13
DenProx, ну, ежели так, можно обойтись самым простым решением - массивом.
Delphi
1
2
3
4
5
type
  TShowArray = array [0..10003] of integer;
...
// описываем переменные
Myarrays: array[1..5] of TShowArray;
Это вместо showarray_1..5.
1
Техник
315 / 173 / 26
Регистрация: 09.10.2009
Сообщений: 3,101
28.10.2014, 15:42  [ТС] 14
dondublon, не могу понять, как я могу это использовать для решения задачи
0
Эксперт Python
4543 / 1969 / 354
Регистрация: 17.03.2012
Сообщений: 9,892
Записей в блоге: 5
28.10.2014, 15:47 15
DenProx, а что тут понимать?
Цитата Сообщение от DenProx Посмотреть сообщение
пользователь выбрал для Х=1, для Y=2, в процедуру должны передаться соответственно : Redraw_XY(showarray_1,showarray_2);
Только к моём случае в процедуру должно передаться
Delphi
1
Redraw_XY(myarrays[1],myarrays[2]);
1
Native x86
Эксперт Hardware
4901 / 2796 / 821
Регистрация: 13.02.2013
Сообщений: 9,026
28.10.2014, 15:51 16
Pascal
1
2
3
4
5
type
  TShowArray = array[1..10003] of Integer;
...
var
  ShowArray: array[1..2, 1..5] of TShowArray;
При этом идентификатор ShowArray[1, 3] полностью аналогичен вашему showarray_1_3. Тоже имеет 10003 элемента, к которым можно обратиться как ShowArray[1, 3][i] или ShowArray[1, 3, i].

Добавлено через 1 минуту
Но сам бы про синтаксис определения и использования многомерных массивов почитать, раз возникают затруднения в таких базовых вещах.
1
Техник
315 / 173 / 26
Регистрация: 09.10.2009
Сообщений: 3,101
30.10.2014, 13:38  [ТС] 17
quwy, Переделал по вашему примеру! :-) Большой фрагмент из Var заменился в 1 строку )) Осталось только доделать присвоение процедуре нужного массива)

Добавлено через 3 часа 24 минуты
Учитывая пример, расположенный чуть выше, использование процедуры теперь такое:

Delphi
1
Redraw_XY(ShowArray[N_block_x,N_chanel_x],ShowArray[N_block_y,N_chanel_y]);
N_block_x,N_chanel_x и N_block_y,N_chanel_y - задаются пользователем, помощью предложенных списков.

Все работает, всем спасибо за помощь!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2014, 13:38

Многопоточность (использование двумя потоками двух разных элементов одной формы)
На форме 2 RichTextBox, создается второй поток, оба потока выводят построчно индекс, который...

Метод выполнить в 11 разных потоках, соответственно для разных входных массивов
Здравствуйте, начал потихоньку разбираться в многопоточном программирование и не могу до конца...

Использование параметра в процедуре
Хочу передать в процедуру в качестве параметра название документа(строка), а затем использовать его...

Использование функций в процедуре
Здравствуйте. В своих процедурах я очень часто использую несколько строчек кода. Что бы его не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.