![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача массива в процедуру [D7, XP]
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]
> Не надоело?
что?