Προς το περιεχόμενο

κληση συναρτησης εν μεσω ροης προγραμματος σε C++


PCganster

Προτεινόμενες αναρτήσεις

καλησπερα σε ολους

εχω ενα προβλημα φιαχνω ενα προγραμμα σε C++ και χρεαζομαι σε ενα κομματι ο χρηστης να καλει μια συναρτηση με διαφρετικες παραμετρους αλλα πρεπει ο χρηστης να καλει οχι το προγραμμμα γινεται??

χιλια ευχαριστω

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

καλησπερα σε ολους

εχω ενα προβλημα φιαχνω ενα προγραμμα σε C++ και χρεαζομαι σε ενα κομματι ο χρηστης να καλει μια συναρτηση με διαφρετικες παραμετρους αλλα πρεπει ο χρηστης να καλει οχι το προγραμμμα γινεται??

χιλια ευχαριστω

Δεν ζητάς τίποτα τρελό. Αλλά αν θέλεις αναλτική απάντηση δώσε μας περισσότερες πληροφορίες...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

να σας πω

φιαχνω ενα προγραμμα το οπιο θα τρεχει εντολες cmd στο τερματικο των linux ετσι ωστε να κανω ακομα εναν λογο για να αλλαζουν οι χρηστες απο windows «σε linux

γινεται αρχκετα καλο αλλα θα ηταν φοβερης πολυπλοκοτητας αν εβαζα 200 με 300 else if αναλογα την παραμετρο  και νσε εντολες οπως ping ή shutdown -t{o xronos) δεν θα μπορουσα να μαντεψω με else if ποσα δευτερα θα εβαζε ο χρηστης.......θα ητραν συνεπως πιο ευκολο αμα εφιαχνα τις συναρυησεις με παραμετρους που θα οριζε ο χρηστης θα γινοταν εφικτο απο τελειως απιθανο

αυχαριστω για την γρηγορη απαντηση το απογευμα που θα μπω {εχω φροντιστηριο μαθηματικα :)} θα σας στειλω τον πηγαιο κωδικα για να τον δειτε εαν χρεαστει

και παλι ευχαριστω

Στέφανος

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτό που χρειάζεσαι φίλε μου είναι ένας αναλυτής αρχικά. Τι θα κάνει θα παίρνει ως είσοδο ένα string ότι έχει δώσει ο χρήστης και αυτό που θα κάνει είναι να σπάει/αναλύει την εντολή.

 

Επίσης δεν μπορείς να αποφύγεις τα if else. Θέλεις δεν θέλεις θα χρησιμοποιήσεις πάρα πολλά.

 

Θα σου ήταν χρήσιμο να ξέρεις οτι πχ. η cd δεν υλοποιείται κάπου άρα, μπορείς να χρησιμοποιήσεις την chdir() συνάρτηση αν θυμάμαι καλά και για εντολές όπως ls, date kok θα πρέπει να χρησιμοποιήσεις την exec() οικογένεια συναρτήσεων.

 

Googlare "C++ terminal implementation", αν έχεις επίσης κάποιο βιβλίο με λειτουργικά συστήματα θα έχει πολλά μέσα που μπορείς να χρησιμοποιήσεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορείς να έχεις έναν πίνακα με sysCommands  { "ver" , "date" , "exit",...}

Αν η command ανήκει στον πίνακα γράψε system(command)  για να μειώσεις τα if-else

 

Επίσης βάλτα σε loop αντί για (πολλές) goto.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορείς να έχεις έναν πίνακα με sysCommands  { "ver" , "date" , "exit",...}

 

idea.gif

 

#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;
}
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εγώ πιστεύω οτι δεν έχεις κάνει και τίποτα στον κώδικα απο θέμα υλοποίησησης :| Επίσης το έχεις αρχίσει λάθος κατα την γνώμη μου.

 

εγώ θα καθόμουν και θα έπαιρνα τις περιπτώσεις που υπάρχουν για τις διαφορετικές επιλογέ,

while(1) {
// display prompt
// get user input
// parsing and data storing
// if else and execution section
}
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορείς να έχεις έναν πίνακα με 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);
}
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...