Τετάρτη 13 Ιανουαρίου 2016

Πίνακες αντικειμένων με Πίνακες αντικειμένων

Μικρό πρόγραμμα (στα αγγλικά)  με κλάση Mem() που φτιάχνει πίνακες με κλάσεις. Στο παράδειγμα φτιάχνουμε πρώτα το Μ με την κλάση Mem() να περιέχει 100 στοιχεία από την κλάση D3. Μετά κάνουμε resize τον πίνακα της Μ βάζοντας επιπλέον 100 στοιχεία από την ίδια κλάση. Εκτελούμε και μια καταχώρηση ίδιας τιμής σε μια περιοχή στο πίνακα (με το τμήμα ResetRange )
Μετά φτιάχνουμε ένα αντικείμενο ΜΜ ως κλάση Mem() με 100 στοιχεία από κλάση Mem() με δέκα στοιχεία (δέκα έχουμε βάλει εξ ορισμού, δες το Ν=10)  από την κλάση D3. Κάνουμε διάφορες εργασίες όπως αντιγραφή, αλλαγή μεγέθους επιλεκτικά σε ένα από τα 100 στοιχεία,
Μετά βγάζουμε ένα αντίγραφο του ΜΜ στο ΚΚ. Μάλιστα του αφαιρούμε τα μισά στοιχεία (κρατάμε το κάτω μισό). Στην αντιγραφή του ΜΜ στο ΚΚ έχει γίνει αντιγραφή του κάθε στοιχείου του ΜΜ, και όλων των στοιχείων και πινάκων μέσα σε αυτό.
Θα μπορούσαμε να βγάλουμε ένα αντίγραφο του ΜΜ στο σωρό τιμών και να το "σηκώσουμε" σε ένα ΚΚ (μπορεί να γίνει και ως επιστροφή σε τμήμα που καλούμε)
Push MM
Read KK

Σε συνάρτηση μπορούμε να γράψουμ =ΜΜ και να γυρίσουμε το αντικείμενο
οπότε ένα ΚΚ=ΜιαΣυνάρτηση() θα δώσει το αντίγραφο του ΜΜ (ενώ το ΜΜ θα έχει διαγραφεί με το πέρας της ΜιαΣυνάρτηση )
Οι κλάσεις είναι στην ουσία συναρτήσεις που γυρίζουν αντικείμενα (ομάδες λέγονται στην Μ2000). Ένα τμήμα (Module) με το ίδιο όνομα με τη κλάση είναι ο κατασκευαστής, δηλαδή όταν καλούμε την Mem() αυτή περνάει τις όποιες παραμέτρους στο τμήμα Mem και στο τέλος δίνει ένα αντικείμενο για επιστροφή. Ακόμα και αν δεν έχουμε το τμήμα Mem, θα γυρίσει αντικείμενο. Ο κατασκευαστής είναι προαιρετικός. Δεν υπάρχει ειδικός αποδομητής (deconstructor).  Μπορεί κανείς να ορίσει μηδενικό μέγεθος πίνακα, άρα να τον σβήσει, κρατώντας το όνομα για χειρισμό μετά.

Ενώ τα Μ, ΜΜ και ΚΚ είναι "στατικά αντικείμενα", δηλαδή έχουν γίνει ένα με το τμήμα, όλα τα άλλα που είναι εντός στοιχείων πίνακα μπορούν να αλλαχθούν στο βαθμό που θέλουμε. Επειδή όμως όλοι οι πίνακες εδώ "καθαρίζονται" στην αρχή με κλάση...περιορίζονται οι συναρτήσεις που μένουν μόνιμα στα αντικείμενα, σε αυτές που δηλώθηκαν στην αρχή. Έτσι κάθε στοιχείο του πίνακα στην Mem έχει πίνακες και μεταβλητές (και μπορεί να τα αυξήσει), αλλά έχει σταθερές συναρτήσεις και τμήματα. Μπορούμε να φτιάχνουμε πίνακες βάζοντας διάφορες ομάδες σε κάθε στοιχείο.

Στη Μ2000 δεν υπάρχει αναγνωριστικό ιδιαίτερης ομάδας, ή αντικειμένου. Αν θέλει κανείς κάτι τέτοιο μπορεί να κάνει κάτι μόνος του, δηλαδή να βάλει σε κάθε αντικείμενο μια συνάρτηση που να γυρνάει το τύπο ή μια μεταβλητή. Μόνο οι βασικοί τύποι αναγνωρίζονται στη Μ2000, όπως double (και το Α% που παίρνει ακέραια τιμή είναι double), string, group, long και document. (και COM αντικείμενα που δύναται να χειριστούμε, και δεν θα επεκταθώ, δείτε εδώ). Το Document δεν δίνει πίνακες, αλλά μπορεί να αλλάξει ένα στοιχείο σε πίνακα αλφαριθμητικών (ένα κάθε φορά). Το Long αλλάζει απλή μεταβλητή σε Long για να χρησιμοποιηθεί σε κλήσεις εξωτερικών ρουτινών (dll).




Class Mem {
      Dim d()
      MaxItem
      Module Mem {
            If Match("N") Then {Read N} Else N=10
            If Match("G") Then {Read G} Else Group G { Null }
            Dim .d(N+1)=G
            .MaxItem<=N
      }
      Module Resize {
            If Match("N") Then {Read N} Else N=10
            If Match("G") Then {Read G} Else Group G { Null }
            NewItems= N-.Maxitem
            Dim .d(N+1)
            If NewItems>0 Then Stock .d(.MaxItem +1) Sweep NewItems , G
            .MaxItem<=N
      }
      Module ResetRange {
            Read FromHere,ToThere, G
            stock .d(FromHere) Sweep ToThere-Fromhere+1, G
      }
}
Class D3 {
      x,y,z
      Module D3 {
            If Match("NNN") Then Read .x, .y, .z
      }
}
Mx=100
M=Mem(Mx,D3())
For I=0 to Mx : Gosub GetD3(I,10*I,20,30) : Next I
For M.d(50) {
      Print .x, .y, .z
}
Mx*=2
M.Resize Mx, D3()


Print Type$(M.d(150)) \\ Group  
For I=Mx div 2+1 to Mx: Gosub GetD3(I,10*I,20,30) : Next I
For M.d(150) {
      Print .x, .y, .z
}
M.ResetRange 0, 19, D3(10,20,30)
For M.d(15) {
      Print .x, .y, .z
}
MM=Mem(100,Mem(D3(10,20,30)))
Print MM.d(10).maxitem \10
\\ we have 100 Mem() with 10 items each
Print MM.d(10).d(2).z \ 30
MM.d(10).ResetRange 1, 10, D3(100,100,100)
Print MM.d(10).d(2).z \ 100
MM.d(4).Resize 20, D3(10,20,30)
Print MM.d(4).d(12).z
For MM.d(10), MM.d(0) {
       ..d() =.d() ' copy all elements
}
Print MM.d(0).d(2).z \ 100
For MM {
      .d(1)=.d(10) ' the same for all elements of group inside array item
}
Print MM.d(1).d(2).z \ 100
For MM {
      Swap .d(1),.d(3) ' Swap objects
}
Print MM.d(1).d(2).z \ 30  
Print MM.d(3).d(2).z \ 100
\******************************/
KK=MM ' this is a copy - KK has a copy of 100 objects with an array each, with an object of that array
KK.resize MM.Maxitem div 2
\*************************/
For MM {
      .d(1).d(2).z+=10
      .d(3).d(2).z+=10
      Print .d(1).d(2).z \ 40
      Print .d(3).d(2).z \ 110
}
For KK {
      Print .d(1).d(2).z \ 30  
      Print .d(3).d(2).z \ 100
      Print .maxitem \50
}
End
Sub GetD3(where, x,y,z)
      For M.d(where) {
            .x=x
            .y=y
            .z=z
      }
End Sub



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

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

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