Announcement

Collapse
No announcement yet.

Leere Menge wird nicht zugewiesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Leere Menge wird nicht zugewiesen

    Hallo liebe Leute,

    an einer Stelle meines Programmcodes funktioniert die Zuweisung einer leeren Menge nicht.

    Die Mengenvariable hat die Größe longword.

    Die Zuweisung
    X:=[];

    weist nur dem niederwertigen word von X Null zu,
    das höherwertige word von X bekommt beliebige Werte zugewiesen,
    selbst wenn vor dieser Zuweisung longword(X)=0 war(!!):

    Zum Testen habe ich folgendes gemacht:
    longword(X):=0;
    //jezt ist lonword(X) tatsächlich Null.
    //nun:
    X:=[]
    // jetzt ist longword(X)=34F0000 (Hex)
    //

    Der Fehler trat auf, als ich den Code vor dieser Stelle
    mit ein paar Zeilen erweiterte.

    Zum Test habe ich den zusätzlichen Code, der diesen Fehler
    verursacht hat, durch viele verschiedene belanglose
    Code ersetzt. Dabei trat der Fehler bei einigen Codes auf, bei anderen nicht. Eine Systematik konnte ich nicht entdecken.

    Natürlich kann ich dieses Problem umschiffen,
    indem ich
    X:=[];
    durch
    longword(X):=0;
    ersetze,
    aber solange ich nicht weiß was da los ist,
    kann ich nicht darauf vertrauen, daß das programm ordentlich
    arbeitet.

    Weiß da jemand was??

  • #2
    Moin Uwe,

    ... könnte daran liegen, dass lt. Delphi-Hilfe Mengen nur den Bereich bis 255 abdecken ("Die Ordinalpositionen der Werte müssen zwischen 0 und 255 liegen.").

    Gruß,

    Geer

    Comment


    • #3
      Hi Geert,

      die Ordinalwerte der Mengenelemente liegen von 0 bis 26,
      das liefert eine SizeOf(Menge) von 4(byte) wie longword.

      Das ist es nicht.

      Gruß Uw

      Comment


      • #4
        Moin Uwe,

        kannst Du ein Stückchen Code liefern, mit dem das beschriebene Verhalten provozierbar ist ?

        Gruß,

        Geer

        Comment


        • #5
          Hallo Geert,

          ich kann das selber an anderer Stelle nicht reproduzieren
          mit einem "Stückchen" code, die exe hat inzwischen 3MB.

          Das Phänomen tritt soweit ich das sehe bisher nur an dieser
          einen Stelle im Programm auf.

          TElemente = (Element0,
          Element1,
          ::
          Element26);

          TMenge = set of TElemente;

          Procedure any;
          var M: TMenge;
          begin
          M:=[];
          //Jetzt ist and dieser Stelle
          // longword(M)=34F0000 (Hex)
          end;

          Gruß Uwe
          &#10

          Comment


          • #6
            Moin Uwe,

            tut mir leid, aber ich kann auch mit dem von Dir gelieferten Code (ich habe ihn um einige includes und excludes ergänzt, damit in "M" etwas Bewegung kommt) das von Dir beschriebene Verhalten nicht provozieren.

            Gruß,

            Geer

            Comment


            • #7
              Hallo Geert,

              danke für deine Mühe, aber ich hatte auch gar nicht erwartet, daß man dieses Verhalten reproduzieren kann. Ich kann's auch nicht.
              Kommt nur an der besagten Stelle des Codes vor und ist meiner Meinung nach am ehesten ein Bug im Compiler (darf man so eine Vermutung überhaupt äußern?) und genau das macht mir Sorgen.

              Wichtig wäre hier eher, ob sonst noch jemand so ein Verhalten beobachtet hat.

              Gruß Uw

              Comment

              Working...
              X