Τετάρτη 26 Αυγούστου 2020

Αναθεώρηση 53, Έκδοση 9.9

Διόρθωση στη Πίνακας() (ή Array()).  Το παρακάτω πρόγραμμα τρέχει σωστά!

Το πρόγραμμα που ακολουθεί εμφανίζει δυο φορές μια λίστα στοιχείων, διαβάζοντας έναν πίνακα. Το ενδιαφέρον εδώ πριν την αναθεώρηση 53 ήταν ότι η πρώτη λίστα εμφανίζονταν σωστά, αλλά χάλαγε το η πρώτη ομάδα στο πίνακα οπότε στη δεύτερη φάση στην πρώτη ομάδα (αντικείμενο) στο πίνακα ο δείκτης στην Εταιρεία είχε διαγραφεί! Ο λόγος ήταν απλός όταν είδα το κώδικα. Η εξαγωγή της Πίνακας() έδινε απευθείας το δείκτη της ομάδας, και στην πρώτη αντιγραφή στο Κ ο διερμηνευτής "χάλαγε" το υποτιθέμενο "μοναδικό" δείκτη. Οπότε έγινε αυτό που έπρεπε, η Πίνακας δείνει αντίγραφο της ομάδας. Αν ο πίνακας έχει δείκτη σε ομάδα τότε δίνει το δείκτη (δεν έχοιυμε αντιγραφή), οπότε και στην δημιουργία του Κ θα πάρουμε την Κ σαν δείκτη σε ομάδα.

Τμήμα ΔεςΑυτό {
      Κλάση Άτομο {
            Όνομα$="Ένα Όνομα Εργαζόμενου"
            Κωδικός=0
            Εργοδότης=Δείκτης()
      Κλάση:
            Τμήμα Άτομο(Ε ως *Εταιρεία, &Αρ) {
                  .Εργοδότης<=Ε
                  Αρ++
                  .Κωδικός<=Αρ
                  
            }
      }
      Κλάση Εταιρεία {
            Όνομα1$="Μια Εταιρεία"
      }
      Ε1=Εταιρεία()
      ΑρΕργαζομένου=0
      Πίνακας Εργαζόμενος(1 έως 10)<<Άτομο(Δείκτης(Ε1), &ΑρΕργαζομένου)
      Β=Διάσταση(Εργαζόμενος(),1,0) ' 1
      Μ=Κάθε(Εργαζόμενος())
      Ενώ Μ {
            K=Πίνακας(Μ)
            Για K {
                  Τύπωσε Μορφή$("{0::-5}|{1:25}|{2:20}", .Κωδικός, .Όνομα$, .Εργοδότης=>Ονομα1$)
            }
      }
      Μ=Κάθε(Εργαζόμενος())
      Ενώ Μ {
            K=Πίνακας(Μ)
            Για K {
                  Τύπωσε Μορφή$("{0::-5}|{1:25}|{2:20}", .Κωδικός, .Όνομα$, .Εργοδότης=>Ονομα1$)
            }
      }
}
ΔεςΑυτό



Παρακάτω είναι στα αγγλικά το τμήμα REV53 που μπήκε στο info.gsb (το αρχείο που υπάρχει στην εγκατάσταση της Μ2000). Εδώ έχουμε πίνακα με δείκτες.

Module CheckThis {
      Class Company {
            Name$="A Company"
      }
      Function At {
            Class Person {
                  Name$="John Doe"
                  Idempl=0
                  Company=Pointer()
                  Remove {
                        Print "Remove:";.Idempl
                  }
            Class:
                  Module Person(t as *Company, &n) {
                        .Company<=t
                        n++
                        .Idempl<=n
                  }
            }
            =Pointer(Person(![]))
      }
      Ε1=Company()
      Idempl=0
      Dim Empl(1 to 10)<<At(Pointer(Ε1), &Idempl)
      m=Each(Empl())
      While m {
            k=Array(m)
            For k {
                  Print Format$("{0::-5}|{1:25}|{2:20}", .Idempl, .Name$, .Company=>Name$)
            }
      }
      m=Each(Empl())
      While m {
            k=Array(m)
            For k {
                  Print Format$("{0::-5}|{1:25}|{2:20}", .Idempl, .Name$, .Company=>Name$)
            }
      }
}
CheckThis

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.