Спасибо друзья.Не думал что последуют еще ответы, не заглядывал, а тут такое.
Alex2013 - спасибо за ваш ответ. К сожалению я еще не так глубоко освоил предмет, понять трудновато. Может тестировочный код просто подсунуть чтобы проверить что движок "разрешит" использовать? какую конструкцию попробовать?
Vadim писал(а):Это всё потому, что Вы нормальным русским языком не объяснили, где именно Вы программируете.
В FreePascal PByte - это встроенный тип данных. Если у Вас его нет - Вы используете что-то другое. Начав с "олбанского" языка, Вы сделали помощь в Вашей проблеме невозможной.
Настаиваю, что у Вас ошибка исключительно логическая, ошибка разработчика. Необходимо сначала продумать логику Ваших действий и только потом садиться программировать.
Вадим, в этом деле я новичок, и нектотрые вещи мне еще, возможно, не совсем понятны, вы уточните, в чем вы видите "олбанский". В ПО встроен скриптовый язык. Автор упоминает Pascal Script Lazarus, и руководство Remobjects pascal script.
Вот скрипт, с которого я начинал, он построен на ФУНКЦИЯХ описанных к использованию в движке. Как я упоминал исполнение получается очень медленным, в основном из-за копирования присвоением в цикле. По этому, я хочу исключить копирование из буфера в буфер, для начала. Решил делать это средствами самого паскаля. Естественно,я что то не учитываю, я и прошу помощи, что не так.
- Код: Выделить всё
const
PageSize = 512;
ErGrSize = 512*1024{PageSize *page_count;};
var
Res: Boolean; //Результат выполнения функции. Принимает значение 1 в случае успешного выполнения и 0 в случае ошибки
myFileName: String; //Имя файла, выбираемое в файловом диалоге
iFileSize: Int64; // Размер открываемого дампа
page_count, i, g: Integer;
MyBuffer: array {[0..ErGrSize]} OF byte; // Обьявляем массив MyBuffer.
begin
//При запуске скрипта открывается файловый диалог, в котором необходимо выбрать дамп
Res := GetOpenFileName('Выбери меня!', myFileName, 'Dumps', 'Дампы (*.user)|*.user| Все файлы|*.*', 'user');
//SetLength(PageBuffer, ErGrSize); //объявляем PageBuffer (PageSize*page_count)
// Устанавливаем размер буфера
setarraylength(PageBuffer, ErGrSize);
// Устанавливаем размер буфера
setarraylength(MyBuffer, ErGrSize);
if (Res) then //если файл выбран, то продолжаем выполнять скрипт, если нет, то переход на завершение
begin
//В лог выдаем сообщения об открытии файла
AddMessage('Open file %s', [myFileName]);
Res := iFileStreamCreate(myFileName, fmOpenRead or fmShareDenyWrite);
// Проверка
if not(Res) then Exit;
iFileSize := iFileStream.Size;
//В лог выдаем сообщение
AddMessage('File size %d byte', [iFileSize]);
// Последовательно, группа за группой считываем в буфер и сравниваем файл с дампом.
for g:= 0 to (iFileSize div ErGrSize)-1 do //filesize : 524288
begin
// считали группу из файла
iFileStreamSeek(g*ErGrSize, soFromBeginning);
iFileStreamRead(0, ErGrSize);
//AddMessage('Прочитали файл', []);
// и выводим в лог
//ArrayToLog(PageBuffer, 512);
//AddMessage('Копируем в MyBuff', []);
//Просто копируем из буфера в массив.
for i:= 0 to ErGrSize-1 do
MyBuffer [i] := PageBuffer [i];
// и выводим в лог, проверяем
//ArrayToLog(MyBuffer, 512);
// Считать 1024 страниц начиная с g*1024
//AddMessage('Читаю EMMC группу', []);
ReadPage(g*1024, 1024); ////Какой раздел будет читаться зависит от того, какой файл был выбран для сохранения
//ReadPage всегда читается только по 512 байт независимо от размера обьявленного PageBuffer
//AddMessage('Тест PageBuffer', []);
// и выводим в лог
//ArrayToLog(PageBuffer, 512);
// выводим сообщение в лог
//AddMessage('Тест MyBuffer', []);
// и выводим в лог
//ArrayToLog(MyBuffer, 512);
//AddMessage('Сравниваю буферы', []);
for i:= 0 to (ErGrSize-1) do
begin
if PageBuffer[i] <> MyBuffer[i] then break; //сравниваем в цикле блок данных, при первом несовпадении цикл прерывается
end;
if i = ErGrSize then //если i = x, то все байты в массивах совпадают
//AddMessage('переходим к проверке следующей группы №%d', [g])
else AddMessage(' требуется перезапись группы, i = %d', [i]);
end;
iFileStreamFree;
AddMessage('Проверка заврешена', [])
Time;
end
end.