Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Внизкак в функцию передать переменную по ссылке? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.031 c