Текущий архив: 2007.01.21;
Скачать: CL | DM;
Вниз
Передача массива в процедуру Найти похожие ветки
← →
RomanH © (2006-12-29 12:28) [0]Всем доброго дня. Все таки я решил написать свой "навороченный DBGrid", наследовав TRxDBGrid. И мне нужно знать как передать в процедуру массив типа integer;
← →
Desdechado © (2006-12-29 12:31) [1]type TIntArray = array of integer;
← →
evvcom © (2006-12-29 12:35) [2]Причем в D7 уже есть определение типа TIntegerDynArray.
← →
RomanH © (2006-12-29 12:45) [3]Мастера никак не пойму.
То есть я описываю метод:
TMyGrid.Resize(а здесь я должен вписать динамический массив )/
Что мне вписывать?
← →
Elen © (2006-12-29 12:47) [4]TMyGrid.Resize(a:array of variant)
← →
evvcom © (2006-12-29 12:48) [5]> [4] Elen © (29.12.06 12:47)
TMyGrid.Resize(a:TIntegerDynArray);
← →
Рамиль © (2006-12-29 12:49) [6]В [1] и [2] все сказано. Не знаешь как параметр передать в метод и что такое type?
Не в обиду, рано тебе писать компоненты.
← →
Рамиль © (2006-12-29 12:50) [7]
> Elen © (29.12.06 12:47) [4]
Не надоело?
← →
Игорь Шевченко © (2006-12-29 12:52) [8]Elen © (29.12.06 12:47) [4]
Дай отдохнуть фонтану
← →
Elen © (2006-12-29 12:52) [9]
> Не надоело?
что?
← →
Рамиль © (2006-12-29 12:55) [10]
> Elen © (29.12.06 12:52) [9]
Фигню постить.
← →
Elen © (2006-12-29 12:58) [11]
> Фигню постить.
Почему фигню? Чем это не так?
← →
Игорь Шевченко © (2006-12-29 13:04) [12]Elen © (29.12.06 12:58) [11]
> Почему фигню?
Кроме тебя на этот вопрос вряд ли кто-то может ответить
← →
evvcom © (2006-12-29 13:07) [13]> [11] Elen © (29.12.06 12:58)
> Чем это не так?
Напиши для своего случая рабочий пример, тогда поймешь.
← →
Elen © (2006-12-29 13:21) [14]
> Напиши для своего случая рабочий пример, тогда поймешь.
Ну вот :
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 14:40) [15]> [14] Elen © (29.12.06 13:21)
> EPanel1.rz([1,2,3])
т.е. ты всегда константы передаешь? Или все же чаще переменные? Переменную передай.
← →
Elen © (2006-12-29 15:04) [16]
> 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;
...то это тоже работает.
Может проведете ликбез, а мастера, ато я себя не в своей тарелке с вашими вопросами чувствую...
← →
Anatoly Podgoretsky © (2006-12-29 15:10) [17]> Elen (29.12.2006 15:04:16) [16]
Да шутят они
← →
Elen © (2006-12-29 15:18) [18]
> Да шутят они
А мне уже не до смеха. :( Не ну серьезно, зачем вот так... "Ребята давайте жить дружно" ((с) Леопольд)
← →
Elen © (2006-12-29 15:19) [19]
> Anatoly Podgoretsky
Да шутят они
В таком случае некоторым бы извиниться не мешало.
← →
evvcom © (2006-12-29 15:25) [20]Действительно с динамическими работает. И тем не менее имеем некоторые ограничения, в которые рано или поздно можем упереться. Потому лучше следовать принятым правилам. Аргументы описывать определенным типом, а не придумывать его на ходу.
← →
Anatoly Podgoretsky © (2006-12-29 15:29) [21]> evvcom (29.12.2006 15:25:20) [20]
Тебе привели пример, не надо много ума, чтобы заменить A: array of varint, на A: type
← →
Elen © (2006-12-29 15:43) [22]
> И тем не менее имеем некоторые ограничения,
Так. Поподробнее плиз...
← →
evvcom © (2006-12-29 15:51) [23]> [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 16:00) [24]
> Ладно, мир.
Мир конечно ;) (с наступаюшим, кстати!), а с присваиваниями я стараюсь быть особо осторожнее иb := a;
, где оба операнда массивы вообше не приемлю, лучше уж цикл илиmove
.
Пример [23] кстати не надуманный, а очень даже правильно предупредительно описанный во многих книгах-мануалах по паскалю. Все авторы, мне попавшиеся предупреждали о таких приколах.
← →
Anatoly Podgoretsky © (2006-12-29 16:11) [25]> evvcom (29.12.2006 15:51:23) [23]
Так типы разные, ты же не кричишь, что Boolean := string, а здесь почему то наоборот.
← →
evvcom © (2006-12-29 16:23) [26]> [24] Elen © (29.12.06 16:00)
> с наступаюшим, кстати!
и тебя с наступающим
> где оба операнда массивы вообше не приемлю, лучше уж цикл
> или move.
Смотря для чего они нужны. Если нужна копия данных, то move, если копия указателя, то b := a. Я если не знаю как себя ведет компилятор в каком-то случае, ставлю бряк и Ctrl+Alt+C - это лучший критерий истины :)
← →
Anatoly Podgoretsky © (2006-12-29 16:30) [27]> evvcom (29.12.2006 16:23:26) [26]
b := a не означает копию указателя
← →
evvcom © (2006-12-29 16:32) [28]> [25] Anatoly Podgoretsky © (29.12.06 16:11)
> Так типы разные
Именно. Только без знания сего это не очевидно, тогда как с Boolean и string - эта разница очевидна.
Да я и ввязался в этот спор только потому, что интуитивно подумал, что для функций эти типы тоже окажутся разными, что [16] вызовет ошибку компиляции. Ошибочка вышла, потому как сам никогда не пользуюсь такой конструкцией, а определяю сложные типы специальными идентификаторами.
Страницы: 1 вся ветка
Текущий архив: 2007.01.21;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.032 c