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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 06.04.2009, 00:08   #1
kartalex
 
Регистрация: 09.02.2008
Сообщений: 7
По умолчанию использование 2х мерных массивов внутри функции или процедуры

Добрый вечер!! Замечательный форум, нашел здесь много интересных топиков.

Позвольте задать еще один вопрос от новичка в программировании..

допустим имеются двухмерные массивы, состоящие из integer:

var a: array[1..4,1..3] of integer;
b: array[1..6,1..8] of integer;

как написать процедуру, изменяющую значения этих массивов, например, делающую зеркальное преобразование по вертикали


1 2 3 4
5 6 7 8
9 10 11 12


преобразуется в


4 3 2 1
8 7 6 5
12 11 10 9


причем определить размеры массива процедура должна сама, т е в качестве аргумента мы должны задать только имя массива:

FlipArrayVertical(a);

заранее спасибо за ответ! Обещаю, что когда вырасту в программировании, сам буду отвечать на вопросы от новичков!
kartalex вне форума
Старый 06.04.2009, 00:31   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Если хотите, чтобы процедура работала с массивами разного размера, то нужно создавать массив динамически.
Код:
type mas = array of array of integer;
var
a: mas;
b: mas;
Теперь создадим массив и заполним его:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,j : integer;
begin
 SetLength(a,3);
 for i:=0 to 2 do
  SetLength(a[i],4);

 for i:=0 to 2 do
  for j:=0 to 3 do
   a[i,j] := i*10+j;

 FlipArrayVertical(a);

end;
А процедура будет выглядеть, например, так:
Код:
procedure FlipArrayVertical(a : mas);
var m,n : integer;
begin
m := length(a);
n := length(a[1]);
ShowMessage(IntToStr(m)+' '+IntToStr(n));
end;
Вот вам пример.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 06.04.2009, 00:44   #3
kartalex
 
Регистрация: 09.02.2008
Сообщений: 7
По умолчанию

Значит с каждым двухмерным массивом нужно обращаться как с массивом массивов!!! Спасибо большое за ценный совет!

А есть ли возможность в динамическом массиве начинать индексы массивов не с 0 а с 1?

т е чтобы наш массив имел такой вид после его создания

A[1..4,1..4]

вместо

A[0..3,0..3]

Последний раз редактировалось kartalex; 06.04.2009 в 00:47.
kartalex вне форума
Старый 06.04.2009, 02:50   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
А есть ли возможность в динамическом массиве начинать индексы массивов не с 0 а с 1?
Насколько знаю, нет.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 06.04.2009, 14:31   #5
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

просто не используй нулевой индекс массива и все
тогда надо бедет делать SetLength(n+1)
Bayazet вне форума
Старый 06.04.2009, 14:37   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Bayazet
росто не используй нулевой индекс массива и все
тогда надо бедет делать SetLength(n+1)
Очень нерациональное использование памяти ради сомнительного удобства
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 06.04.2009, 16:03   #7
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

Цитата:
var a: array[1..4,1..3] of integer;
b: array[1..6,1..8] of integer;
Цитата:
Очень нерациональное использование памяти ради сомнительного удобства
давайте посчитаем, сколько же нашей драгоценной памяти мы израсходуем впустую: 23 (пустых ячеек) на 4(байта на интежер).
итого.. 92 байта....
пойду куплю еще одну планку оперативы..

хотя некоторые использую нулевой индекс массива, записывая в него длинну оного массива... кстати, что выгоднее: запрос длинны массива через length(ar) или же просмотр ar[0] с предварительно внесенным туда значением длины?

ЗЫ: не учитывая необходимость каждый раз вручную увеличивать ar[0] при увеличении размерности массива

Последний раз редактировалось Stilet; 06.04.2009 в 16:19.
Bayazet вне форума
Старый 06.04.2009, 16:09   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Bayazet, сейчас это 92 байта, потом 92 Мегабайта..
Лучше сразу приучаться к стандартам. Иначе можно приобрести нехорошую привычку (не экономить память).

Тем более, я действительно не вижу никаких неудобств при отсчете с нуля (правда, я сишник, но это дело не меняет).

Цитата:
кстати, что выгоднее: запрос длинны массива через length(ar) или же просмотр ar[0] с предварительно внесенным туда значением длины?
Лично мне удобнее length(ar)
Более универсально исключает ошибку (при неверном задании размера в ar[0])
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 06.04.2009 в 16:11.
Sazary вне форума
Старый 06.04.2009, 16:20   #9
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

ну да, я понимаю, что начинается все с малого. win3.1 тоже помещались на дискетку

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

а к вопросу о том, что выгоднее: мне тоже удобнее юзать length(ar).
но вопрос в том, насколько "дольше" выхолняется пересчет эл-тов массива, относительно запроса одного из элемента?
Bayazet вне форума
Старый 06.04.2009, 16:27   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

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

Впрочем, если кому-то не жаль лишней памяти для своего удобства, то и вопрос снимается.
Цитата:
но вопрос в том, насколько "дольше" выхолняется пересчет эл-тов массива, относительно запроса одного из элемента?
Как вариант, можно посылать процедуре размер
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Закрытая тема


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача массивов в функции. Си Alar Общие вопросы C/C++ 12 08.02.2011 13:25
Как изменить значения переменной внутри процедуры kartalex Помощь студентам 5 20.11.2010 18:44
Форматирование текста внутри поля. как? или другие варианты... smoky Microsoft Office Access 2 26.12.2008 19:09
использование массивов! ...Оленька... Паскаль, Turbo Pascal, PascalABC.NET 2 22.12.2008 11:02
вычислить по формуле с использованием функции или процедуры St@FFord Паскаль, Turbo Pascal, PascalABC.NET 7 10.06.2008 10:18