2017-01-29 1 views
-2

Ich bin neu in Delphi und Programmierung im Allgemeinen. Ich habe ein Problem, dass, wenn ich die folgende DLL-Prozedur kompiliere und laufe, ich einen I/O-Fehler 998 bekomme. Könntest du bitte darauf hinweisen, was ich falsch mache, während ich die geringste Menge von Änderungen an meinem Code mache? Soweit ich das beurteilen kann, muss es ein Problem mit der Art sein, wie ich meine Dateien handhabe.Delphi Fehler: I/O Fehler 998

Die Idee dieses Verfahrens, um Daten von der VCL-Anwendung mit der DLL zu akzeptieren, speichern Sie es in einen Datensatz und speichern Sie den Datensatz dann in eine DAT-Datei.

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; 

Entschuldigung für die fremden Variablennamen.

+0

Welche Linie bewirkt, dass die Ausnahme ausgelöst werden? –

+0

Warum können wir kein [mcve] haben? Dies ist nicht das erste Mal, dass wir diesen Code gesehen haben. Es gibt ziemlich viele Probleme mit dem Code. Ich muss zugeben, ich frage mich, warum Sie nicht debuggen. Warum das? Wäre es nicht einfacher zu lernen, wie man debuggt und in der Lage ist, es selbst zu tun, anstatt andere Leute zu bitten, Fragmente Ihres Codes zu debuggen? Würdest du das nicht gerne selbst sortieren? –

+0

Ja, das würde ich gerne selbst machen können, ich würde hier keine Frage stellen, wenn ich nicht schon alle meine Möglichkeiten ausgeschöpft hätte. Ich bitte um Hilfe, nicht weil ich faul bin, sondern weil ich feststecke. Soweit ich das beurteilen kann, sagt mir der Debugger, dass alles in Ordnung ist. Ich sehe keine Probleme, über die Sie sprechen. –

Antwort

1

Es ist mir nicht klar, warum Sie Zeiger auf einen Datensatz verwenden (erster ^), wenn Sie den Datensatz selbst genauso einfach verwenden könnten.

Du dereferencing einen unitialised Zeiger hier

Read(BazaDanych, first^); 
+0

Es ist, weil ich eine Liste von Einweg-Zeigern verwende, um meine Daten zu speichern, obwohl ich die vorgeschlagenen Änderungen ausprobiert habe und sie nicht funktioniert haben. Soweit ich das beurteilen kann, gibt es keinen Unterschied in der Funktionalität. –

+0

@ M.G. Ich habe keine Ahnung, was Sie tatsächlich getan haben, aber ich vermute stark, dass Sie die Implikationen der Verwendung eines "nicht initialisierten Zeigers" nicht verstehen. Also ist es Zeit für Sie, etwas zu diesem Thema zu lesen. Unabhängig davon ist das Duplikat, das ich im Kommentar zu Ihrer Frage gefunden habe, konzeptionell sehr ähnlich zu Ihrem eigenen Fehler. Und diese Antwort weist genau darauf hin, dass "Lesen" fehlschlägt, weil Sie die Methode nicht mit einem *** gültigen *** Speicherort versehen haben, um die aus der Datei gelesenen Daten zu speichern. –