Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.032 c
3-1091195736
Koala
2004-07-30 17:55
2004.08.22
Активные подключения


3-1090972330
AleKo
2004-07-28 03:52
2004.08.22
Проверка на вхождение в операторе WHERE IN


1-1091763515
kos
2004-08-06 07:38
2004.08.22
Как конвертировать значение даты в целое число?


9-1083603796
Bim
2004-05-03 21:03
2004.08.22
Как передать управление процедуре?


3-1091102730
AVPog
2004-07-29 16:05
2004.08.22
Память ест в access





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский