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

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

Δημοσ.

Δε θα το'λεγα. Δεικτης ειναι μια μεταβλητη που εχει μια virtual address που δειχνει καπου.

Τι εννοείς "ο δείκτης είναι μια μεταβλητή που έχει virtual address". Καθόλου virtual δεν είναι η διεύθυνση των δεικτών. Καρά-logical address είναι όπως είναι οι διευθύνσεις οποιασδήποτε άλλης μεταβλητής. Μια απλή μεταβλητή είναι και ο δείκτης, με διεύθυνση και περιεχόμενο. Απλώς το περιεχόμενό του είναι διεύθυνση κάποιας άλλης μεταβλητής.

 

Ο πινακας ειναι ενα "lable" (constant) που ουσιαστικα ειναι ενα offset που προσδιοριζει που βρισκεται ο πινκας σχετικα με την αρχη της stack.

εφοσον εχουμε

address = ebp - pin

δεν μπορουμε να πουμε οτι ο pin ειναι δεικτης

Το που βρίσκεται ο πίνακας (σε ποια δηλαδή διεύθυνση μνήμης ξεκινάει) αναγράφεται μέσα στο περιεχόμενο του δείκτη του 1ου στοιχείου του. Το σε ποια physical address αντιστοιχεί η logical address του δείκτη καθώς και η logical address που περιέχει εξαρτάται από την πλατφόρμα.

 

Συνήθως οι logical addresses απαρτίζονται από το segment id + offset (π.χ. far & huge pointers) αλλά μπορεί να απαρτίζονται μονάχα από το offset σε πλατφόρμες με ένα μόνο segment (near pointers). Εξαρτάται από το memory-model που χρησιμοποιεί η πλατφόρμα ή επιλέγει ο προγραμματιστής.

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

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

Δημοσ.

Οι πίνακες είναι δείκτες στο 1ο στοιχείο τους, αλλά με τον περιορισμό ότι δεν μπορούν να χρησιμοποιηθούν ως LVALUES. Σε αυτή τη φράση συνοψίζεται η ουσία.

 

Αν το δεις μακροσκοπικά-πρακτικά, η διατύπωσή σου είναι σωστή. Και ένας όμως που λέει ότι "οι πίνακες συμπεριφέρονται σαν δείκτες" πρακτικά σωστός είναι και αυτός. Εκεί που κολάνε οι περισσότερες διατυπώσεις είναι στην θεωρία. Για αυτό είπα ότι είναι δύσκολο να το περιγράψεις πολιτικώς ορθά και ότι θα το διατυπώσω και εγώ λάθος. Αν το δούμε τυπικά, όχι οι πίνακες _δεν_ είναι δείκτες στο 1ο στοιχείο τους και μια πιο σωστή περιγραφή είναι η παρακάτω του Παπί.

 

Δε θα το'λεγα. Δεικτης ειναι μια μεταβλητη που εχει μια virtual address που δειχνει καπου. Ο πινακας ειναι ενα "lable" (constant) που ουσιαστικα ειναι ενα offset που προσδιοριζει που βρισκεται ο πινκας σχετικα με την αρχη της stack.

εφοσον εχουμε

address = ebp - pin

δεν μπορουμε να πουμε οτι ο pin ειναι δεικτης

 

Τι εννοείς "ο δείκτης είναι μια μεταβλητή που έχει virtual address". Καθόλου virtual δεν είναι η διεύθυνση των δεικτών. Καρά-logical address είναι όπως είναι οι διευθύνσεις οποιασδήποτε άλλης μεταβλητής. Μια απλή μεταβλητή είναι και ο δείκτης, με διεύθυνση και περιεχόμενο. Απλώς το περιεχόμενό του είναι διεύθυνση κάποιας άλλης μεταβλητής.

 

Το που βρίσκεται ο πίνακας (σε ποια δηλαδή διεύθυνση μνήμης ξεκινάει) αναγράφεται μέσα στο περιεχόμενο του δείκτη του 1ου στοιχείου του. Το σε ποια physical address αντιστοιχεί η logical address του δείκτη καθώς και η logical address που περιέχει εξαρτάται από την πλατφόρμα.

 

Συνήθως οι logical addresses απαρτίζονται από το segment id + offset (π.χ. far & huge pointers) αλλά μπορεί να απαρτίζονται μονάχα από το offset σε πλατφόρμες με ένα μόνο segment (near pointers). Εξαρτάται από το memory-model που χρησιμοποιεί η πλατφόρμα ή επιλέγει ο προγραμματιστής.

 

>
#include <stdio.h>

int main(void)
{
int a[5];
int *p = &a[1];

scanf("%d%d", &a[0], p);

printf("a = %d\n", a[0]);
printf("p = %d\n", *p);

return 0;
}

Δες το παραπάνω πρόγραμμα. Ουσιαστικά ένα χαζό πρόγραμμα που τυπώνει ένα αριθμό με τη χρήση πίνακα και τη χρήση δείκτη. Την scanf την έβαλα απλά για να παραχθεί κανονικός κώδικας γιατί αν χρησιμοποιούσα σταθερές, το πιο πιθανό ήταν να βελτιστοποιήσει τον κώδικα ο compiler. Δες τι προκύπτει:

>
main:
blah blah
mov	eax, DWORD PTR [esp+24]     <-- προσπέλαση του πίνακα.

mov	eax, DWORD PTR [esp+44]   \ προσπέλαση του δείκτη
mov	eax, DWORD PTR [eax]      /

 

Όπως βλέπεις, εκεί που χρησιμοποιώ τον a απλά μπαίνει μια γνωστή διεύθυνση. Το a είναι ένα "label" σε αυτή την διεύθυνση όπως είπε ο Παπί και είναι από πριν γνωστό. Δηλαδή το "a" είναι μια εύκολη ονομασία πχ της διεύθυνσης 50. Δεν αναγράφεται η διεύθυνση στο 1ο στοιχείο του όπως είπες. Στην περίπτωση του δείκτη, είναι μεν γνωστή από πριν η διεύθυνσή του αλλά πρέπει να διαβαστεί για να πάρουμε την "τιμή" δηλαδή την διεύθυνση. Ουσιαστικά αυτό που δείχνω τώρα είναι το ίδιο με το ascii art που έδειξα στο προηγούμενο μήνυμα.

Δημοσ.

Ναι αλλά παραβλέπεις την ουσία, που είναι το platform/memory-model dependency που ανάφερα. Ανάλογα την πλατφόρμα και το memory model, οι δείκτες μπορούν να περιέχουν ακόμα και physical addresses. Η assembly που δίνεις είναι προφανώς platform specific, όπως και το σχόλιο του παπι.

 

Δεν θα σας κουράσω με κατεβατά, απλά θα δώσω 2 links:

 

http://www.cyberplus...es-of-pointers/

http://www.keil.com/..._ptrmemtype.htm

 

Θα βρείτε κάμποσο αντίστοιχο υλικό αν ψαχτείτε (και στο νετ και παντού).

Δημοσ.

Ναι αλλά παραβλέπεις την ουσία, που είναι το platform/memory-model dependency που ανάφερα. Ανάλογα την πλατφόρμα και το memory model, οι δείκτες μπορούν να περιέχουν ακόμα και physical addresses. Η assembly που δίνεις είναι προφανώς platform specific, όπως και το σχόλιο του παπι.

 

Δεν θα σας κουράσω με κατεβατά, απλά θα δώσω 2 links:

 

http://www.cyberplus...es-of-pointers/

http://www.keil.com/..._ptrmemtype.htm

 

Θα βρείτε κάμποσο αντίστοιχο υλικό αν ψαχτείτε (και στο νετ και παντού).

 

Οι δείκτες ας περιέχουν ό,τι θέλουν. Τι σχέση έχουν τα physical addresses και το memory model με αυτό που συζητάμε ? Τα links που έδωσες μιλάνε για segmented αρχιτεκτονική και near/far δείκτες. Εμείς δεν μιλήσαμε για το πόσα bytes είναι οι pointers αλλά για την διαφορά μεταξύ πίνακα και δείκτη και ότι το όνομα ενός πίνακα είναι ουσιαστικά μια ετικέτα σε μια διεύθυνση (σκέψου ότι όπως το google.com είναι ένα εύκολο όνομα για την προσπέλαση μιας IP έτσι και το όνομα του πίνακα είναι μια εύκολη ετικέτα σε μια περιοχή που ορίζει ο linker).

Δημοσ.

Κακως εβαλα το virtual happy.gif

 

Να στο πω οσο πιο απλα γινεται

 

πινακας

address = stack_start_address - pin_offset ( + οτι αυτο εδω ειναι constant δηλαδη μεταφραζεται αυτουσιο για αυτο δεν μπορεις πχ να προχωρισεις τον δεικτη με ++ γιατι δεν υπαρχει δεικτης )

 

δεικτης

address = address

Δημοσ.

Οι δείκτες ας περιέχουν ό,τι θέλουν. Τι σχέση έχουν τα physical addresses και το memory model με αυτό που συζητάμε ? Τα links που έδωσες μιλάνε για segmented αρχιτεκτονική και near/far δείκτες. Εμείς δεν μιλήσαμε για το πόσα bytes είναι οι pointers αλλά για την διαφορά μεταξύ πίνακα και δείκτη και ότι το όνομα ενός πίνακα είναι ουσιαστικά μια ετικέτα σε μια διεύθυνση (σκέψου ότι όπως το google.com είναι ένα εύκολο όνομα για την προσπέλαση μιας IP έτσι και το όνομα του πίνακα είναι μια εύκολη ετικέτα σε μια περιοχή που ορίζει ο linker).

 

Και το όνομα του δείκτη είναι ουσιαστικά μια ετικέτα σε μια διεύθυνση, δεν αποδεικνύει/απορρίπτει κάτι αυτό. Τα links που έδωσα είναι για το "virtual address" στο αρχικό ποστ του παπι. Στο τελευταίο του ποστ το διατυπώνει πιο σωστά.

 

Παρόλα αυτά, αν ο πίνακας περαστεί ως παράμετρος μέσα σε συνάρτηση τότε συμπεριφέρεται ακριβώς ως δείκτης, μιας και ουσιαστικά γίνεται re-written από τον compiler ως δείκτης.

 

Όλες αυτές οι λεπτομέρειες δεν χρειάζονται παρά μόνο σε εξειδικευμένα projects. Η φράση που έγραψα στο παραπάνω ποστ συνοψίζει με χρηστική ακρίβεια την σχέση μεταξύ πινάκων και δεικτών, abstractly, που σημαίνει πως ισχύει ατόφια σε όποια πλατφόρμα κι αν αναφέρεται (ανεξάρτητα από την εσωτερική υλοποίηση).

Δημοσ.

Και το όνομα του δείκτη είναι ουσιαστικά μια ετικέτα σε μια διεύθυνση, δεν αποδεικνύει/απορρίπτει κάτι αυτό. Τα links που έδωσα είναι για το "virtual address" στο αρχικό ποστ του παπι. Στο τελευταίο του ποστ το διατυπώνει πιο σωστά.

Δεν είναι έτσι ακριβώς γιατί στον δείκτη διαβάζεις αυτή την ετικέτα για να πάρεις την διεύθυνση στην οποία δείχνει. Μπορεί να γνωρίζεις την διεύθυνση του δείκτη όπως λες αλλά δεν ξέρεις που θα δείχνει όταν τρέξει το πρόγραμμά σου. Το όνομα του πίνακα από την άλλη είναι απλά όμορφο όνομα για μια στάνταρ διεύθυνση την οποία γνωρίζεις (Syntactic sugar που λένε και στα χωριά)

 

Όλες αυτές οι λεπτομέρειες δεν χρειάζονται παρά μόνο σε εξειδικευμένα projects. Η φράση που έγραψα στο παραπάνω ποστ συνοψίζει με χρηστική ακρίβεια την σχέση μεταξύ πινάκων και δεικτών.

 

Ναι ρε συ αλλά και ο όρος "οι πίνακες συμπεριφέρονται ως δείκτες" που αναφέρουν πολλά βιβλία και οι άλλοι όροι μια χαρά "χρηστικά" σωστοί είναι. Το νόημα όλων αυτών των μηνυμάτων ήταν να πούμε ότι ναι μεν το λέμε αυτό αλλά δεν είναι ακριβώς έτσι τα πράγματα.

 

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

 

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

Δημοσ.

Ξαναδιάβασε την ενότητα/κεφάλαιο που μιλάει για το τι είναι ορισμός (definition) και τι δήλωση (deceleration) γιατί από ότι φαίνεται τα συγχέεις.

 

Oχι οκ!

 

Η δήλωση που γίνεται παντα στην αρχή ειναι το πρωτότυπο

της συνάρτησης και την βάζουμε και στα headers , απλα ο ορισμός μιας συνάρτησης

δεν ειναι δήλωση αλλα περιέχει μια δήλωση της + το σώμα της .

 

Για αυτο και δεν χρειάζεται έξτρα δηλωση οταν βάζεις πρωτα τον ορισμο

και μετα ακολουθεί η main με την κλήση της. Αλλιως θες δηλωση κατω απο τα #include

μετα την main και απο κατω τον ορισμο της / των συναρτησεων

Δημοσ.

...

Ναι ρε συ αλλά και ο όρος "οι πίνακες συμπεριφέρονται ως δείκτες" που αναφέρουν πολλά βιβλία και οι άλλοι όροι μια χαρά "χρηστικά" σωστοί είναι. Το νόημα όλων αυτών των μηνυμάτων ήταν να πούμε ότι ναι μεν το λέμε αυτό αλλά δεν είναι ακριβώς έτσι τα πράγματα.

Το "συμπεριφέρονται ως δείκτες" δεν είναι ακριβές, διότι γενικώς οι δείκτες μπορούν να χρησιμοποιηθούν ως lvalues, ενώ οι πίνακες γενικώς όχι (με μόνη εξαίρεση όταν είναι ορίσματα συναρτήσεων).

 

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

 

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

Θα έλεγα πως πιο εύστοχο abstract παράδειγμα είναι το ότι όταν πατάς φρένο το αυτοκίνητο σταματάει. Το πως ακριβώς υλοποιείται η πέδηση δεν σου χρειάζεται για να οδηγήσεις, παρά μόνο σε εξειδικευμένες περιπτώσεις (π.χ. αν είσαι οδηγός αγώνων).

Δημοσ.

Κάπου διάβασα οτι η δήλωση μιας συνάρτησης με την κεφαλίδα της

στον ορισμο έχουν την μοναδική διαφορα το ερωτηματικο στο τελος... αυτο δεν ειναι τελειως λάθος?

Καταρχην στην μεν κεφαλιδα δεν μπορεις να παραλειψεις τα ονοματα των παραμετρων ενω στην δηλωση μπορεις.

Δημοσ.

Κάπου διάβασα οτι η δήλωση μιας συνάρτησης με την κεφαλίδα της

στον ορισμο έχουν την μοναδική διαφορα το ερωτηματικο στο τελος... αυτο δεν ειναι τελειως λάθος?

Καταρχην στην μεν κεφαλιδα δεν μπορεις να παραλειψεις τα ονοματα των παραμετρων ενω στην δηλωση μπορεις.

 

Για το ερωτηματικό και τα ονόματα των παραμέτρων μιλήσαμε λίγα μηνύματα πίσω. Στην δήλωση του prototype μπαίνει το ερωτηματικό και εκεί είναι που μπορείς να παραλείψεις τα ονόματα. Το αν το prototype βρίσκεται στο ίδιο αρχείο ή σε ένα header file δεν παίζει κανένα ρόλο.

 

Ή μας κοροϊδεύεις ή δεν καταλαβαίνεις αυτά που διαβάζεις (πιθανότερο το 1ο). Αν παρόλα αυτά δεν μας κοροϊδεύεις, τότε προσπάθησε να καταλαβαίνεις αυτά που διαβάζεις αντί να τρέχεις να βγάλεις 10 κεφάλαια του King σε 1 μέρα. Αν σε δυσκολεύουν τα αγγλικά, δοκίμασε αρχικά ένα ελληνικό βιβλίο.

Δημοσ.

Ή μας κοροϊδεύεις ή δεν καταλαβαίνεις αυτά που διαβάζεις (πιθανότερο το 1ο). Αν παρόλα αυτά δεν μας κοροϊδεύεις, τότε προσπάθησε να καταλαβαίνεις αυτά που διαβάζεις αντί να τρέχεις να βγάλεις 10 κεφάλαια του King σε 1 μέρα. Αν σε δυσκολεύουν τα αγγλικά, δοκίμασε αρχικά ένα ελληνικό βιβλίο.

 

Γιατι εισαι δυσκοίλιος ?

Κακό θα σου κάνει... πέρα απο τον προγραμματισμο.

 

Συζήτηση κάνουμε... σε πίεσα να μου απαντήσεις σε κάτι?

 

Αν σε κουραζει κατι

δεν απαντας εξαρχης... για να μην ζοριζεσαι το λεω.. εγω δεν εχω προβλημα.

Δημοσ.

Γιατι εισαι δυσκοίλιος ?

Κακό θα σου κάνει... πέρα απο τον προγραμματισμο.

 

Συζήτηση κάνουμε... σε πίεσα να μου απαντήσεις σε κάτι?

 

Αν σε κουραζει κατι

δεν απαντας εξαρχης... για να μην ζοριζεσαι το λεω.. εγω δεν εχω προβλημα.

Καταπληκτικοί τρόποι. Για να μην ζορίζομαι λοιπόν και έχω προβλήματα όπως λες, να θυμάμαι να μην σου απαντήσω ξανά.

 

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

Δημοσ.

Καταπληκτικοί τρόποι. Για να μην ζορίζομαι λοιπόν και έχω προβλήματα όπως λες, να θυμάμαι να μην σου απαντήσω ξανά.

 

Ακριβως γραψτο και σε ένα χαρτακι

να μην το ξεχάσεις. hahhahaha

 

ειμαι αλητεία να μην με κάνεις παρεα !

 

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

 

Δεν εχω κανενα προβλημα με την κριτικη. :P

Μπορεις να κάνεις οση θες αν ειχα δεν θα ποσταριζα κωδικα... απλα επειδη σε ειδα

οτι κουράστηκες στο ειπα. Οταν εχουμε μια συζητηση γνωμη μου ειναι

οτι μπορουμε να κανουμε και λιγο χαβαλε αλλιως δεν τσουλαει... δεν χαθηκε και ο κοσμος

αν παρολαυτα τρωω χρονο απο καποιους και θεωρουν οτι ειμαι ξερω γω ανάγωγος ειμαι ξηγημενος εξαρχης και εγω ο ιδιος

τους λεω να μην βοηθανε !

 

Σορρυ για την παρλαπίπα και το αουτ οφ τοπικ. -.-

Δημοσ.

Υπάρχει κάνα θέμα εδω με την goto ?

 

>

#include <stdio.h>
int fact(int n);

int main( void )
{
int n;

   printf("\n * Recursive calculation * ");
   
   start:
   
   printf("\n \n Give the number  : ");
   scanf("%d" , &n);
   
   /*if( n < 0 )
   {
   printf(" *** Error : Negative number ");
   return 0;
   }*/
   
   if( n < 0 )
   {
	printf(" Negative number: Try again !!! ");
	goto start;
}
   
   printf("\n !%d equals : %d " , n , fact(n));
                    
      return 0;
}
int fact(int n)
{
int count = n  , total=1 ;

if( n == 0)
return 1;

for(; count>=1; count--)
total *= count;

return total;
}

 

Εμένα με βολεύει παντως η χρήση της. Και δεν βλέπω κάτι άσχημο στον κώδικα τον δοκίμασα.

Eναλλακτική λύση ειναι η χρηση της if την οποια καταργω προς το παρον επειδη τερματιζει

εκει το προγραμμα και δεν μ αρεσει.

 

(Υπολογισμός παραγοντικού χωρις χρήση αναδρομής) .

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

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