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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> одна функция для двумерных статических, массивов разной размерности 
V
    Опции темы
vespa
Дата 8.6.2007, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В программе объявленно несколько двумерных статических массивов разной размерности. Нужно написать функцию, которая на вход получала бы любой из этих массивов + его длины и обрабатывала его. 

должно быть примерно так:
Код

A : array [1..10, 1..5] of double;
B : array [1..3, 1..2] of double;

// примерный прототип функции
procedure LoadArr2(var arr: array of array of double; M,N: integer);
var i,j : integer;
begin
  for i := 1 to M do
    for j := 1 to N do
       arr[i,j] := i + j;
end;

// вызов
LoadArr2(A,10,5);
LoadArr2(B,3,2);



Как это можно реализовать, желательно без указателей? В случае, если без указателей никак, то как с ними?
PM MAIL   Вверх
Sunvas
Дата 8.6.2007, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Цитата(vespa @  8.6.2007,  09:57 Найти цитируемый пост)
var arr: array of array of double;

Так в процедурах используються открытые массивы (кажется так называется). Поэтому для твоего случая это не подходит.

Вынеси свои массивы в тип. И объявляй примерно так:
Код

type MyArr1 = array [1..10, 1..5] of double;
        MyArr2 = array [1..3, 1..2] of double;
var
  A:MyArr1;
  B:MyArr2;



Это сообщение отредактировал(а) Sunvas - 8.6.2007, 10:31


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
vespa
Дата 8.6.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Вынеси свои массивы в тип


Это не выход. Если у меня будет 1000 разных массивов, мне придется объявить 1000 типов.
PM MAIL   Вверх
aktuba
Дата 8.6.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Код

type
  TArray = array of array of Double;
...
var
  a: TArray;
  b: TArray;
  procedure DoArr(var arr: TArray; m, n: Integer);
...
  SetLength(a, 1, 10);
  SetLength(b, 3, 15);
  DoArr(a, 1, 10);
  DoArr(b, 3, 15);


Так пойдет?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
vespa
Дата 8.6.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



К сожалению, нет.  Я не могу поменять массивы.  Мне нужно решить задачу именнно в такой постановке. Как мне одной функцией обрабатывать двумерные статические массивы произвольной размерности.
Причем вся проблема именно в двумерности. Для одномерных все получается. Я просто пишу в функции:

Код

// прототип
procedure LoadArr1(var arr: array of double; size: integer);

// вызов для A: array[1..3] of double
LoadArr1(A, 3);



и все работает.

PM MAIL   Вверх
Sunvas
Дата 8.6.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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





--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
vespa
Дата 8.6.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



To Sunvas:

это про одномерные массивы
для них работает

это примерно то же самое, что и в первой ссылке и несет мало смысловой нагрузки именно по моему вопросу,
там для двумерных массивов проблема так и не решена

лучше бы какой дельный совет дали, чем ссылки давать(поиском я пользоваться умею)

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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

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



Цитата(vespa @  8.6.2007,  23:59 Найти цитируемый пост)
там для двумерных массивов проблема так и не решена

А это что тогда?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
vespa
Дата 9.6.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



To Yanis:

Что конкретно Вы имеете в виду под словами "это" ?
Процитируйте, напрямую, пожалуйста.
PM MAIL   Вверх
Yanis
Дата 9.6.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

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



Цитата(Петрович @ 21.1.2005,  10:50)
Аналогично.
Код

type
 tMyArray = array of array of real;

procedure Test (a :tMyArray);
begin
 //
end;

абырвалг

Это сообщение отредактировал(а) Yanis - 9.6.2007, 11:03


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 9.6.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

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



vespa, 
Ну нельзя со статическими массивами. Они не содержат в себе размерность, а динамические содержат. Единственный вариант это в функцию передавать указатель на область памяти массива и также туда передавать его размерность. Это имхо изврат. Статические массивы не для того предназначены. Используй динамические. Что тебя мешает?


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
vespa
Дата 9.6.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Yanis @ 9.6.2007,  11:03)
Цитата(Петрович @ 21.1.2005,  10:50)
Аналогично.
Код

type
 tMyArray = array of array of real;

procedure Test (a :tMyArray);
begin
 //
end;


В этом фрагменте функция вызывается с тем же параметром, с каким объявлена. Этот вариант не подходит.

Добавлено @ 12:19
To Rennigth:

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

Вообще, для меня довольна странная ситуация. Казалось, бы такая простая задача, а простого решения нет. В Си, например, такой проблемы вообще бы не стояло.

Это сообщение отредактировал(а) vespa - 9.6.2007, 12:22
PM MAIL   Вверх
aktuba
Дата 9.6.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

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



Цитата

т.к. не могу менять код, который у меня есть.


Если у тебя есть код, то почему нельзя его поменять??? Объяви как динамический и при запуске программы присвой размеры, а при выгрузке обнуляй...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
vespa
Дата 9.6.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(aktuba @ 9.6.2007,  17:03)
Цитата

т.к. не могу менять код, который у меня есть.


Если у тебя есть код, то почему нельзя его поменять??? Объяви как динамический и при запуске программы присвой размеры, а при выгрузке обнуляй...

Почему нельзя менять код - это долгая история.

Вообще, я тут в одной статье прочитала, что динамические массивы работают раза в три медленнее статических. Думаю, не имеет смысла переводить их в динамические.
Хотя если бы я сама писала бы подобный код, то я бы, не задумываясь, обявила бы как динамические.

Это сообщение отредактировал(а) vespa - 10.6.2007, 08:49
PM MAIL   Вверх
MetalFan
Дата 9.6.2007, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


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

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



Цитата(vespa @  9.6.2007,  21:50 Найти цитируемый пост)
я тут в одной статье прочитала, что динамические массивы работают раза в три медленне статических

гм... на сарае, знаете ли, тоже написано... а там дрова.
а если я вам напишу, что если все правильно реализовать, то медленнее ну может быть на десяток процентов будет, но не в 3 раза ;)

Добавлено через 13 минут и 43 секунды
реализуй с указателями...
Цитата(vespa @  8.6.2007,  09:57 Найти цитируемый пост)
В случае, если без указателей никак, то как с ними? 


Код

var
  A : array [1..10, 1..5] of double;
  B : array [1..3, 1..2] of double;

procedure LoadArr2(ArrPtr: PDouble; M,N: integer);
var
  i : integer;
  lPtr1: PDouble;
begin
  lPtr1 := ArrPtr;
  for i := 1 to (M * N) do
  begin
    lPtr1^ := i;
    Inc( lPtr1 );
  end;
end;


procedure TForm1.btn2Click(Sender: TObject);
begin
  LoadArr2( @A[1,1], 10, 5 );
  LoadArr2( @B[1,1], 3, 2 );
end;


Это сообщение отредактировал(а) MetalFan - 9.6.2007, 22:25


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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