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

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

var A:Array [0..0] of DWORD; Как получить A[1]?


Страницы:   1 2

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-му эл-ту, если у тебя перед глазами декларация, ЯВНО указывающая, что нумерация элементов идет с "нуля", и элементов с индексом больше нуля заведомо не существует ?


Страницы:   1 2

Наверх

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