Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как мне посмотреть исходники процедуры SetLength [D6, Win2k]


Страницы:   1 2

Андрусь ©   (2002-08-22 13:59:00) 

Привет всем!Такой вот вопрос.Как мне посмотреть исходники процедуры SetLength(прикалываться не надо - подводишь курсор,кликаешь мышкой).Хотябы шапку - типы входных параметров. Зараннее всем большое спасибо.


Андрусь   (2002-08-22 15:18:00) [21]

>McSimm © (22.08.02 15:05)
Что мне нужно - нужна процедура,которая бы удаляла из динамического массива i-й элемент.Причем чтобы работала для дин.массивов различного типа.И вот там стопор - SetLength.


Игорь Шевченко   (2002-08-22 15:16:00) [22]

SetLength:

procedure _LStrSetLength{ var str: AnsiString; newLength: Integer};
asm
{ -> EAX Pointer to str }
{ EDX new length }

PUSH EBX
PUSH ESI
PUSH EDI
MOV EBX,EAX
MOV ESI,EDX
XOR EDI,EDI

TEST EDX,EDX
JE @@setString

MOV EAX,[EBX]
TEST EAX,EAX
JE @@copyString

CMP [EAX-skew].StrRec.refCnt,1
JNE @@copyString

SUB EAX,rOff
ADD EDX,rOff+1
PUSH EAX
MOV EAX,ESP
CALL _ReallocMem
POP EAX
ADD EAX,rOff
MOV [EBX],EAX
MOV [EAX-skew].StrRec.length,ESI
MOV BYTE PTR [EAX+ESI],0
JMP @@exit

@@copyString:
MOV EAX,EDX
CALL _NewAnsiString
MOV EDI,EAX

MOV EAX,[EBX]
TEST EAX,EAX
JE @@setString

MOV EDX,EDI
MOV ECX,[EAX-skew].StrRec.length
CMP ECX,ESI
JL @@moveString
MOV ECX,ESI

@@moveString:
CALL Move

@@setString:
MOV EAX,EBX
CALL _LStrClr
MOV [EBX],EDI

@@exit:
POP EDI
POP ESI
POP EBX
end;


Ученик   (2002-08-22 15:15:00) [23]

procedure Delete_Element(var Arr; TypeInfo : Pointer; DeleteIdx : Integer);
Var
Source, Dest : Integer;
ArrayLen, ElemSize, ArrSize : Integer;
p_source,p_dest:pointer;
Begin
ArrayLen := PInteger(Integer(Arr) - 4)^;
ElemSize := PDynArrayTypeInfo(PChar(TypeInfo) + Length(PDynArrayTypeInfo(typeInfo).name))^.elSize;
ArrSize := ArrayLen * ElemSize;
Source := (DeleteIdx+1)*ElemSize;
Dest := Source-ElemSize;
p_dest:=Pointer(Integer(Arr)+Dest);
p_source:=Pointer(Integer(Arr)+Source);
Move(p_source^,p_dest^, ArrSize-(DeleteIdx+1)*ElemSize);
Dec(ArrayLen);
DynArraySetLength(Pointer(Arr), TypeInfo, 1, @ArrayLen);
End;

Вызов: Delete_Element(I, TypeInfo(TIntegerArray), 3);


McSimm   (2002-08-22 15:05:00) [24]

Когда компилятор встречает SetLength в программе, он в разных случаях генерирует разный код.
Для строк - один, для массивов другой.

В случае с массивами фактически происходит вызов
DynArraySetLength
где в качестве одного из параметров указатель на структуру Type info. Поэтому чтобы откомпилировать SetLength компилятору необходимо знать информацию о типе массива.

Попробуй пойти другим путем. Я не знаю что тебе нужно, но думаю это можно сделать проще


Андрусь   (2002-08-22 15:05:00) [25]

>Ученик © (22.08.02 14:55)
См. Подскажите функцию (Андрусь 22.08.02 14:10)
Вызов процедуры с примером от туда

const del=3;
n=10;
var SS:array of integer;i:integer;
begin
SetLength(SS,n);
For i:=0 To n-1 Do SS[i]:=i;
Delete_Element(SS,Length(SS),SizeOf(SS[0]),del);
end;


Андрусь   (2002-08-22 14:56:00) [26]

Вот код бы от SetLength глянуть и добавить в мою процедуру что там нужно - тогда можно и без него.


Ученик   (2002-08-22 14:55:00) [27]

>Андрусь ©
А как выглядит вызов Delete_Element, желательно с определением типов передаваемых переменных ?


PVOzerski   (2002-08-22 14:47:00) [28]

Очень неплохо договариваться через ReallocMem, только отслеживать все возможные утечки памяти придётся самостоятельно. Зато гибкость большая, и для старых версий Delphi, где нет динамических массивов, тоже годится.


Андрусь   (2002-08-22 14:30:00) [29]

>McSimm ©
Не подскажите как с ним договориться. На входе железно будет динамический массив,но тип тоже неизвестен.


McSimm   (2002-08-22 14:21:00) [30]

>почему на такое компилер ругается

1. :) Когда компилятор "ругается" он среди бранных слов объясняет причину своего недовольства.

2. Переменная Arr нетипизирована. Поэтому передать ее в SetLength нельзя


Anatoly Podgoretsky   (2002-08-22 14:19:00) [31]

System.pas


Андрусь   (2002-08-22 14:17:00) [32]

>McSimm
Мастер,а почему на такое компилер ругается

Procedure Delete_Element(Var Arr; ArrSize : Integer; ElemSize, DeleteIdx : Integer);
Var Source, Dest : Integer;
p_source,p_dest:pointer;
Begin
ArrSize := ArrSize * ElemSize;
Source := (DeleteIdx+1)*ElemSize;
Dest := Source-ElemSize;
p_dest:=Pointer(Integer(Arr)+Dest);
p_source:=Pointer(Integer(Arr)+Source);
Move(p_source^,p_dest^,ArrSize-(DeleteIdx+1)*ElemSize);
//Эту строку компилер не пропускает
// SetLength(Arr,ArrSize div ElemSize - 1);
End;


Ученик   (2002-08-22 14:17:00) [33]

>Андрусь © (22.08.02 13:59)
После SetLength( нажми Ctrl+Shift+Пробел


Dmitriy Polskoy   (2002-08-22 14:15:00) [34]

Смотри в system.pas


McSimm   (2002-08-22 14:10:00) [35]

Шапка (типы входных параметров) -

procedure SetLength(var S; NewLength: Integer);

S - string or dynamic array


lenin   (2002-08-22 14:10:00) [36]


> Hooch © (22.08.02 14:08)

Чего, чего, а SetLength не показывает.


Shaman_Naydak   (2002-08-22 14:10:00) [37]

Не поверишь, выдрал из хелпа! :)
SetLength procedure
Sets the length of a string or dynamic-array variable.
Unit System

procedure SetLength(var S; NewLength: Integer);

Description

S is a string or dynamic-array variable.

NewLength is the new number of characters or elements in S.

For a short-string variable, SetLength simply sets the length-indicator character (the character at S[0]) to the given value. In this case, NewLength must be a value between 0 and 255.

For a long-string or dynamic-array variable, SetLength reallocates the string or array referenced by S to the given length. Existing characters in the string or elements in the array are preserved, but the content of newly allocated space is undefined. The one exception is when increasing the length of a dynamic array in which the elements are types that must be initialized (strings, Variants, Variant arrays, or records that contain such types). When S is a dynamic array of types that must be initialized, newly allocated space is set to 0 or nil.

Following a call to SetLength, S is guaranteed to reference a unique string or array—that is, a string or array with a reference count of one. If there is not enough memory available to reallocate the variable, SetLength raises an EOutOfMemory exception.

Добавлю от себя, что если переменная многомерный динамический массив, то можно выставлять сразу все размерности, т.е.
var A: array of array of Integer;
begin
SetLength(A, 3, 4); // вполне нормально и корректно!
end;


McSimm   (2002-08-22 14:08:00) [38]

Точка прерывания, CPU Window


Hooch   (2002-08-22 14:08:00) [39]

подводишь курсор,удерживаеш кнопку Контрол, кликаешь мышкой видиш исходник


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо