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

Модератор: Apromix
Даже не знаю, что и ответитьApromix писал(а):Массив из массивов или матрица - это и есть обыкновенный двумерный массив, индексы которого начинаются с нуля
Собери версию библиотеки что-бы там была 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);
}
если честно лучше передавать array of char размером (Длинна*Ширина) и индекс по координатам в нем будет (x + y * длинна)Apromix писал(а):То есть лучше передавать как массив из строк: array of string ?alexbard писал(а):Вы просили потестить вызов из С# и я это сделал. Более того msdn также согласен со мной в том, что вложенные массивы не поддерживаются. Вполне может быть можно было бы решить все, взяв array of string, но, насколько я помню из первого семестра универа, в паскале string сам по-себе - это array of char.
погоди...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);
Можно, конечно, но размеры его задать можно только заранее, еще до начала программы.Добавлено: совсем забыл паскаль. А нельзя вместо массива массивов сделать обыкновенный двухмерный массив? Или так он не будет динамическим ?
А что значит "адрес 100"? Ты же как я понял вызываешь функцию создать карту 100Х80 первого типа, или я что-то не понял?вываливается при попытке читать с адреса 100
JustHarry писал(а):Можно, конечно, но размеры его задать можно только заранее, еще до начала программы.Добавлено: совсем забыл паскаль. А нельзя вместо массива массивов сделать обыкновенный двухмерный массив? Или так он не будет динамическим ?
Поэтому - не вариант.А что значит "адрес 100"? Ты же как я понял вызываешь функцию создать карту 100Х80 первого типа, или я что-то не понял?вываливается при попытке читать с адреса 100
это не решил проблему описанную мною...Apromix писал(а):А проблем, описанных выше, при одномерном динамическом массиве разве не будет? Я имею ввиду array of pchar.
Оперативно все меняем, 10 - 15 мин и выложим переработанную либуJesus05 писал(а):может сделаем чуток поближе к машине? (к С++ к Асму)
переделаем процедуру что-бы она ничего не возвращала, а требовала дать ей указатель на массив.
GenMap(длинна, ширина, тип_карты, указатель_на_массив, размер_массива) (последнее для безопасности)
но размер имеет значение только если это будет одномерный массив. для двумерного (если паскаль действительно создаст указатель на массив указателей на массивы из чаров надо 2 размера вставлять... но сымсла это не имеетApromix писал(а):Оперативно все меняем, 10 - 15 мин и выложим переработанную либуJesus05 писал(а):может сделаем чуток поближе к машине? (к С++ к Асму)
переделаем процедуру что-бы она ничего не возвращала, а требовала дать ей указатель на массив.
GenMap(длинна, ширина, тип_карты, указатель_на_массив, размер_массива) (последнее для безопасности)
Меняем все, делаем процедуру и одномерный массив + размерJesus05 писал(а):но размер имеет значение только если это будет одномерный массив. для двумерного (если паскаль действительно создаст указатель на массив указателей на массивы из чаров надо 2 размера вставлять... но сымсла это не имеетибо 2 размера и так указаны в виде длинны и ширины)
Код: Выделить всё
procedure GenMap(X, Y, Z: Integer; var A: TBeaRLibMap; S: Integer); stdcall;
Вау. Неужели работает?Jesus05 писал(а):ну что-же пример на С++ Builder через LoadLibrary. (не самый правильный и удобный вариант другой сделаю позже)
проект: екзешник:
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость