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

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

Δημοσ.

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

εχω ενα προβλημα φιαχνω ενα προγραμμα σε 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

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

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

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

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

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

Σύνδεση

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

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