Προς το περιεχόμενο

Γενικό thread αποριών για τη C#.


Alithinos

Προτεινόμενες αναρτήσεις

αυτά τα κόλπα γίνονται σε c++; ( προφανώς όχι 99, από τελευταίες εκδόσεις αν έχει κάτι ) ξέρω πως από την 11 έχεις lambdas αλλά τι είδους support υπάρχει; το λέω γιατί μου θύμισε λίγο scala και θέλω να δω κατά πόσο μπορώ να μεταφέρω αυτό το στυλ και σε c++

 

Εννοείται γίνεται σε c++ αλλά όχι με αυτό ακριβώς τον τρόπο. Η ουσία είναι ότι εκεί αντί για IEnumerable έχεις iterators και αντί για extension methods έχεις free functions. Οι lambdas παραμένουν lambdas απλά με χειρότερη σύνταξη. Και τέλος αν θέλεις να μην είσαι αναγκασμένος να κάνεις επι τόπου materialize τα sequences θα χρειαστεί να γράψεις ή να βρεις έτοιμο κώδικα.

 

 

 

materialize:

 

Είδες στο παράδειγμα που έδωσε το παπί για ισοδύναμο της select ότι χρειάστηκε να κάνει ένα vector για να βάλει μέσα τα πράγματα, οπότε πριν ξεκινήσει "ο επόμενος" έχεις ήδη κάνει όλη τη δουλειά. Αντίθετα με LINQ αυτό το πράγμα δε γίνεται εκτός και αν το ζητήσεις άμεσα ή έμμεσα (π.χ. αν πεις Reverse() στη γενική περίπτωση προφανώς πρέπει να γίνει materialize όλο το σύμπαν πρώτα).

 

Θα μπορούσες να το αποφύγεις αυτό με for_each, του στυλ

for_each(persons.begin(), persons.end(), [](const Person& p) { ela_o_epomenos(p.Name); });

αλλά πρώτον αυτό είναι άπειρα πιο άσχημο από

persons.Select(p => p.Name).ElaOEpomenos();

και δεύτερον πρέπει να έχεις κάτι να επιστρέψεις από την persons.end(). Το οποίο σημαίνει ότι αν η persons είναι κάτι από standard library θα είναι materialized οπότε δεν κερδίζεις και πολλά, αν όχι θα πρέπει να την έχεις γράψει μόνος σου.

 

 

 

Ίσως αργότερα κάποια στιγμή να κάτσω να γράψω ο,τι πιο κοντινό μου προκύπτει μόνο με standard library να δούμε τι θα βγει.

Μέχρι να λύσω το θέμα με τα Non-Local (αν λυθεί ποτέ...)

Αυτή είναι η λύση για High Order Function

H Compose δίνει αντικείμενο και το αντικείμενο έχει μια Val() που εκτελεί του "ορισμούς" που έχουν αποθηκευτεί σε δυο αλφαριθμητικά. Ακόμα και να φύγουμε από το σημείο που είναι οι F και Twice, δηλαδή να "επιστρέψουμε" το αντικείμενο, θα υπάρχουν οι συναρτήσεις "μέσα του".

 

Δηλαδή, δεν περνάμε function ως παράμετρο σε κάποιο function call (περνάμε αλφαριθμητικά) ούτε και επιστρέφουμε function από κάποιο function call (επιστρέφουμε ένα object που δεν είναι το ίδιο callable).

 

Βαφτίζεται ο δούλος του θεού higher order function.

 

In mathematics and computer science, a higher-order function (also functionalfunctional form or functor) is a function that does at least one of the following:

All other functions are first-order functions

 

 

Γαμάτο! Το ξέρατε ότι η PHP 4 που βγήκε 128 χρόνια πριν έχει higher order functions? Ορίστε:

$a = array("foo", "bar", "foobar");
$lengths = array_map("strlen", $a); // higher order function like a boss!

/facepalm

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 505
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Ετοιμάζω λάμδα γιο τη Μ2000...

Το παρακάτω τρέχει (δεν έχω ανεβάσει το κώδικα της Μ2000, γιατί έχει δουλειά ακόμα, Πρέπει να φτιάξω και το lambda$ για να φτιάχνω π.χ. ΒΒ$() επειδή στη Μ2000 η επιστροφή αλφαριθμητικού πρέπει να γίνει με όνομα που έχει το $,,,

 

 

 

BB=lambda A=lambda A=10 -> {
      =a*number
      a-- } , b -> {
                        b++
                        =A( b )*number
                        }
For i=1 to 10 {
      Print BB(i)
}


H BB είναι αντικείμενο και συνάρτηση μαζί!  Έχει δυο non local, δηλαδή δεν υπάρχουν έξω από το χώρο της lambda, αλλά δεν σβήνουν μετά την κλήση, παραμένουν μαζί!  Η ΒΒ έχει την Α μια άλλη λάμδα, και τη b. Κάθε φορά που καλούμε τη ΒΒ() αυτή αυξάνει το b και καλεί την δική της Α() η οποία ξεκινάει με τιμή 10 και κάθε φορά μειώνεται!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το έφτιαξα (παράλληλα έφτιαξα και το combobox, σαν dropdown list, σε επόμενη έκδοση θα το έχω και editable+autocomplete)

 

Έφτιαξα μια κλάση lambda, που κάνει όλη τη δουλειά. Δηλαδή κρατάει τις δικές του μεταβλητές. Δουλεύει για δυο ειδών συναρτήσεις, αριθμητικές και αλφαριθμητικές και μπορούν και οι δύο να γυρνούν την ίδια κλάση, αλλά νέο αντικείμενο. (δηλαδή επιστρέφουν συναρτήσεις)

Η σύνταξη είναι απλή. Μπορούμε σε μεταβλητές και πίνακες να βάζουμε lambda συναρτήσεις. Όταν βάζουμε lambda  σε μεταβλητή παράγεται και η συνάρτηση για να μπορεί και να κληθεί και να περαστεί με αναφορά. Όταν βάζουμε lambda σε πίνακα, τότε ο διερμηνευτής φτιάχνει αυτόματα τη συνάρτηση, είναι on demand δηλαδή. Αυτή η συνάρτηση είναι μια Call στο αντικείμενο (είναι αυτό που λέει ο Defecer Callable).

 

Πρόσθεσα τη φόρμα Α()() με διπλή παρένθεση, όπου η πρώτη είναι η θέση στο πίνακα (μπορεί να είναι μέχρι δέκα διαστάσεων, και οι δεύτερη μπορεί να έχει λίστα παραμέτρων.

Παρακάτω η Twice είναι νορμάλ συνάρτηση που γυρίζει lambda

Στο z παίρνει μια συνάρτηση lambda και μένει εκεί, δεν έχουμε δηλαδή αναφορά αλλά by value πέρασμα. (δεν έχουμε καθόλου δείκτες εδώ)

 

f=lambda ->number+3
L=Lambda -> number**2
Def Twice(z)=Lambda z ->z(z(number))
Dim G(10)
G(2)=Twice(f)
G(3)=Twice(L)
K=Twice(L)
Print Type$(G(2))
Print G(2)(7) \\13
Print G(2)(8) \\14
Print G(3)(3), K(3) \\ 81 , 81
Dim KL()
KL()=G() \\ copy array, produce new objects
Print KL(3)(2) \\ 16

 

 

Και εδώ παράδειγμα με αλφαριθμητικά!

Μια συνάρτηση που επιστρέφει έναν αριθμό στο σύστημα που θέλουμε. Απλά δίνουμε στην lambda το αλφαριθμητικό "εργασίας" και μετά είναι έτοιμη

Στο τέλος αντιγράφω τις τρεις συναρτήσεις (δεκαεξαδικό, οκταδικό και δυαδικό) σε ένα πίνακα.

 

Πραγματικά αν δεν συζητάγαμε εδώ το θέμα...δεν θα καταλάβαινα τι παίζει...Για την ώρα οι μεταβλητές non local δεν μπορούν να είναι πίνακες...αλλά και αυτό θα το ξεπεράσω!  (non local είναι η A1$, διότι αφενός δεν είναι global και αφετέρου παραμένει στη Lambda και μετά το τερματισμό της εκτέλεσης. Μοιάζει μεν με στατική, αλλά δεν είναι. Οι στατικές στη Μ2000 είναι κάτι άλλο, που δεν το αναπτύσσω εδώ..για να μην το χάσουν οι φίλοι εδώ..(ότι έμεινε δηλαδή)...  :-D

 

\\ Revision 199
Def A$(A1$)= lambda$ A1$ ->{
            Read X%
            Let B$="", L=Len(A1$)
            While X%<>0 {
                  B$=Mid$(A1$,X% mod L+1,1)+B$
                  X%/=L
            }
            =B$
}
Hx$=A$("0123456789ABCDEF")
Oct$=A$("01234567")
Bin$=A$("01")
M=256
Print Hx$(M) \\ 100
Print Oct$(M) \\400
Print Bin$(M) \\100000000
Dim A$(10)
Stack New {
      Data Hx$, Oct$, Bin$
      For I=0 to 2 : Read A$(I) : Next I
}
For I=0 to 2 {
      Print A$(I)(1000) \\ 3E8,  1750,  11111010000
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έφτιαξες lambda σε ένα διήμερο. Μάλιστα. Την επόμενη βδομάδα θα στήσεις parallel programming και σε κάνα μήνα θα φτιάξεις και βιβλιοθήκη για CUDA.

 

Εντωμεταξύ τίποτα από όλα αυτά που γράφεις δεν έχει σχέση με lambda αλλά εντάξει, εσύ ξέρεις καλύτερα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έχει ήδη η Μ2000 concurrent processing..με δικό  του Task Manager...


Θα μπορούσες βέβαια να πεις και έναν καλό λόγο που το έστησα σε ένα διήμερο!!!!

 

υπάρχει ο κώδικας εδώ! https://github.com/M2000Interpreter/Version8/

 

αυτές οι 138 γραμμές είναι η κλάση lambda

https://github.com/M2000Interpreter/Version8/blob/master/lambda.cls

αλλά υπάρχουν αρκετές αλλαγές, ακόμα και στη ρουτίνα που χρωματίζει, γιατί μπήκε το -> που δεν ήταν στο σχεδιασμό της Μ2000.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βρε παιδιά να σας ρωτήσω κάτι.

Ξεκίνησα να μαθαίνω για τους πίνακες.

 

Έμαθα λοιπόν πως να φτιάξω ένα νέο πίνακα:

int[] Akeraioi = new int[10];

Πως να ορίσω τιμές σε κάθε στοιχείο ξεχωριστά:

akearioi[0] = 10;

Πως να κάνω αρχικοποίηση ενός πίνακα:

int[] Akeraioi = int[] {32,10,0,600,5};

Πως να δημιουργώ πίνακα n διαστάσεων:

string[] Onomata = new string[5,10];

Πως να ορίζω τιμές μια προς μια σε πολυδιάστατο πίνακα:

Onomata[2,0] = "Deadpool";

Αλλά η αρχικοποίηση πολυδιάστατου πίνακα κάπου με μπερδεύει.

Ο τύπος είναι αυτός:

string[,] Onomata = {
 {"Deadpool", "Superman", "Spiderman"}
 {"Catwoman", "Batman", "Venom"}
};

Μέσα δηλαδή στα γενικά άγκιστρα του πίνακα, φτιάχνουμε υπό-μπλοκ με μικρότερα άγκιστρα, και σε αυτό τις τιμές των μεταβλητών μας χωρισμένες με κόμματα. Για κάθε τιμή, δεν ορίζουμε τις συντεταγμένες της οι ίδιοι, άρα το κάνει η C# στα κρυφά. Και αυτό είναι που μου δημιουργεί την απορία. Το πως το κάνει αυτό.

 

Α) Διότι αν το κάθε υπό-μπλοκ αντιπροσωπεύει διαφορετική διάσταση, τότε η τιμή στο πρώτο κόμβο [0] πχ του 'ύψους', δεν θα έρθει σε διένεξη με τη πρώτη τιμή πχ του πλάτους, στη τοποθεσία 0,0 ?

 

Για χάρη παραδείγματος να καταλάβετε τι εννοώ ας υποθέσουμε πως έχουμε ένα πίνακα [7,5] όπως σε αυτή την εικόνα:

 

labview_0143.jpg

 

 

 

Δεδομένου ότι στο παράδειγμα κώδικα που έδωσα παραπάνω θέτω ως πρώτη τιμή της σειράς τη "Deadpool", η Deadpool θα μπει στη θέση [0,0]

 

Στο υπό-μπλοκ της δεύτερης διάστασης όμως, στη πρώτη τιμή [0] έδωσα "Catwoman."

 

Αφού όμως η 0 της σειράς και η 0 της στήλης συμπίπτουν, τελικά στη θέση 0,0 τι θα υπάρχει ?

Ο Deadpool ή η Catwoman ?

 

Β) Έλα όμως ντε που αφού αρχικοποίησα έναν πίνακα 2Δ, και έβαλα τη foreach να μου τυπώσει κάθε τιμή στη κονσόλα, όλες οι τιμές εμφανίστηκαν, χωρίς να χαθεί καμία. Που σημαίνει πως ο πρώτος κόμβος του μήκους που κάνει στα κρυφά ανάθεση, και ο πρώτος κόμβος του ύψους στον οποίο αναθέτει στα κρυφά, δεν είναι ο ίδιος. Πως γίνεται όμως αυτό ? Όταν κάνεις αρχικοποίηση και δεν δηλώνεις ο ίδιος τις συντεταγμένες, δεν ξεκινά τοποθετώντας για τη κάθε διάσταση τη πρώτη τιμή που θα δώσεις στο κόμβο [0] αυτής της διάστασης ? Από ποιο κόμβο ξεκινάει ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εάν μιλάς για γλώσσα που έχει και vectors/vectror like containers, τότε ο array (i.e. [ ] ) εξυπηρετεί κάτι πολύ συγκεκριμένο. Θα σου πρότεινα να ψάξεις για array vs vector για την γλώσσα που θες (αν και για όλες το ίδιο ισχύει). 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βασικά έκανα το εξής τεστ:

string[,] names = { 
  { "Deadpool", "Superman", "Spiderman" }, 
  { "Catwoman", "Batman", "Venom" } 
};

            for (int index0 = 0; index0 < names.GetLength(0); index0++)
            {
                for (int index1 = 0; index1 < names.GetLength(1); index1++)
                {
                    var name = names[index0, index1];
                    Console.WriteLine("{0} is at position [{1},{2}].",name,index0,index1);
                }
            }

Και τελικά αποδείχθηκε πως μόνο στη πρώτη διάσταση ξεκινά από το στοιχείο 0.

Στη δεύτερη διάσταση προσπερνά το 0 και ξεκινά από το 1.

 

Που σημαίνει πως ο Deadpool μπήκε στο [0,0] και η Catwoman στο [1,0].

 

Εν το μεταξύ και το βιβλίο και το MSDN αναφέρουν πως στην αρχικοποίηση το πρώτο στοιχείο είναι το 0,σκέτο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μήπως δεν θες να καταλάβεις;

Δεν σκέφτεσαι με διαστάσεις ως να είναι "χωράφια". Μπορείς να έχεις δέκα διαστάσεις με ένα στοιχείο. Που σημαίνει με τη δική σου λογική είναι ταυτόχρονα σε όλες τις διαστάσεις..

Ενώ οι διαστάσεις απλά μπαίνουν σε τύπο και βγάζουν την θέση σε έναν μονοδιάστατο πίνακα..(η μνήμη στον υπολογιστή μας είναι ΜΟΝΟΔΙΑΣΤΑΤΗ)...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αλλά η αρχικοποίηση πολυδιάστατου πίνακα κάπου με μπερδεύει.

Ο τύπος είναι αυτός:

string[,] Onomata = {
 {"Deadpool", "Superman", "Spiderman"}
 {"Catwoman", "Batman", "Venom"}
};

Μέσα δηλαδή στα γενικά άγκιστρα του πίνακα, φτιάχνουμε υπό-μπλοκ με μικρότερα άγκιστρα, και σε αυτό τις τιμές των μεταβλητών μας χωρισμένες με κόμματα. Για κάθε τιμή, δεν ορίζουμε τις συντεταγμένες της οι ίδιοι, άρα το κάνει η C# στα κρυφά. Και αυτό είναι που μου δημιουργεί την απορία. Το πως το κάνει αυτό.

 

Α) Διότι αν το κάθε υπό-μπλοκ αντιπροσωπεύει διαφορετική διάσταση, τότε η τιμή στο πρώτο κόμβο [0] πχ του 'ύψους', δεν θα έρθει σε διένεξη με τη πρώτη τιμή πχ του πλάτους, στη τοποθεσία 0,0 ?

 

Δεδομένου ότι στο παράδειγμα κώδικα που έδωσα παραπάνω θέτω ως πρώτη τιμή της σειράς τη "Deadpool", η Deadpool θα μπει στη θέση [0,0]

 

Στο υπό-μπλοκ της δεύτερης διάστασης όμως, στη πρώτη τιμή [0] έδωσα "Catwoman."

 

Αφού όμως η 0 της σειράς και η 0 της στήλης συμπίπτουν, τελικά στη θέση 0,0 τι θα υπάρχει ?

Ο Deadpool ή η Catwoman ?

 

Β) Έλα όμως ντε που αφού αρχικοποίησα έναν πίνακα 2Δ, και έβαλα τη foreach να μου τυπώσει κάθε τιμή στη κονσόλα, όλες οι τιμές εμφανίστηκαν, χωρίς να χαθεί καμία. Που σημαίνει πως ο πρώτος κόμβος του μήκους που κάνει στα κρυφά ανάθεση, και ο πρώτος κόμβος του ύψους στον οποίο αναθέτει στα κρυφά, δεν είναι ο ίδιος. Πως γίνεται όμως αυτό ? Όταν κάνεις αρχικοποίηση και δεν δηλώνεις ο ίδιος τις συντεταγμένες, δεν ξεκινά τοποθετώντας για τη κάθε διάσταση τη πρώτη τιμή που θα δώσεις στο κόμβο [0] αυτής της διάστασης ? Από ποιο κόμβο ξεκινάει ?

 

Λοιπόν, κατ' αρχήν το πρώτο πρώτο πράγμα που πρέπει να κάνεις είναι να δεις και να καταλάβεις τη διαφορά ανάμεσα σε multidimensional arrays (αυτό που έχεις εδώ) και jagged arrays, που είναι τελείως άλλο πράγμα.

 

Multidimensional:

string[,] a = new[,] // pay attention to the type, θα μπορούσα να βάλω var αλλά το έγραψα επίτηδες
{
    {"foo"},  // δεν επιτρέπεται να βάλεις 2 strings εδώ και 1 κάτω ή το αντίθετο!
    {"bar"},
}

var s = a[0, 0]; // όλα τα indexes πρέπει να είναι γνωστά εδώ, δεν έχει "δόσεις"

Δημιούργησα 2x1 πίνακα από strings. Για να προσπελάσω ένα από αυτά πρέπει να δώσω index για όλες τις διαστάσεις του πίνακα. Συνολικός αριθμός objects που δημιουργήθηκαν: 3 (πίνακας + 2 strings).

 

Jagged:

string[][] b = new[] // pay attention to the type, θα μπορούσα να βάλω var αλλά το έγραψα επίτηδες
{
    new[] { "foo" }, // εδώ χρειάζονται new[]
    new[] { "bar", "baz" }, // εδώ αντίθετα δεν υπάρχει κανένα θέμα
};

var s = b[1][2]; // προφανώς εδώ έχει δόσεις

Δημιούργησα 2x1 πίνακα από πίνακες από strings. Για την προσπέλαση δίνω σε δόσεις το index κάθε "επιπέδου". Συνολικός αριθμός objects που δημιουργήθηκαν: 6 (1 το b, 2 τα b[0] και b[1], + 3 strings). Να σημειώσω ότι η γλώσσα επίτηδες σε αναγκάζει να γράψεις new[] ή new string[] σε κάθε γραμμή, πράγμα που κάνει φανερό το πόσα αντικείμενα δημιουργούνται.

 

Τώρα όσον αφορά αυτά που λες (αναφερόμενος σε multidimensional).

 

Τα μπλοκ δεν αντιπροσωπεύουν διαστάσεις, αντιπροσωπεύουν γραμμές. Άρα δεν υπάρχει μπέρδεμα τελικά; Προφανώς ο Deadpool πάει στο 0,0 γιατί είναι πρώτος στην πρώτη γραμμή και η Catwoman στο 1,0 γιατί είναι πρώτη στη δεύτερη γραμμή.

 

Υποθέτω αυτό απαντάει στις ερωτήσεις σου; Ακόμα κι αν δεν απάντησα, το σίγουρο είναι ότι δεν έχεις το σωστό μοντέλο για το πώς λειτουργεί στο μυαλό σου και γι' αυτό μπερδεύεσαι. Αν έχεις το σωστό μοντέλο είναι τελείως φυσικό αυτό που συμβαίνει.

 

Εγώ θα δώσω κάτι από το κώδικα της Μ2000 (σε Vb6) (και σε όποιον αρέσει)

 

Τι θα έλεγες να σταματήσεις το spamming ή να πάρεις πόδι από το thread, κάτι που σίγουρα θα αρέσει σε όλους όσους το παρακολουθούν;

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπόν, κατ' αρχήν το πρώτο πρώτο πράγμα που πρέπει να κάνεις είναι να δεις και να καταλάβεις τη διαφορά ανάμεσα σε multidimensional arrays (αυτό που έχεις εδώ) και jagged arrays, που είναι τελείως άλλο πράγμα.

 

Multidimensional:

string[,] a = new[,] // pay attention to the type, θα μπορούσα να βάλω var αλλά το έγραψα επίτηδες
{
    {"foo"},  // δεν επιτρέπεται να βάλεις 2 strings εδώ και 1 κάτω ή το αντίθετο!
    {"bar"},
}

var s = a[0, 0]; // όλα τα indexes πρέπει να είναι γνωστά εδώ, δεν έχει "δόσεις"

Δημιούργησα 2x1 πίνακα από strings. Για να προσπελάσω ένα από αυτά πρέπει να δώσω index για όλες τις διαστάσεις του πίνακα. Συνολικός αριθμός objects που δημιουργήθηκαν: 3 (πίνακας + 2 strings).

 

Jagged:

string[][] b = new[] // pay attention to the type, θα μπορούσα να βάλω var αλλά το έγραψα επίτηδες
{
    new[] { "foo" }, // εδώ χρειάζονται new[]
    new[] { "bar", "baz" }, // εδώ αντίθετα δεν υπάρχει κανένα θέμα
};

var s = b[1][2]; // προφανώς εδώ έχει δόσεις

Δημιούργησα 2x1 πίνακα από πίνακες από strings. Για την προσπέλαση δίνω σε δόσεις το index κάθε "επιπέδου". Συνολικός αριθμός objects που δημιουργήθηκαν: 6 (1 το b, 2 τα b[0] και b[1], + 3 strings). Να σημειώσω ότι η γλώσσα επίτηδες σε αναγκάζει να γράψεις new[] ή new string[] σε κάθε γραμμή, πράγμα που κάνει φανερό το πόσα αντικείμενα δημιουργούνται.

 

Τώρα όσον αφορά αυτά που λες (αναφερόμενος σε multidimensional).

 

Τα μπλοκ δεν αντιπροσωπεύουν διαστάσεις, αντιπροσωπεύουν γραμμές. Άρα δεν υπάρχει μπέρδεμα τελικά; Προφανώς ο Deadpool πάει στο 0,0 γιατί είναι πρώτος στην πρώτη γραμμή και η Catwoman στο 1,0 γιατί είναι πρώτη στη δεύτερη γραμμή.

 

Υποθέτω αυτό απαντάει στις ερωτήσεις σου; Ακόμα κι αν δεν απάντησα, το σίγουρο είναι ότι δεν έχεις το σωστό μοντέλο για το πώς λειτουργεί στο μυαλό σου και γι' αυτό μπερδεύεσαι. Αν έχεις το σωστό μοντέλο είναι τελείως φυσικό αυτό που συμβαίνει.

 

Α γραμμές αντιπροσωπεύουν ? Είπα και εγώ...

Αρχικά νόμιζα ότι αντιπροσωπεύουν τις διαστάσεις, και πως θα ισχύει ότι και για συντεταγμένες στο καρτεσιανό επίπεδο.

 

Αφού όμως αντιπροσωπεύουν σειρές, τότε άμα γράψω

string[] name = {
  {"Tyropita", "Zamponotyropita", "Peinirli"},
  {"Buwacha","Galatopita","Piroski"},
  {"Spanakopita","Kreatopita","Croissant"},
};

Τότε θα έχω πάλι ένα πίνακα 2 διαστάσεων, 3Χ3.

Πως θα κάνω όμως αρχικοποίηση 3 διαστάσεων ? 

 

 

Υ.Γ. Άρα στην var s = b[1][2], στο jagged array η τιμή θα είναι η "baz", σωστά ?

Μήπως δεν θες να καταλάβεις;

Δεν σκέφτεσαι με διαστάσεις ως να είναι "χωράφια". Μπορείς να έχεις δέκα διαστάσεις με ένα στοιχείο. Που σημαίνει με τη δική σου λογική είναι ταυτόχρονα σε όλες τις διαστάσεις..

Ενώ οι διαστάσεις απλά μπαίνουν σε τύπο και βγάζουν την θέση σε έναν μονοδιάστατο πίνακα..(η μνήμη στον υπολογιστή μας είναι ΜΟΝΟΔΙΑΣΤΑΤΗ)...

 

Κάτσε. Εξήγησε μου λίγο τι έννοια έχει ο όρος 'διάσταση' στη πληροφορική, γιατί στη φυσική σημαίνει κάτι άλλο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τότε θα έχω πάλι ένα πίνακα 2 διαστάσεων, 3Χ3.

Πως θα κάνω όμως αρχικοποίηση 3 διαστάσεων ? 

 

Ναι. Αρχικοποίηση 3 διαστάσεων:

var ThreeD = new[,,]
{
    {
        { "a", "b", "c" },
        { "d", "e", "f" },
    },
    {
        { "g", "h", "i" },
        { "j", "k", "l" },
    },
};


Console.WriteLine(ThreeD[0, 1, 2]);

Προφανώς το γραμμές και στήλες είναι βολικό αλλά ισχύει μόνο στη 2d περίπτωση. Για πάνω από 2d η συμβουλή μου είναι απλά να το βλέπεις αφηρημένα ("η πρώτη διάσταση, η δεύτερη διάσταση, η τρίτη διάσταση" κλπ). Μ' αυτή την προσέγγιση δεν είχα θέμα να δουλεύω με 6-7-8 διαστάσεις back in the day όταν δεν καταλάβαινα ακόμα πως αν έχεις πίνακα με 8 διαστάσεις κάτι πηγαίνει ήδη πάρα πολύ λάθος.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Alithinos, οι διαστάσεις τις φυσικής είναι άσχετες. Εγώ προσπάθησα με απλό τρόπο να σου δώσω να καταλάβεις πως οι διαστάσεις γίνονται ΜΙΑ. Από κει και πέρα αν θες να έχεις πίνακα με κρόσσια..άλλο κοντό και άλλο μακρύ...δικό σου θέμα. 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...