Miky-Maous Δημοσ. 10 Σεπτεμβρίου 2009 Δημοσ. 10 Σεπτεμβρίου 2009 Ειμαι καπως καινουριος στο προγραμματισμο με δεικτες οποτε η ερωτηση μου μπορει να ειναι λιγο χαζη. Εχω γραψει τον παρακατω κωδικα και υπαρχει προοβλημα στη συναρτηση func2 η οποια θα επρεπε να μου επιστρεφει τους αριθμους απο το α ως το β (αριθμους που επιλέγει ο χρηστης): #include <stdio.h> #include <stdlib.h> char *func(char *s, int n) { char *s2; int i; s2 = (char *) malloc(n+1); for (i=0;i<n;i++) s2=s; s2[n] ='\0'; return s2; } int *func2(int a, int { int *s2; int i; s2 = (int *) malloc((b-a+1)*sizeof(int)); for (i=a;i<=b;i++) { s2[i-a]=i; } return s2; } main() { char *s = "Hello"; printf("%s\n",func(s,2)); printf("%d",func2(3,7)); getchar(); } ---------- Το μήνυμα προστέθηκε στις 02:16 ---------- Συγγνωμη που τα γραφει ετσι απλα για καποιο λογο βγαζει εναλλαξ κεφαλαια και μικρα μετα απο καθε ισον (=) ---------- Το μήνυμα προστέθηκε στις 02:19 ---------- και παλι συγγνωμη θα πρεπει να επιστρεφει εναν πινακα ακεραιων με στοιχεια τους αριθμουσ απο το α εως το β
parsifal Δημοσ. 10 Σεπτεμβρίου 2009 Δημοσ. 10 Σεπτεμβρίου 2009 Εσώκλεισε τον κώδικά σου μέσα σε ή [php] tags, για να φαίνεται σωστά:
bxenos Δημοσ. 11 Σεπτεμβρίου 2009 Δημοσ. 11 Σεπτεμβρίου 2009 printf("%s\n",func(s,2)); printf("%d",func2(3,7)); στο πρωτο printf τυπώνεις string χαρακτηρων στο δευτερο σκάει, διότι λές στην printf να τυπώσει έναν ακέραιο αλλα εσυ της δίνεις εναν δείκτη σε πίνακα ακεραίου, αρα στην πραγματικότητα σου τυπώνει τη θέση μνήμης που έκανες malloc (συμπιεσμένη σε απλό int βέβαια). Δεν μπορείς να τυπώσεις με μια εντολή printf εναν ολόκληρο πίνακα και μάλιστα αγνωστου μεγέθους... > printf("%d",func2(3,7)[0]); Αλλο ένα σημείο που βλέπω είναι ότι δεσμεύεις μνήμη χωρις να την ελευθερώνεις (και χωρις καν να κρατας τον pointer για να την ελευθερωσεις αργοτερα)
kagelos Δημοσ. 11 Σεπτεμβρίου 2009 Δημοσ. 11 Σεπτεμβρίου 2009 στο δευτερο σκάει, διότι λές στην printf να τυπώσει έναν ακέραιο αλλα εσυ της δίνεις εναν δείκτη σε πίνακα ακεραίου, αρα στην πραγματικότητα σου τυπώνει τη θέση μνήμης που έκανες malloc (συμπιεσμένη σε απλό int βέβαια). Δεν μπορείς να τυπώσεις με μια εντολή printf εναν ολόκληρο πίνακα και μάλιστα αγνωστου μεγέθους... Όλοι οι pointers είναι απλοί ακέραιοι 4 byte (σε 32bit λειτουργικά συστήματα). Δεν "συμπιέζεται" πουθενά ο pointer για να γίνει ακέραιος. Είναι unsigned int.
bxenos Δημοσ. 12 Σεπτεμβρίου 2009 Δημοσ. 12 Σεπτεμβρίου 2009 Όλοι οι pointers είναι απλοί ακέραιοι 4 byte (σε 32bit λειτουργικά συστήματα). Δεν "συμπιέζεται" πουθενά ο pointer για να γίνει ακέραιος. Είναι unsigned int. Δεν το εγγυάτε η C αυτό. Αν ένας pointer γίνει cust σε int δεν είναι σίγουρο αν θα χωρέσει. Το ότι ισχύει στα intel/amd pc με τις γνωστές υλοποιήσεις λειτουργικών και compilers δεν είναι λόγος να γενικεύσουμε σε όλο το φάσμα των μικροελενκτών/μικροεπεξεργαστών.
Directx Δημοσ. 12 Σεπτεμβρίου 2009 Δημοσ. 12 Σεπτεμβρίου 2009 Το πως τελικά αναπαρίσταται ένας pointer είναι καθαρά θέμα του συστήματος (hardware / software και compiler) που τρέχει το πρόγραμμα. Η C προσφέρει μέσο της printf("%p"..) (και όχι μόνο) μια αυτόματη αναπαράσταση της διεύθυνσης του pointer αλλά ακόμα και αυτή η αναπαράσταση εξαρτάται από το πιο μοντέλο μνήμης χρησιμοποιεί το πρόγραμμα. Έτσι σε DOS (16bit - cmm) ένα printf("%p..) δίνει 0970:0004 (Segment:Offset) για παράδειγμα ενώ σε Windows ένα 00A532C4 (linear virtual 32bit address).
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.