PCganster Δημοσ. 11 Φεβρουαρίου 2013 Δημοσ. 11 Φεβρουαρίου 2013 καλησπερα σε ολους εχω ενα προβλημα φιαχνω ενα προγραμμα σε C++ και χρεαζομαι σε ενα κομματι ο χρηστης να καλει μια συναρτηση με διαφρετικες παραμετρους αλλα πρεπει ο χρηστης να καλει οχι το προγραμμμα γινεται?? χιλια ευχαριστω
goldenlion Δημοσ. 12 Φεβρουαρίου 2013 Δημοσ. 12 Φεβρουαρίου 2013 καλησπερα σε ολους εχω ενα προβλημα φιαχνω ενα προγραμμα σε C++ και χρεαζομαι σε ενα κομματι ο χρηστης να καλει μια συναρτηση με διαφρετικες παραμετρους αλλα πρεπει ο χρηστης να καλει οχι το προγραμμμα γινεται?? χιλια ευχαριστω Δεν ζητάς τίποτα τρελό. Αλλά αν θέλεις αναλτική απάντηση δώσε μας περισσότερες πληροφορίες...
PCganster Δημοσ. 13 Φεβρουαρίου 2013 Μέλος Δημοσ. 13 Φεβρουαρίου 2013 να σας πω φιαχνω ενα προγραμμα το οπιο θα τρεχει εντολες cmd στο τερματικο των linux ετσι ωστε να κανω ακομα εναν λογο για να αλλαζουν οι χρηστες απο windows «σε linux γινεται αρχκετα καλο αλλα θα ηταν φοβερης πολυπλοκοτητας αν εβαζα 200 με 300 else if αναλογα την παραμετρο και νσε εντολες οπως ping ή shutdown -t{o xronos) δεν θα μπορουσα να μαντεψω με else if ποσα δευτερα θα εβαζε ο χρηστης.......θα ητραν συνεπως πιο ευκολο αμα εφιαχνα τις συναρυησεις με παραμετρους που θα οριζε ο χρηστης θα γινοταν εφικτο απο τελειως απιθανο αυχαριστω για την γρηγορη απαντηση το απογευμα που θα μπω {εχω φροντιστηριο μαθηματικα } θα σας στειλω τον πηγαιο κωδικα για να τον δειτε εαν χρεαστει και παλι ευχαριστω Στέφανος
bird Δημοσ. 13 Φεβρουαρίου 2013 Δημοσ. 13 Φεβρουαρίου 2013 Δώσε κώδικα γιατί προσωπικά ακόμα δεν κατάλαβα τι ακριβώς θέλεις...
goldenlion Δημοσ. 13 Φεβρουαρίου 2013 Δημοσ. 13 Φεβρουαρίου 2013 Αυτό που χρειάζεσαι φίλε μου είναι ένας αναλυτής αρχικά. Τι θα κάνει θα παίρνει ως είσοδο ένα string ότι έχει δώσει ο χρήστης και αυτό που θα κάνει είναι να σπάει/αναλύει την εντολή. Επίσης δεν μπορείς να αποφύγεις τα if else. Θέλεις δεν θέλεις θα χρησιμοποιήσεις πάρα πολλά. Θα σου ήταν χρήσιμο να ξέρεις οτι πχ. η cd δεν υλοποιείται κάπου άρα, μπορείς να χρησιμοποιήσεις την chdir() συνάρτηση αν θυμάμαι καλά και για εντολές όπως ls, date kok θα πρέπει να χρησιμοποιήσεις την exec() οικογένεια συναρτήσεων. Googlare "C++ terminal implementation", αν έχεις επίσης κάποιο βιβλίο με λειτουργικά συστήματα θα έχει πολλά μέσα που μπορείς να χρησιμοποιήσεις.
PCganster Δημοσ. 13 Φεβρουαρίου 2013 Μέλος Δημοσ. 13 Φεβρουαρίου 2013 ευχαριστω για τις συμβουλες ο πειραματικος κωδικας που εχω γραψει μεχρι τωρα ειναι ανεβασμενος εδω http://pastebin.com/vs9aYi6k
albNik Δημοσ. 13 Φεβρουαρίου 2013 Δημοσ. 13 Φεβρουαρίου 2013 Μπορείς να έχεις έναν πίνακα με sysCommands { "ver" , "date" , "exit",...} Αν η command ανήκει στον πίνακα γράψε system(command) για να μειώσεις τα if-else Επίσης βάλτα σε loop αντί για (πολλές) goto.
παπι Δημοσ. 13 Φεβρουαρίου 2013 Δημοσ. 13 Φεβρουαρίου 2013 Μπορείς να έχεις έναν πίνακα με sysCommands { "ver" , "date" , "exit",...} #include <iostream> #include <string> #include <map> #include <vector> #include <functional> typedef std::function<void(const std::string&)> command; std::map<std::string,command> g_commands; void InitCommands() { g_commands["clearscreen"] = [](const std::string& args) -> void { system("cls"); }; g_commands["echo"] = [](const std::string& args) -> void { std::cout<<args; }; //etc... } void extractCommand(const std::string& input,std::string& cmd, std::string& args) { for(auto it = input.begin(); it!= input.end(); ++it) { if(*it == ' ') { args.assign(it,input.end()); break; } cmd.push_back(*it); } } int main(int argc, char **argv) { InitCommands(); for(; { std::string line,cmd,args; std::cout<<">"; std::getline(std::cin,line); if(line == "exit") break; extractCommand(line,cmd,args); auto func = g_commands[cmd]; if(func) func(args); else std::cout<<"unregistered command"<<cmd; std::cout<<std::endl; } return 0; }
goldenlion Δημοσ. 13 Φεβρουαρίου 2013 Δημοσ. 13 Φεβρουαρίου 2013 Εγώ πιστεύω οτι δεν έχεις κάνει και τίποτα στον κώδικα απο θέμα υλοποίησησης :| Επίσης το έχεις αρχίσει λάθος κατα την γνώμη μου. εγώ θα καθόμουν και θα έπαιρνα τις περιπτώσεις που υπάρχουν για τις διαφορετικές επιλογέ, while(1) { // display prompt // get user input // parsing and data storing // if else and execution section }
migf1 Δημοσ. 14 Φεβρουαρίου 2013 Δημοσ. 14 Φεβρουαρίου 2013 Μπορείς να έχεις έναν πίνακα με sysCommands { "ver" , "date" , "exit",...} Αν η command ανήκει στον πίνακα γράψε system(command) για να μειώσεις τα if-else Επίσης βάλτα σε loop αντί για (πολλές) goto. +1 Σε C τουλάχιστον ο πιο διαδεδομένος τρόπος για αυτές τις δουλειές είναι ένας πίνακας όπως ο παραπάνω, αλλά για κάθε εντολή να περιέχει και μια callback συνάρτηση (ενδεχομένως και τα expected arguments της εντολής), την οποία θα την καλείς αυτοματοποιημένα. Π.χ... #define NCOMMANDS 100 ... typedef struct SysCommand { int id; char *cmd; int (*callback)(char *argv[], void *userdata); ... }SysCommand; ... /* ---------------------------------- */ int do_dir( char *argv[], void *userdata) { int ret = -1; ... ret = system("ls"); ... return ret; } /* ---------------------------------- */ int syscmd_lookup( SysCommand sysCommands[], char *cmd ) { int i; ... /* sanity checks, etc*/ for (i=0; i < NCOMMANDS; i++) if ( i == sysCommands[i].id ) return i; return -1 } /* ---------------------------------- */ int main( int argc, char *argv[]) { SysCommand sysCommands[NCOMMANDS] = { {0, "dir", &do_dir}, ... {100, "exit", NULL} }; int cmdId = -1; ... for (; { read_cmd( cmd, args ); if ( 0 == strcmp(cmd, sysCommands[100].cmd) ) break; cmdId = syscmd_lookup(sysCommands, cmd); if ( -1 == cmdId ) { fputs( "unknown command", stderr ); continue; } sysCommands[cmdId].callback( args, userdata ); } ... exit(EXIT_SUCCESS); } 1
PCganster Δημοσ. 19 Φεβρουαρίου 2013 Μέλος Δημοσ. 19 Φεβρουαρίου 2013 OK ευχαριστω...θα μελετησω οσα ηπατε και θα διορθωσω τα λαθη μου...ευχαριστω και παλι
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα