Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1078593609
Ivolg
2004-03-06 20:20
2004.03.28
Поиск


8-1069686747
NetKnight
2003-11-24 18:12
2004.03.28
Как уменьшить JPEG, как это делает Photoshop без потери качества?


1-1079024181
1Raily
2004-03-11 19:56
2004.03.28
Рисование


14-1077804171
Budy
2004-02-26 17:02
2004.03.28
Иконка около часов


1-1078995931
Dmitrij_K
2004-03-11 12:05
2004.03.28
Mastera помогите!!! MS Word as Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский