Mi blog lah! Το ιστολόγιό μου

2Sep/0519

Τι θα εκτυπώσει;

Ακολουθώντας το παράδειγμα το Γιώργου, τι θα εκτυπώσει το παρακάτω πρόγραμμα;

#include <stdio.h>

int
main(int argc, char *argv[])
{
int i;
char a[12];

for ( i = 0; i <= 12; i++ )
{
a[i]=i-1;
}

printf("a[12] is %d\n", a[12]);

return 0;
}

Σε τυχόν απάντηση αναφέρατε υπολογιστική πλατφόρμα (π.χ. GNU/Linux, x86)

Ενημέρωση Διόρθωσα ένα συντακτικό σφάλμα από τη μετατροπή στο WordPress (ύπαρξη διαστήματος μεταξύ < και = στο βρόχο).

Ενημέρωση #2 Απλούστευσα λίγο ακόμα το πρόγραμμα. Όταν το εκτελέσετε, τι τυπώνει η εντολή printf;

Comments (19) Trackbacks (0)
  1. Ο compiler (έκδοση gcc 3.3.5 (Debian 1:3.3.5-8ubuntu2), x86) βγάζει συντακτικό λάθος λόγω του κενού μεταξύ των συμβόλων του τελεστή “

    Like or Dislike: Thumb up 0 Thumb down 0

  2. Για κάποιο λόγο “κόπηκε” το σχόλιο στο string ” ”

    Like or Dislike: Thumb up 0 Thumb down 0

  3. Δεν εξηγείται αλλιώς, το wordpress κόβει τα σχόλια που έχουν δίπλα δίπλα τους χαρακτήρες

    Like or Dislike: Thumb up 0 Thumb down 0

  4. ΟΚ λάθος μου, ξέχασα ότι πρέπει να escape το σύμβολο μικρότερο λόγω HTML :-/

    Τελευταία δοκιμή με pre tag.

    Ή έξοδος του compiler είναι:

    $ gcc a.c
    a.c: Στη συνάρτηση `main’:
    a.c:7: error: σφάλμα σύνταξης before ‘=’ token
    a.c:7: error: σφάλμα σύνταξης before ‘)’ token
    a.c: At top level:
    a.c:11: error: σφάλμα σύνταξης before string constant
    a.c:11: προειδοποίηση: conflicting types for built-in function `printf’
    a.c:11: προειδοποίηση: data definition has no type or storage class

    Λειτουργεί αφαιρώντας το κενό μεταξύ των συμβόλων

    Like or Dislike: Thumb up 0 Thumb down 0

  5. … των συμβόλων μικρότερο και ίσον και εμφανίζει το αναμενόμενο αποτέλεσμα (7)

    (το pre δεν δούλεψε, σόρρυ που σου γέμισα το blog με κομμένα σχόλια :)

    Like or Dislike: Thumb up 0 Thumb down 0

  6. :)

    Όντως υπήρξε ένα πρόβλημα με την μετατροπή του κωδικά σε HTML για την εμφάνιση στο ιστολόγιο. Προστέθηκε ένα διάστημα μεταξύ του < και του =.

    Το διόρθωσα και τώρα επιβεβαίωσα ότι με αντιγραφή/επικόλληση να πάρεις το πρόγραμμα και να το μεταγλωττίσεις ορθά.

    Like or Dislike: Thumb up 0 Thumb down 0

  7. Να πω ότι το ερώτημα δεν έχει απαντηθεί ακόμα.

    Ποια είναι η τιμή που πρέπει να έχει το a[10] και όταν εκτελέσετε το πρόγραμμα, τι εκτυπώνει;

    Like or Dislike: Thumb up 0 Thumb down 0

  8. den tiponi tipota se debian me gcc 4.0.2

    sorry re simo alla ti ypotithete oti prepi na tiposi?

    Like or Dislike: Thumb up 0 Thumb down 0

  9. Εμ, αυτό είναι το κουίζ. ;-)

    Τι φαίνεται να κάνει το πρόγραμμα και τι κάνει πραγματικά;
    Γιατί;

    Like or Dislike: Thumb up 0 Thumb down 0

  10. an ke tin C tin barieme (ke kirios ta quiz pu ‘oxinun to mialo’):

    ti giati? giati bazis INT se char ke giati to i pote den ftani pote to 12 opote loopari gia pada

    Like or Dislike: Thumb up 0 Thumb down 0

  11. Βάζω int σε char διότι είναι επιτρεπτό στη C.
    Γίνεται αυτόματη μετατροπή που είναι και έγκυρη για το παράδειγμα.
    Εναλλακτικά μπορείς να θεωρήσεις ότι

    a[i]= (char )i-1;

    Γιατί το i να μην φτάνει ποτέ στο 12; Δεν νομίζω να τού εκχωρώ τιμή;

    Like or Dislike: Thumb up 0 Thumb down 0

  12. Ναί είναι απόλυτα legal.
    Μήπως είναι trick ερώτηση ?

    Πρίν να το τρέξω έλεγα 11.

    Αφού το έτρεξα, ο υπολογιστής είπε 11.
    Ούτε παραπονέθηκε, ούτε τίποτα.
    Ακόμα και με -ansi μια χαρόυλα έκανε “συμπίληση” (aka compile).

    Σε Solaris/Sparc.

    Μήπως είναι κατι που δεν καταλαβαίνω ?

    Like or Dislike: Thumb up 0 Thumb down 0

  13. Ναι, είναι τρικ η ερώτηση.
    Πράγματι σε Solaris/Sparc έχεις διαφορετικό αποτέλεσμα.
    Χρησιμοποίησες τον μεταγλωττιστή της Sun;

    Αν μπορείς να δοκιμάσεις σε GNU/Linux (32bit), θα δεις το παρασκήνιο του τρικ :) .

    Like or Dislike: Thumb up 0 Thumb down 0

  14. Γιατί είναι ακριβώς legal; Η διάσταση του πίνακα δεν είναι 12; Το μέγιστο array index επομένως είναι 11 (και όχι 12 που παίρνει το i).

    Like or Dislike: Thumb up 0 Thumb down 0

  15. Η μεταγλώττιση δεν παρουσιάζει μήνυμα σφάλματος.

    Μπορείς να εξηγήσεις τη συμπεριφορά του προγράμματος όταν εκτελείται; Έχεις δοκιμάσει να το εκτελέσεις;

    Like or Dislike: Thumb up 0 Thumb down 0

  16. Όντως δεν παρουσιάζει. (Δε θα ‘πρεπε;) Εκτυπώνει “a[12] is 11″. Γιατί είναι legal δε μπορώ να μαντέψω (ειδικά εφόσον έχουμε πρόσβαση σε index ίσο με το μήκος του πίνακα a). Βέβαια αυτό είναι το λιγότερο. Το γεγονός ότι εκτυπώνει 11, και όχι “σκουπίδια” ή κάποιον τυχαίο ακέραιο, ενισχύει το “μυστήριο”.

    Like or Dislike: Thumb up 0 Thumb down 0

  17. Πιστεύω ότι η πλατφόρμα που δοκίμασες το πρόγραμμα δεν είναι Linux/i386 (μάλλον AMD64;). Σε πρόσφατο Linux/i386 έχει μια πολύ συγκεκριμένη/παράξενη συμπεριφορά.

    H C είναι μια “untyped” γλώσσα, που σημαίνει μεταξύ άλλων ότι δεν ελέγχει για προσβάσεις εκτός των ορίων ενός πίνακα, κατά την μεταγλώττιση ή εκτέλεση.

    Like or Dislike: Thumb up 0 Thumb down 0

  18. Το τελευταίο δεν το γνώριζα.

    Το πρόγραμμα το δοκίμασα σε GCC 3.3.6, Gentoo Linux, Intel Pentium III Coppermine.

    Like or Dislike: Thumb up 0 Thumb down 0

  19. Την συμπεριφορά (στο πρόγραμμα) που ζητάω να διερευνηθεί είναι αυτή που λαμβάνω σε Linux/x86 (2.6.11-1.1369_FC4smp i686) με GCC (4.0.0 20050519 (Red Hat 4.0.0-8)). Με άλλα λόγια, Fedora Core 4 και μάλλον και Ubuntu Breezy.

    Συγκεκριμένα, αυτό που συμβαίνει είναι ότι το πρόγραμμα κολλάει όταν το εκτελείς. Ναι, απλά κολλάει χωρίς να εκτυπώνει κάτι. Γιατί να κολλάει ενώ δεν υπάρχει τέτοια εντολή;

    Παρόμοιο παράδειγμα είναι και το
    http://simos.info/blog/?p=421

    Like or Dislike: Thumb up 0 Thumb down 0


Leave a comment

Comments are filtered through Akismet for spam detection. Use of a non-personal web site or blog URL in the field below and/or comments that are off-topic or personal attacks will likely be removed at my discretion. Your opinions are welcome but please keep them polite and constructive.

Trackbacks are disabled.

Switch to our mobile site