Announcement

Collapse
No announcement yet.

Array in Struct

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

  • Array in Struct

    Hallo,

    ich habe ein Struct :

    public struct TimeRec
    {
    public enum Zeitpunkt
    {
    none,
    hour,
    day,
    week,
    month
    }

    public int anzahl ;
    public Zeitpunkt zeitpunkt;
    public DateTime time ;
    }

    public struct Bookmark
    {
    public int id ;
    public string user;
    public string pass;
    public TimeRec[] timerec ;
    }

    Wie und wann initialisiere ich das Array?
    Mein Versuch sah wie folgt aus:

    if ( mark.timerec == null )
    {
    //mark wurde vorher initialisiert:
    // Bookmark mark = new Bookmark();

    // Hat nicht funktioniert
    mark.TimeRec = new TimeRec[1] ;

    // Hat auch nicht funktioniert
    TimeRec[] tt = new TimeRec[1] ;
    mark.timerec mark.timerec = tt ;
    }

    Kann mir jemand sagen wie es richtig geht?

  • #2
    Hallo,
    eine Lösung könnte so aussehen: Um zu prüfen, ob dem Bookmark-Eintrag bereits ein TimeRec zugewiesen wurde, greift das Beispiel auf den Wert von "anzahl" zurück:
    <code>
    TimeRec aTR;
    aTR.zeitpunkt = TimeRec.Zeitpunkt.day;
    aTR.time = DateTime.Now;
    aTR.anzahl = 1;
    //
    Bookmark aBM;
    aBM.id = 1;
    aBM.user = "user";
    aBM.timerec = new TimeRec[10];
    if (aBM.timerec[0].anzahl == 0)
    {
    aBM.timerec[0] = aTR;
    }
    MessageBox.Show(aBM.timerec[0].time.ToShortTimeString());
    </code&gt

    Comment


    • #3
      Hallo,

      Du hast mein Problem nicht verstanden.

      Ich habe in einem Struct ein Array. Ich kann es nicht wie Du mit
      aBM.TimeRec = new timeRec[10];
      initialisieren, da es vorhanden sein könnte.

      Ich möchte schauen ob es initialisiert ist und ggf. initialisieren falls es noch nicht existiert.

      Ich komme von Delphi nach c# vielleicht kann ich es Dir in Delphi zeigen was ich möchte und Du sagst mir wie ich es in c# machen muss?

      Type
      tTimeRec = Record
      Zeit : TDateTime ;
      End ;
      pTimeRecArr = Array of tTimeRec ;

      tBookmark = Record
      name : String ;
      Arr : ^tTimeRecArr ;
      End;

      Var
      bm : tBookmark ;
      tr : tTimeRec ;

      Begin
      tr.Zeit := now ;

      // 1. Es geht um diesen Teil: Der Befehl Assigned fehlt mir in c#
      if Not Assigned ( bm.Arr ) then // in c# bm.Arr == null OK?
      New ( bm.Arr ) ;

      bm.Arr := SetLength ( bm.Arr, Count ( bm.Arr ) + 1 ) ;

      bm.Arr[ high ( bm.Arr ) ] := tr ;
      End ;

      2. Die Initialisierung eine neuen Arrays in der Unterstruktur

      tTimeRec[] bm.Arr = new tTimeRec[1] ;
      // Fehlermeldung ";" statt "." erwartet.

      Code ist immer schwer zu beschreiben. Kannst Du mir folgen?

      Gruss
      Andrea

      Comment


      • #4
        Hallo,
        das grundsätzlich Problem besteht darin, dass ein <i>struct</i> als Value Type direkt auf dem Stack (oder "Inline" gespeichert) gespeichert wird. Eine Variable für eine Struktur kann nicht den Typ <i>null</i> aufweisen. Aus diesem Grund weigert sich der C#-Compiler, auf ein nichtinitialsiertes Element der Struktur zuzugreifen. Im Gegensatz dazu unterliegt eine <i>class</i> als Reference Type nicht diesen Einschränkungen.
        <br>
        Wenn eine null-Abfrage genutzt werden soll, muss der struct gegen eine class ausgetauscht werden. Die nächste Entscheidung besteht darin, ob man die Verwaltung in eigene Regie übernimmt oder auf die Fähigkeiten der <i>DataTable</i>- bzw. <i>DataSet</i>-Klasse zurückgreift. Mit diesen kann mit sehr einfachen Mitteln visuell eine In-Memory-Datenbank (inklusive referenzieller Integrität, kaskadierenden Updates etc.) implementiert werden. Lange Rede - kurzer Sinn: Es ist nicht zweckmäßíg, ein Delphi-Beispiel im Maßstab 1:1 mit C# nachzubauen, da in diesem Fall (Prinzip des kleinsten gemeinsamen Nenners) die Vorteile des .NET Frameworks nicht ausgenutzt werden können

        Comment


        • #5
          Hallo Andreas,

          mir geht es darum in einer Struktur eine dynamische Liste von irgendwas verwalten zu können.

          Der Delphi Code war nur als Beispiel um zu beschreiben wie ich es annähernd in Delphi gemacht hätte.

          Natürlich ist es nicht sinnvoll 1:1 umzusetzen. Als Umsteiger weiß man ja aber auch nicht wie es gehen kann. Trotz aller schlauen Bücher wird der eigene Problemfall natürlich nicht behandelt. (wie auch)

          Danke für die Hinweise.

          Andrea

          Comment

          Working...
          X