Главная страница
    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]


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


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


 
cvg   (2004-08-04 17:54) [41]

Не знаю вот только, что лучше: оставить как есть и в отладчике не отслеживать либо совать это значение в переменную, чтоб отслеживать? Или отключить этот д... оптимизатор?


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

отключи этот д. оптимизатор..


 
Sandman25 ©   (2004-08-04 17:56) [43]

Конечно, отключить. И включить только тогда, когда программа будет полностью готова.


 
cvg   (2004-08-04 18:01) [44]

Узнать бы ещеЮ как это делается. А то затравку не я писал...


 
Digitman ©   (2004-08-04 18:09) [45]


> cvg   (04.08.04 18:01) [44]


залезь в опции проекта и пошарь там ... оптимизатор вкл/откл-ся в опциях компилятора


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

Это .cfg? А которая там? А то в книге Бобровского "Delphi 7. Учебный курс" алфавитный указатель только по компонентам... :((


 
begin...end ©   (2004-08-04 18:20) [47]

Project -> Options -> Compiler -> Code generation -> Optimization


 
cvg   (2004-08-04 18:24) [48]

А там крыжик и так не стоит!


 
CyberStorm   (2004-08-04 18:35) [49]

SizeOf(MyRec)*(High(A)+1)


 
Digitman ©   (2004-08-04 18:36) [50]


> не стоит


когда "не стоит", тогда одно спасение - явное обращение к идентификатору, например, так как ты сделал - M:= Length(A)


 
cvg   (2004-08-04 18:38) [51]

Это же будет кол-во эл-тов во всех запасях, если я правильно понимаю... А оно мне надо?


 
cvg   (2004-08-04 18:40) [52]

ОК, Digitman. Обидно только слегка, что отладчик неполноценный. И где-то я уже с такой фигою в нем втречался...


 
Digitman ©   (2004-08-04 18:41) [53]


> cvg   (04.08.04 18:38) [51]
> Это же будет кол-во эл-тов во всех запасях


это ты по какому поводу ?


 
Digitman ©   (2004-08-04 18:45) [54]


> cvg   (04.08.04 18:40) [52]


> Обидно только слегка, что отладчик неполноценный


сейчас ты уподобляешься некоему Куртевичу, разведшему похожий флейм насчет иных якобы "неполноценностей" Делфи ... не надо) ... не стоит того ... отладчик все делает правильно


 
cvg   (2004-08-04 18:46) [55]

Это я Киберсторму. Пока отвечал, твоя мессага появилась.


 
Digitman ©   (2004-08-04 18:49) [56]

а CyberStorm вообще непонятно что хотел этим кодом показать ..полного объема памяти, занимаемого дин.массивом А этот код все равно не покажет


 
cvg   (2004-08-04 18:50) [57]

А насчет отладчика не уверен. Он призван жисть мне облегчить, а не непонятки порождать.


 
cvg   (2004-08-04 18:52) [58]

Но общее-то кол-во эл-тов покажет же?


 
Digitman ©   (2004-08-04 18:55) [59]


> cvg   (04.08.04 18:52) [58]


не покажет
общее кол-во эл-тов покажет именно Length()


 
cvg   (2004-08-04 19:02) [60]

Я имею ввиду: суммарное кол-во записей во всех рЕкордах массива...


 
CyberStorm   (2004-08-04 19:07) [61]

Digitman с каких щей он не покажет объем памяти,
<размер одной записи>*<количество записей в динамическом массиве> - как раз и покажет.
High(A) верхняя граница динамического массива+1 т.к. динамические массивы включают в себя нулевой элемент т.е. размерность 0..N
В Delphi записи по умоланию упакованные т.е. поля записи не выравниваются по опции Align
Общее количество элементов равно High(A)+1
Блин, я с динамическими массивами и указателями работаю ХЗ скоко лет 8)
PS может конечно вопрос не понял, не люблю длинных веток


 
CyberStorm   (2004-08-04 19:10) [62]

CVG
ты че написал, ум за разум заходит от этой формулировки:
"суммарное количество записей во всех записях массива"


 
cvg   (2004-08-04 19:15) [63]

Да ладно тебе к словам придираться, Кибершторм! Ну ладно, в книжке вот это дело названо "массив структур". Я имел ввиду: суммарное количество записей во всех структурах массива. Вот.


 
GrayFace ©   (2004-08-04 19:40) [64]

Можно отслеживать и без переменной.
pint(integer(A)-4)^ нормально выдает длину, если массив не нулевой (когда мышь на конец подведешь). Я, кажется, понял, почему так - length - это функция, а не значение в памяти. Если a=nil, то length возвращает 0 иначе то, что я написал.

Digitman ©   (04.08.04 18:45) [54]
> отладчик все делает правильно

Не все. В Delphi много неправильностей, о которых говорить бессмысленно, но считать их правильными - глупо.

CyberStorm   (04.08.04 19:10) [62]
И у меня.


 
begin...end ©   (2004-08-04 19:47) [65]


> [63] cvg   (04.08.04 19:15)


> Я имел ввиду: суммарное количество записей во всех структурах массива.

Товарищ!
То, что ты называешь структурами, называется записями.
А то, что ты называешь записями, называется полями записи.



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

Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.038 c
1-1092049709
Pavelkq
2004-08-09 15:08
2004.08.22
Открыт ли Word


14-1091394689
Кириешки
2004-08-02 01:11
2004.08.22
Самый лучший Dawnload manager


1-1091634776
XuMuk
2004-08-04 19:52
2004.08.22
Как создать несколько копий компонента в runtime?


1-1091639532
bloodman
2004-08-04 21:12
2004.08.22
Вызов функции главной программы из dll.


14-1091791513
Юрий Зотов
2004-08-06 15:25
2004.08.22
Переустановка Red Hat "по месту" - это возможно?





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