Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

как в функцию передать переменную по ссылке?   Найти похожие ветки 

 
MadGhost ©   (2004-03-10 12:11) [0]

см. сабж.


 
Карелин Артем ©   (2004-03-10 12:15) [1]

Типа как с указателями работать?


 
Тимохов ©   (2004-03-10 12:16) [2]

Может var?
Задача то какая?


 
Reindeer Moss Eater ©   (2004-03-10 12:19) [3]

как в функцию передать переменную по ссылке?

Задекларировать саму функцию соответствующим образом


 
Digitman ©   (2004-03-10 12:33) [4]


> MadGhost ©   (10.03.04 12:11)


вариантов - куча
декларация такой ф-ции и факт.вызов ее в ран-тайм будет зависеть от многих факторов : как объявлена переменная, что планируется творить с ней самой и с переданной ссылкой на нее в теле ф-ции и т.д. и т.п.

приводи конкретности


 
Reindeer Moss Eater ©   (2004-03-10 12:37) [5]

А что, при имеющейся конкретной декларации функции у нас есть выбор как передавать аргументы?

Например function foo(var APar : Integer) :  integer

Как передать параметр не по ссылке?


 
Я ©   (2004-03-10 12:43) [6]

1. Общее решение (со своими граблями в случае непонимания происходящего):

procedure AProcedure(a_pVariable: pointer);
begin
...
end;

или
procedure AProcedure(var a_Variable);
begin
...
end;

тогда
var
 A: integer;
 B: double;

begin
 AProcedure(@A);
 AProcedure(@B);
end;


2. Частное решение:
procedure AProcedure(var a_Variable: integer);
begin
...
end;


 
Digitman ©   (2004-03-10 12:49) [7]


> Reindeer Moss Eater ©   (10.03.04 12:37) [5]



> А что, при имеющейся конкретной декларации функции у нас
> есть выбор как передавать аргументы?


у автора, видимо, как раз непонятка, как декларировать ф-цию

type
function foo(pPar : PInteger) :  integer
var
 i: Integer;
..
foo_result := foo(@i);

это же - тоже вариант передачи ссылки на переменную, несмотря на то что декларация подразумевает передачу параметра по значению


 
Я ©   (2004-03-10 12:49) [8]

> Например function foo(var APar : Integer) :  integer
> Как передать параметр не по ссылке?


var
 iVariable: integer;
 iParam: integer;
begin
 ...
 iParam := iVariable;
 foo(iParam);
 ...    
end;

Хоть передача идет по ссылке, но поведение получается как при передаче по значению. Реально, в данном случае вручную выполнено то, что проделывает компилятор в тени, занося "аргумент по значению" в регистр, стек и т.д.
iVariable остается неизменной.


 
Reindeer Moss Eater ©   (2004-03-10 12:58) [9]

iVariable остается неизменной.

При чем здесь iVariable, когда мы про параметры?


 
Тимохов ©   (2004-03-10 13:02) [10]

заметте, что автор кроме 50 букв ничего не написал, а вы тут боретесь за истину :))))))


 
Я ©   (2004-03-10 13:18) [11]

Тупые размышления. И я тупой. Потому, что принимаю участие в этой дискуссии. Прошу у всех прощения.


 
MadGhost ©   (2004-03-10 14:29) [12]

четы я после 2 недельной сессии ваще соображать перестал.
вот есть функция в которую я передаю например параметры.
она как бы создает локальные переменные и меняет только их, а как передать переменную чтобы эта функция глобальную переменную меняла, а не свою локальную.

т.е. да как определить эту функцию, и как с ней работать.
плизз


 
Reindeer Moss Eater ©   (2004-03-10 14:32) [13]

function one(var Param:DWORD):boolean;
function two(Param:PDWORD):boolean;

var
VarOne:DWORD;
begin
One(OneVar);
Two(@OneVar);


 
Digitman ©   (2004-03-10 14:38) [14]

function one(var Param:DWORD):boolean;
begin
 Param := ...;
end;

function two(Param:PDWORD):boolean;
begin
 Param^ := ...;
end;


 
MadGhost ©   (2004-03-10 22:23) [15]

ни пайму :(
^ после переменной типа указателя - получение значения, находящегося по адресу, расположенному в переменной типа указателя.

делаю так:

type
procedure ChangeValue(a:pointer);

implementation
procedure TForm1.ChangeValue(a: pointer);
begin
   a^:=100; //ошибка указывает на эту строку
end;

пишет ошибку: Left side cannot be assigned to


 
Никто ©   (2004-03-10 22:30) [16]

procedure TForm1.ChangeValue(a: pointer);
begin
  pinteger(a)^:=100;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
ChangeValue(@i);
Label1.Caption:=IntToStr(i);
end;


 
Sentinel ©   (2004-03-10 22:38) [17]


> Left side cannot be assigned to

мнда. Кажеца Operator not applicable to this operand type.

Два варианта:

procedure ChangeValueNonTypedPointer(a: pointer);
begin
 Integer( a^ ):=100; //ошибка указывает еще куда-нибудь, но не на эту строку)
end;

или, чьто гораздо лучше и правильнее, в простом случае:

procedure ChangeValueTypedPointer(a: PINTEGER);
begin
 a^:=100; //ошибка больше не указывает на эту строку
end;


 
MadGhost ©   (2004-03-10 22:42) [18]

вот изврат :) в определнии функции незя ^integer использовать.

сделал так:

procedure ChangeValue(c:pointer);
var
   g:^integer;
begin
 g:=c;
 g^:=300;
end;


ну это ли не изврат, спасибо всех кого по беспокоил.
решпект всем.


 
Sentinel ©   (2004-03-10 22:50) [19]

Тебе два предыдущих поста ничего не сказали?


 
MadGhost ©   (2004-03-10 22:57) [20]

я когда [15] написал, после начал фильм смотреть, потом начал смотреть как же все таки это дело реализовать, написал и после уже увидел ;)


 
Defunct ©   (2004-03-11 01:36) [21]

PInteger это гониво, а что делать когда нет соответствующего PType
В общем случае лучше определять типизированный указатель самостоятельно.

Type PMyStruct = ^Struct;
    PInteger = ^Integer;
    PAnything = ^Anything;

Procedure DoSomethingWith( It: PAnything);
Begin
 It^ := Anything(...);
End;

Var It: Anything;

Begin
 DoSomethingWith( @It );
End;



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.051 c
14-1077853110
CrytoGen
2004-02-27 06:38
2004.03.28
библиотечные функции, которых нет в Delphi


3-1077804454
MIDPAD
2004-02-26 17:07
2004.03.28
перенос данных


7-1073270354
Babay
2004-01-05 05:39
2004.03.28
Очередь печати принтера


3-1077482727
Serko
2004-02-22 23:45
2004.03.28
Alias


7-1065522980
npAKTuk
2003-10-07 14:36
2004.03.28
Компьютер и гирлянда?