Форум: "Основная";
Текущий архив: 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