Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Подскажите про доступ к массивам [Win32]


DanilinS ©   (12.11.16 14:03

Есть такая проблема:

В программе объявлены 3 массива. Статические. Размер - разные.
При инициализации программы неизвестно, какой именно массив будет использован.

Далее происходит выбор массива - и работаю только с ним.

Но не получается реализовать. Идея такая:

Создаем:
type
 ArrayА: array [0..10] of Int32;  
 ArrayB: array [0..20] of Int32;  
 ArrayC: array [0..30] of Int32;
 ArrayFin: array of Int32;  

А в коде
 case ... of
   1: ArrayFin:=ArrayА;
   2: ArrayFin:=ArrayB;
   3: ArrayFin:=ArrayC;
 end;

Естественно это не прокатит. Нельзя присваивать динамическому массиву статический. Вообще похоже присваивание в массивах работает только с с массивами одинаковой размерности и содержимого.

Пробовал обозвать ArrayFin типом pointer  и работать через него - не смог  
реализовать. Везде описаны в основном массивы указателей. А не указатели на массивы.

Может обозвать все массивы динамическими? Не смог найти правил присвоения массивов при динамической размерности.

Как лучше всего реализовать? А то уже 3 день голову ломаю ...


Rouse_ ©   (12.11.16 14:12[1]

Работай через указатель. Зачем тебе тип массива то возвращать?


Pavia ©   (12.11.16 18:30[2]

Так по разному можно.

> Естественно это не прокатит. Нельзя присваивать динамическому
> массиву статический

Можно для этого использовать цикл. Один раз присваиваешь и далее в остальной части программы пользуешься динамическими массивами.

Можно указатель использовать или указательные массивы. Только там есть специфика работы.


NoUser ©   (13.11.16 01:57[3]

procedure CopyMyArrayToDynArray(N:Integer);
type
TInt20 = array [0..20] of Integer;  PInt20 = ^TInt20;
TInt30 = array [0..30] of Integer;  PInt30 = ^TInt30;
TInt40 = array [0..40] of Integer;  PInt40 = ^TInt40;
var
A20 : TInt20;
A30 : TInt30;
A40 : TInt40;

Axx : array of Integer;

const
n20 = SizeOf(A20) div SizeOf(A20[0]);
n30 = SizeOf(A30) div SizeOf(A30[0]);
n40 = SizeOf(A40) div SizeOf(A40[0]);

begin
case N of
 2: SetLength(Axx, n20);
 3: SetLength(Axx, n30);
 4: SetLength(Axx, n40);
end;
case N of
 2: PInt20(Axx)^ := A20;
 3: PInt30(Axx)^ := A30;
 4: PInt40(Axx)^ := A40;
end;

Axx[42] := 0; // ?!

end;

procedure MyArrayAsUnBorderedArray(N:Integer);
type
TInt20 = array [0..20] of Integer;
TInt30 = array [0..30] of Integer;
TInt40 = array [0..40] of Integer;

TIntArray = array [0..MaxInt div SizeOf(Integer) - 1] of Integer;
PIntArray = ^TIntArray;
var
A20 : TInt20;
A30 : TInt30;
A40 : TInt40;

Acc : PIntArray;

begin
case N of
 2: Acc := @A20[0];
 3: Acc := @A30[0];
 4: Acc := @A40[0];
end;

Acc[42] := 0; // ?!

end;


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо