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

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

Ερώτηση

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

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

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

11 απαντήσεις σε αυτή την ερώτηση

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

  • 0

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

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

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

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

να σας πω

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

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

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

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

Στέφανος

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Δώσε κώδικα γιατί προσωπικά ακόμα δεν κατάλαβα τι ακριβώς θέλεις...

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

 

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

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

ευχαριστω για τις συμβουλες

ο πειραματικος κωδικας που εχω γραψει μεχρι τωρα ειναι ανεβασμενος εδω http://pastebin.com/vs9aYi6k

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

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

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Μπορείς να έχεις έναν πίνακα με 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;
}

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

while(1) {
// display prompt
// get user input
// parsing and data storing
// if else and execution section
}

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Μπορείς να έχεις έναν πίνακα με 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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

OK ευχαριστω...θα μελετησω οσα ηπατε και θα διορθωσω τα λαθη μου...ευχαριστω και παλι :)

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

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

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

Χρήσιμες πληροφορίες

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.