BeaRLibMG - генератор карт

Форум библиотеки BeaRLib

Модератор: Apromix

Аватара пользователя
alexbard
Сообщения: 670
Зарегистрирован: 22 апр 2011, 17:15
Откуда: Украина
Контактная информация:

Re: BeaRLib

Сообщение alexbard » 02 сен 2011, 21:00

Apromix писал(а):Массив из массивов или матрица - это и есть обыкновенный двумерный массив, индексы которого начинаются с нуля :)
Даже не знаю, что и ответить :D

Аватара пользователя
Jesus05
Сообщения: 1839
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: BeaRLib

Сообщение Jesus05 » 03 сен 2011, 07:35

Apromix писал(а):Удалось наконец добится надежности библиотеки при генерации карт и, я думаю, можно тестировать всеми силами. Исходники присутствуют.

Следует знать:
1. Что установлены разумный лимит для ширины и высоты генерируемой карты: от 25 до 511 тайлов. Могут быть ошибки, если кому-то захочется получить карту 20 на 20 или 700 на 900 :)
2. Карта получается в динамической матрице из символов (на паскале: array of array of char), могут быть ошибки, если динамически не выделять память под матрицу перед генерацией.

Просьба:
1. Потестировать на С++ и С# и выложить исходники демок и exe. Ну и интересует сам результат тестирования =)

Выкладываю фреймворк BeaRLib для тестирования и обнаружения ошибок: http://rghost.ru/20190561
Собери версию библиотеки что-бы там была Debug information.

иначе код на билдеровском С++

Код: Выделить всё

typedef char** TBeaRLibMap;
typedef _stdcall TBeaRLibMap (*TGenMap)(const int X, const int Y, const int ID);
TGenMap GenMap;
TBeaRLibMap test;

void CreateMap()
{
  HMODULE hBearLib = LoadLibrary("BeaRLibMG.dll");

  GenMap = (TGenMap)GetProcAddress(hBearLib, "GenMap");

  int ID = 1;

  test = GenMap(100, 80, 1);
}
вываливается при попытке читать с адреса 100
ReadFrom100.PNG
ReadFrom100.PNG (13.42 КБ) 3196 просмотров

Аватара пользователя
Jesus05
Сообщения: 1839
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: BeaRLib

Сообщение Jesus05 » 03 сен 2011, 08:10

Apromix писал(а):
alexbard писал(а):Вы просили потестить вызов из С# и я это сделал. Более того msdn также согласен со мной в том, что вложенные массивы не поддерживаются. Вполне может быть можно было бы решить все, взяв array of string, но, насколько я помню из первого семестра универа, в паскале string сам по-себе - это array of char.
То есть лучше передавать как массив из строк: array of string ?
если честно лучше передавать array of char размером (Длинна*Ширина) и индекс по координатам в нем будет (x + y * длинна)

Аватара пользователя
Jesus05
Сообщения: 1839
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: BeaRLib

Сообщение Jesus05 » 03 сен 2011, 08:21

Apromix писал(а):
Скрытый текст: ПОКАЗАТЬ
kipar писал(а):
Apromix писал(а): Только в дин. массивах от 0 до n - 1.
Я имел в виду именно статические массивы. А если в либе используются динамические, то это да - проблема. Динамический array of array of char - это указатель на массив указателей на массивы Сhar (или указателей на Char, надо уточнить).
Ну вот код импорта из dll на паскале:

Код: Выделить всё

type TBeaRLibMap = array of array of Char;
function GenMap(const X, Y, ID: Integer): TBeaRLibMap; stdcall; external 'BeaRLibMG.dll';
Дальше объявляем переменные:

Код: Выделить всё

var
  DR: TBeaRLibMap;
  X: Word = 99; // 25 .. 511
  Y: Word = 99; // 25 .. 511
И собственно используем в процедуре отрисовки:

Код: Выделить всё

var
  I, J, Z: Integer;
  S: string;
begin
  RE.Clear;
  Z := 1;
  for Z := 1 to 15 do
  begin
    RE.Lines.Append('#' + IntToStr(Z));
    SetLength(DR, X);
    for I := 0 to X - 1 do SetLength(DR[I], Y);
    DR := GenMap(X, Y, Z);
    for I := 0 to X - 1 do
    begin
      S := '';
      for J := 0 to Y - 1 do
        S := S + DR[I][J];
      RE.Lines.Append(S);
    end;
  end;
end;
Все элементарно просто...
погоди...
а что происходит тут?

Код: Выделить всё

SetLength(DR, X);
    for I := 0 to X - 1 do SetLength(DR[I], Y);
ты создаешь динамический массив...

если я в с++ пишу

Код: Выделить всё

blabla = GenMap(100,100,1);
я уверен что в blabla попадет указатель на массив. а судя по коду делфи каким-то образом берет указатель на масиив и передает его в функцию, но каким параметром?

Код: Выделить всё

DR := GenMap(X, Y, Z);
ведь ты не говоришь функции куда писать, ты просто говоришь вернуть данные в DR.
С может вернуть только 1 значение и в случае с массивом С вернет указатель на начало массива.

JustHarry
Сообщения: 655
Зарегистрирован: 30 июл 2010, 17:13

Re: BeaRLib

Сообщение JustHarry » 03 сен 2011, 08:30

Добавлено: совсем забыл паскаль. А нельзя вместо массива массивов сделать обыкновенный двухмерный массив? Или так он не будет динамическим ?
Можно, конечно, но размеры его задать можно только заранее, еще до начала программы.
Поэтому - не вариант.


вываливается при попытке читать с адреса 100
А что значит "адрес 100"? Ты же как я понял вызываешь функцию создать карту 100Х80 первого типа, или я что-то не понял?

Аватара пользователя
Apromix
Мастер
Сообщения: 1199
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BeaRLib

Сообщение Apromix » 03 сен 2011, 08:31

А проблем, описанных выше, при одномерном динамическом массиве разве не будет? Я имею ввиду array of pchar.

Аватара пользователя
Jesus05
Сообщения: 1839
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: BeaRLib

Сообщение Jesus05 » 03 сен 2011, 08:38

JustHarry писал(а):
Добавлено: совсем забыл паскаль. А нельзя вместо массива массивов сделать обыкновенный двухмерный массив? Или так он не будет динамическим ?
Можно, конечно, но размеры его задать можно только заранее, еще до начала программы.
Поэтому - не вариант.
вываливается при попытке читать с адреса 100
А что значит "адрес 100"? Ты же как я понял вызываешь функцию создать карту 100Х80 первого типа, или я что-то не понял?
Apromix писал(а):А проблем, описанных выше, при одномерном динамическом массиве разве не будет? Я имею ввиду array of pchar.
это не решил проблему описанную мною...
может сделаем чуток поближе к машине? (к С++ к Асму)
переделаем процедуру что-бы она ничего не возвращала, а требовала дать ей указатель на массив.

GenMap(длинна, ширина, тип_карты, указатель_на_массив, размер_массива) (последнее для безопасности :) )

Аватара пользователя
Apromix
Мастер
Сообщения: 1199
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BeaRLib

Сообщение Apromix » 03 сен 2011, 08:43

Jesus05 писал(а):может сделаем чуток поближе к машине? (к С++ к Асму)
переделаем процедуру что-бы она ничего не возвращала, а требовала дать ей указатель на массив.

GenMap(длинна, ширина, тип_карты, указатель_на_массив, размер_массива) (последнее для безопасности :) )
Оперативно все меняем, 10 - 15 мин и выложим переработанную либу :)

Аватара пользователя
Jesus05
Сообщения: 1839
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: BeaRLib

Сообщение Jesus05 » 03 сен 2011, 09:01

Apromix писал(а):
Jesus05 писал(а):может сделаем чуток поближе к машине? (к С++ к Асму)
переделаем процедуру что-бы она ничего не возвращала, а требовала дать ей указатель на массив.

GenMap(длинна, ширина, тип_карты, указатель_на_массив, размер_массива) (последнее для безопасности :) )
Оперативно все меняем, 10 - 15 мин и выложим переработанную либу :)
но размер имеет значение только если это будет одномерный массив. для двумерного (если паскаль действительно создаст указатель на массив указателей на массивы из чаров надо 2 размера вставлять... но сымсла это не имеет :) ибо 2 размера и так указаны в виде длинны и ширины)

Аватара пользователя
Apromix
Мастер
Сообщения: 1199
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BeaRLib

Сообщение Apromix » 03 сен 2011, 09:06

Jesus05 писал(а):но размер имеет значение только если это будет одномерный массив. для двумерного (если паскаль действительно создаст указатель на массив указателей на массивы из чаров надо 2 размера вставлять... но сымсла это не имеет :) ибо 2 размера и так указаны в виде длинны и ширины)
Меняем все, делаем процедуру и одномерный массив + размер :)

Вот:

Код: Выделить всё

procedure GenMap(X, Y, Z: Integer; var A: TBeaRLibMap; S: Integer); stdcall;

JustHarry
Сообщения: 655
Зарегистрирован: 30 июл 2010, 17:13

Re: BeaRLib

Сообщение JustHarry » 03 сен 2011, 09:19

BREAKING NEWS

Переработанная библиотека, процедура возвращает array of char(видимо это указатель на массив символов в С\С++)
Вложения
(!!!)BearLib.rar
(199.79 КБ) 220 скачиваний

JustHarry
Сообщения: 655
Зарегистрирован: 30 июл 2010, 17:13

Re: BeaRLib

Сообщение JustHarry » 03 сен 2011, 10:32

Прошу прощения, в формулу в программе закралась ошибка, прямоугольный массив вроде бы заполнялся, но не до конца.

Вот поправленная версия, проверял на делфи и фри паскале.
Вложения
(!!!)BearLib.rar
(199.99 КБ) 84 скачивания

Аватара пользователя
Jesus05
Сообщения: 1839
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: BeaRLib

Сообщение Jesus05 » 03 сен 2011, 10:52

ну что-же пример на С++ Builder через LoadLibrary. (не самый правильный и удобный вариант другой сделаю позже)
проект:
BorlandLoadLibrary.zip
(14.89 КБ) 83 скачивания
екзешник:
BorlandLoadLibraryExe.zip
(9.02 КБ) 83 скачивания

JustHarry
Сообщения: 655
Зарегистрирован: 30 июл 2010, 17:13

Re: BeaRLib

Сообщение JustHarry » 03 сен 2011, 10:58

Jesus05 писал(а):ну что-же пример на С++ Builder через LoadLibrary. (не самый правильный и удобный вариант другой сделаю позже)
проект:
BorlandLoadLibrary.zip
екзешник:
BorlandLoadLibraryExe.zip
Вау. Неужели работает? 8)

Да, в таком разрешении видны ошибки: деревня получается слишком пустой, город почему-то делится дорогами только по вертикали, прямоугольный город вообще генерится "по диагонали". Будем чинить=)

Спасибо всем за помощь :oops:

Аватара пользователя
Apromix
Мастер
Сообщения: 1199
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BeaRLib

Сообщение Apromix » 03 сен 2011, 10:59

Пришлось для твоего примера качать Rtl60.bpl и Vcl60.bpl, но оно того, хе-хе, стоило :) Остался СИШАРП :lol:

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость