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 :)

ABTOMAT 07.03.2009 19:50

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

Делать массив из типов тоже можно, надо указывать в качестве типа массива свой тип, например
Cubes.A(100)
Где A - твой тип

А цвет - там хытренько
Код:

Function ARGB(A#,R,G,B)
        Return (Int(A*255) Shl 24) Or (R Shl 16)  Or (G Shl 8)  Or B       
End Function

Возвращает 1 инт
Как прочитать из этого цвета обратно думаю догадаешься ;)

HolyDel 07.03.2009 20:05

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

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

100 * 100 = 10000

пишеш простую функцию - типа
Код:

function index(int a, int b)
retrun 100*a + b;
end function

и дальше тупая, как тибетская овца, операция:
Код:

some.A = new A
some\Cubes[index(10,20)] = бла_бла_бла


ABTOMAT 07.03.2009 20:22

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

HolyDel 07.03.2009 20:39

Ответ: Динамический массив - способы реализации!
 
умножение и сложение - это минимум. чтобы получить 1д индекс из 2д.
вызов функции - для удобства. ну нет в блице макросов и инлайн функций.

как ты предлагаеш еще решить эту задачу?

ABTOMAT 07.03.2009 21:04

Ответ: Динамический массив - способы реализации!
 
Я уже предложил выше. Это намного разумнее. Во-первых, потому что всякой хрени вроде доп функций не надо, а во-вторых вот поменяешь размер массива - и функцию переписывать придётся. Или использовать Глобалы. Или константы, но тогда функция для каждого случая своя, что тоже ФПС не увеличит.

ELIAS 07.03.2009 21:55

Ответ: Динамический массив - способы реализации!
 
Спасибо, HolyDel, твою идею я понял, может воспользуюсь ею:) Но, там у тебя функция построена так что заранее сказано что типа квадрат 100х100, у меня будет не обязательно квадраты и не обязательно будет 100...
АВТОМАТ,(пост 16) я не понял если мы пишем так:
dim Cubes.A(100)
То какой смысл вообще использовать типы, обычный массив можно сдлелать n-мерным. Или я не понял твою идею...?.%%%

Блин! Ничего себе! Вот не поодумал бы что так придётся извращаться из-за казалось бы не сложной для понимания вещи... Неужели не существует ещё более лаконичного и понятного для восприятия способа?..

ABTOMAT 07.03.2009 22:21

Ответ: Динамический массив - способы реализации!
 
Наверноя я просто не понял что ты хочешь - вот и предложил не то...

Можно вообще всё сделать на массивах без типов (так покойный WarTech был сделан)


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

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