Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 13.03.2010, 19:12
Smerch66 Smerch66 вне форума
Прохожий
 
Регистрация: 31.10.2009
Сообщения: 43
Репутация: 10
По умолчанию

А быстродействие алгоритма по первому и второму способу одинаковое?
Ответить с цитированием
  #17  
Старый 13.03.2010, 19:14
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от Smerch66
А быстродействие алгоритма по первому и второму способу одинаковое?
Одинаковы, при компиляции машинный код получается один и тот же
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #18  
Старый 13.03.2010, 19:18
Smerch66 Smerch66 вне форума
Прохожий
 
Регистрация: 31.10.2009
Сообщения: 43
Репутация: 10
По умолчанию

Спасибо большое! +2
Ответить с цитированием
  #19  
Старый 10.11.2010, 17:07
ilyas09 ilyas09 вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 6
Репутация: 10
Вопрос

У меня немного другая задача. Нужно в процедуре заполнить значения элементов массива, изменив его размер.
Как я понял, в этом случае нужно в основной программе "обновить" указатель на массив, примерно следующем образом:
Код:
var
DATA : array of Float; 
p:pointer;

procedure MassEdit(var pMass : Pointer);
var
mass: array of Float;
begin
  Pointer(mass) := pMass;
  SetLength(mass,3);
  mas[0]:=1;
  mas[1]:=1;
  mas[2]:=1;
  pMass:=@mass[0];
  Pointer(mass) :=nil;
end;

//далее  идёт кусок из текста, в котором обращаюсь к процедуре
...
p:=@DATA[0];
MassEdit(p);
pointer(DATA):=p;
...
//далее обращаемся к элементам массива DATA

Я правильно делаю?
Ответить с цитированием
  #20  
Старый 11.11.2010, 08:39
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от ilyas09
У меня немного другая задача. Нужно в процедуре заполнить значения элементов массива, изменив его размер.
Как я понял, в этом случае нужно в основной программе "обновить" указатель на массив, примерно следующем образом:
Код:
var
DATA : array of Float; 
p:pointer;

procedure MassEdit(var pMass : Pointer);
var
mass: array of Float;
begin
  Pointer(mass) := pMass;
  SetLength(mass,3);
  mas[0]:=1;
  mas[1]:=1;
  mas[2]:=1;
  pMass:=@mass[0];
  Pointer(mass) :=nil;
end;

//далее  идёт кусок из текста, в котором обращаюсь к процедуре
...
p:=@DATA[0];
MassEdit(p);
pointer(DATA):=p;
...
//далее обращаемся к элементам массива DATA

Я правильно делаю?
обьяви тип
Код:
TDataArr = array of Float
процедуру обьяви так:
Код:
procedure MassEdit(var pMass : TDataArr);
...
внутри компилятора это будет такая же работа с адресом, но в коде так удобнее
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #21  
Старый 11.11.2010, 15:45
ilyas09 ilyas09 вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от AleD
процедуру обьяви так:
Код:
procedure MassEdit(var pMass : TDataArr);
...
Вот этот момент не понял.
И не понятно: что передавать в процедуру?
Если смотреть в лоб, то получается, что я должен передать безразмерный массив.

Хм, если процедуру вызвать так, то всё работает.
Код:
MassEdit(DATA);
Правда принцип до конца так и не понял.
Спасибо!

Я так понимаю, в этом случае через стек передаётся только указатель на массив?

Последний раз редактировалось ilyas09, 11.11.2010 в 17:00.
Ответить с цитированием
  #22  
Старый 17.11.2010, 13:32
mirt steelwater mirt steelwater вне форума
Прохожий
 
Регистрация: 17.10.2010
Сообщения: 35
Репутация: 10
По умолчанию

кажется у меня похожая проблема, но у меня все это не работает
я пытался решить проблему так:
http://www.delphisources.ru/forum/sh...ad.php?t=14362
затем решил сделать иначе:
Код:
type
    ArrayOfConst  = array of TVarRec;

function _const (anArgs: array of const) : ArrayOfConst;
var
    I      : WORD;
    Index  : WORD;
    Length : WORD;
begin
    Length := 0;
    if ( High (anArgs) >= 0 ) then
        Length := Length + High (anArgs) - Low (anArgs) +1;
    if ( Length > 0 ) then
    begin
        SetLength (Result,Length);
        Index := 0;
        for I := Low (anArgs) to High (anArgs) do
        begin
            Result [Index] := anArgs [i];
            Inc (Index);
        end;
    end;
end;

function ParamToArrayOfConst (const aValue: TVarRec) : ArrayOfConst;
begin
    Result := _const([]);
    with aValue do
    try
        case VType of
            vtPointer: Pointer (Result) := VPointer;
        end;
    except
        Result := _const([]);
    end;
end;

function arrays (anArgs: array of const) : String;
var
    I : WORD;
    A : ArrayOfConst;
begin
    Result := '';
    for I := Low (anArgs) to High (anArgs) do
    begin
        A := ParamToArrayOfConst (anArgs [i]);
        if Assigned (A) then
        begin
            if ( I <= Low (anArgs) ) then
                Result := arrays (A)
            else
                Result := Format ('%s, %s',[ Result, arrays (A) ]);
        end
        else if ( I <= Low (anArgs) ) then
            Result := ParamToStr (anArgs [i])
        else
            Result := Format ('%s, %s',[ Result, ParamToStr (anArgs [i]) ]);
    end;
    Result := Format ('[%s]',[Result]);
end;

caption := arrays ([ 'a', _const(['test1']), 'b', _const(['test2','test3']), 'c', TForm, Pointer(TForm){, Pointer(form1)}, NIL, self, _const(['test4','test5', 2.718281828459045,  _const(['A','B','C']), 'test6' ]), 'hello', pi ]);

Все отлично работает, но только до тех пор, пока я не передам в массив какой-то другой указатель. Как мне правильно отличить типы переменных, на которые указывают указатели?

если указатель Pointer(TForm) еще как-то обрабатывается Except-ом, то Pointer(form1) сносит башню

что делать?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter