2017-01-29 26 views
-2

Я новичок в delphi и программировании в целом. У меня проблема, когда при компиляции и выполнении следующей DLL-процедуры я получаю ошибку ввода-вывода 998. Не могли бы вы указать, что я делаю неправильно, делая минимально возможное количество изменений в моем коде? Насколько я могу судить, это проблема с тем, как я обрабатываю свои файлы.Ошибка Delphi: ошибка ввода/вывода 998

Идея этой процедуры для приема данных из приложения VCL с использованием DLL, сохранения его в записи и сохранения записи в файл .dat.

type 
    plist = ^game; 
    tdata = record 
    nazwa: shortstring; 
    wydawca: shortstring; 
    rokwyd: shortstring; 
    gatunek1: shortstring; 
    gatunek2: shortstring; 
    end; 
    game = record 
    data: tdata; 
    pointer: plist; 
    end; 

{$R *.res} 

procedure DodajElement (var field1, field2, field3, field4, field5 : shortstring); stdcall; 
var 
    BazaDanych : file of game; 
    first, current: plist; 
begin 
    AssignFile(BazaDanych, 'BazaDanychGier.dat'); 
    if not FileExists('BazaDanychGier.dat') then 
    begin 
     new(first); 
     first^.data.nazwa := field1; 
     first^.data.wydawca := field2; 
     first^.data.rokwyd := field3; 
     first^.data.gatunek1 := field4; 
     first^.data.gatunek2 := field5; 
     first^.pointer := nil; 
     Rewrite(BazaDanych); 
     Write(BazaDanych, first^); 
     CloseFile(BazaDanych); 
    end 
    else 
    begin 
     Reset(BazaDanych); 
     Read(BazaDanych, first^); 
     CloseFile(BazaDanych); 
     current := first; 
     new(first); 
     first^.data.nazwa := field1; 
     first^.data.wydawca := field2; 
     first^.data.rokwyd := field3; 
     first^.data.gatunek1 := field4; 
     first^.data.gatunek2 := field5; 
     first^.pointer := current; 
     Rewrite(BazaDanych); 
     Write(BazaDanych, first^); 
     CloseFile(BazaDanych); 
    end; 
end; 

Извините за имена иностранных переменных.

+0

Какая линия вызывает исключение быть поднят? –

+0

Почему мы не можем иметь [mcve]? Это не первый раз, когда мы видели этот код. С кодом довольно много проблем. Должен признаться, мне интересно, почему вы не отлаживаете. Почему это? Разве не легче было бы узнать, как отлаживать и быть в состоянии сделать это самостоятельно, вместо того, чтобы просить других людей отлаживать фрагменты вашего кода? Разве вы не хотели бы сортировать это для себя? –

+0

Да, я хотел бы иметь возможность сделать это сам, я бы не стал задавать вопрос здесь, если бы я еще не исчерпал все свои возможности. Я прошу помощи не потому, что я ленив, а потому, что я застрял. Кроме того, насколько я могу судить, отладчик говорит мне, что все в порядке, я не вижу проблем, о которых вы говорите. –

ответ

1

Непонятно, почему вы используете указатели на запись (сначала ^), когда вы можете так же легко использовать саму запись.

Вы разыменования в unitialised указатель здесь

Read(BazaDanych, first^); 
+0

Это потому, что я использую список указателей с одним указателем для хранения моих данных, несмотря на то, что я пробовал предложенные вами изменения, и они не работали. Насколько я могу судить, нет никакой разницы в функциональности. –

+0

@ M.G.I понятия не имею, что вы на самом деле делали, но я сильно подозреваю, что вы не понимаете последствий использования «неинициализированного указателя». Так что пришло время вам кое-что прочитать по этому вопросу. Несмотря на это, дубликат, который я нашел, как упоминалось в комментарии к вашему вопросу, концептуально очень похож на вашу собственную ошибку. И этот ответ точно указывает, что 'Read' терпит неудачу, потому что вы не предоставили метод с *** корректным *** местоположением для хранения данных, считанных из файла. –