euler Δημοσ. 13 Μαρτίου 2011 Δημοσ. 13 Μαρτίου 2011 Γεια χαρα!! εχω ενα προτζεκτ να κανω για την σχολη μου και ενω το εχω ολοκληρωσει σχεδον ολο,αντιμετωπιζω ενα μικρο προβλημα. η ασκηση λεει οτι η κληση του προγραμματος θα πρεπει να ειναι της μορφης: progname -c C1 C2 -f file1 file2 -o fileoutput οποιος μπορει να μου πως γινεται αυτο γιατι εψαξα και δεν βρηκα τπτ παρομοιο.. μονο την συναρτηση getopt βρηκα αλλαδε ξερω.. ευχαριστω
Επισκέπτης Δημοσ. 13 Μαρτίου 2011 Δημοσ. 13 Μαρτίου 2011 Κοίτα η πλήρης σύνταξη της main είναι >int main(int argc, char* argv[]) Η μεταβλητή argc δείχνει τον αριθμό των ορισμάτων με τα οποία έχεις καλέσει το πρόγραμμα. Να ξέρεις πάντα μετράει και το όνομα του εκτελέσιμου. Δηλαδή στην περίπτωσή σου θες να καλείται το πρόγραμμα με 9 ορίσματα οπότε θα κάνεις έναν έλεγχο στην αρχή αν το argc είναι 9. Μετά κάθε όρισμα αποθηκεύεται ως string στον πίνακα argv. Δηλαδή αν καλέσω το πρόγραμμα ως εξής: progname -c C1 C2 -f file1 file2 -o fileoutput θα αποθηκευτεί στο argv[0] το string progname, στο argv[1] το -c, στο argv[2] το C1,κ.ο.κ.Χρησιμοποίησε αυτές τις πληροφορίες και δε θα ναι πολύ δύσκολο να βρεις τη λύση.
Evgenios1 Δημοσ. 13 Μαρτίου 2011 Δημοσ. 13 Μαρτίου 2011 >#define OPT_HAS_FILE (1) #define OPT_HAS_STAFF (1<<1) int options = 0; char path[MAX_PATH]; int staff = 0; int main(int argc,char* argv[]) { int i =0; if(argc >1) { for(i = 1; i<argc; i+=2) { if(!strcmp(argv[i],"-file")) { strcpy(path,argv[i+1]); options |= OPT_HAS_FILE; } else if(!strcmp(argv[i],"-staff")) { options |= OPT_HAS_STAFF; staff = atoi(argv[i+1]); } } } else { printf( "options:\n" " -file <filename> set a file\n" " -staff <num>\n" " 1: Dosomthing\n" " 2: Dosomthing else\n" ); return 0; } if(options & OPT_HAS_FILE) printf("file:%s\n",path); if(options & OPT_HAS_STAFF) printf("staff:%d\n",staff); return 0; } Αποτελεσμα > G:\>test options: -file <filename> set a file -staff <num> 1: Dosomthing 2: Dosomthing else G:\>test -file "g:\test.exe" file:g:\test.exe G:\>test -staff 2 staff:2 G:\>test -staff 2 -file "g:\te\te\te\te\e.yy" file:g:\te\te\te\te\e.yy staff:2 G:\>test -file "file" -staff 35 file:file staff:35 G:\>
euler Δημοσ. 13 Μαρτίου 2011 Μέλος Δημοσ. 13 Μαρτίου 2011 καταρχην ευχαριστω και τους δυο για τια απαντησεις σας.!! καταλαβα περιπου τι πρεπει να κανω,αλλα ο κωδικας του evgenios1 λιγο με μπερδεψε,δεν θα χρησιμοποιησω την συνρτηση getopt? εγω σκεφτηκα κατι με switch και case και με την συναρτηση atoi να περνει το προγραμμα τις τιμες των ακεραιων. αλλα για τα δυο αρχεια δεν ξερω ακομα.. αν μπορεις και θελεις εξηγησε μου λιγο τον κωδικα σου.. ευχαριστω και παλι!
Evgenios1 Δημοσ. 13 Μαρτίου 2011 Δημοσ. 13 Μαρτίου 2011 Οπως λεει και ο νικταμιας, το commandline χωριζεται με βαση τα spaces και παιρνανει μεσου του argv (με το 1 στοιχειο το ονομα του exe). Αρα αν το προγραμμα σου παιρνει options τυπου optionName optionValue εσυ πρεπει να βρεις το optionName μεσα στο argv οταν το βρεις θα ξερεις οτι το επομενο ειναι το optionValue
euler Δημοσ. 13 Μαρτίου 2011 Μέλος Δημοσ. 13 Μαρτίου 2011 ok νομιζω πως καταλαβα ομως με αυτα τι κανεις? και το |= τι σημαινει? options |= OPT_HAS_FILE; options |= OPT_HAS_STAFF;
parsifal Δημοσ. 13 Μαρτίου 2011 Δημοσ. 13 Μαρτίου 2011 Αυτά είναι bitwise operations, και στον κώδικα που έδωσε ο Evgenios1 τα χρησιμοποιεί για να [αποθηκεύει σε] και να [ανακτά από] μία μοναδική μεταβλητή (την int μεταβλητή options), περισσότερες από μία παραμέτρους τύπου on-off / true-false. Φαντάζομαι πως η λογική είναι αυτή της εξοικονόμησης μνήμης, αλλά θα μπορούσε η options ακόμη καλύτερα να είναι τύπου char (1 byte), αντί για int, αφού οι παράμετροι δεν είναι τόσες πολλές.
παπι Δημοσ. 13 Μαρτίου 2011 Δημοσ. 13 Μαρτίου 2011 ok νομιζω πως καταλαβα ομως με αυτα τι κανεις? και το |= τι σημαινει? options |= OPT_HAS_FILE; options |= OPT_HAS_STAFF; http://en.wikipedia.org/wiki/Mask_(computing) Σε περιπτωση που το προγραμμα δεν χρειαζεται ολα τα options για να δουλεψει . (μπορεις να βαλεις απλα BOOL πχ BOOL hasFile,hasStaff,has.... εδιτ με προλαβε ο παρισ)
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.