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;
September 3rd, 2005 - 09:53
Ο compiler (έκδοση gcc 3.3.5 (Debian 1:3.3.5-8ubuntu2), x86) βγάζει συντακτικό λάθος λόγω του κενού μεταξύ των συμβόλων του τελεστή “
[Translate]
Like or Dislike:
0
0
September 3rd, 2005 - 10:00
Για κάποιο λόγο “κόπηκε” το σχόλιο στο string ” ”
[Translate]
Like or Dislike:
0
0
September 3rd, 2005 - 10:04
Δεν εξηγείται αλλιώς, το wordpress κόβει τα σχόλια που έχουν δίπλα δίπλα τους χαρακτήρες
[Translate]
Like or Dislike:
0
0
September 3rd, 2005 - 10:11
ΟΚ λάθος μου, ξέχασα ότι πρέπει να 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
Λειτουργεί αφαιρώντας το κενό μεταξύ των συμβόλων
[Translate]
Like or Dislike:
0
0
September 3rd, 2005 - 10:14
… των συμβόλων μικρότερο και ίσον και εμφανίζει το αναμενόμενο αποτέλεσμα (7)
(το pre δεν δούλεψε, σόρρυ που σου γέμισα το blog με κομμένα σχόλια
[Translate]
Like or Dislike:
0
0
September 3rd, 2005 - 12:36
Όντως υπήρξε ένα πρόβλημα με την μετατροπή του κωδικά σε HTML για την εμφάνιση στο ιστολόγιο. Προστέθηκε ένα διάστημα μεταξύ του < και του =.
Το διόρθωσα και τώρα επιβεβαίωσα ότι με αντιγραφή/επικόλληση να πάρεις το πρόγραμμα και να το μεταγλωττίσεις ορθά.
[Translate]
Like or Dislike:
0
0
September 3rd, 2005 - 22:46
Να πω ότι το ερώτημα δεν έχει απαντηθεί ακόμα.
Ποια είναι η τιμή που πρέπει να έχει το a[10] και όταν εκτελέσετε το πρόγραμμα, τι εκτυπώνει;
[Translate]
Like or Dislike:
0
0
September 3rd, 2005 - 23:43
den tiponi tipota se debian me gcc 4.0.2
sorry re simo alla ti ypotithete oti prepi na tiposi?
[Translate]
Like or Dislike:
0
0
September 3rd, 2005 - 23:48
Εμ, αυτό είναι το κουίζ.
Τι φαίνεται να κάνει το πρόγραμμα και τι κάνει πραγματικά;
Γιατί;
[Translate]
Like or Dislike:
0
0
September 4th, 2005 - 13:56
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
[Translate]
Like or Dislike:
0
0
September 4th, 2005 - 14:03
Βάζω int σε char διότι είναι επιτρεπτό στη C.
Γίνεται αυτόματη μετατροπή που είναι και έγκυρη για το παράδειγμα.
Εναλλακτικά μπορείς να θεωρήσεις ότι
a[i]= (char )i-1;
Γιατί το i να μην φτάνει ποτέ στο 12; Δεν νομίζω να τού εκχωρώ τιμή;
[Translate]
Like or Dislike:
0
0
September 5th, 2005 - 14:19
Ναί είναι απόλυτα legal.
Μήπως είναι trick ερώτηση ?
Πρίν να το τρέξω έλεγα 11.
Αφού το έτρεξα, ο υπολογιστής είπε 11.
Ούτε παραπονέθηκε, ούτε τίποτα.
Ακόμα και με -ansi μια χαρόυλα έκανε “συμπίληση” (aka compile).
Σε Solaris/Sparc.
Μήπως είναι κατι που δεν καταλαβαίνω ?
[Translate]
Like or Dislike:
0
0
September 5th, 2005 - 14:22
Ναι, είναι τρικ η ερώτηση.
Πράγματι σε Solaris/Sparc έχεις διαφορετικό αποτέλεσμα.
Χρησιμοποίησες τον μεταγλωττιστή της Sun;
Αν μπορείς να δοκιμάσεις σε GNU/Linux (32bit), θα δεις το παρασκήνιο του τρικ
.
[Translate]
Like or Dislike:
0
0
October 2nd, 2005 - 08:21
Γιατί είναι ακριβώς legal; Η διάσταση του πίνακα δεν είναι 12; Το μέγιστο array index επομένως είναι 11 (και όχι 12 που παίρνει το i).
[Translate]
Like or Dislike:
0
0
October 2nd, 2005 - 12:03
Η μεταγλώττιση δεν παρουσιάζει μήνυμα σφάλματος.
Μπορείς να εξηγήσεις τη συμπεριφορά του προγράμματος όταν εκτελείται; Έχεις δοκιμάσει να το εκτελέσεις;
[Translate]
Like or Dislike:
0
0
October 2nd, 2005 - 16:50
Όντως δεν παρουσιάζει. (Δε θα ‘πρεπε;) Εκτυπώνει “a[12] is 11″. Γιατί είναι legal δε μπορώ να μαντέψω (ειδικά εφόσον έχουμε πρόσβαση σε index ίσο με το μήκος του πίνακα a). Βέβαια αυτό είναι το λιγότερο. Το γεγονός ότι εκτυπώνει 11, και όχι “σκουπίδια” ή κάποιον τυχαίο ακέραιο, ενισχύει το “μυστήριο”.
[Translate]
Like or Dislike:
0
0
October 2nd, 2005 - 17:01
Πιστεύω ότι η πλατφόρμα που δοκίμασες το πρόγραμμα δεν είναι Linux/i386 (μάλλον AMD64;). Σε πρόσφατο Linux/i386 έχει μια πολύ συγκεκριμένη/παράξενη συμπεριφορά.
H C είναι μια “untyped” γλώσσα, που σημαίνει μεταξύ άλλων ότι δεν ελέγχει για προσβάσεις εκτός των ορίων ενός πίνακα, κατά την μεταγλώττιση ή εκτέλεση.
[Translate]
Like or Dislike:
0
0
October 2nd, 2005 - 20:18
Το τελευταίο δεν το γνώριζα.
Το πρόγραμμα το δοκίμασα σε GCC 3.3.6, Gentoo Linux, Intel Pentium III Coppermine.
[Translate]
Like or Dislike:
0
0
October 2nd, 2005 - 21:01
Την συμπεριφορά (στο πρόγραμμα) που ζητάω να διερευνηθεί είναι αυτή που λαμβάνω σε 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
[Translate]
Like or Dislike:
0
0