Главная страница
    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.5 MB
Время: 0.049 c
1-1099176911
Кто---то
2004-10-31 02:55
2004.11.14
Как в программе хранятся record ? В виде смещений, или чего то


14-1098183034
Kerk
2004-10-19 14:50
2004.11.14
Орешник отдыхает.


1-1099339331
Skiter
2004-11-01 23:02
2004.11.14
Работа с TImages


1-1099320334
Kat
2004-11-01 17:45
2004.11.14
Как узнать сколько дней в январе например?


1-1098967297
Chlavik
2004-10-28 16:41
2004.11.14
Надо после QueryInterface как то уничтожать полученый интерфейс ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский