(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 

Конференция "Micro Focus/Borland"

Обсуждение вопросов, связанных с компанией Micro Focus/Borland, ее продуктами CaliberRM, CaliberRDM, SilkTest, StarTeam, TeamDefine, Together и других.

 
 
Добавить сообщение »

Тема: Обсуждение материала "Работа с динамическими массивами в Delphi"

В статье приводятся простейшие примеры работы с динамическими массивами.

Автор:  FataLL Дата: 10.12.2009 06:11
Екатерина пишет 08.06.2009 19:11:
>Подскажите пожалуйста!!!
>Работаю с динамическими массивами
>type Arr2 = array of array of integer;

Дело в том, что Вы, скорее всего, описали тип Arr2 в двух юнитах, и в Form1, и в Form2. Не смотря на то, что называются они одинаково, компилятор считает их совершенно различными. Если Вы создаёте какие-либо новые типа данных, пользуетесь константами и т.д., возьмите за правило реализовывать всё это в отдельном модуле, который потом просто включите в секцию uses там, где есть надобность...
Ответить на сообщение »
 
Автор:  Екатерина Дата: 08.06.2009 19:11
Подскажите пожалуйста!!!
Работаю с динамическими массивами
type Arr2 = array of array of integer;

затем опичываю процедуру:
procedure MyProc(var a: Arr2)

При работе программы создается массив типа Arr2 в Form1 и передаётся в процедуру Form2.MyProc(var a:Arr2).
Delphi 7 выдает ошибку:'Тип формальных и актуальных переменных должны быть одинаковы'
В чём причина, и как можно решить эту задачу?
Заранее спасибо.
Ответить на сообщение »
 
Автор:  pkr Дата: 03.03.2009 22:25
Из массива уже никак ни удалишь- просто нужно создать новый динамический массив соотв-го размера, а потом скопировать из исходного массива. в него все столбцы, кроме того в котором найден кратный элемент.
Ответить на сообщение »
 
Автор:  Az@t Дата: 03.03.2009 06:51
Подскажите пожалуйста как можно удалить из двумерногого массива столбец содержащий элемент кратный пяти
Ответить на сообщение »
 
Автор:  pkr Дата: 11.07.2008 11:16
Эх, народ народ! че париться писали бы на C
и было б все проще -

// нужен динамический массив целых ?- нужен указатель
int *m;
// пускай в n число элементов...
int n;
// и создаем массив...
m= new int [n] ;
m[0] =... ; m[1]= ... ; m[n-1] =... ; // работаем с массивом
// и т д и т ..................
delete []m ; // если больше не нужен -убираем мусор...
Ответить на сообщение »
 
Автор:  Andrey Дата: 30.07.2007 18:39
2Oleg

Ну не знаю, я на Delphi7 писал и всё ок )

в чём именно проблемма ? в какой строчке ?
Ответить на сообщение »
 
Автор:  Oleg Дата: 30.07.2007 11:39
Andrey пишет 30.07.2007 08:38:
>2Олег
>
>Для того что бы передать динамический многомерный массив в функцию, вам необходимо указать его в качестве новоги типа данных:
>
>type Arr2 = array of array of integer;
>
>затем опичываем функцию:
>
>function MyFnc(a: Arr2): integer; // нет никакой разницы ,как передавать, по ссылке или по значению, смотря что вам нужно
>begin
>// тело функции, делаем что хочем с нашим массивом, например напечатаем первый елемент
>writeln (a[0,0]);
>readln;
>end;
>
>//тело программы
>var
>MyArr: Arr2;
>begin
>randomize;
>SetLengt(MyArr,2,2); // устнавливаем размерность массива по X,Y
>// заполняем массив
>for i:=0 to 1 do
> for j:=0 to 1 do
> MyArr[i,j]:= random(20);
>MyFnc(MyArr); // вызываем функцию
>
>Вот собственно и всё )


Я так тоже пробовал на дельфи 2007, нужна библиотека чтобы объект создать (arrays.pas), но в моей сборке ее нет.
Ответить на сообщение »
 
Автор:  Andrey Дата: 30.07.2007 08:38
2Олег

Для того что бы передать динамический многомерный массив в функцию, вам необходимо указать его в качестве новоги типа данных:

type Arr2 = array of array of integer;

затем опичываем функцию:

function MyFnc(a: Arr2): integer; // нет никакой разницы ,как передавать, по ссылке или по значению, смотря что вам нужно
begin
// тело функции, делаем что хочем с нашим массивом, например напечатаем первый елемент
writeln (a[0,0]);
readln;
end;

//тело программы
var
MyArr: Arr2;
begin
randomize;
SetLengt(MyArr,2,2); // устнавливаем размерность массива по X,Y
// заполняем массив
for i:=0 to 1 do
for j:=0 to 1 do
MyArr[i,j]:= random(20);
MyFnc(MyArr); // вызываем функцию

Вот собственно и всё )
Ответить на сообщение »
 
Автор:  Олег Дата: 28.07.2007 13:48
может кто знает библиотеки для работы с массивами... в книге архангельского он часто использует библиотеку arrays.pas, но вот я найти ее не могу, везде валяется одно старье (2000-2002) год... может у кого есть библитотека из делфи 2006, пришлите на мыло плиз.
Ответить на сообщение »
 
Автор:  Олег Дата: 28.07.2007 13:45
А как отправить многомерный динамический массив в функцию???

function myfunc(var: a: array of array of string): string;

не получается... по возможности отпишитесь на мыло.
Ответить на сообщение »
 
Автор:  Krab Дата: 28.07.2007 02:26
Я просто показывал, что статья, во всяком случае ее словесная часть, очень небрежно написана. Ни на одно определение или объяснение нельзя положиться, почти всегда можно привести контрпример. Например, определение динамических массивов. По классической логике определение должно показывать сходство объекта с другими и его отличие от похожих объектов. Для определения динамических массивов тут выполнена только первая часть, да и то она слишком широка. Контейнеры с данными - далеко не только лишь динамические массивы, а чем динамический массив отличается от других контейнеров с данными, абсолютно непонятно. Компьютер - тоже контейнер с данными, разве не так?
Буквально каждая фраза в статье грешит противоречиями. Ну, вот еще пара примеров: "X и Y могут быть только простыми числами. Так же они могут быть частями какого-либо упорядоченного целого" Если "так же", значит, уже не "только". Или "посредством указания порядкового номера". Тут же - пример массива, в котором для "вытаскивания" нужен не номер, а буква алфавита. Или "тип переменных, в котором хранятся данные". Данные хранятся не в типе. "Наметанным глазом можно прочитать здесь следующее: имеется массив с именем EditArray, в котором хранится пять различных значений типа String (текст)." А одинаковые значения там не могут храниться? Надо убрать слово "различных". И т. п.
Я понимаю, что Вы представляете себе то, о чем пишете, но вот с выбором верных слов для передачи Вашего представления читателям дела в статье обстоят очень плохо. "Свежий" человек будет не только спотыкаться на каждом шагу, но и большей частью поймет неправильно.
Насчет простоты числа два - согласен, написал не подумав. В качестве примера оно никак не годится. Охотно признаю свою ошибку.
Ответить на сообщение »
 
Автор:  nolik Дата: 26.07.2007 13:42
Krab пишет 26.07.2007 01:42:
>"Если Integer - то этот же параметр является простым числом"
>То есть равным 2, например, быть не может: 2 - не простое число.

Маленькое уточнение: 2 - число простое. А вот 4 - уже нет.
Простыми называются числа, которые делятся только на само себя и на 1
Ответить на сообщение »
 
Автор:  Andrey Дата: 26.07.2007 10:59
2MDT
можно и так, смотря какую цель вы приследуете )

2Krab
Не понимаю цели вашео поста. И что вы имеете под словосочетанием "Мой компьютер" ??? Вашь системный блок, полный железа ? оперционную систему? или всётаки таблицы разметки жёсткого диска которые отдалённо напоминают массивы.
Ответить на сообщение »
 
Автор:  MDT Дата: 26.07.2007 08:00
Здраствуй Andrey а как насчет:

заменять: for i:=0 to length(MyArr)-1 do
на: for i:=Low(MyArr) to High(MyArr) do
Ответить на сообщение »
 
Автор:  Krab Дата: 26.07.2007 01:42
"Динамический массив есть контейнер, содержащий определенное число данных, которые могут быть записаны либо извлечены для каких-нибудь с ними действий. "
Тогда мой компьютер - тоже динамический массив ;)
"Идентификаторы Array и of постоянны"
А что такое переменный идентификатор??
"Имя массива зависит только от вашей фантазии."
OK. Беру 111!!! Пойдет?
"Так же они могут быть частями какого-либо упорядоченного целого: например, можно указать [‘а’..’я’]"
Алфавит - это целое? Кстати, с кавычками что-то не то...
"Если Integer - то этот же параметр является простым числом"
То есть равным 2, например, быть не может: 2 - не простое число.
И т. д. В контрольной любой студент получил бы за такую работу пару баллов. Уж простите...
Ответить на сообщение »
 
Автор:  Andrey Дата: 25.07.2007 13:38
2MDT
Дуаю так будет правильнее:

var
MyArr: array of integer; // для начала массив должен быть цело численным, рнадом даёт только Целые числа !
i: integer;
begin
randomize; // во вторых нужно запустить генератор случайных чисел, иначе вся наша конструкция не имеет никакого смысла.
SetLength(MyArr,StrToInt(Edit1.text));
for i:=0 to length(MyArr)-1 do // в третьих нужно задать правильно границы цикла
MyArr[i]:=random(100)
end;
Ответить на сообщение »
 
Автор:  MDT Дата: 24.07.2007 08:36
Yuriy

Здраствуйте Yuriy я получил ваши вопрос. Как я понимаю вы имеете виду размерность это колич. индекс в массиве. Но если так то вот: После создание массива в процессе выполнения программы
вы заполнаете тем же случайными числами, после этого массив пересоздается не теряя предидущие данные, если больше индекс чем предидещий но если меньше то остальные данные усекается. На деюсь я понял вас правильно.

Ваша версия:

var
a1: array of real;
n,i : integer;
begin
// поле в котором задаётся размерность динамического массива
n:=StrToInt(Form1.Edit1.Text);
SetLength(a1,n);
for i:=1 to n do begin
a[i]=random(100);
end;
Ответить на сообщение »
 
Автор:  MDT Дата: 24.07.2007 08:36
Yuriy

Здраствуйте Yuriy я получил ваши вопрос. Как я понимаю вы имеете виду размерность это колич. индекс в массиве. Но если так то вот: После создание массива в процессе выполнения программы
вы заполнаете тем же случайными числами, после этого массив пересоздается не теряя предидущие данные, если больше индекс чем предидещий но если меньше то остальные данные усекается. На деюсь я понял вас правильно.

Ваша версия:

var
a1: array of real;
n,i : integer;
begin
// поле в котором задаётся размерность динамического массива
n:=StrToInt(Form1.Edit1.Text);
SetLength(a1,n);
for i:=1 to n do begin
a[i]=random(100);
end;
Ответить на сообщение »
 
Автор:  Yuriy Дата: 21.07.2007 01:58
у меня такой вопрос:

Что если мне нужно задавать размерность массива в процессе выполнения программы, то есть я заведомо не знаю его размерность. Массив состоит из случайных чисел. Например:

var
a1: array of real;
n,i : integer;
begin
// поле в котором задаётся размерность динамического массива
n:=StrToInt(Form1.Edit1.Text);
SetLength(a1,n);
for i:=1 to n do begin
a[i]=random(100);
end;

Будет такая конструкция работать. Как это реализовать.

То есть программа должна создавать массив из случайных чисел и в процессе выполнения программы можно изменять размерность массива.

Спасибо.
Ответить на сообщение »
 
Автор:  MDT Дата: 05.02.2007 09:36
VK пишет 18.01.2007 13:22:
>Ребята, ну так же нельзя!
>Для кого эта статья? Для новичка? Но новичков нельзя обманывать в самом начале деятельности. Это не ДИНАМИЧЕСКИЕ массивы! Так можно писать только для студентов непрофильного колледжа, которые сдадут экзамен и с чистой совестью забудут и массивы, и Дельфи. А эта статья даже для статических массивов дает информации меньше, чем самый простой букварь по Дельфи.


Ответ:
Мистер VK, хотел бы сказать вам, документации в Делфи, именно динамический массив определяется через SetLength а статических массивах это не обезательно.
Вот пример из документации Делфи: Статический и Динамический массив
------------------------------------------------------------------------------------------------------------

Static Arrays

Static array types are denoted by constructions of the form

array[ indexType1, ..., indexTypen ] of baseType;

where each indexType is an ordinal type whose range does not exceed 2GB. Since the indexTypes index the array, the number of elements an array can hold is limited by the product of the sizes of the indexTypes. In practice, indexTypes are usually integer subranges.

In the simplest case of a one-dimensional array, there is only a single indexType. For example,
var MyArray: array [1..100] of Char;
declares a variable called MyArray that holds an array of 100 character values. Given this declaration, MyArray[3] denotes the third character in MyArray. If you create a static array but don't assign values to all its elements, the unused elements are still allocated and contain random data; they are like uninitialized variables.

A multidimensional array is an array of arrays. For example,
type TMatrix = array[1..10] of array[1..50] of Real;
is equivalent to
type TMatrix = array[1..10, 1..50] of Real;
Whichever way TMatrix is declared, it represents an array of 500 real values. A variable MyMatrix of type TMatrix can be indexed like this: MyMatrix[2,45]; or like this: MyMatrix[2][45]. Similarly,
packed array[Boolean, 1..10, TShoeSize] of Integer;
is equivalent to
packed array[Boolean] of packed array[1..10] of packed array[TShoeSize] of Integer;
The standard functions Low and High operate on array type identifiers and variables. They return the low and high bounds of the array's first index type. The standard function Length returns the number of elements in the array's first dimension.

A one-dimensional, packed, static array of Char values is called a packed string. Packed-string types are compatible with string types and with other packed-string types that have the same number of elements. See Type compatibility and identity .

An array type of the form array[0..x] of Char is called a zero-based character array. Zero-based character arrays are used to store null-terminated strings and are compatible with PChar values. See Working with null-terminated strings .

Dynamic Arrays

Dynamic arrays do not have a fixed size or length. Instead, memory for a dynamic array is reallocated when you assign a value to the array or pass it to the SetLength procedure. Dynamic-array types are denoted by constructions of the form

array of baseType
For example,
var MyFlexibleArray: array of Real;
declares a one-dimensional dynamic array of reals. The declaration does not allocate memory for MyFlexibleArray. To create the array in memory, call SetLength. For example, given the previous declaration,
SetLength(MyFlexibleArray, 20);
allocates an array of 20 reals, indexed 0 to 19. Dynamic arrays are always integer-indexed, always starting from 0.

Dynamic-array variables are implicitly pointers and are managed by the same reference-counting technique used for long strings. To deallocate a dynamic array, assign nil to a variable that references the array or pass the variable to Finalize; either of these methods disposes of the array, provided there are no other references to it. Dynamic arrays are automatically released when their reference-count drops to zero. Dynamic arrays of length 0 have the value nil. Do not apply the dereference operator (^) to a dynamic-array variable or pass it to the New or Dispose procedure.

If X and Y are variables of the same dynamic-array type, X := Y points X to the same array as Y. (There is no need to allocate memory for X before performing this operation.) Unlike strings and static arrays, copy-on-write is not employed for dynamic arrays, so they are not automatically copied before they are written to. For example, after this code executes,
var
A, B: array of Integer;
begin
SetLength(A, 1);
A[0] := 1;
B := A;
B[0] := 2;
end;
the value of A[0] is 2. (If A and B were static arrays, A[0] would still be 1.)

Assigning to a dynamic-array index (for example, MyFlexibleArray[2] := 7) does not reallocate the array. Out-of-range indexes are not reported at compile time.

In contrast, to make an independent copy of a dynamic array, you must use the global Copy function:
var
A, B: array of Integer;
begin
SetLength(A, 1);
A[0] := 1;
B := Copy(A);
B[0] := 2; { B[0] <> A[0] }
end;
When dynamic-array variables are compared, their references are compared, not their array values. Thus, after execution of the code
var
A, B: array of Integer;
begin
SetLength(A, 1);
SetLength(B, 1);
A[0] := 2;
B[0] := 2;
end;
A = B returns False but A[0] = B[0] returns True.

To truncate a dynamic array, pass it to SetLength, or pass it to Copy and assign the result back to the array variable. (The SetLength procedure is usually faster.) For example, if A is a dynamic array, A := SetLength(A, 0, 20) truncates all but the first 20 elements of A.

Once a dynamic array has been allocated, you can pass it to the standard functions Length, High, and Low. Length returns the number of elements in the array, High returns the array's highest index (that is, Length - 1), and Low returns 0. In the case of a zero-length array, High returns 1 (with the anomalous consequence that High < Low).

Note: In some function and procedure declarations, array parameters are represented as array of baseType, without any index types specified. For example,function CheckStrings(A: array of string): Boolean;

This indicates that the function operates on all arrays of the specified base type, regardless of their size, how they are indexed, or whether they are allocated statically or dynamically.
Ответить на сообщение »
 
Автор:  Андрей Дата: 18.01.2007 21:10
ага...вот это правильно... вроде сайт салидный, а выкладывают фигню какую то ... и вот как потом читать, например стаью по SQL, о передаче таблички в хранимую процедуру, стоит ли верить новичкам ? )
Ответить на сообщение »
 
Автор:  ProGRа /\/\ /\/\ er Дата: 18.01.2007 20:05
Вобщем моя статья новичкам и автору статьи (который наверное хуже новичка)

оббьявление динамического массива:
var <Name> : array of <Type>
где <Name> имя массива начинающееся с латинской буквы и могущее содержать
цифры, латинские буквы, знак _ никаких пробелов и русских букв
<Type> один из зарезервированных типов данных (integer, char, string, ...) или
пользовательских включая recordset или objects в т.ч. может
использоватся вложенность array of

Передначалом работы надо задать размерность массива:

SetLength(<Name>, <К-во элементов массива>)

для вложенных (многоуровневых дин. массивов) можно применить конструкцию

SetLength(<Name>[<Element>], , <К-во элементов массива>)


для операций с такими массивами очень удобно пользоватся функциями

Length(<Name>) - к-во элементов массива
Low(<Name>) - нижняя граница массива
High(<Name>) - верхняя граница массива

Внимание!!! Во избежание утечек памяти не забывайте после использования массива высвободить память задав нулевую размерность массива

SetLength(<Name>, 0)

Внимание!!! При многоуровневых массивах не забывайте сначала высвободить память подуровней

for i := Low(<Name>) to High(<Name>) do SetLength(<Name>[i]);

А потом и первого уровня

SetLength(<Name>, 0);
Ответить на сообщение »
 
Автор:  Олег Дата: 18.01.2007 13:25
На сколько я понимаю это статья о работе со статическими массивами. Что из примеров есть динамический массив? Или надо между строк читать?
Ответить на сообщение »
 
Автор:  VK Дата: 18.01.2007 13:22
Ребята, ну так же нельзя!
Для кого эта статья? Для новичка? Но новичков нельзя обманывать в самом начале деятельности. Это не ДИНАМИЧЕСКИЕ массивы! Так можно писать только для студентов непрофильного колледжа, которые сдадут экзамен и с чистой совестью забудут и массивы, и Дельфи. А эта статья даже для статических массивов дает информации меньше, чем самый простой букварь по Дельфи.
Ответить на сообщение »
 
Автор:  Андрей Дата: 17.01.2007 14:45
наверно тут какая то ошибка, статья должна была называться "Работа с массивами".

Динамический :
<Имя_Массива>: Array of <Тип_переменных>;
....
SetLength(<Имя_Массива>: array, Count: integer);
Ответить на сообщение »
 

Добавить сообщение »

 Распечатать »
 Правила публикации »
   
 Рекомендовать »  
 

Магазин программного обеспечения   WWW.ITSHOP.RU
FastCube.Net Standard Edition Single License
Nero Basic Burning ROM 2018 VL Maintenance VL 5 - 9 License corporate
Компонент NetworkLock - от 1 ПК до 24 ПК
go1984 pro
WinRAR 5.x Standard Licence - для частных лиц 1 лицензия
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Вопросы и ответы по MS SQL Server
Новости мира 3D-ускорителей
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
Обсуждения в форумах
Как мигрировать программу написанную на старом Буилдер 4.52 (1)
Мы поддерживаем старое приложение написанное с использованием С++ Буилдер 5.5 (ЕХЕ) и Буилдер...
 
Создание базы данных в Delphi, без сторонних БД (1)
Уважаемый автор, гуглю уже который день и у Вас как у всех "кидаем.." "даже не создаем проект"...
 
C++ Builder6 & Excel (11)
Доброе время суток! Пишу приложение в C++ Builder6 для формирования файлов Excel. Требуется...
 
Принцип создания плагинов в Delphi (3)
Достали, Эта статья не о плагинах а о подключении dll и возможности использования ресурсов в...
 
QuickREport (40)
Есть приложение скомпилированное в Delphi6. Для построения отчетов я использовал компонеты из...
 
 
 



    
rambler's top100 Rambler's Top100