[delphi 2006] х86 vs x64 [чудеса с памятью]

kill-still

под ХР х86 на 64битном (амд старенький) процессоре проект работает нормально
под вистой х64 на 64битном проце (другом, дуб 2ухядерный) съезжают поля записей в массиве
Record field aligment = 1
первый элемент массива нормально читается, второй смещён на 2 байта влево, след на 4 и т.д.
т.е. длл записала в массив хххх а читается область ****
ххххххххх
__*********
в итоге 2 последних символа забиты хз чем.
тип - pchar
массив передаётся указателем из сишной библиотеки.
в библиотеке тоже стоит Record field aligment = 1
память и там и там DDR2
ещё раз повторюсь под хр86 всё работает.

kill-still

аврал жестокий. 10го сдавать проект, а тут такое выясняется.

kill-still

если выставить
Record field aligment = 0
то смещение увеличивается на 3 байта, если 2, то отаётся таким же, если 4, то вообще перестаёт работать.

vall

структуру покажи :smirk:

kill-still

type

Tdictout = record
name: array [1..28] of char; // Слово из словаря
value,dic_value,add_value: Smallint;
end;

TdictoutArray = array of Tdictout;

Pdictout = ^TdictoutArray;

Tisearch = record
okof: array [1..10] of char;
value,NumberOfElements:Longint;
items: Pdictout;
end;

Tisearcharray = array of Tisearch;
isearch = ^Tisearcharray;


TintSearch = class
public
procedure SetMinStemLen(len:integer); virtual; stdcall; abstract;
procedure SetBadSymbols(bs: pchar); virtual; stdcall; abstract;
procedure SetDictPath(dp: pchar); virtual; stdcall; abstract;
procedure SetLenWordsValues(list, listK: pchar); virtual; stdcall; abstract;
procedure SetDictValues(dictlistK: pchar); virtual; stdcall; abstract;
procedure searchString(s: pchar); virtual; stdcall; abstract;
function getCount: integer; virtual; stdcall; abstract;
function getItems: isearch; virtual; stdcall; abstract;
function stemka(str: pchar): pchar; virtual; stdcall; abstract;
procedure filter(border:integer); virtual; stdcall; abstract;
procedure SetDebugFileName(name:Pchar); virtual; stdcall; abstract;
end;

PintSearch = ^TintSearch;

TInitSearch = function : PintSearch; stdcall;
TDelSearch = procedure (ex : PintSearch); stdcall;


TOkofAISearchElementItem = record
OKOF:string[9];
OkofDescription:string[255];
TestHint:string[255];
end;

TOkofAISearchElement = record
assigned: boolean;
ItemsCount:integer;
data: array of TOkofAISearchElementItem;
end;

TOkofAISearchArray = array of TOkofAISearchElement;

TintSearch - абстрактное описание объекта сишной длл.

var
ItemsPointer:isearch;
ItemsElements:Tisearcharray;
IntSearchPointer:PIntSearch;

AISearcher:TintSearch;
InitSearch:TInitSearch;
DelSearch:TDelSearch;
LibHandle: HModule;

момент присваивания:
ItemsPointer:=AIsearcher.getItems;
ItemsElements:=pointer(ItemsPointer);

момент считывания:

findstring:=ItemsElements[j].okof;

kill-still

Чудеса... Хз что я сделал, но оно стало работать. Не стал сохранять проект, закрыл всё, перезагрузился, продолжает работать. А перед этим полдня не работало.
О_о

vall

:pop: можешь меня не благодарить =)

SPARTAK3959

И все же еще раз посоветую почитать книгу по ассемблеру и части справки delphi о встроенном асме + выучить комбинацию alt+ctrl+c (давно не юзал delphi - могу немного ошибаться) для вызова окна дизассемблера. И тогда вопросов у вас больше не возникнет.
Не стоит пытаться вставить круглый цилиндр в квадратное отверстие (сопрягая delphi программу с C++ без COM не обладая силой Шварцнегера.

vall

да ладно, ничего там сложного, ты ещё предложи в xml всё сереализовать.
просто нужно структуры описывать в нормальных типах, размер которых понятен и не меняется.
да и понять как выравнивание сделать предсказуемым.

kill-still

Во что вычитал:
On the .NET platform, field layout in record types is determined at runtime, and can vary depending on the architecture of the target hardware. The following discussion of record alignment applies to the Win32 platform only (packed records are supported on the .NET platform, however).
When a record type is declared in the {$A+} state (the default and when the declaration does not include a packed modifier, the type is an unpacked record type, and the fields of the record are aligned for efficient access by the CPU. The alignment is controlled by the type of each field and by whether fields are declared together. Every data type has an inherent alignment, which is automatically computed by the compiler. The alignment can be 1, 2, 4, or 8, and represents the byte boundary that a value of the type must be stored on to provide the most efficient access. The table below lists the alignments for all data types.

З.Ы. всегда найдётся человек, предлагающий забивать гвозди микроскопом. :)

SPARTAK3959

да ладно, ничего там сложного, ты ещё предложи в xml всё сереализовать.просто нужно структуры описывать в нормальных типах, размер которых понятен и не меняется.да и понять как выравнивание сделать предсказуемым.
XML тут не причем - в него код метода не запихнешь. Тут как раз дело в том, что чел юзает не структуры, которыми можно полностью управлять, а объекты, которыми, вообще говоря, управляет компилятор. Поэтому при передаче объектов, созданных в другом языке программирования, нужно понимать их внутреннюю структуру, чтобы знать как с этими объектами можно работать на другом языке, который предполагает другую внутреннюю структуру объектов, и как с ними работать нельзя.

vall

если из языка можно делать сисколы значит стандартное представление обычных структур там есть, остальное дело техники.
Любую проблему можно решить введением дополнительного уровня абстракции кроме одной — слишком большого количества уровней абстракции. (С) не я.
Оставить комментарий
Имя или ник:
Комментарий: