Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Длина массива записей -- как???   Найти похожие ветки 

 
cvg   (2004-08-04 16:38) [0]

Hi, masters! Как можно найти длину массива записей (или как оно там по-умному называется?) Структурка такая:

type MyRec =
record
 name:string[10];
 ar0:integer;
 ar1:double;
 ar2:double;
 ar3:double;
 ar4:double;
 ar5:double;
end;
MyArr = array of MyRec;

Length(A) не работает... Ж:(((


 
WondeRu ©   (2004-08-04 16:40) [1]

sizeof(A);


 
WondeRu ©   (2004-08-04 16:42) [2]

WondeRu ©   (04.08.04 16:40) [1] - неверно, сорри


 
Digitman ©   (2004-08-04 16:46) [3]


> Length(A) не работает


это почему же ?


 
Sandman25 ©   (2004-08-04 16:47) [4]

>это почему же ?

Undeclared identifier A :)


 
MacroDenS ©   (2004-08-04 16:48) [5]

а по тому, что нужно
sizeof(MyRec)*Length(MyArr)


 
Digitman ©   (2004-08-04 16:50) [6]


> MacroDenS


и что это будет, по-твоему ?


> Length(MyArr)


а это вообще не будет скомпилировано


 
Anatoly Podgoretsky ©   (2004-08-04 16:50) [7]

A должно быть типа MyArr


 
MacroDenS ©   (2004-08-04 16:51) [8]

> Length(MyArr)
>а это вообще не будет скомпилировано

Странно, но у меня нормально компилиться...


 
cvg   (2004-08-04 16:53) [9]

Ну я тут на радостях проверил sizeof. Результат: выдает 4 вне завистимости от еол-ва записей. Что делать будем?


 
Digitman ©   (2004-08-04 16:54) [10]


> MacroDenS ©   (04.08.04 16:51) [8]


не придумывай
скомпилироваться у тебя мог любой иной код, но только не авторский


 
Anatoly Podgoretsky ©   (2004-08-04 16:54) [11]

MacroDenS ©   (04.08.04 16:51) [8]
Код в студию, правда этот код смысла не имеет.


 
Sandman25 ©   (2004-08-04 16:54) [12]

>Что делать будем?

Может, книжки почитаем? Или хотя бы help из Delphi?


 
П7   (2004-08-04 16:54) [13]

Да ну, ты гонишь! Length вернёт количество этих записей в массиве.
А ещё можно сделать так:

var
 MyArr = array of MyRec;
 MyRecCount : integer;
function AddMyRec( MyR : MyRec ) : integer;
begin
 Result := MyRecCount;
 inc( MyRecCount );
 SetLength( MyArr, MyRecCount );
end;

Собственно MyRecCount у тебя будет размером массива.

А SizeOf( MyArr ) вроде как не сработает, т.к. массив у тебя динамический. А если и сработает, то полученное значение придётся делить на SizeOf( MyRec ), чтобы из общего размера данных выделить количество блоков "весом", равным твоей записи.


 
Digitman ©   (2004-08-04 16:56) [14]


> cvg   (04.08.04 16:53) [9]


если ведешь речь именно о длине одномерного дин.массива, то именно Length() возвращает эту длину (т.е. число элементов в этом массиве)


 
MacroDenS ©   (2004-08-04 16:59) [15]

да ладно, че вы гоните, вот код:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

type MyRec = record
name:string[10];
ar0:integer;
ar1:double;
ar2:double;
ar3:double;
ar4:double;
ar5:double;
end;
MyArr = array of MyRec;

var
 Form1: TForm1;
 a:MyArr;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  showmessage(IntToStr(length(A)));
end;

end.


который нормально компилиться, и естественно, при нажатии на button1 выскакивает сообщение 0.
а если сделать,

setlength(a, length(a)+1)

то при повторном нажатии на кнопку мессага выкинет количество записей в массиве.


 
Anatoly Podgoretsky ©   (2004-08-04 17:01) [16]

Где Length(MyArr) зачем было обманывать?


 
WondeRu ©   (2004-08-04 17:02) [17]

cvg   (04.08.04 16:53) [9]
потому что размер указателя на массив = 4


 
П7   (2004-08-04 17:02) [18]

Тупилки очередные устроили... (:


 
Digitman ©   (2004-08-04 17:02) [19]


> MacroDenS ©   (04.08.04 16:59) [15]


так ведь код-то у тебя совершенно иной !


 
MacroDenS ©   (2004-08-04 17:03) [20]

to Anatoly Podgoretsky ©
sorri, за невнимательность...
строку MyArr = array of MyRec; воспринял как MyArr : array of MyRec;

а в целом для автора

Length(A) не работает... Ж:(((

вообще нормально работает!


 
Digitman ©   (2004-08-04 17:07) [21]

осталось только выяснить, что подразумевал автор под

> или как оно там по-умному называется


то ли число эл-тов дин.массива, то ли полный объем памяти в байтах, занимаемых дин.массивом в некий момент времени


 
cvg   (2004-08-04 17:09) [22]

У меня в WatchList"е пишет: length(a): Inaccessible value.


 
MacroDenS ©   (2004-08-04 17:11) [23]

а у тебя делфа какая?
в Д6 все работает нормально!


 
cvg   (2004-08-04 17:13) [24]

Седьмая.


 
cvg   (2004-08-04 17:13) [25]

Удалено модератором


 
Digitman ©   (2004-08-04 17:14) [26]


> cvg   (04.08.04 17:09) [22]


приведи ПОЛНЫЙ код, где фигурирует объявление и использование переменной А


 
MacroDenS ©   (2004-08-04 17:14) [27]

ну вообще странно!
а как именно ты используешь length(a), в смысле просто showmessage(length(a)) или еще какие операции делаешь?


 
Anatoly Podgoretsky ©   (2004-08-04 17:15) [28]

Да их последних сообщений видно, что у него претензии не к функции, а к отладчику


 
cvg   (2004-08-04 17:18) [29]


type MyRec =
record
 name:string[10];
 ar0:integer;
 ar1:double;
 ar2:double;
 ar3:double;
 ar4:double;
 ar5:double;
end;
MyArr = array of MyRec;
var A:MyArr;
function blah_blah_blah:integer;
...
   if length(A) > 0
   then
    begin
     buf[1] := A[n].ar4; A[n].ar4 := A[n].ar1;
     buf[2] := A[n].ar5; A[n].ar5 := A[n].ar2;
    end;
...


 
cvg   (2004-08-04 17:20) [30]

Говорю же, что в списке отслеживаемых переменных показывает length(a): Inaccessible value


 
MacroDenS ©   (2004-08-04 17:21) [31]

да не все вроде ok!


 
Sandman25 ©   (2004-08-04 17:21) [32]

ИМХО лучше проверять Length(A) > n


 
Digitman ©   (2004-08-04 17:24) [33]


> cvg   (04.08.04 17:18) [29]


а где у тебя SetLength(A) ?


 
MacroDenS ©   (2004-08-04 17:24) [34]

у тебя юнит здоровый, если нет, то кинь сюда полностью


 
cvg   (2004-08-04 17:33) [35]

Юнит здоровый... Насчет StLength(A): так дело в том, что исходно массив пуст, а добавление эл-та идет в отдельной функции.


 
MacroDenS ©   (2004-08-04 17:36) [36]

кинь юнит на мыло...
или вообще, я здесь код маленького юнита делал, создай новое приложение и по его подобие все свояй, потом сюда с отчетом...


 
Digitman ©   (2004-08-04 17:36) [37]


> cvg


выключи для начала оптимизатор


 
cvg   (2004-08-04 17:42) [38]

Вот чмо!!! Перед

if length(A) > 0
then ...

написал

m := length(A);

И в списке отслеживаемых переменных эта m нормально показывается! То-то я вроде пару циклов прошел и гляжу, что условя вроде как логично срабатывают... Может, дело и впрвду в этом д... оптимизаторе?


 
MacroDenS ©   (2004-08-04 17:43) [39]

ну так заработало что ли?


 
Digitman ©   (2004-08-04 17:47) [40]


> Может, дело и впрвду в этом д... оптимизаторе?


именно в нем ... но отнюдь не в д...



Страницы: 1 2 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.05 c
14-1091394689
Кириешки
2004-08-02 01:11
2004.08.22
Самый лучший Dawnload manager


3-1090913876
Nikolai_S
2004-07-27 11:37
2004.08.22
Проблема с версиями MDAC


1-1091711193
XXX
2004-08-05 17:06
2004.08.22
Диалог выбора директории


3-1090836150
MORA
2004-07-26 14:02
2004.08.22
Каскадное удаление вручную


14-1091768274
WondeRu
2004-08-06 08:57
2004.08.22
Кто использует в своих программах HASP ы?