![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
var A:Array [0..0] of DWORD; Как получить A[1]?
Chlavik © (2004-11-02 14:17:00)Дело в том что многие масивы для совместимости, продекларены именно иак как в сабже а при попытке получить доступ к любому елементу ( не нулевому ) delphi кричит что
"Constant expression violates subrange bounds" Как обойти это ?
есть что то для этого типа {$R-} ?... Пасиба!
Chlavik (2004-11-03 15:53:00) [1]
> марсианин © (02.11.04 17:19) [19]
> ничего не понятно. совсем. ты хочешь сделать свое подобие
> динамическим массивам??
Да только память юзать чужую....
А absolute очень удобно юзать когда известен на что указывает параметр
типа
procedure TMyClass.ProcA(A:Pointer);
var RowSet:PRowSet absolute A;
begin
end;
когда такая Proc перекрыта в наследнике
Юрий Зотов (2004-11-02 20:47:00) [2]> Chlavik © (02.11.04 15:31) [18]
По индексу вычислите смещение, вот и все. Какие проблемы?
type
TSRow = ...;
TSRowSet = record
cRows: ULONG;
aRow: array[0..0] of TSRow;
end;
PSRow = ^TSRow;
var
RowSet: TSRowSet;
function GetARow(Index: ULONG): TSRow;
begin
if Index >= RowSet.cRows then
raise ... ;
Result := PSRow(ULONG(Addr(RowSet.aRow[0])
+ Index * SizeOf(TSRow))^
end;
> марсианин © (02.11.04 17:19) [19]
> а если я вижу директиву absolute и это не исходник драйвера,
> то это надо срочно нести на свалку
А если в Дельфишном коде Вы видите ассемблерные вставки, то ЭТО куда надо нести?
Sergey_Masloff (2004-11-02 18:27:00) [3]марсианин © (02.11.04 17:19) [19]
>а если я вижу директиву absolute и это не исходник драйвера, то >это надо срочно нести на свалку
Очень спорно
марсианин (2004-11-02 17:19:00) [4]ничего не понятно. совсем. ты хочешь сделать свое подобие динамическим массивам??
только aRow : array[0..0] of TSRow; - массив из одного элемента, но не указатель на массив, как ты наверное предположил
а если я вижу директиву absolute и это не исходник драйвера, то это надо срочно нести на свалку
Chlavik (2004-11-02 15:31:00) [5]Блин почему моих месаг не видно что с Форумом? Сервер тормозит..
//
Просто на самом деле я работаю со структорой MapiDefs.PSRowSet
Так вот
TSRowSet =
record
cRows : ULONG; { Count of rows }
aRow : array[0..0] of TSRow;
{ Array of rows }
end;
Просто было бы супер зазать что то типа
type TA :array of DWORD;
var _A:^TA;
A:PSRowSet absolute Pointer(Pointer(_A^)^ - $4
В общем понятно что я хочу ..
MBo (2004-11-02 15:11:00) [6]>Romkin © (02.11.04 15:01) [15]
>Вот только все равно лучше перевести на динамические массивы ;)
Такие объявления в API-шных структурах часто встречаются, например, tagBITMAPINFO
MBo (2004-11-02 15:09:00) [7]1. Не использовать константы - при {$R-} A[5] не пропустит компилятор, но
i:=5;// или вычисляемое
A[i] сработает
2. Объявить тип
TDWArray=array[0..много] of DWord;
PDWArray=^TDWArray;
и приводить к этому типу
PDWArray[@A][5]
3. через арифметику указателей PDWord(Integer(@A)+4*SizeOf(Integer))^
Romkin (2004-11-02 15:01:00) [8]А проблема-то именно в использовании константы. Ругается компилятор, насколько я понял?
i := 1; A[i]... Должно пройти при отключенном контроле границ. Вот только все равно лучше перевести на динамические массивы ;)
Rem (2004-11-02 14:50:00) [9]Лучше все же использовать:
{$RANGECHECKS OFF}
...
{$RANGECHECKS ON}
Потому как негоже отключать контроль выхода за пределы диапазона для всегопроекта.
или
type
PMyArray = ^TMyArray;
TMyArray = array[0..MaxInt div 4] of dword;
...
procedure DoSomething(A: PMyArray; ALength: integer);
begin
...
A^[ALength - 1] := 300;
...
end;
Т.е. использовать только тип PMyArray, но никак не TMyArray, т.к. тогда никакой памяти не хватит.
Verg (2004-11-02 14:49:00) [10]I:=0;
Func(A^[i+0],A^[i+1],A^[i+2]...) // АА?
Pentium133 (2004-11-02 14:47:00) [11]
> ГДЕ в коде автора ты видишь "работу" имеено с
> динамическими массивами ?
Chlavik © (02.11.04 14:36) [8]
Помню раньше именно так делал динамические масивы в TurboPascal'e
Digitman (2004-11-02 14:44:00) [12]
> работа с динамическими масивами.
> Попробуй в настройках отключить Range Cheking
чушь.
эта опция предназначена для контроля обращений к статическиммассивам.
ГДЕ в коде автора ты видишь "работу" имеено с динамическимимассивами ?
Pentium133 (2004-11-02 14:42:00) [13]
> Попробуй в настройках отключить Range Cheking. Хотя это помоему одно и тоже.
Короче в хелпе явнонаписанноThe $R directive enables or disables the generation of range-checking code. Почему у тебя не работает не знаю. Разбирайся.
Chlavik (2004-11-02 14:39:00) [14]
> Pentium133 © (02.11.04 14:31) [7]
Единственный кто меня понимает ...
Chlavik (2004-11-02 14:36:00) [15]Я сам должен решить какой у масива размер .... Есть этому альтернатива?
Пример с одной функции я получаю Указатель на масив DWORD
var A:PDWORD;
Count:Dword;
procedure getArray (var Count:dword; var A:PDword);
процедура виделит память (и вернёт колво елементовв Count)
и тут мне надо в следующую какуюто процедуру пердать три параметра масива A !! то что для кадого парметра выделять переменную а потом делать типа var1:=A^; Inc(A); var2:=A^; Inc(A) ....
а потом типа Func(var1,var2,var3...)
ЕСЛИ мона было бы сразу написать
var A:^ array [0..0] of DWORD;
begin
getArray (Count, A);
Func(A^[0],A^[1],A^[2]...) // АА?
Pentium133 (2004-11-02 14:31:00) [16]
> нет. далеко не то же самое.
Не тормозите. Это работа с динамическими масивами.
Попробуй в настройках отключить Range Cheking. Хотя это помоему одно и тоже.
Chlavik (2004-11-02 14:28:00) [17]На {$R-} оно не ведётся ....
Digitman (2004-11-02 14:26:00) [18]
> А если A:Array [0..0] of DWORD это тоже самое что и A:PDWORD
> ?
нет. далеко не то же самое.
Chlavik (2004-11-02 14:25:00) [19]А если A:Array [0..0] of DWORD это тоже самое что и A:PDWORD ? и что бы потом не делать 5 раз Inc(A) я могу просто написать A[5] и всё. Разве никто с этим не сталкивался ?
Digitman (2004-11-02 14:23:00) [20]
> продекларены именно иак как в сабже а при попытке получить
> доступ к любому елементу ( не нулевому )
а какого же ляда ты обращаешься к 1-му эл-ту, если у тебя перед глазами декларация, ЯВНО указывающая, что нумерация элементов идет с "нуля", и элементов с индексом больше нуля заведомо не существует ?