Πρώτη ερώτηση αρχαρίου στην C για main()  Το θέμα επιλύθηκε

...ασύγχρονα μαθήματα γλώσσας C

Πρώτη ερώτηση αρχαρίου στην C για main()  Το θέμα επιλύθηκε

Δημοσίευσηαπό spyridon1971 » 04 Οκτ 2013, 22:40

Καλησπέρα παιδιά!

Μόλις ξεκίνησα να μελετώ την C και στην αρχή του βιβλίου που έχει το πρόγραμμα που παρακολουθώ μου δημιουργήθηκε η πρώτη απορία :-) καθώς διαβάζοντας το βιβλίο διαβάζω και το forum. Μάλλον είναι υπεραπλοική ερώτηση αλλά είπα να μην ξεκινήσω με κενά (από την πρώτη παράγραφο).

Λοιπόν, στο tutorial υπάρχει το παρακάτω πρόγραμμα που έχω και στο βιβλίο.

Κώδικας: Επιλογή όλων
    #include <stdio.h>
    int main(){
          printf ("Hello World!\n");
    }


Στο βιβλίο όμως η συνάρτηση main() δεν έχει την δήλωση int και όταν χρησιμοποιώ το Geany για να την μεταγλωτίσω παίρνω μια ειδοποίση
hello.c:2:1: προειδοποίηση: return type defaults to ‘int’ [-Wreturn-type]


Επίσης, όποιο και από τα δύο αν δώσω εντολή στο Geany να εκτελεστεί παίρνω ένα
hello.c:4:9: προειδοποίηση: control reaches end of non-void function [-Wreturn-type]


Κώδικας: Επιλογή όλων
#include <stdio.h>
main()
{
   printf("καλημέρα κόσμε\n");
   }


Οπότε αναρωτιέμαι τι συμβαίνει με την int και τι θα πρέπε να έχω στο μυαλό μου για τα μηνύματα σφάλματος. Αν έχει κάποιος φίλος κάτι θα ήμουν υποχρεωμένος!

Ευχαριστώ πολύ!

Σπύρος
Γνώσεις ⇛ Linux: Ανύπαρκτες┃Προγραμματισμός:C (Αρχάριος)┃Αγγλικά: Άριστα
Laptop 1: Λειτουργικό ⇛ Ubuntu 16.04 (32bit) σε HP 530 Laptop
Προδιαγραφές ⇛ T2600 │4 GB│Intel Corporation Mobile 945GME Express Integrated Graphics Controller (rev 03)│LG L1915S
Laptop 2: Λειτουργικό ⇛ Ubuntu 14.04 LTS σε Turbo-X Laptop Cardio Gi546-450
Προδιαγραφές ⇛ Intel-Core i5-460M-2.53 GHz│4 GB DDR3│ATI Radeon HD 5165│LG L1915S│Atheros AR9285
spyridon1971
babeTUX
babeTUX
 
Δημοσιεύσεις: 108
Εγγραφή: 03 Φεβ 2010, 15:32
Τοποθεσία: Πειραιάς
Εκτύπωση

Re: Πρώτη ερώτηση αρχαρίου στην C για main()

Δημοσίευσηαπό medigeek » 05 Οκτ 2013, 00:51

Χρησιμοποιώντας το "int main" λες ότι πρέπει να επιστρέψει κάποιο αριθμό.
Συνήθως όταν όλα είναι ΟΚ, χρησιμοποιούμε το "0" (μηδέν). Η γραμμή που λείπει είναι το "return 0;"

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
int main(){
printf ("Hello World!\n");
return 0;
}
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Πρώτη ερώτηση αρχαρίου στην C για main()

Δημοσίευσηαπό konnn » 05 Οκτ 2013, 01:31

Μπορείς να βάλεις και void main() χωρίς να επιστρέφει κάτι.
1 Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Προχωρημένος
2 Desktop : Ubuntu 16.04 64bit
a Intel Core i3 CPU 530 2.93GHz ‖ RAM 3824 MiB ‖ Intel DH55HC -
b nVidia Device [10de:1040] (rev a1)
c eth0: Intel 82578DC Gigabit Network Connection
3 Notebook : Ubuntu 16.04 64 bit
a Intel Core i3-2365M CPU @ 1.40GHz ‖ RAM 3854 MiB ‖ LENOVO 20197
b Intel 2nd Generation Core Processor Family Integrated Graphics Controller
c 5 wlan0: Intel Centrino Wireless-N 2230 ⋮ eth0: Realtek RTL8101E/RTL8102E

Αυτόματη υπογραφή.
Άβαταρ μέλους
konnn
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3568
Εγγραφή: 12 Ιούλ 2010, 17:54
Τοποθεσία: Καλαμάτα
Launchpad: konnn
Εκτύπωση

Re: Πρώτη ερώτηση αρχαρίου στην C για main()

Δημοσίευσηαπό spyridon1971 » 05 Οκτ 2013, 01:35

Ευχαριστώ πάρα πολύ παιδιά!
Γνώσεις ⇛ Linux: Ανύπαρκτες┃Προγραμματισμός:C (Αρχάριος)┃Αγγλικά: Άριστα
Laptop 1: Λειτουργικό ⇛ Ubuntu 16.04 (32bit) σε HP 530 Laptop
Προδιαγραφές ⇛ T2600 │4 GB│Intel Corporation Mobile 945GME Express Integrated Graphics Controller (rev 03)│LG L1915S
Laptop 2: Λειτουργικό ⇛ Ubuntu 14.04 LTS σε Turbo-X Laptop Cardio Gi546-450
Προδιαγραφές ⇛ Intel-Core i5-460M-2.53 GHz│4 GB DDR3│ATI Radeon HD 5165│LG L1915S│Atheros AR9285
spyridon1971
babeTUX
babeTUX
 
Δημοσιεύσεις: 108
Εγγραφή: 03 Φεβ 2010, 15:32
Τοποθεσία: Πειραιάς
Εκτύπωση

Re: Πρώτη ερώτηση αρχαρίου στην C για main()

Δημοσίευσηαπό vasster » 05 Οκτ 2013, 06:53

konnn έγραψε:Μπορείς να βάλεις και void main() χωρίς να επιστρέφει κάτι.


... αλλά σίγουρα δεν θέλεις να κάνεις κάτι τέτοιο. Το ANSI πρότυπο αναφέρει ότι πρέπει η main πρέπει να επιστρέφει int. Είναι η τιμή που επιστρέφει στο λειτουργικό σύστημα (ή τέλος πάντων στο πρόγραμμα που κάλεσε αυτή την main) και είναι καθορισμένο να είναι int. Αν δεν επιστρέψεις τιμή τότε επιστρέφεται ότι τυχαία τιμή υπάρχει σε κάποιον register που χρησιμοποιείται. Με λίγα λόγια είναι λάθος και αφού ξεκινάς τώρα, ξεκίνα σωστά.

Όσο για το βιβλίο από το οποίο προσπαθείς να μάθεις, αν έχει το παράδειγμα όπως το έγραψες (δηλ. χωρίς return type και value) θα πρότεινα να το αφήσεις και να βρεις κάποιο άλλο.
Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
Ubuntu 17.04 (Zesty Zapus) 4.10.0-19-generic 64bit (en_US.UTF-8, Unity ubuntu)
Intel Core i5-6500 CPU @ 3.20GHz ‖ RAM 15915 MiB ‖ MSI H170M PRO-VDH (MS-7982) - MSI MS-7982
Intel Sky Lake Integrated Graphics [8086:1912] {i915_bpo}
enp1s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15) ⋮ wlx784476b5edea: 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter
vasster
punkTUX
punkTUX
 
Δημοσιεύσεις: 253
Εγγραφή: 23 Μάιος 2010, 09:51
Εκτύπωση

Re: Πρώτη ερώτηση αρχαρίου στην C για main()

Δημοσίευσηαπό konnn » 05 Οκτ 2013, 09:40

vasster έγραψε:... αλλά σίγουρα δεν θέλεις να κάνεις κάτι τέτοιο. Το ANSI πρότυπο αναφέρει ότι πρέπει η main πρέπει να επιστρέφει int. Είναι η τιμή που επιστρέφει στο λειτουργικό σύστημα (ή τέλος πάντων στο πρόγραμμα που κάλεσε αυτή την main) και είναι καθορισμένο να είναι int. Αν δεν επιστρέψεις τιμή τότε επιστρέφεται ότι τυχαία τιμή υπάρχει σε κάποιον register που χρησιμοποιείται. Με λίγα λόγια είναι λάθος και αφού ξεκινάς τώρα, ξεκίνα σωστά.


Σωστά.
1 Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Προχωρημένος
2 Desktop : Ubuntu 16.04 64bit
a Intel Core i3 CPU 530 2.93GHz ‖ RAM 3824 MiB ‖ Intel DH55HC -
b nVidia Device [10de:1040] (rev a1)
c eth0: Intel 82578DC Gigabit Network Connection
3 Notebook : Ubuntu 16.04 64 bit
a Intel Core i3-2365M CPU @ 1.40GHz ‖ RAM 3854 MiB ‖ LENOVO 20197
b Intel 2nd Generation Core Processor Family Integrated Graphics Controller
c 5 wlan0: Intel Centrino Wireless-N 2230 ⋮ eth0: Realtek RTL8101E/RTL8102E

Αυτόματη υπογραφή.
Άβαταρ μέλους
konnn
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3568
Εγγραφή: 12 Ιούλ 2010, 17:54
Τοποθεσία: Καλαμάτα
Launchpad: konnn
Εκτύπωση

Re: Πρώτη ερώτηση αρχαρίου στην C για main()

Δημοσίευσηαπό lucinos » 05 Οκτ 2013, 18:40

Μπορείς να δεις την τιμή τής επιστροφής από την γραμμή εντολών
Κώδικας: Επιλογή όλων
echo $?

Σού δίνει αυτήν την τιμή για το πρόγραμμα που εκτελέστηκε τελευταίο

Η σύμβαση είναι να είναι 0 αν όλα πάνε καλά και διαφορετική αν υπήρξε κάποιο σφάλμα.

Όταν συνδέεις εντολές με && τότε η δεύτερη εκτελείται μόνο αν η πρώτη έδωσε 0

το
Κώδικας: Επιλογή όλων
return 0

μόνο του δεν είναι απολύτως σωστό γιατί δεν έγινε έλεγχος αν υπήρξε σφάλμα!
Spoiler: show
Γνώσεις → Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Μέτριος
Λειτουργικό → Ubuntu 11.04 natty 64-bit (el_GR.UTF-8)
Προδιαγραφές → CPU: 4x Intel Core i5 CPU 750 2.67GHz ‖ RAM 3953 MiB ‖ ASRock P55DE3
Κάρτες γραφικών: nVidia G92 [GeForce GTS 250] ⎨10de:0615⎬ (rev a2)
Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller ⎨10ec:8168⎬ (rev 03)
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Μαθήματα C