Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.054 c
1-1098936553
Babay
2004-10-28 08:09
2004.11.14
Два вопроса по Д8


1-1098909229
dms_main
2004-10-28 00:33
2004.11.14
debug DLL


6-1094132569
sniknik
2004-09-02 17:42
2004.11.14
UDP протокол на базе Мелкософтского клиента


11-1082719819
BolikDimon
2004-04-23 15:30
2004.11.14
Использование KOL в БД-приложениях


14-1098554938
Piter
2004-10-23 22:08
2004.11.14
Ищу архив ветки об обновлении FAQ