Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Размеры массива

13K
04 октября 2005 года
greedya
7 / / 04.10.2005
Наверно я очень ленивый но искать долго мне в лом, вот в чем само дело:
Есть двумерный динамический массив А(0..X,0..Y) типа матрицы и нужно найти эти X и Y. Допустим X=Length(A), но как найти Y не знаю.
Ну или хотя бы кол-во всех элементов в массиве найти, тож чето не могу найти такой функции. Хелп народ.
292
04 октября 2005 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by greedya
Допустим X=Length(A), но как найти Y не знаю.


width(y)
:)))
вообще на сколько я помню (5 лет уже на паскале проги не писал) Length возвращает длину строки. Вернет ли оно размер массива по Х? может быть, но наверное только в случае если это байтовский массив.
А вообще не пойму зачем вычислять размер массива, если Ты сам его задаеш?

13K
04 октября 2005 года
greedya
7 / / 04.10.2005
Цитата:
Originally posted by Matush
width(y)
:)))
вообще на сколько я помню (5 лет уже на паскале проги не писал) Length возвращает длину строки. Вернет ли оно размер массива по Х? может быть, но наверное только в случае если это байтовский массив.


>Вообще Length возвращает нужное мне значение, тоьлко не X, а X+1. Поэтому лучше использовать High(A).

Цитата:
Originally posted by Matush
А вообще не пойму зачем вычислять размер массива, если Ты сам его задаеш?


>Собственно ты прав можно и не искать длину массива а восплользоваться данными при заполнении. Но так как там много вариантов конечного массива а еще и обработка массивов процедурой, в которой никак не обойтись без длин, то прога вырастает раз в 4-5. Это конечно не страшно =))), но при отладке хочется повеситься... Ну должны же быть какие то функции.
Хотя б чтоб найти кол-во элементов в массиве!

241
05 октября 2005 года
Sanila_san
1.6K / / 07.06.2005
>Собственно ты прав можно и не искать длину массива а восплользоваться данными при заполнении. Но так как там много вариантов конечного массива а еще и обработка массивов процедурой, в которой никак не обойтись без длин, то прога вырастает раз в 4-5.... Ну должны же быть какие то функции.
Хотя б чтоб найти кол-во элементов в массиве! [/QUOTE]

Так ведь никто не мешает написать самому такую функцию. Есть ещё вариант - двумерный массив есть одномерный массив одномерных массивов.:) Может быть, тебе эта мысль что-то даст.;)
Количество элементов посчитать просто - умножь длину на ширину (array [1..i, a..j]; i*j; ), по-моему не такая уж и проблема узнать, чему равны эти i и j. Они же чем-то задаются?
13K
06 октября 2005 года
greedya
7 / / 04.10.2005
Цитата:
Количество элементов посчитать просто - умножь длину на ширину (array [1..i, a..j]; i*j; ), по-моему не такая уж и проблема узнать, чему равны эти i и j. Они же чем-то задаются?


>Да ты приколист. Ради интереса спрашиваю: читал предыдущие посты?

Цитата:
Так ведь никто не мешает написать самому такую функцию.


>Можно конечно и даже идеи есть, но а вдруг есть такая стандартная функция.
Как правильно написать проверку задана ли переменная X?(А точнее элемент массива A[j], хотя принцип должен быть одинаковым)

241
06 октября 2005 года
Sanila_san
1.6K / / 07.06.2005
>Можно конечно и даже идеи есть, но а вдруг есть такая стандартная функция.

По-моему, такой функции нет. Могу ошибаться.


Как правильно написать проверку задана ли переменная X?(А точнее элемент массива A[j], хотя принцип должен быть одинаковым)

Как вариант, можно задать сразу все переменные при инициализации массива. Например, можно присвоить им какие-то одинаковые значения.
13K
06 октября 2005 года
greedya
7 / / 04.10.2005
Цитата:
Originally posted by Sanila_san
Как вариант, можно задать сразу все переменные при инициализации массива. Например, можно присвоить им какие-то одинаковые значения.


>Ведь для того чтоб задать все элементы массива нужно знать его размеры что мне и нужно. То что ты предложил это то же самое что и использование размеров массива при его инициации, но так как вариантов конечных массивов может быть много(и размеры у них могут быть разные) то намного более экономно написать универсальную процедуру вывода массива X на Y. Да и для обработки тоже удобнее написать пару универсальных процедур.

Короче мне нужно знать вот что:
Пользователь задает значение некой переменной X, и нужно узнать задал ли он значение или же оставил пустой. Что то типа:
IF (X задан) THEN операторы;
Что именно нужно написать в условии???

13K
06 октября 2005 года
greedya
7 / / 04.10.2005
Все, наконец-то получил эти долбаные размеры. Если кому интересно то размер Y в массиве A(0..X,0..Y) находится так(я не думаю что ктото будет создавать дин. массив с колвом элементов больше чем 1000*(X+1), заполнять заколебается =))) :

type Arr=array of real;
...
function CountY(A: array of Arr):byte;
var i:integer;
begin
for i:=0 to 1000 do
begin
try
if A[0]<>0 then continue;
except
on IndexOutOfRangeException do
begin
Result:=i;
break;
end
end;
end;
end;
292
07 октября 2005 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by greedya
Все, наконец-то получил эти долбаные размеры. Если кому интересно то размер Y в массиве A(0..X,0..Y) находится так(я не думаю что ктото будет создавать дин. массив с колвом элементов больше чем 1000*(X+1), заполнять заколебается =))) :



Недумаю что это хорошее решение. Вместо того чтобы запомнить размер массива, Ты будеш вычислять его каждый раз с помщью этой не очень-то хорошей функции.
Если уж так влом держать где-то отдельно размеры массива, то сделай структуру (record), в которой будет массив и его размеры:
TYPE
tt = ARRAY of ARRAY of byte;
tArr = record
m: tt;
sizeX, sizeY: integer;
end
VAR
MyArr : tArr;

ну и юзаеш себе теперь MyArr.m[MyArr.SizeX][My.ArrSizeY] - ячейка с максимальными координатами в массиве.

P.S. С синтаксисом может напутал (давно это было)

5
14 октября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by greedya
Все, наконец-то получил эти долбаные размеры. Если кому интересно то размер Y в массиве A(0..X,0..Y) находится так(я не думаю что ктото будет создавать дин. массив с колвом элементов больше чем 1000*(X+1), заполнять заколебается =))) :

type Arr=array of real;
...
function CountY(A: array of Arr):byte;
var i:integer;
begin
for i:=0 to 1000 do
begin
try
if A[0]<>0 then continue;
except
on IndexOutOfRangeException do
begin
Result:=i;
break;
end
end;
end;
end;



Всё гораздо проще чем ты предстваляешь себе:

Код:
type
  TMatrix = array of array of real;

//инициализация  матицы 10x10
SetLength(MyMatrix,10,10);

//дело в том, что это массив
//динамических массивов
RowLength:=Length(MyMatrix); //кол-во строк

//длина i-строки
ColLength:=Length(MyMatrix);

//в случае прямоугольного массива
if RowLength >0 then ColLength:=Length(MyMatrix[0]);

Т.к. динамический массив в Delphi - это объект, поддерживаемый системой, то функция Length - просто обращается к соответствующему полю у объекта, что очень эффективно :)
13K
14 октября 2005 года
greedya
7 / / 04.10.2005
Цитата:
Originally posted by hardcase
Всё гораздо проще чем ты предстваляешь себе:
Код:
type
  TMatrix = array of array of real;

//инициализация  матицы 10x10
SetLength(MyMatrix,10,10);

//дело в том, что это массив
//динамических массивов
RowLength:=Length(MyMatrix); //кол-во строк

//длина i-строки
ColLength:=Length(MyMatrix);

//в случае прямоугольного массива
if RowLength >0 then ColLength:=Length(MyMatrix[0]);

Т.к. динамический массив в Delphi - это объект, поддерживаемый системой, то функция Length - просто обращается к соответствующему полю у объекта, что очень эффективно :)



Я согласен это просто, но проблема в том что массив надо передать в процедуру, например:
procedure Smthng(Array:array of real);
begin
...
Length(Array) - проходит намана
Length(Array[0]) - компилятор начинает ругаться Error'ами.
...
Как тут быть?

5
15 октября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by greedya
Я согласен это просто, но проблема в том что массив надо передать в процедуру, например:
procedure Smthng(Array:array of real);
begin
...
Length(Array) - проходит намана
Length(Array[0]) - компилятор начинает ругаться Error'ами.
...
Как тут быть?


Так у тебя же array of real, а Length(Arr[Index1][Index2]...[IndexN]) доступна когда у нас массив массивов - т.е. многомерный массив. Вот компилер и ругается - несовместимый тип: реал И массив или строка

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог