Текущий архив: 2004.11.14;
Скачать: CL | DM;
Внизvar A:Array [0..0] of DWORD; Как получить A[1]? Найти похожие ветки
← →
Chlavik © (2004-11-02 14:17) [0]Дело в том что многие масивы для совместимости, продекларены именно иак как в сабже а при попытке получить доступ к любому елементу ( не нулевому ) delphi кричит что
"Constant expression violates subrange bounds" Как обойти это ?
есть что то для этого типа {$R-} ?... Пасиба!
← →
MacroDenS © (2004-11-02 14:18) [1]а нафига тебе обращаться за пределы массива?
Там кроме мусора из оперативы ничего путного нет...
← →
Pentium133 © (2004-11-02 14:22) [2]Ну так и используй эту {$R-}
← →
Digitman © (2004-11-02 14:23) [3]
> продекларены именно иак как в сабже а при попытке получить
> доступ к любому елементу ( не нулевому )
а какого же ляда ты обращаешься к 1-му эл-ту, если у тебя перед глазами декларация, ЯВНО указывающая, что нумерация элементов идет с "нуля", и элементов с индексом больше нуля заведомо не существует ?
← →
Chlavik © (2004-11-02 14:25) [4]А если A:Array [0..0] of DWORD это тоже самое что и A:PDWORD ? и что бы потом не делать 5 раз Inc(A) я могу просто написать A[5] и всё. Разве никто с этим не сталкивался ?
← →
Digitman © (2004-11-02 14:26) [5]
> А если A:Array [0..0] of DWORD это тоже самое что и A:PDWORD
> ?
нет. далеко не то же самое.
← →
Chlavik © (2004-11-02 14:28) [6]На {$R-} оно не ведётся ....
← →
Pentium133 © (2004-11-02 14:31) [7]
> нет. далеко не то же самое.
Не тормозите. Это работа с динамическими масивами.
Попробуй в настройках отключить Range Cheking. Хотя это помоему одно и тоже.
← →
Chlavik © (2004-11-02 14:36) [8]Я сам должен решить какой у масива размер .... Есть этому альтернатива?
Пример с одной функции я получаю Указатель на масив 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]...) // АА?
← →
Chlavik © (2004-11-02 14:39) [9]
> Pentium133 © (02.11.04 14:31) [7]
Единственный кто меня понимает ...
← →
Pentium133 © (2004-11-02 14:42) [10]
> Попробуй в настройках отключить Range Cheking. Хотя это помоему одно и тоже.
Короче в хелпе явнонаписанноThe $R directive enables or disables the generation of range-checking code
. Почему у тебя не работает не знаю. Разбирайся.
← →
Digitman © (2004-11-02 14:44) [11]
> работа с динамическими масивами.
> Попробуй в настройках отключить Range Cheking
чушь.
эта опция предназначена для контроля обращений к статическим массивам.
ГДЕ в коде автора ты видишь "работу" имеено с динамическими массивами ?
← →
Pentium133 © (2004-11-02 14:47) [12]
> ГДЕ в коде автора ты видишь "работу" имеено с
> динамическими массивами ?
Chlavik © (02.11.04 14:36) [8]
Помню раньше именно так делал динамические масивы в TurboPascal"e
← →
Verg © (2004-11-02 14:49) [13]I:=0;
Func(A^[i+0],A^[i+1],A^[i+2]...) // АА?
← →
Rem © (2004-11-02 14:50) [14]Лучше все же использовать:
{$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, т.к. тогда никакой памяти не хватит.
← →
Romkin © (2004-11-02 15:01) [15]А проблема-то именно в использовании константы. Ругается компилятор, насколько я понял?
i := 1; A[i]... Должно пройти при отключенном контроле границ. Вот только все равно лучше перевести на динамические массивы ;)
← →
MBo © (2004-11-02 15:09) [16]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))^
← →
MBo © (2004-11-02 15:11) [17]>Romkin © (02.11.04 15:01) [15]
>Вот только все равно лучше перевести на динамические массивы ;)
Такие объявления в API-шных структурах часто встречаются, например, tagBITMAPINFO
← →
Chlavik © (2004-11-02 15:31) [18]Блин почему моих месаг не видно что с Форумом? Сервер тормозит..
//
Просто на самом деле я работаю со структорой 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
В общем понятно что я хочу ..
← →
марсианин © (2004-11-02 17:19) [19]ничего не понятно. совсем. ты хочешь сделать свое подобие динамическим массивам??
только aRow : array[0..0] of TSRow; - массив из одного элемента, но не указатель на массив, как ты наверное предположил
а если я вижу директиву absolute и это не исходник драйвера, то это надо срочно нести на свалку
← →
Sergey_Masloff (2004-11-02 18:27) [20]марсианин © (02.11.04 17:19) [19]
>а если я вижу директиву absolute и это не исходник драйвера, то >это надо срочно нести на свалку
Очень спорно
← →
Юрий Зотов © (2004-11-02 20:47) [21]> 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 и это не исходник драйвера,
> то это надо срочно нести на свалку
А если в Дельфишном коде Вы видите ассемблерные вставки, то ЭТО куда надо нести?
← →
Chlavik © (2004-11-03 15:53) [22]
> марсианин © (02.11.04 17:19) [19]
> ничего не понятно. совсем. ты хочешь сделать свое подобие
> динамическим массивам??
Да только память юзать чужую....
А absolute очень удобно юзать когда известен на что указывает параметр
типа
procedure TMyClass.ProcA(A:Pointer);
var RowSet:PRowSet absolute A;
begin
end;
когда такая Proc перекрыта в наследнике
Страницы: 1 вся ветка
Текущий архив: 2004.11.14;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.037 c