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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2012, 11:39   #1
inmyacid
Пользователь
 
Аватар для inmyacid
 
Регистрация: 17.04.2012
Сообщений: 42
По умолчанию Матрица как входящий параметр

Добрый день господа. Столкнулся с таким вопросом и не знаю как лучше реализовать.
Суть такова. Есть матрица я пишу некую процедуру которая выполняет некоторые действия с ее ячейками. Нужно сделать чтобы в качестве входящего параметра в процедуру была матрица.
чтото типа
procedure run(входящая матрица);
Как будет выглядеть обьявление процедуры где в качестве входящего параметра будет матрица?
Вероятно поступить предложение сделать это посредством указателей
procedure run(matrixointer);
но поскольку в делфи я работаю с указателями впервые было бы неплохо увидеть пример использования указателя matrix(в моем случае) в процедуре.
спасибо
inmyacid вне форума Ответить с цитированием
Старый 17.04.2012, 11:52   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

лучше всего, через свой тип данных:
Код:
type
  MyArr = array[1..10000] of integer; {тип может быть и динамическим массивом, разумеется}

...
procedure ReplaceMainCross(var M : MyArr);
либо можно использовать т.н. "открытые массивы" (не путать с динамическими!!!!)
Код:
procedure ReplaceMainCross(var M : array of integer);

через указатели тоже можно, но зачем чесать правое ухо пяткой левой ноги, если создатели языка/компилятора обеспечивают удобные, надёжные и мощные механизмы внутрипрограммного взаимодействия!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.04.2012, 12:09   #3
inmyacid
Пользователь
 
Аватар для inmyacid
 
Регистрация: 17.04.2012
Сообщений: 42
По умолчанию

спасибо. я с чего-то решил будто это можно реализовать в прямом смысле вопроса
inmyacid вне форума Ответить с цитированием
Старый 18.04.2012, 22:17   #4
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Все сказано верно, только будьте внимательны в следующем: всегда передавайте в параметры процедуры массивы большой размерности как var или const, или же out (если требуется только изменить массив в методе). Без указания ссылочных типов в параметрах метода данные копируются в его стек, а он варьируется от 16 кб до 1 мб по умолчанию. При переполнении стека получим AV. Иными словами, надо делать так:
Код:
procedure  DoArray(var Arr:TArr);
или так:
Код:
procedure  DoArray(const Arr:TArr);
а такого объявления лучше избегать:
Код:
procedure  DoArray(Arr:TArr);
Чтобы понять суть, попробуйте в новом приложении с пустой формой заменить весь код на:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TArr=array[0..1000000] of Integer;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  gArr:TArr;

implementation

{$R *.dfm}

procedure  DoArray(Arr:TArr);
var
  i:Integer;
begin
  for i:=0 to High(Arr) do Arr[i]:=i;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DoArray(gArr);
end;

end.
При запуске форма не появится, а приложение завалится.
P.S. Serge_Bliznykov, ответьте на вопрос: чем отличаются открытые массивы от динамических? Для себя интересно. Спасибо.
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 18.04.2012 в 22:22.
3D Hunter вне форума Ответить с цитированием
Старый 18.04.2012, 22:45   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если мне не изменяет память - понятие открытого массив применяется для описания параметров функции. Это еще с паскаля пошло.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.04.2012, 15:22   #6
inmyacid
Пользователь
 
Аватар для inmyacid
 
Регистрация: 17.04.2012
Сообщений: 42
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Без указания ссылочных типов в параметрах метода данные копируются в его стек, а он варьируется от 16 кб до 1 мб по умолчанию. При переполнении стека получим AV.
А вот это полезная информация. тоже спасибо
inmyacid вне форума Ответить с цитированием
Старый 19.04.2012, 15:39   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
for i:=0 to High(Arr) do Arr[i]:=i;
лучше начинать с Low уж тогда.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрица как параметр miftayka Visual C++ 2 09.04.2012 20:19
подсчитать количество единиц входящий в текст LILI26092009 Помощь студентам 1 07.11.2010 09:58
Входящий аудиопоток FIPC Win Api 1 03.06.2010 10:10
Как увидеть програмно в DELPHI входящий звонок и узнать номер звонка ? LiderServis Общие вопросы Delphi 3 20.01.2009 21:19
Входящий звонок на модем _SERGEYX_ Работа с сетью в Delphi 2 25.09.2007 09:22