nickppfts Δημοσ. 26 Δεκεμβρίου 2013 Δημοσ. 26 Δεκεμβρίου 2013 Καλησπέρα και καλες γιορτές!Γραφω ενα προγραμμα σε C στο οποιο θελω κατα την εκτελεση του ο χρηστης να μπορει να δωσει μια εντολη τυπου:function orisma1 orisma2 orisma3.... orismaNκαι να καλεσει με αυτον τον τροπο την συναρτηση function με ορισματα τα orisma1,orisma2 κτλΕυχαριστω εκ των προτερων για την βοηθεια σας!
Moderators Kercyn Δημοσ. 26 Δεκεμβρίου 2013 Moderators Δημοσ. 26 Δεκεμβρίου 2013 Χρειάζεται να κάνεις parse το μήνυμα που θα σου δώσει ο χρήστης και στη συνέχεια να επιλέξεις ποια συνάρτηση θα κληθεί (με πολλαπλά IFs). Δηλαδή αν εγώ γράψω "function1 arg1 arg2", το πρόγραμμα να χωρίζει αυτό που έγραψα σε "function1", "arg1" και "arg2". Στη συνέχεια, το πρόγραμμα να μπαίνει στο if που αντιστοιχεί στο function1 και αφού κάνει τα κατάλληλα casts στα arguments, να καλεί την function1. 1
παπι Δημοσ. 27 Δεκεμβρίου 2013 Δημοσ. 27 Δεκεμβρίου 2013 Ουσιαστικα θες ενα script. Δηλαδη 3 σταδια, 1 binds 2 parse 3 evaluate. Ενα πχ σε c++ για προφανεις λογους. typedef std::vector<std::string> Args; typedef std::string (*Function)(const Args& args); std::map<std::string,Function> functionMap; //bind stage std::string BindPow(const Args& args) { double base = atof( args[0].c_str() ); double exp = atof( args[1].c_str() ); double result; result = std::pow(base,exp); //native return std::to_string(result); } std::string BindPrint(const Args& args) { for(size_t i = 0; i < args.size(); i++) std::cout<< args[i]; return "<void>"; } std::string BindSin(const Args& args) { double r = atof(args[0].c_str()); double result; result = std::sin(r); //native call return std::to_string(result); } // parse & evaluate stage void LetUserCall() { std::string input; std::getline(std::cin,input); std::stringstream ss(input); std::string funcName; Args args; //format: functionName arg1 arg2 argN ss>> funcName;// read functionName while(ss) { std::string arg; ss>>arg; // read arg args.push_back(arg); } //find func in functiontable auto func = functionMap.find(funcName); if(func != functionMap.end()) // if found { std::string result = func->second(args); // call with args std::cout<<result<<std::endl; // print result } else std::cout<<"Fail"<<std::endl; } int main() { //init binds functionMap["pow"] = BindPow; functionMap["print"] = BindPrint; functionMap["sin"] = BindSin; while(1) LetUserCall(); return 0; } output print 121323 121323<void> print hello hello<void> pow 1 1 1.000000 pow 2 2 4.000000 pow 3 2 9.000000 pow 4 2 16.000000 sin 3.1415 0.000093
migf1 Δημοσ. 27 Δεκεμβρίου 2013 Δημοσ. 27 Δεκεμβρίου 2013 Αν επιτρέπεται, ποιος είναι ο λόγος τέτοιου είδους λειτουργικότητας στο πρόγραμμά σου;
nickppfts Δημοσ. 27 Δεκεμβρίου 2013 Μέλος Δημοσ. 27 Δεκεμβρίου 2013 Ουσιαστικα θες ενα script. Δηλαδη 3 σταδια, 1 binds 2 parse 3 evaluate. Ενα πχ σε c++ για προφανεις λογους. typedef std::vector<std::string> Args; typedef std::string (*Function)(const Args& args); std::map<std::string,Function> functionMap; //bind stage std::string BindPow(const Args& args) { double base = atof( args[0].c_str() ); double exp = atof( args[1].c_str() ); double result; result = std::pow(base,exp); //native return std::to_string(result); } std::string BindPrint(const Args& args) { for(size_t i = 0; i < args.size(); i++) std::cout<< args[i]; return "<void>"; } std::string BindSin(const Args& args) { double r = atof(args[0].c_str()); double result; result = std::sin(r); //native call return std::to_string(result); } // parse & evaluate stage void LetUserCall() { std::string input; std::getline(std::cin,input); std::stringstream ss(input); std::string funcName; Args args; //format: functionName arg1 arg2 argN ss>> funcName;// read functionName while(ss) { std::string arg; ss>>arg; // read arg args.push_back(arg); } //find func in functiontable auto func = functionMap.find(funcName); if(func != functionMap.end()) // if found { std::string result = func->second(args); // call with args std::cout<<result<<std::endl; // print result } else std::cout<<"Fail"<<std::endl; } int main() { //init binds functionMap["pow"] = BindPow; functionMap["print"] = BindPrint; functionMap["sin"] = BindSin; while(1) LetUserCall(); return 0; } output print 121323 121323<void> print hello hello<void> pow 1 1 1.000000 pow 2 2 4.000000 pow 3 2 9.000000 pow 4 2 16.000000 sin 3.1415 0.000093 ευχαριστω πολυ παπι!! Αν επιτρέπεται, ποιος είναι ο λόγος τέτοιου είδους λειτουργικότητας στο πρόγραμμά σου; χμμ..βασικα δεν υπαρχει καποιο προγραμμα με συγκεκριμενες προδιαγραφες και λειτουργικοτητες...δοκιμες κανω
migf1 Δημοσ. 27 Δεκεμβρίου 2013 Δημοσ. 27 Δεκεμβρίου 2013 ... χμμ..βασικα δεν υπαρχει καποιο προγραμμα με συγκεκριμενες προδιαγραφες και λειτουργικοτητες...δοκιμες κανω Α οκ, γιατί διαβάζοντας το αρχικό σου ποστ το μυαλό μου πήγε σε closures, που δεν υποστηρίζονται στη στάνταρ C. Εφόσον δεν πρόκειται για closures ή κάτι παραπλήσιο, δεν μπορώ να σκεφτώ αυτή τη στιγμή για ποιο λόγο ο χρήστης ενός προγράμματος χρειάζεται να γνωρίζει τα εσωτερικά ονόματα των συναρτήσεων και τα ορίσματα που παίρνει η κάθε μια, πόσο μάλλον να τα χρησιμοποιεί κιόλας ως input του προγράμματος. Ο κανόνας είναι να παρουσιάζουμε στον χρήστη μενού επιλογών, με την καθεμιά τους να ζητάει έξτρα input (αν χρειάζεται) κι ανάλογα ποια επιλογή θα διαλέξει ο χρήστης και τι input θα μας δώσει για αυτή την επιλογή, να καλούμε εμείς εσωτερικά την ή τις συναρτήσεις που έχουμε προγραμματίσει για αυτή την επιλογή.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα