Даже не знаю, что и ответитьApromix писал(а):Массив из массивов или матрица - это и есть обыкновенный двумерный массив, индексы которого начинаются с нуля
BeaRLibMG - генератор карт
Модератор: Apromix
Re: BeaRLib
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: BeaRLib
Собери версию библиотеки что-бы там была Debug information.Apromix писал(а):Удалось наконец добится надежности библиотеки при генерации карт и, я думаю, можно тестировать всеми силами. Исходники присутствуют.
Следует знать:
1. Что установлены разумный лимит для ширины и высоты генерируемой карты: от 25 до 511 тайлов. Могут быть ошибки, если кому-то захочется получить карту 20 на 20 или 700 на 900
2. Карта получается в динамической матрице из символов (на паскале: array of array of char), могут быть ошибки, если динамически не выделять память под матрицу перед генерацией.
Просьба:
1. Потестировать на С++ и С# и выложить исходники демок и exe. Ну и интересует сам результат тестирования =)
Выкладываю фреймворк BeaRLib для тестирования и обнаружения ошибок: http://rghost.ru/20190561
иначе код на билдеровском С++
Код: Выделить всё
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);
}
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: BeaRLib
если честно лучше передавать array of char размером (Длинна*Ширина) и индекс по координатам в нем будет (x + y * длинна)Apromix писал(а):То есть лучше передавать как массив из строк: array of string ?alexbard писал(а):Вы просили потестить вызов из С# и я это сделал. Более того msdn также согласен со мной в том, что вложенные массивы не поддерживаются. Вполне может быть можно было бы решить все, взяв array of string, но, насколько я помню из первого семестра универа, в паскале string сам по-себе - это array of char.
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: BeaRLib
погоди...Apromix писал(а):Скрытый текст: ПОКАЗАТЬВсе элементарно просто...Код: Выделить всё
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);
Код: Выделить всё
DR := GenMap(X, Y, Z);
С может вернуть только 1 значение и в случае с массивом С вернет указатель на начало массива.
Re: BeaRLib
Можно, конечно, но размеры его задать можно только заранее, еще до начала программы.Добавлено: совсем забыл паскаль. А нельзя вместо массива массивов сделать обыкновенный двухмерный массив? Или так он не будет динамическим ?
Поэтому - не вариант.
А что значит "адрес 100"? Ты же как я понял вызываешь функцию создать карту 100Х80 первого типа, или я что-то не понял?вываливается при попытке читать с адреса 100
- Apromix
- Мастер
- Сообщения: 1236
- Зарегистрирован: 04 июл 2011, 10:44
- Откуда: Украина, Черновцы
- Контактная информация:
Re: BeaRLib
А проблем, описанных выше, при одномерном динамическом массиве разве не будет? Я имею ввиду array of pchar.
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: BeaRLib
JustHarry писал(а):Можно, конечно, но размеры его задать можно только заранее, еще до начала программы.Добавлено: совсем забыл паскаль. А нельзя вместо массива массивов сделать обыкновенный двухмерный массив? Или так он не будет динамическим ?
Поэтому - не вариант.А что значит "адрес 100"? Ты же как я понял вызываешь функцию создать карту 100Х80 первого типа, или я что-то не понял?вываливается при попытке читать с адреса 100
это не решил проблему описанную мною...Apromix писал(а):А проблем, описанных выше, при одномерном динамическом массиве разве не будет? Я имею ввиду array of pchar.
может сделаем чуток поближе к машине? (к С++ к Асму)
переделаем процедуру что-бы она ничего не возвращала, а требовала дать ей указатель на массив.
GenMap(длинна, ширина, тип_карты, указатель_на_массив, размер_массива) (последнее для безопасности )
- Apromix
- Мастер
- Сообщения: 1236
- Зарегистрирован: 04 июл 2011, 10:44
- Откуда: Украина, Черновцы
- Контактная информация:
Re: BeaRLib
Оперативно все меняем, 10 - 15 мин и выложим переработанную либуJesus05 писал(а):может сделаем чуток поближе к машине? (к С++ к Асму)
переделаем процедуру что-бы она ничего не возвращала, а требовала дать ей указатель на массив.
GenMap(длинна, ширина, тип_карты, указатель_на_массив, размер_массива) (последнее для безопасности )
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: BeaRLib
но размер имеет значение только если это будет одномерный массив. для двумерного (если паскаль действительно создаст указатель на массив указателей на массивы из чаров надо 2 размера вставлять... но сымсла это не имеет ибо 2 размера и так указаны в виде длинны и ширины)Apromix писал(а):Оперативно все меняем, 10 - 15 мин и выложим переработанную либуJesus05 писал(а):может сделаем чуток поближе к машине? (к С++ к Асму)
переделаем процедуру что-бы она ничего не возвращала, а требовала дать ей указатель на массив.
GenMap(длинна, ширина, тип_карты, указатель_на_массив, размер_массива) (последнее для безопасности )
- Apromix
- Мастер
- Сообщения: 1236
- Зарегистрирован: 04 июл 2011, 10:44
- Откуда: Украина, Черновцы
- Контактная информация:
Re: BeaRLib
Меняем все, делаем процедуру и одномерный массив + размерJesus05 писал(а):но размер имеет значение только если это будет одномерный массив. для двумерного (если паскаль действительно создаст указатель на массив указателей на массивы из чаров надо 2 размера вставлять... но сымсла это не имеет ибо 2 размера и так указаны в виде длинны и ширины)
Вот:
Код: Выделить всё
procedure GenMap(X, Y, Z: Integer; var A: TBeaRLibMap; S: Integer); stdcall;
Re: BeaRLib
BREAKING NEWS
Переработанная библиотека, процедура возвращает array of char(видимо это указатель на массив символов в С\С++)
Переработанная библиотека, процедура возвращает array of char(видимо это указатель на массив символов в С\С++)
- Вложения
-
- (!!!)BearLib.rar
- (199.79 КБ) 254 скачивания
Re: BeaRLib
Прошу прощения, в формулу в программе закралась ошибка, прямоугольный массив вроде бы заполнялся, но не до конца.
Вот поправленная версия, проверял на делфи и фри паскале.
Вот поправленная версия, проверял на делфи и фри паскале.
- Вложения
-
- (!!!)BearLib.rar
- (199.99 КБ) 125 скачиваний
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: BeaRLib
ну что-же пример на С++ Builder через LoadLibrary. (не самый правильный и удобный вариант другой сделаю позже)
проект: екзешник:
проект: екзешник:
Re: BeaRLib
Вау. Неужели работает?Jesus05 писал(а):ну что-же пример на С++ Builder через LoadLibrary. (не самый правильный и удобный вариант другой сделаю позже)
проект: екзешник:
Да, в таком разрешении видны ошибки: деревня получается слишком пустой, город почему-то делится дорогами только по вертикали, прямоугольный город вообще генерится "по диагонали". Будем чинить=)
Спасибо всем за помощь
- Apromix
- Мастер
- Сообщения: 1236
- Зарегистрирован: 04 июл 2011, 10:44
- Откуда: Украина, Черновцы
- Контактная информация:
Re: BeaRLib
Пришлось для твоего примера качать Rtl60.bpl и Vcl60.bpl, но оно того, хе-хе, стоило Остался СИШАРП
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 20 гостей