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

Ch Iossif's "Hello World"


chiossif

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

Δημοσ.

...περιμένοντας ένα κώδικα να τρέξει "σκάλισα" αυτό:

 

#include <stdio.h>

int main(){

char *c="My Hello world!\n";

while(putchar(*c++));

return 0;

}

 

Άλλες ιδέες σε C ή C++ με το ίδιο αποτέλεσμα;

Κανένα σχόλιο; Βλέπετε κάτι περίεργο σ' αυτό

σε σύγκριση με το αυθεντικό;

  • Απαντ. 42
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

Ενδέχεται το πρόγραμμα να δημιουργήσει πρόβλημα. Εξηγώ

 

Γραμμή 1: ΟΚ

 

Γραμμή 2: κάνε και την main int main(void). Ενδέχεται να προκαλέσει πρόβλημα η έλλειψη παραμέτρων σε μερικούς compilers.

 

Γραμμή 3: OK

 

Γραμμή 4: Εδώ χωράει μεγάλη συζήτηση. Η putchar() επιστρέφει int ο οποίος είναι ο χαρακτήρας που εκτυπώθηκε ή το EOF σε περίπτωση I/O error. Το loop σταματά αφού εκτυπωθεί και το '\0', κάτι που δεν είναι σωστό. Επιπλέον αν συμβεί EOF θα πέσει σε endless loop - συνήθως το EOF είναι -1. Άρα ο πιο λογικός τρόπος είναι

>#include <stdio.h>
int main(void) {
 char *c="My Hello world!\n";
 while(*c!='\0')
 { 
   if (putchar(*c++)==EOF)
   {
      return -1;
   }
 }
 return 0;
}

Γραμμή 5: OK

 

Φυσικά γίνεται και μικρότερο, αλλά νομίζω η κλασική λύση (με puts) είναι η μικρότερη.

Δημοσ.

 

Γραμμή 4: ...Το loop σταματά αφού εκτυπωθεί και το '\0'' date=' κάτι που δεν είναι σωστό. ...

 

[/quote']

 

Μπράβο...Αυτό εννοούσα. Άραγε ένας \0χ00 στην "οθόνη" πόσο "κακό" μπορεί να κάνει;

 

Δεν έχω καταφέρει να κάνω putchar να στείλει πίσω EOF. Έχετε καμιά ιδέα;

 

(κάτι μου λέει ότι θα'χει ενδιαφέρον η συζήτηση...)

Δημοσ.
Μπράβο...Αυτό εννοούσα. Άραγε ένας \0χ00 στην "οθόνη" πόσο "κακό" μπορεί να κάνει;

 

Δεν έχω καταφέρει να κάνω putchar να στείλει πίσω EOF. Έχετε καμιά ιδέα;

 

(κάτι μου λέει ότι θα'χει ενδιαφέρον η συζήτηση...)

 

Για το πρώτο σημείο: ίσως είναι undefined behaviour, στην καλύτερη περίπτωση θα είναι implementation defined οπότε πρέπει να αποφεύγεται.

 

Για το δεύτερο: η putchar() επιστρέφει EOF αν συμβεί write error. Ακόμα και σε προγράμματα με καλό error checking δεν έχω δει να ελέγχεται η τιμή επιστροφής της putchar(), οπότε κάτι μου λέει ότι δεν είναι συνηθισμένη κατάσταση.

Δημοσ.

Για το πρώτο δεν μπορώ να θυμηθώ πόσο παράνομο είναι (undefined/implementation). Παρόλα αυτά φαίνεται να είναι ;)

 

Update: φαίνεται να είναι standard conforming ΑΛΛΑ πιθανώς να μην παράγει σωστό text output (για εκτύπωσέ το σε αρχείο κειμένο και θα δεις). Γενικά το standard λέει ότι δεν υπάρχουν εκτυπώσιμοι χαρακτήρες που να είναι ταυτόχρονα και control χαρακτήρες. Για περισσότερα στο http://groups.google.gr/group/comp.std.c/browse_thread/thread/ba63f8825a86a8d9/d9a33f921b28e81e?lnk=st&q=&rnum=4&hl=el#d9a33f921b28e81e

 

Γενικά για το τι εκτυπώνεται στα stdout/stderr κατά παράβαση όλοι (ή σχεδόν όλοι) δεν ελέγουν για τυχόν λάθη - μόνον στην είσοδο τσεκάρουν. Σπανίως βλέπω και printf() να ελέγχεται - εγώ μόνον μία φορά το έκανα για φορμαρισμένη έξοδο σε αρχείο. Ίσως επειδή τα της οθόνης/line terminal είναι εφήμερα.

 

2ο update: στο 1ο πρόγραμμα αν εκτυπωθεί το '\0' μετά δεν υπάρχει και άλλο '\n'. Ο χαρακτήρας '\0' μπορεί να εκτυπωθεί, μπορεί και όχι. Αν εκτυπωθεί στο DOS έχεις ένα προσωπάκι.

Δημοσ.

"

I don't remember where I read this, but it's in C, and here's the deal:

1. Create a file called void main(){puts("Hello, World!");}, assuming your filesystem will allow it.

2. Its contents should be:

__FILE__

3. Compile it with -istdio.h

Quite clever. Although gcc won't let you compile it without a file extension.

Update: I was talking this over with Bozyo the other day. We decided that you can do it like this: on the command line:

gcc -Df=__FILE__ -Dc=// -istdio.h void*.c, then add a "c .c" to the filename and change the content to "f".

 

There is only one way to make a Hello World program shorter than that.

 

Add -DA=__FILE__ to the gcc args, and change the source file's contents to just A.

 

That's the shortest Hello World program possible, as it's just one byte in size.

 

"[http://everything2.com/index.pl?node_id=901951]

 

Τι λέτε; Δουλεύει σε εσάς; Και αν όχι έτσι πώς και με ποιό compiler;

Δημοσ.

PRAGMATI...Tora to eida...Miso...

 

Ekana anazitisi me keimeno kai DEN TO VRIKA.

 

Mallon kapoios enoxlithike...

 

Efoson den ifistate i anafora PLEON DEN IFISTATE KAI TO KEIMENO.

 

Sorry.

Δημοσ.

Αν γράφεις ISO C σε νοιάζει το portability - άρα παρακάηκε ο χυλός ;)

 

Η main() ορίζεται είτε int main(void) είτε int main(int, char *[]). Οτιδήποτε άλλο είναι UB - undefined behavior.

 

Η αλήθεια είναι για την C++, ο Stroustrup λέει να αποφεύγεται το void στις συναρτήσεις που δεν δέχονται ορίσματα.

Δημοσ.

dop δίκαιο έχεις. Αλλά εδώ μιλάμε για τον ορισμό της ακρότητας, με την έννοια του βίτσιου, στον προγραμματισμό οπότε αυτό το θεωρώ πταίσμα. Δοκίμασες ή και κατάφερες να τρέξεις την πρόταση http://www.insomnia.gr/vb3/showpost.php?p=1226251&postcount=6 ;

Δημοσ.

Ως τέχνασμα δε μπορώ να πω ότι δε ενθουσιασε: εντάξει χρησιμοποιεί μία macro που αναπτύσσεται στο όνομα του αρχείου, μόλις περάσει το πρόγραμμα από τον preprocessor δε μεγαλώνει κανονικά σε μέγεθος όμως; Το τσουρεκάκι όνομα αρχείου δεν πιάνει κάποιο χώρο στο filesystem;

Αρχειοθετημένο

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

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