forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Динамический массив - способы реализации! (http://forum.boolean.name/showthread.php?t=7902)

ELIAS 28.02.2009 23:55

Динамический массив - способы реализации!
 
Нужен двухмерный бесконечный массив.
То есть если к примеру number-это бесконечность, то мне нужен такой массив, если его представлять в обычной форме:

Dim MyArray(number, number)
;Ну типа создаем квадрат для морского боя, только размер ничем не ограничен - это мне надо! :)

Посоветовали пользоваться банками(банки памяти всмысле), дак что-то так ссебе впечатление оставили. Какие-то неповоротливые они, трудно с ними работать, они очевидно не дают всех тех возможностей, что могут дать обыкновенные массивы...Ну хотя бы например тем, что банки могут быть только одномерными, чтобы создавать двухмерность или трёхмерность в одном банке, придётся сильно извращаться :(
И вообще что-то странное с ними творится: я в цикле работаю с PokeInt ну и ResizeBank естественно, дак вот поличить правильный указательнь на ентити из банка получается только в этом цикле, если же за его пределы написать - PeekInt(bank, 4) - то с этим энтити будет программа вылетать со всем изместной мав.(((

Вообщем что делать? Типы...

tormoz 01.03.2009 00:10

Ответ: Динамический массив - способы реализации!
 
Цитата:

Сообщение от ELIAS (Сообщение 99173)
Вообщем что делать? Типы...

Они, родимые...
Тип в блитце - это и есть безразмерный динамический массив

jimon 01.03.2009 00:10

Ответ: Динамический массив - способы реализации!
 
ELIAS
пользуйся n-мерной проекцией масива в 1-мерный (в данном случае 2д проекция это X1 = Y2 * SizeX2 + X2), а 1-мерным масивом "неограниченого" размера может быть даже файл на диске
под понятием "неограниченый" я представляю себе такой масив данных обьемом 1 - 1.5 гигабайта, потому про производительность таких решений не важна для работы системы, потому если обьем данных не превышает 1-5 мегабайт то следует это всё тупо засунуть в динамические структуры (типы хотя бы) и не мучать себе голову

ELIAS 01.03.2009 11:09

Ответ: Динамический массив - способы реализации!
 
А зачем же нужны банки памяти???
Мне доверенные люди точно сказали что динамический массив в блитце - банк памяти!..:dontknow:

jimon 01.03.2009 13:06

Ответ: Динамический массив - способы реализации!
 
ELIAS
банк памяти это особенная структура данных, нужна она к примеру для создания пакетов для отправки через сеть, работу как буфер который может создаватся из зашифрованого файла и тд

impersonalis 01.03.2009 13:46

Ответ: Динамический массив - способы реализации!
 
Банки очень удобны, но из встроенных типов данных там
byte
short
int
float
К тому же, так или иначе, для удобной работы их скорее всего понадобиться обёртывать в типы и писать ряд методов. В идеале - написать на их базе класс-контейнер для произвольного типа данных.
Так же можно используя только типы и команды object-handle написать связанный список произвольной архитектуры, но "разыменование" достаточно долгая по выполнению команда.

www.boolean.name > Программирование в широком смысле слова > Алгоритмика
Туториальчик по Связанным спискам
http://forum.boolean.name/showthread.php?t=1194


www.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ
Контейнер данных
http://forum.boolean.name/showthread.php?t=5730

Randomize 03.03.2009 13:27

Ответ: Динамический массив - способы реализации!
 
В блице можно много раз юзать Dim допустим следующий код :
PHP код:

Dim map(10,10)
map_width=100
map_height
=100
Dim map
(map_width,map_height

Это не даст ошибки и не создаст дубликата массива map.
Полный безразмерный массив либо через типы либо так:
PHP код:

Dim map(0,0)
global 
map_w
global map_h 

Для изменения размера вызваем Dim(map_w, map_h) предварительно привсовив им значения.
Пример на практике:


PHP код:

Dim map(0,0)
Global 
map_width=20  Ширина мапы
Global map_height=20 Высота мапы

создаём мапу
Dim map
(map_width,map_height)
For 
poy=0 To map_height
    
For pox=0 To map_width
        map
(pox,poy)=Rand(0,9); заполним ячейки случайными числами
    Next
Next

Поработаем с мапкой ^_^
Repeat
Cls
For poy=0 To map_height
    
For pox=0 To map_width
        Rect pox
*32,poy*32,32,32,False
        Text pox
*32,poy*32,map(pox,poy)
    
Next
Next
Flip
Until KeyHit
(1



Через типы всё немного посложнее:
Опять же если речь идёт о 2D карте:

PHP код:

Type TArray
 Field dat
End Type
Global map_width=10
Global map_height=10

Создаём рандомную мапу с рандомными числами в каждой ячейке
For poY=0 To map_height
 
For pox=0 To map_width
  arr
.TArray=New TArray
  arr
\dat=Rand(0,9); лучайное число от нуля до девяти
 Next
Next



А работать с такой мапой так:
Repeat
    pox
=0
    poy
=0

    
For arr.TArray=Each TArray
        Rect pox
*32-1,poy*32-1,32,32,False
        Text pox
*32,poy*32,arr\dat
        poy
=poy+1
        
If poy>map_height Then poy=0:pox=pox+1
    Next
Flip
Until KeyHit
(1


Личная заметка:
Както так получилось, что первый способ у меня работает быстрее(который без типов) В принципе способ живой и не возбраняется его использовать

ELIAS 06.03.2009 22:10

Ответ: Динамический массив - способы реализации!
 
В blitz-FAQ от avel написано:
Цитата:

Вопрос: как в типе создать массив?

Ответ: Для этого просто впишите следующую строку в тип:

Field имя_массива[кол-во_элементов]

Теперь обращатся к этому массиву можно так:

указатель\имя_массива[номер_элемента] = …
А как создать двухмерный массив в типе???
Если писать так field array[100,2] - то блитц выдает ошибочку :(((

ABTOMAT 07.03.2009 02:46

Ответ: Динамический массив - способы реализации!
 
Никак

ELIAS 07.03.2009 15:33

Ответ: Динамический массив - способы реализации!
 
А как тогда создать тип в типе?...

impersonalis 07.03.2009 15:45

Ответ: Динамический массив - способы реализации!
 
type a
field x
end type

type b
field internal.a
end type

ELIAS 07.03.2009 18:17

Ответ: Динамический массив - способы реализации!
 
Мдеее... А никто не может хотя бы словестно описать, как на блитце замутить такую вещь: при нажатии на ентер создаётся некоторое количество кубиков, расположенных по клеткам на поле Rand(1,100)xRand(1,100) - то есть всего за одно нажатие создаётся от 1 до 10000 кубиков. Причём этими кубиками можно манипулировать позже - то есть указатели на них сохраняются!!! И ещё, у каждого кубика есть по три свойства, определяющих например его цвет, которые можно считать и изменить отдельно(это соотвектсвенно свойсва r g b).
Вот... сложно! Помогите пожалуйста! :)

Хотя все было бы аццко просто, если бы не это ограничение на создание многомерных массивв в типе!!!
Вот как бы выглядел этот код без этого обидного недостатка блица:

Код:

Type A
Field Sq[100,100,4]
End Type

где
sq[1,1,1] - это сам ентити куба
sq[1,1,2] - r
sq[1,1,2] - g
sq[1,1,2] - b

ABTOMAT 07.03.2009 18:43

Ответ: Динамический массив - способы реализации!
 
Код:

Type A
Field Cubes[100]
Field Colors[100]
End Type

Цвет можно описать одним-единственным Integer'ом $AARRGGBB (т.е. как раз 4 байта) - поетому можно обойтись 2-мя массивами

HolyDel 07.03.2009 19:21

Ответ: Динамический массив - способы реализации!
 
Любой n-мерный массив можно спроецировать на одномерный. Если конечно его размеры известны.

АВТОМАТ +1, тока не 100, а 10 000

ELIAS 07.03.2009 19:40

Ответ: Динамический массив - способы реализации!
 
Я с проекциями массивов не разобрался, (jimon говорил про них)...
Кстати, что только массивами здесь выкрутиться можно??? А нельзя никак использовать типы в типах или массив типа?
Мне кажется что раюотать с проекциями массивов жутко трудно и неудобно :((( даже если научиться.

Зы: АВТОМАТ, я не понял как это с цветом???.. Как объявлять такую перемнную, присваивать ей значение и потом красить цветом из этой переменной объект??? У меня выдает ошибку :(

А вообще я же сказал, что цвет - это только пример, мне нужно просто помимо самого ентити 3 свойства...Пускай это будет posX, posY, posZ :)


Часовой пояс GMT +4, время: 12:19.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot