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