Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача массива в процедуру [D7, XP]


Страницы:   1 2

RomanH ©   (2006-12-29 12:28:00) 

Всем доброго дня. Все таки я решил написать свой "навороченный DBGrid", наследовав  TRxDBGrid. И мне нужно знать как передать в процедуру массив типа integer;


evvcom   (2006-12-29 16:32:00) [1]

> [25] Anatoly Podgoretsky ©   (29.12.06 16:11)
> Так типы разные

Именно. Только без знания сего это не очевидно, тогда как с Boolean и string - эта разница очевидна.
Да я и ввязался в этот спор только потому, что интуитивно подумал, что для функций эти типы тоже окажутся разными, что [16] вызовет ошибку компиляции. Ошибочка вышла, потому как сам никогда не пользуюсь такой конструкцией, а определяю сложные типы специальными идентификаторами.


Anatoly Podgoretsky   (2006-12-29 16:30:00) [2]

> evvcom  (29.12.2006 16:23:26)  [26]

b := a не означает копию указателя


evvcom   (2006-12-29 16:23:00) [3]

> [24] Elen ©   (29.12.06 16:00)
> с наступаюшим, кстати!

и тебя с наступающим

> где оба операнда массивы вообше не приемлю, лучше уж цикл
> или move.

Смотря для чего они нужны. Если нужна копия данных, то move, если копия указателя, то b := a. Я если не знаю как себя ведет компилятор в каком-то случае, ставлю бряк и Ctrl+Alt+C - это лучший критерий истины :)


Anatoly Podgoretsky   (2006-12-29 16:11:00) [4]

> evvcom  (29.12.2006 15:51:23)  [23]

Так типы разные, ты же не кричишь, что Boolean := string, а здесь почему то наоборот.


Elen   (2006-12-29 16:00:00) [5]


> Ладно, мир.

Мир конечно ;) (с наступаюшим, кстати!), а с присваиваниями я стараюсь быть особо осторожнее и b := a;, где оба операнда массивы вообше не приемлю, лучше уж цикл или move.

Пример [23] кстати не надуманный, а очень даже правильно предупредительно описанный во многих книгах-мануалах по паскалю. Все авторы, мне попавшиеся предупреждали о таких приколах.


evvcom   (2006-12-29 15:51:00) [6]

> [21] Anatoly Podgoretsky ©   (29.12.06 15:29)

угу, согласен

> [22] Elen ©   (29.12.06 15:43)
> Поподробнее плиз...

Контрнаступление? :)))

> function rz(a:array of integer):integer;

var b:array of integer;
begin
b := a; // [Error] Incompatible types
...
end;

Подобные ошибки будут не только с массивами. Это я к тому, если появится желание сказать, что пример надуманный, и на практике вряд ли когда пригодится. :)
Ладно, мир. Я особо и не пытался наезжать вроде?


Elen   (2006-12-29 15:43:00) [7]


>  И тем не менее имеем некоторые ограничения,

Так. Поподробнее плиз...


Anatoly Podgoretsky   (2006-12-29 15:29:00) [8]

> evvcom  (29.12.2006 15:25:20)  [20]

Тебе привели пример, не надо много ума, чтобы заменить A: array of varint, на A: type


evvcom   (2006-12-29 15:25:00) [9]

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


Elen   (2006-12-29 15:19:00) [10]


> Anatoly Podgoretsky
  Да шутят они

В таком случае некоторым бы извиниться не мешало.


Elen   (2006-12-29 15:18:00) [11]


> Да шутят они

А мне уже не до смеха. :( Не ну серьезно, зачем вот так... "Ребята давайте жить дружно" ((с) Леопольд)


Anatoly Podgoretsky   (2006-12-29 15:10:00) [12]

> Elen  (29.12.2006 15:04:16)  [16]

Да шутят они


Elen   (2006-12-29 15:04:00) [13]


> evvcom

Ну вообще-то чаше константы.

Но если имеется ввиду так?

procedure TForm1.EPanel1Click(Sender: TObject);
var u:array of integer;
begin
setlength(u,3);
u[0]:=1;
u[1]:=2;
u[2]:=3;
caption:=inttostr(EPanel1.rz(u));
end;


...то это тоже работает.

Может проведете ликбез, а мастера, ато я себя не в своей тарелке с вашими вопросами чувствую...


evvcom   (2006-12-29 14:40:00) [14]

> [14] Elen ©   (29.12.06 13:21)
> EPanel1.rz([1,2,3])

т.е. ты всегда константы передаешь? Или все же чаще переменные? Переменную передай.


Elen   (2006-12-29 13:21:00) [15]


> Напиши для своего случая рабочий пример, тогда поймешь.

Ну вот :

unit EPanel;

interface

uses
 Windows, Messages, SysUtils, Classes, Controls, ExtCtrls;

type
 TEPanel = class(TPanel)
 private
   { Private declarations }
 protected
   { Protected declarations }
 public
  function rz(a:array of integer):integer;
   { Public declarations }
 published
   { Published declarations }
 end;

procedure Register;

implementation

//********* PROCEDURE**********
function TEPanel.rz;
//const
Var i:integer;
begin
  for i:=Low(a) to High(a) do result:=a[i]+result;
end;
//********* END PROCEDURE*******

procedure Register;
begin
 RegisterComponents('Elen', [TEPanel]);
end;

end.


А вот вызов :
caption:=inttostr(EPanel1.rz([1,2,3]));

Уважаемые Господа Мастера, если я чего-то не знаю поделитесь.


evvcom   (2006-12-29 13:07:00) [16]

> [11] Elen ©   (29.12.06 12:58)
> Чем это не так?

Напиши для своего случая рабочий пример, тогда поймешь.


Игорь Шевченко   (2006-12-29 13:04:00) [17]

Elen ©   (29.12.06 12:58) [11]


> Почему фигню?


Кроме тебя на этот вопрос вряд ли кто-то может ответить


Elen   (2006-12-29 12:58:00) [18]


> Фигню постить.

Почему фигню? Чем это не так?


Рамиль   (2006-12-29 12:55:00) [19]


> Elen ©   (29.12.06 12:52) [9]

Фигню постить.


Elen   (2006-12-29 12:52:00) [20]


> Не надоело?

что?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо