τι περιέχει αυτό το κεφάλαιο...
Όπως είχαμε πεί και στην εισαγωγή η main δεν είναι τίποτα άλλο απο μια συνάρτηση. Γνωρίζουμε οτι κάθε συνάρτηση παίρνει ορίσματα, έτσι και η main μπορεί να παρει ορίσματα με λίγο διαφορετικό τρόπο. Δεν θα έλεγα οτι είναι δύσκολος αλλα λίγο διαφορετικός! Καταρχήν τα ορίσματα αυτά θα τα δώσουμε απο το τερματικό απο όπου και θα εκτελέσουμε το πρόγραμμά μας. Τώρα, τα ορίσματά της είναι τα: argc, argv[].
Το argc είναι ένας ακέραιος και το argv[] ένας πίνακας. Δεν επιτρέπεται να βάλετε κάτι άλλο όπως μια μεταβλητή που έχετε στο πρόγραμμα. Ότιδήποτε θέλετε να περάσετε στο πρόγραμμα θα το περνάτε μέσω argv[]. Πως? Σκεφτείτε οτι το argv είναι πίνακας και έτσι μπορείτε σε κάθε κελί να έχετε και μια μεταβλητη-όρισμα! Ας δούμε τώρα πως μπορεί κάποιος να το κάνει.
Αντί να γράφετε στον κώδικα σας,
- Κώδικας: Επιλογή όλων
main(){
...
}
θα πρέπει να βάζετε και τα ορίσματα της main ώς εξής,
- Κώδικας: Επιλογή όλων
main(int argc, char *argv[]){
...
}
ή
- Κώδικας: Επιλογή όλων
main(int argc, char argv[][]){
...
}
Προτιμήστε τον πρώτο τρόπο!
Ας δούμε τώρα αναλυτικά τί είναι το καθένα...
- Κώδικας: Επιλογή όλων
argc: Η μεταβλητή αυτή είναι ίση με τα ορίσματα που έχουμε δώσει.
Για παράδειγμα,
- Κώδικας: Επιλογή όλων
argc = 5 -> a.out 32 koutia ston aera
- Κώδικας: Επιλογή όλων
argc = 7 -> a.out 2 kai 3 mas kanei 5
- Κώδικας: Επιλογή όλων
argc = 3 -> a.out 4 5
- Κώδικας: Επιλογή όλων
argv[ ]: Δείτε στον παρακάτω πίνακα.
έστω οτι δίνουμε, a.out manolis 32 poulia , γραφικά μπορούμε να το σχηματίσουμε κάπως έτσι:
Off topic:
Κανονικά το παρακάτω θα πρέπει να εμφανιστεί σε πίνακα, αλλα τέλοςπάντων. Μόλις μάθω θα το φτιάξω! Υπομονή..
argc = 6
argv[0] = ./a.out
argv[1] = manolis
argv[2] = 32
argv[3] = pouli
σαν έναν πίνακα δηλαδή που για να προσπελάσουμε ένα κελί χρησιμοποιούμε το όνομα του πίνακα και τον αριθμό του κελιού όπως, πχ argv[2], argv[5], argv[0].
για παράδειγμα,
- Κώδικας: Επιλογή όλων
/* How to use argc, argv[ ] */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
printf("argc: %d\n", argc);
printf("argv[0]: %s\n", argv[0]);
printf("argv[1]: %s\n", argv[1]);
printf("argv[2]: %s\n", argv[2]);
return 0;
}
κάντε compile και τρέξτε το παραπάνω πρόγραμμα δίνοντας μαζί με το a.out κάποια ορίσματα χωρισμένα με space όπως,
- Κώδικας: Επιλογή όλων
a.out 32 koutia me 10 mpales
ΣΥΧΝΟ ΛΑΘΟΣ: Εάν χρησιμοποιείσετε σωστά τα argc, argv[ ], κάνετε compile και μετά δώσατε την εντόλη a.out ή ./a.out θα έχετε την εξής συνέπεια: Segmentation Fault! Γιατί? Γιατί, θα πρέπει να κάνετε κάτι σαν το παρακάτω:
- Κώδικας: Επιλογή όλων
a.out manolis 32 poulia ston aera ή ./a.out manolis 32 poulia ston aera
θα έπρεπε δηλαδή να βάλετε και ορίσματα μετά το a.out ή ./a.out.
Έλεγχος
Δεν είναι απαραίτητος αλλα καλό είναι να τον βάζουμε στην αρχή του προγράμματος μας! Σε περίπτωση που γίνουν όλα σωστά δεν υπάρχει θέμα γιατί είναι όλα οκ! Σε περίπτωση όμως που κάνουμε κάποιο λάθος όπως να μην δώσουμε καθόλου ορίσματα τότε οκ θα πετάξει Segmentation fault αλλα είμαστε σίγουροι οτι είναι απο αυτό και όχι απο κάτι άλλο? Προφανώς οχι!!! Και ή λύση είναι σε κάποιο σημείο στην αρχή του προγράμματτος μας βάζουμε τον εξής κώδικα:
- Κώδικας: Επιλογή όλων
if(argc != 2){
printf("Error in argv!\n");
exit(1);
}
Δεν είναι ο μόνος έλεγχος που μπορεί να γίνει!
Έτσι μπορούμε να εξετάουμε αν η είσοδος είναι διαφορετική απο δύο! Δηλαδή, αν εκτός το ./a.out που πληκτρολογήσαμε δώσαμε και άλλο ένα όρισμα. Σε περίπτωση που δώσαμε μόνο ένα όρισμα μετά του ./a.out θα συνεχίσει κανονικά ο κώδικας. Σε αντίθετη περίπτωση θα εκτυπωθεί ένα μύνημα σφάλματος. Για παράδειγμα αν θέλει κάποιος να δώσει οπωςδήποτε 4 ορίσματα θα έχει τον εξής έλεγχο:
- Κώδικας: Επιλογή όλων
if(argc != 5){ /* 4 ορίσματα και ένα το ./a.out = 5 ορίσματα! */
printf("Error in argv!\n");
exit(1);
}
Χρήση της παραμέτρου
Κάποια στιγμή θα περάσουμε τον έλεγχο, οπότε θα έρθει η ώρα να χρησιμοποιήσουμε το όρισμα που δώσαμε! Σωστά? Ένα συχνό και πολύ δύσκολο να εντοπιστεί να δεν το γνωρίζει κάποιος είναι το εξής:
Εάν περάσετε μια παράμετρο πχ. 4 και μετά προσπαθήσετε να κάνετε x = argv[1] + 2; αυτό που θα περιμένατε είναι το 6. Δεν θα εμφανιστεί αυτό όμως!
Καταρχήν στο παραπάνω παράδειγμα, η πράξη που έκανα είναι απολύτως λογική γιατί στο argv[0](1ο κελί του πίνακα argv[]) βρίσκεται το "./a.out" και στην δεύτερη θέση το 4. Άρα ως πράξη είναι λογικη! Ο πίνακας όμως μέσα έχει strings. Τι σημαίνει αυτό? το 4 ναι μεν είναι ακέραιος αριθμός-integer αλλα στο πρόγραμμά μας έχει περαστεί ως string. Έτσι μόλις περάσουμε τον έλεγχο θα πρέπει να καταναλώσουμε άλλη μια γραμμή για να τον κάνουμε πάλι ακέραιο! Πώς? Με χρήση της συνάτησης atoi(). Η atoi έιναι μια συνάρτηση που επιστρέφει ένα ακέραιο! Όπως το 4 στο παραδειγμά μας! Χρησιμοποιείτε ως εξής:
- Κώδικας: Επιλογή όλων
atoi(argv[number]); /* όπου Number θα βάλετε το νούμερο του πίνακα πχ. 1, 2, κτλ */
Στο συγκεριμένο παράδειγμα θα έπρεπε να χρησιμοποιήσουμε,
- Κώδικας: Επιλογή όλων
int value;
value=atoi(argv[1]);
Έτσι έχουμε ως αποτέλεσμα η μεταβλητή value να περιέχει το όρισμα που δώσαμε που ήταν το 4!
-ΚΑΛΗ ΣΥΝΕΧΕΙΑ!!!- ΓΙΑ ΑΠΟΡΙΕΣ-ΕΡΩΤΗΣΕΙΣ-ΔΙΟΡΘΩΣΕΙΣ ΜΗΝ ΔΙΣΤΑΣΕΤΕ ΝΑ ΚΑΝΕΤΕ POST