gademis
Τιμώμενο Μέλος
Ο Δημήτρης αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 46 ετών και επαγγέλεται Η.Μ.Μ.Υ.. Έχει γράψει 1,634 μηνύματα.
08-08-06
10:56
Η θεση μνημης ειναι το τηλέφωνο του λιακοπουλου που πρέπει να παρεις για παρεις τα βιβλια του.. σε αυτη την εκπομπή ηταν το reference.
Την υποψία μου οτι μπορει να μην εχεις δει Λιακοπουλο την προσπερναω.. δεν υπαρχει περιπτωση.
Την υποψία μου οτι μπορει να μην εχεις δει Λιακοπουλο την προσπερναω.. δεν υπαρχει περιπτωση.
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
gademis
Τιμώμενο Μέλος
Ο Δημήτρης αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 46 ετών και επαγγέλεται Η.Μ.Μ.Υ.. Έχει γράψει 1,634 μηνύματα.
30-06-06
14:09
Εχεις ενα προγραμμα που κανειΑρχική Δημοσίευση από Demelene:Μπορείς να γίνεις πιο συγκεκριμένος?
int A;
if (A==7) printf("Lalala");
else A=7;
Το κανεις compile και το pc παει και αντιστοιχει την Α στη θεση μνήμης 0x2310521010, που αρχικα τυχαινει και εχει μεσα 42.
Τρέχεις μια φορα το πρόγραμμα, κανει Α=7 αυτο.
Τη δευτερη φορα, η θέση μνήμης μπορεί να έχει παραμείνει με την τιμή 7 μεσα, οποτε θα σου γράψει Lalala.
Σε C και επι dos που δεν εχει virtual address spaces ολα αυτα. Ευτυχως τα συγκρονα λειτουργικα και γλώσσες μας εχουν γλυτώσει απο αυτο το αναθεμα. Σκευτειτε να ξεχνάτε να αρχικοποιείτε τις μεταβλητες και αυτες να έχουν τις σωστές τιμες απο προηγούμενο run ποσο δυσκολευει το debugging.
PS: Οποιος βρει σε ποια εκπομπή κανω reference στο post αυτο κερδιζει
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
gademis
Τιμώμενο Μέλος
Ο Δημήτρης αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 46 ετών και επαγγέλεται Η.Μ.Μ.Υ.. Έχει γράψει 1,634 μηνύματα.
29-06-06
17:14
Σχετικα με το τι γινεται με τη μνημη που δεν εχεις δωσει τιμη.
Αναλογα με ποια C εχεις στη C εχει η τα προηγούμενα που ειχε η μεταβλητη που ηταν σε αυτη την περιοχή της μνημης, η μια ασχετη τιμη. Στις αλλες γλώσσες εχει μια συγκεκριμένη άσχετη τιμή που ειναι ορισμένη σαν NULL (η κατι αναλογο), για να μπορεις να πεις πραγματα του τυπου if (A==NULL) και να ελεγχεις αν εχει αρχικοποιηθει κατι. Στις συγχρονες γλώσσες θα σου βγαλει τουλαχιστον ενα warning αν πας να κανεις πράξη με τετοια μεταβλητη.
Αναλογα με ποια C εχεις στη C εχει η τα προηγούμενα που ειχε η μεταβλητη που ηταν σε αυτη την περιοχή της μνημης, η μια ασχετη τιμη. Στις αλλες γλώσσες εχει μια συγκεκριμένη άσχετη τιμή που ειναι ορισμένη σαν NULL (η κατι αναλογο), για να μπορεις να πεις πραγματα του τυπου if (A==NULL) και να ελεγχεις αν εχει αρχικοποιηθει κατι. Στις συγχρονες γλώσσες θα σου βγαλει τουλαχιστον ενα warning αν πας να κανεις πράξη με τετοια μεταβλητη.
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
gademis
Τιμώμενο Μέλος
Ο Δημήτρης αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 46 ετών και επαγγέλεται Η.Μ.Μ.Υ.. Έχει γράψει 1,634 μηνύματα.
29-06-06
17:10
Γενικά σε κάλυψαν οι περισσότεροι. Τα πρόβληματα που αναφέρεις διαφέρουν πολύ πως λύνονται απο υλοποιηση σε υλοποιηση, και γενικα ειναι απο αυτα που (οταν προγραμματιζεις) πρέπει να θεωρήσεις οτι παίζουν και να μή σε νοιαζει πώς. Οι πιο σύγχρονες γλώσσες προγραμματισμού σου δίνουν όλο και περισσότερο αυτή τη δυνατότητα, στη C πχ έρπεπε να γνωρίζεις πως γίνονται τετοια πράγματα σε πολυ μεγαλύτερο βαθμό απο τις πιό σύγχρονες γλώσσες. Αλλά αφου θες να μάθεις εγκυκλοπαιδικά τι γίνεται.. οκ. Μιλαμε πάντα για στατικές μεταβλητες (που ξέρεις απο την αρχή του προγράμματος οτι υπάρχουν) γιατι υπάρχει και αυτο που λέμε δυναμική παραχώρηση μνήμης (οπου δεν ξερεις απο πριν πόσο θα χρειαστεις, αν ενδιαφερεσαι και γι αυτο πες μου να συνεχισω στο επομενο ποστ).
Για το πως αναπαριστούνται οι μεταβλητές στη μνήμη
Στη C: Κατα το compilation δημιουργείται ο πίνακας που λές* (symbol table λεγεται) και το εκτελεσιμο αρχείο έχει κατ ευθείαν τις διευθύνσεις. Ο compiler φροντίζει ξεροντας το μέγεθος του κάθε τύπου να βαλει τις διευθύνσεις έτσι ωστε να είναι "ξεχωριστα" η μνημη καθε μεταβλητής. Για πίνακες γινεται το ίδιο αλλα με πολλαπλάσιο χώρ, δηλαδη ενα int[10] "δεσμεύει" 10 φορες παραπανω χωρο απο ενα int. Βαζω εισαγωγικα στο δεσμευει γιατι δεν σε εμποδιζει κανενας απο το να πας να γραψεις πανω στο χώρο μιας άλλης μεταβλητης, αμα πας να προσπελάσεις το 11ο στοιχιο του πίνακα με 10 στοιχία 99% θα σου βγαλει οχι λαθος αλλα την τιμή της επομενης μεταβλητης που εχεις ορισει. Αυτο το αισχος έχει ευτυχώς διορθωθεί στις πιο μοντερνες γλώσσες.
*Το symbol table δεν εχει μονο τις δικές σου μεταβλητες αλλα πολλές αλλες. Σκέψου οτι αν εχεις το A<=B+(C+D) ο compiler δημιουργει μια μεταβλητη με ονομα ενα ακαταλαβιστικο Ζ7HRFKLHR για να αποθηκευσει μεσα το αποτελεσμα του (C+D) γιατι μπορει να κανει μονο προσθεση 2 αριθμών τη φορα. Μετα προσθέτει το Β στο Ζ7HRFKLHR και θετει στο Α το αποτελεσμα.
Στις "interpreted" γλωσσες (javascript, Perl, PHP και πολλες αλλες):
Εκει δεν γινεται compilation οποτε το symbol table υπάρχει μονίμως. Εχει μεσα απο τη μια το ονομα και απο την αλλη τη διευθυνση της αρχής της μεταβλητης (επίσης κραταει και τον τυπο σε μια 3η στηλη για να ξερει το μεγεθος) Ολες οι μεταβλητές ειναι δυναμικές γιατι μπορείς να προσθέσεις και να αφαιρέσεις δυναμικά μεταβλητες στις περισσότερες απο αυτές τις γλώσσες.
Java / .NET
Εκει έχεις μεν καπου στατικα ορισμένες τις στατικές μεταβλητές αλλα το virtual machine δε σε αφήνει να προσπελάσεις τη μνήμη τους παρα μονο μεσα απο τις μεταβλητες αυτές. Αυτό έχει πολλά πλεονεκτήματα εκτώς του οτι οταν βγεις απο το array καταλαθος καταλαβαινεις οτι εκανες λαθος γλυτώνοντας σε απο 3 μερες debugging μεχρι να βρεις γιατι σε μισει τοσο το pc σου. Σε αφήνει να κανεις πολλά ωραία πράγματα του τύπου "στειλε την ταδε ρουτίνα στον αλλο επεξεργαστή για εκτελεση" η "κανε recompile το πρόγραμμα την ώρα που τρέχει χρησιμοποιόντας στατιστικα απο το μεχρι τώρα τρέξιμο του για να το κανεις να πηγαινει πιο γρηγορα".
Assembly:
Γραφεις κατ ευθειαν στη μνήμη. Αμα θες κανεις και φλωριες τυπου define ARRAY1 0x00FF και απο τοτε και στο εξής μπορεις να γραφεις ARRAY1 αντι για 0x00FF. Αμα πας και γραψεις πανω στη αλλη μεταβλητη σου προβλημα σου
Για το πως αναπαριστούνται οι μεταβλητές στη μνήμη
Στη C: Κατα το compilation δημιουργείται ο πίνακας που λές* (symbol table λεγεται) και το εκτελεσιμο αρχείο έχει κατ ευθείαν τις διευθύνσεις. Ο compiler φροντίζει ξεροντας το μέγεθος του κάθε τύπου να βαλει τις διευθύνσεις έτσι ωστε να είναι "ξεχωριστα" η μνημη καθε μεταβλητής. Για πίνακες γινεται το ίδιο αλλα με πολλαπλάσιο χώρ, δηλαδη ενα int[10] "δεσμεύει" 10 φορες παραπανω χωρο απο ενα int. Βαζω εισαγωγικα στο δεσμευει γιατι δεν σε εμποδιζει κανενας απο το να πας να γραψεις πανω στο χώρο μιας άλλης μεταβλητης, αμα πας να προσπελάσεις το 11ο στοιχιο του πίνακα με 10 στοιχία 99% θα σου βγαλει οχι λαθος αλλα την τιμή της επομενης μεταβλητης που εχεις ορισει. Αυτο το αισχος έχει ευτυχώς διορθωθεί στις πιο μοντερνες γλώσσες.
*Το symbol table δεν εχει μονο τις δικές σου μεταβλητες αλλα πολλές αλλες. Σκέψου οτι αν εχεις το A<=B+(C+D) ο compiler δημιουργει μια μεταβλητη με ονομα ενα ακαταλαβιστικο Ζ7HRFKLHR για να αποθηκευσει μεσα το αποτελεσμα του (C+D) γιατι μπορει να κανει μονο προσθεση 2 αριθμών τη φορα. Μετα προσθέτει το Β στο Ζ7HRFKLHR και θετει στο Α το αποτελεσμα.
Στις "interpreted" γλωσσες (javascript, Perl, PHP και πολλες αλλες):
Εκει δεν γινεται compilation οποτε το symbol table υπάρχει μονίμως. Εχει μεσα απο τη μια το ονομα και απο την αλλη τη διευθυνση της αρχής της μεταβλητης (επίσης κραταει και τον τυπο σε μια 3η στηλη για να ξερει το μεγεθος) Ολες οι μεταβλητές ειναι δυναμικές γιατι μπορείς να προσθέσεις και να αφαιρέσεις δυναμικά μεταβλητες στις περισσότερες απο αυτές τις γλώσσες.
Java / .NET
Εκει έχεις μεν καπου στατικα ορισμένες τις στατικές μεταβλητές αλλα το virtual machine δε σε αφήνει να προσπελάσεις τη μνήμη τους παρα μονο μεσα απο τις μεταβλητες αυτές. Αυτό έχει πολλά πλεονεκτήματα εκτώς του οτι οταν βγεις απο το array καταλαθος καταλαβαινεις οτι εκανες λαθος γλυτώνοντας σε απο 3 μερες debugging μεχρι να βρεις γιατι σε μισει τοσο το pc σου. Σε αφήνει να κανεις πολλά ωραία πράγματα του τύπου "στειλε την ταδε ρουτίνα στον αλλο επεξεργαστή για εκτελεση" η "κανε recompile το πρόγραμμα την ώρα που τρέχει χρησιμοποιόντας στατιστικα απο το μεχρι τώρα τρέξιμο του για να το κανεις να πηγαινει πιο γρηγορα".
Assembly:
Γραφεις κατ ευθειαν στη μνήμη. Αμα θες κανεις και φλωριες τυπου define ARRAY1 0x00FF και απο τοτε και στο εξής μπορεις να γραφεις ARRAY1 αντι για 0x00FF. Αμα πας και γραψεις πανω στη αλλη μεταβλητη σου προβλημα σου
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.