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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2010, 18:33   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию Двумерный массив в качестве параметра

Есть модуль, в качестве параметра одной процедуры должен задаваться двумерный массив.
Когда делаю так:
Код:
Procedure Add(A:array of integer;
                    B:array of integer;)
и потом пытаюсь обращаться так:
Код:
A[i,j]:=....
B[i,j]:=...
То выдаёт ошибку Invalid qualifier. Так вот, как записать в строке
Код:
Procedure Add(A:array of integer;
                    B:array of integer;)
Типы параметров A и B так, чтобы можно было использовать их(A и B) как двумерные массивы?
_-Re@l-_ вне форума Ответить с цитированием
Старый 05.07.2010, 20:00   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

1) Обычный Паскаль с динамическими массивами через array не работает - делай через списки или статические массивы.
2) Массивы не двумерные, а одномерные. Объявлять как A:array[1..10, 1..10] of integer (в Delphi можно A: array of array of integer)
3) Массивы через параметры так передать не получится, надо создать новый тип, например, type MyTypeA = array[1..10, 1..10] of integer; MyTypeB = array[1..15, 1..15] of integer; Процедура будет выглядеть как Procedure Add(A:MyTypeA; B:MyTypeB)
4) Полагаю, что процедура Add добавляет какие-то данные, т.е. изменяет массивы для дальнейшей работы. Тогда процедура будет выглядеть так: Procedure Add(var A:MyTypeA; var B:MyTypeB) - то есть процедура возвращает значения изменённых данных (передача параметров-переменных)
eoln вне форума Ответить с цитированием
Старый 05.07.2010, 20:08   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
1) Обычный Паскаль с динамическими массивами через array не работает - делай через списки или статические массивы.
Я и забыл про списки.
Цитата:
4) Полагаю, что процедура Add добавляет какие-то данные, т.е. изменяет массивы для дальнейшей работы. Тогда процедура будет выглядеть так: Procedure Add(var A:MyTypeA; var B:MyTypeB) - то есть процедура возвращает значения изменённых данных (передача параметров-переменных)
Не, у меня процедура Add перемножает матрицы размера MxN.

Всё равно не получается то что я хочу.
Вот код:
Код:
Unit Matrices;

Interface

Uses CRT;

Type
    matrix = ^item;
    item = array[1..2,1..2] of integer;

Procedure Add(m,n:integer;
              A:matrix;
              B:matrix;
              var C:matrix);

Implementation

Procedure Add(m,n:integer;
              A:matrix;
              B:matrix;
              var C:matrix);
Var
   k,i,j:integer;
Begin
     Clrscr;
     New(A);
     New(B);
     New(C);
     for i:=1 to m do
        for j:=1 to n do
        begin
             C^[j,i]:=0;
             for k:=1 to m do
             C^[j,i]:=C^[j,i]+A^[i,k]*B^[k,j];
        end;
     for i:=1 to m do
        begin
             for j:=1 to n do
             write(C^[j,i],' ');
             writeln;
        end;
        Dispose(A);
        Dispose(B);
        Dispose(C);
end;

end.

Последний раз редактировалось Stilet; 06.07.2010 в 14:28.
_-Re@l-_ вне форума Ответить с цитированием
Старый 06.07.2010, 14:36   #4
Stepler
Форумчанин
 
Аватар для Stepler
 
Регистрация: 03.02.2008
Сообщений: 213
По умолчанию

Передавать массив как указатель, а дальше с помощю inc и dec перемещатся по массиву вправо-влево!
Пишу программы на заказ, контакты под аватаром!
Отзывы тут
Stepler вне форума Ответить с цитированием
Старый 06.07.2010, 14:39   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Да блин... Я то и делаю!
Вот какой код вы предлагаете?
Вот мой(разумеется, отрывок)
Код:
var
     A,B,C:^matrix
begin
        ...
        Add(A,B,C);
P.S. Тип matrix объявлен в модуле matrices из поста #3
_-Re@l-_ вне форума Ответить с цитированием
Старый 06.07.2010, 14:44   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Предлагаю старые добрые методы.
Код:
type pi=^integer;

procedure a(arr:pi);
var j,i,k:integer;p:pi;
begin
 p:=arr; k:=1;
 for i:=1 to 4 do begin
  for j:=1 to 4 do begin
   p^:=k;    inc(k);
   p:=pointer(integer(p)+4);
  end;
 end;
end;

var m:array[1..4,1..4] of integer;
 i,j:integer;
begin
 a(@m);
  { TODO -oUser -cConsole Main : Insert code here }
 for i:=1 to 4 do begin
  for j:=1 to 4 do begin
   write(m[i,j]:5);
  end; writeln;
 end;
 readln;
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.07.2010, 15:07   #7
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Странно, но ничего не получается. Поправьте, пожалуйста.
Код:
Unit Matrices;

Interface

Uses CRT;

Type
    matrix = ^integer;

Procedure Add(m,n:integer;
              A:matrix;
              B:matrix;
              var C:matrix);

Implementation

Procedure Add(m,n:integer;
              A:matrix;
              B:matrix;
              var C:matrix);
Var
   k,i,j:integer;
Begin
     Clrscr;
     New(A);
     New(B);
     New(C);
     for i:=1 to m do
        for j:=1 to n do
        begin
             C^[j,i]:=0;
             for k:=1 to m do
             C^[j,i]:=C^[j,i]+A^[i,k]*B^[k,j];
        end;
     for i:=1 to m do
        begin
             for j:=1 to n do
             write(C^[j,i],' ');
             writeln;
        end;
        Dispose(A);
        Dispose(B);
        Dispose(C);
end;

end.
Код:
Uses Matrices;
Type 
       matrix = ^integer;
Var A,B,C:matrix;
Begin
       Add(@A,@B,@C);
       readln;
end.
_-Re@l-_ вне форума Ответить с цитированием
Старый 06.07.2010, 16:04   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы уж извините меня, но eoln в пост #2
дал полный и исчерпывающий ответ (имхо, разумеется)!
Что в нём не устроило?!

Добавлено.
_-Re@l-_
Угу. Догадываюсь, что не устроило!

Цитата:
Код:
Dispose(C);
Знаете, что делает этот оператор?! Освобождает выделенную по переменную память.
И вне зависимости от того, как Вы передаёте массив (с VAR или без VAR ) - после Вашей процедуры ADD
обращаться к переменным A,B,C - нельзя!
ну и описывать массивы надо так:
Код:
Type
    matrix = ^item;
    item = array[1..2,1..2] of integer;

Последний раз редактировалось Serge_Bliznykov; 06.07.2010 в 16:10.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.07.2010, 16:14   #9
Stepler
Форумчанин
 
Аватар для Stepler
 
Регистрация: 03.02.2008
Сообщений: 213
По умолчанию

to _-Re@l-_
Работа идет не с двумерным а как с одномерным массивом но не в явном виде.
Перемещать укзаатель можно на одну позицию вперед или на одну позицию назад с помощью inc(c) и dec(c), или варинат предложеный Stiletom
Код:
   p:=pointer(integer(p)+4);
Пишу программы на заказ, контакты под аватаром!
Отзывы тут
Stepler вне форума Ответить с цитированием
Старый 06.07.2010, 16:35   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Перемещать укзаатель можно на одну позицию вперед или на одну позицию назад с помощью inc(c) и dec(c), или варинат предложеный Stiletom
Код:
   p:=pointer(integer(p)+4);
Это возможно только в том случае, если память была выделена правильно!! (New в данном случае не поможет! Надо GetMem юзать. Ну и плюс контролировать, чтобы смещение не "ушло" за пределы выделенной памяти!
А вообще, зачем такие сложности то?!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать обьект в Delphi, который содержит в качестве поля двумерный массив данных. Nastena_12_ Помощь студентам 0 06.12.2009 22:17
TextBox в качестве параметра функции/процедуры Голованов Д. Microsoft Office Excel 6 01.12.2009 10:38
Массив в качестве параметра DeKot Общие вопросы Delphi 6 15.10.2009 22:32
Пользовательская функция с диапазоном в качестве параметра SanSanblch Microsoft Office Excel 2 29.05.2009 17:37