unit not found.. beim neu Kompilieren

Für Fragen rund um die Ide und zum Debugger
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

unit not found.. beim neu Kompilieren

Beitrag von br_klaus »

Hallo,
ich habe immer wieder das Problem, daß oft bereits beim Kompilieren eines neuen Packages bzw dann beim Installieren desselben, wenn Lazarus ganz neu kompiliert werden muss, der Compiler dann immer wieder unterbricht: unit xxx nicht gefunden. Obwohl sie manchmal mit Ctrl+Click sogar angesprungen werden kann. Ich muss dann von Hand erst das entsprechende Verzeichnis in den Compilereinstellungen hinzufügen. Es ist fast immer nur dann der Fall, wenn derselbe Unitname viele Male vorkommt, jedesmal zugehörig zu einem anderen Widgetset bzw. OS.

Kann denn so etwas der Compiler nicht selber automatisch machen?

Aber jetzt das eigentliche Problem:
bei einem Package (MirrorKOL) wird auch die Unit graphics verlangt. Diese führt aber letztlich zur Unit Trees (graphics --> FPReadPNG, FPWritePNG --> zstream --> zdeflate --> trees), und da ist ein - für mich und anscheinend auch den Compiler - unlösbares Problem.

Es heißt da:

Code: Alles auswählen

 
type
ct_data_ptr = ^ct_data;
ct_data = record
   fc : record
   case byte of
      0:(freq : word);       { frequency count }
      1:(code : word);       { bit string }
   end;
 
   dl : record
   case byte of
      0:(dad : word);        { father node in Huffman tree }
      1:(len : word);        { length of bit string }
   end;
end;
 
  tree_ptr = ^ct_data;
 
procedure gen_codes(tree : tree_ptr;  { the tree to decorate }
                    max_code : integer;   { largest code with non zero frequency }
      var bl_count : array of word){ number of codes at each bit length }
 
   var
  next_code : array[0..MAX_BITS+1-1] of word; { next code value for each bit length }
   code : word;              { running code value }
   bits : integer;                  { bit index }
   n : integer;                     { code index }
       len : integer;
 
begin
 ....
 
for n := 0 to max_code do
 begin
    len := tree[n].dl.Len;    // <-- error: array erwartet
   if (len = 0) then continue;
    { Now reverse the bits }
    tree[n].fc.Code := bi_reverse(next_code[len], len);
    inc(next_code[len]);
 ...
 


Der Compiler bleibt hängen bei len:=tree[n].dl.len; Ich kann auch nicht verstehen, was tree[n] bedeuten soll: der n-te tree_ptr, oder was?

Was ich auch nicht verstehe: wieso wird das problemlos akzeptiert, wenn ich Lazarus einfach so kompiliere, aber nicht, wenn alles neu kompiliert werden soll? Ist das ein Bug - oder was?

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: unit not found.. beim neu Kompilieren

Beitrag von Mathias »

Wen ich deinen Code-Ausschnitt kompiliere, kommt bei mir kein Fehler.
len wird akzeptiert.

Code: Alles auswählen

program Project1;
 
 
type
  ct_data_ptr = ^ct_data;
 
  ct_data = record
    fc: record
      case byte of
        0: (freq: word);       { frequency count }
        1: (code: word);       { bit string }
    end;
 
    dl: record
      case byte of
        0: (dad: word);        { father node in Huffman tree }
        1: (len: word);        { length of bit string }
    end;
  end;
 
  tree_ptr = ^ct_data;
 
 
  procedure gen_codes(tree: tree_ptr;  { the tree to decorate }
    max_code: integer;   { largest code with non zero frequency }
  var bl_count: array of word){ number of codes at each bit length }
 
  var
    next_code: array[0..100] of word; { next code value for each bit length }
    code: word;              { running code value }
    bits: integer;                  { bit index }
    n: integer;                     { code index }
    len: integer;
 
  begin
 
    for n := 0 to max_code do begin
      len := tree[n].dl.Len;    // <-- error: array erwartet
      if (len = 0) then begin
        continue;
      end;
      { Now reverse the bits }
      //    tree[n].fc.Code := bi_reverse(next_code[len], len);
      Inc(next_code[len]);
    end;
  end;
 
begin
end.       
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: unit not found.. beim neu Kompilieren

Beitrag von theo »

Was hast du denn für einen Modus?
Pointer als Array geht in FPC/OBJFPC Modus aber nicht im DELPHI Modus.

S.a: http://wiki.freepascal.org/User_Changes ... _directive

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: unit not found.. beim neu Kompilieren

Beitrag von br_klaus »

theo hat geschrieben:Was hast du denn für einen Modus?
Pointer als Array geht in FPC/OBJFPC Modus aber nicht im DELPHI Modus.

S.a: http://wiki.freepascal.org/User_Changes ... _directive


Herzlichen Dank, das war wohl der fehler. Mit objfpc geht es.

Habe aber jetzt ein anderes Problem. Habe leakview installiert, und da zeigt mir das Programm am Ende an:
True haep size: 1343488, True free heap: 1343360, should be 1343488,
also 128 Bytes zu wenig. Und zwar geschieht das, sobald ich das Package MirrorKOLPackage installiere.
Beim Kompilieren des Packages selber gibt es keine Fehlermeldung.
Wie kann ich leakview dazu bringen, nähere Informationen zu geben, woher diese Differenz kommt?

Antworten