THMMY.gr

Ηλεκτρονικοί Υπολογιστές και Τεχνικά Θέματα => C / C++ / C# => Topic started by: Nessa NetMonster on May 28, 2008, 17:21:55 pm



Title: Εντολή system()
Post by: Nessa NetMonster on May 28, 2008, 17:21:55 pm
Έχω ξανασυναντήσει αυτό το πρόβλημα (βλ. topic "πρόγραμμα C που καλεί άλλο πρόγραμμα C"): Η εντολή system δε φαίνεται να εκτελείται. Για την ακρίβεια, δεν εκτελείται ούτε το παράδειγμα που υπάρχει στο help (αυτούσιο, copy-paste). Δουλεύω σε περιβάλλον Windows και χρησιμοποιώ τον compiler Turbo C. Μπορεί κάποιος να μου δώσει ένα παράδειγμα προγράμματος όπου η εντολή να εκτελείται ή να μου πει τι κάνω λάθος;

Το έτοιμο παράδειγμα είναι το εξής:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
   printf("About to spawn command.com and run a DOS command\n");
   system("dir");
   return 0;
}


Title: Re: Εντολή system()
Post by: chggr005 on May 28, 2008, 18:25:54 pm
nessa, γιατί δεν παίρνεις ένα καλό βιβλίο c++ να διαβάσεις?


Title: Re: Εντολή system()
Post by: Nessa NetMonster on May 28, 2008, 18:31:26 pm
Έχω βιβλίο, και έχω και το internet... αλλά πάλι δε βγάζω άκρη μερικές φορές.

Αν βέβαια ξέρεις κανένα βιβλίο ιδιαίτερα καλό και κατανοητό, πες μου.


Title: Re: Εντολή system()
Post by: chggr005 on May 28, 2008, 21:18:29 pm
Υπάρχει το βιβλίο C++ How to program του Deitel που θεωρείται η βίβλος της C++. Είναι διαθέσιμο στην Αλεξάνδρεια, μαζί με άλλα 132 βιβλία για C++. Διάλεξε και πάρε...


Title: Re: Εντολή system()
Post by: Nessa NetMonster on May 28, 2008, 21:42:42 pm
Ευχαριστώ!


Title: Re: Εντολή system()
Post by: Megawatt on May 28, 2008, 23:37:18 pm
Υπάρχει το βιβλίο C++ How to program του Deitel που θεωρείται η βίβλος της C++. Είναι διαθέσιμο στην Αλεξάνδρεια, μαζί με άλλα 132 βιβλία για C++. Διάλεξε και πάρε...
Εγω δεν ξερω κανεναν Deitel ....
Εγω ξερω οτι ο ΔΑΣΚΑΛΟΣ της C, C++ και Java  δεν ειναι αλλος απο τον Herbert Schildt...

παραδειγμα:
(http://img138.imageshack.us/img138/9205/cccir0.jpg)


Title: Re: Εντολή system()
Post by: Aurelius on May 29, 2008, 11:09:05 am
Έχω ξανασυναντήσει αυτό το πρόβλημα (βλ. topic "πρόγραμμα C που καλεί άλλο πρόγραμμα C"): Η εντολή system δε φαίνεται να εκτελείται. Για την ακρίβεια, δεν εκτελείται ούτε το παράδειγμα που υπάρχει στο help (αυτούσιο, copy-paste). Δουλεύω σε περιβάλλον Windows και χρησιμοποιώ τον compiler Turbo C. Μπορεί κάποιος να μου δώσει ένα παράδειγμα προγράμματος όπου η εντολή να εκτελείται ή να μου πει τι κάνω λάθος;

Το έτοιμο παράδειγμα είναι το εξής:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
   printf("About to spawn command.com and run a DOS command\n");
   system("dir");
   return 0;
}

Θα σου δωσω ενα πρακτικο παραδειγμα, με κωδικα που καλει την system για να δημιουργησει φακελους με βαση την ωρα:

string giveTimeAsString()
{
   time_t seconds;

   time (&seconds);
   struct tm * timeinfo = localtime(&seconds) ;
   string tim = asctime(timeinfo);

   size_t found = 0 ;
   
   do
   {
      unsigned int a = tim.find(' ', found);
      unsigned int b =tim.find(':', found);
      found = (a < b) ? a : b ;
      if(found != string::npos)tim[found] = '_' ;

   }while(found != string::npos) ;

   return tim.substr(0, tim.size() - 1) ;
}

και την καλεις μεσα σε μια συναρτηση ως εξης:

string tim1 = giveTimeAsString() ;
system(("mkdir "+temp_dir+"\\experiments\\"+tim1).c_str()) ;

οπου temp_dir ειναι ενα string οπου εχεις βαλει ενα path της επιλογης σου


Title: Re: Εντολή system()
Post by: Aurelius on May 29, 2008, 11:11:06 am
Αν εχεις καποια απορια πες το.


Title: Re: Εντολή system()
Post by: chggr005 on May 29, 2008, 13:14:40 pm
Υπάρχει το βιβλίο C++ How to program του Deitel που θεωρείται η βίβλος της C++. Είναι διαθέσιμο στην Αλεξάνδρεια, μαζί με άλλα 132 βιβλία για C++. Διάλεξε και πάρε...
Εγω δεν ξερω κανεναν Deitel ....
Εγω ξερω οτι ο ΔΑΣΚΑΛΟΣ της C, C++ και Java  δεν ειναι αλλος απο τον Herbert Schildt...
Από τον Schildt υπάρχουν 4 βιβλία για c++ στην Αλεξάνδρεια.


Title: Re: Εντολή system()
Post by: Nessa NetMonster on May 29, 2008, 15:48:10 pm
Μου βγάζει "undefined symbol 'string' in function main"


Title: Re: Εντολή system()
Post by: Aurelius on May 29, 2008, 15:53:56 pm
Εχεις κανει

#include <string>

???


Title: Re: Εντολή system()
Post by: Καμένος on May 29, 2008, 16:08:42 pm
μάλλον όχι...


Title: Re: Εντολή system()
Post by: Nessa NetMonster on May 29, 2008, 16:15:21 pm
Έχω κάνει #include <string.h>


Title: Re: Εντολή system()
Post by: Aurelius on May 29, 2008, 16:47:09 pm
Γραψε

#include <string>

using namespace std;

Παλι σου βγαζει  undefined symbol ?


Title: Re: Εντολή system()
Post by: Nessa NetMonster on May 29, 2008, 17:05:30 pm
Δε μπορώ να κάνω #include <string>, μόνο #include <string.h>.


Title: Re: Εντολή system()
Post by: Aurelius on May 29, 2008, 17:08:40 pm
To namespace το εχεις βαλει?


Title: Re: Εντολή system()
Post by: Nessa NetMonster on May 29, 2008, 17:18:39 pm
Το έβαλα, αλλά πάλι δεν αναγνωρίζει το string.


Title: Re: Εντολή system()
Post by: Καμένος on May 30, 2008, 10:41:05 am
Δε μπορώ να κάνω #include <string>, μόνο #include <string.h>.

Μάλλον γιατί γράφεις σε C και οχι C++...

Για πόσταρε τον κώδικα..


Title: Re: Εντολή system()
Post by: Nessa NetMonster on May 30, 2008, 10:44:20 am
#include <stdlib.h>
#include <stdio.h>
#include <string.h> using namespace std;

int main(void)
{
   string tim1 = giveTimeAsString() ;
   string temp_dir="c:" ;

   system(("md "+temp_dir+"\\experiments\\"+tim1).c_str()) ;

}

string giveTimeAsString()
{
   time_t seconds;

   time (&seconds);
   struct tm * timeinfo = localtime(&seconds) ;
   string tim = asctime(timeinfo);

   size_t found = 0 ;
   
   do
   {
      unsigned int a = tim.find(' ', found);
      unsigned int b =tim.find(':', found);
      found = (a < b) ? a : b ;
      if(found != string::npos)tim[found] = '_' ;

   }while(found != string::npos) ;

   return tim.substr(0, tim.size() - 1) ;
}


Title: Re: Εντολή system()
Post by: Καμένος on May 30, 2008, 11:00:17 am
και τι σφάλμα σου βγάζει στον παραπάνω κώδικα?


Title: Re: Εντολή system()
Post by: Nessa NetMonster on May 30, 2008, 11:05:45 am
Μου βγάζει "undefined symbol 'string' in function main"


Title: Re: Εντολή system()
Post by: Καμένος on May 30, 2008, 11:11:26 am
Λογικό. Στη C δεν υπάρχουν strings. Υπάρχουν συναρτήσεις για strings που εφαρμόζονται σε πίνακες με chars. Δές εδώ:

http://www.macdonald.egate.net/CompSci/hstrings.html

Αν θές να δηλώσεις μία μεταβλητή string, σημαίνει ότι την κάνεις ένα αντικείμενο της κλάσης string της C++. Η C δεν είναι αντικειμενοστρεφής..

Ελπίζω να τα λέω σωστά.. και να βοήθησα!


Title: Re: Εντολή system()
Post by: Nessa NetMonster on May 30, 2008, 11:16:38 am
Ευχαριστώ που το ξεκαθάρισες :)

ΟΚ, τότε γυρνάμε στο πρώτο πρόγραμμα (πρώτο ποστ)... αυτό γιατί δε δουλεύει; Τι πρέπει να κάνω για να μου εμφανίσει τον κατάλογο των αρχείων;


Title: Re: Εντολή system()
Post by: Aurelius on May 30, 2008, 11:29:38 am
Με την εντολη system? Κανε οπως εκανα το mkdir. Δηλαδη δινεις σε string ή σε char* τελος παντων την εντολη και το path. Για να σου εμφανισει καταλαογο αρχειων η συνταξη στο DOS ειναι

dir "path"

Αρα λογικα

string s1 = " dir \"cd c:\\nessa_path\" " ;
system(s1) ;

και δουλευει.

Το δοκιμασα σε μενα και δουλευει. Ο κωδικας μου ειναι

string tmp="dir \"C:\\hand_results\"" ;
system(tmp.c_str()) ;


Title: Re: Εντολή system()
Post by: Aurelius on May 30, 2008, 11:30:14 am
Προφανως αν δουλευεις οντως σε C (αληθεια γιατι δεν πας σε C++??)

θα βαλεις char*


Title: Re: Εντολή system()
Post by: Nessa NetMonster on May 30, 2008, 11:44:33 am
Εδώ:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{

   char  *d="dir \"C:\\TC\"";

   printf("About to spawn command.com and run a DOS command\n");
   system(d);
   return 0;
}


τι κάνω λάθος; :-\


Title: Re: Εντολή system()
Post by: Καμένος on May 30, 2008, 11:50:23 am
Δοκίμασε:

char d[11];

strcpy(d, "dir\"C:\\TC\"");

Και δήλωσε και τη string.h


Title: Re: Εντολή system()
Post by: Nessa NetMonster on May 30, 2008, 11:52:11 am
Άκυρο, δούλεψε χωρίς εισαγωγικά.

Το παράξενο είναι ότι όταν πηγαίνω στη γραμμή εντολών, ανοίγω τον Turbo C, τρέχω το πρόγραμμα από εκεί (compile+run) και ξαναβγαίνω, δεν έχει εκτελεστεί η dir, μόνο η printf. Πρέπει να τρέξω το exe από μόνο του για να εκτελεστεί η dir :???:


Title: Re: Εντολή system()
Post by: Aurelius on May 30, 2008, 12:26:40 pm
Εδώ:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{

   char  *d="dir \"C:\\TC\"";

   printf("About to spawn command.com and run a DOS command\n");
   system(d);
   return 0;
}


τι κάνω λάθος; :-\

Δεν δεσμευσες χωρο για το char* ???

Οταν λες χωρις εισαγωγικα?


Title: Re: Εντολή system()
Post by: Nessa NetMonster on May 30, 2008, 12:30:23 pm
Αυτό:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{

   char  *d="dir C:\\TC";

   printf("About to spawn command.com and run a DOS command\n");
   system(d);
   return 0;
}

δουλεύει.

Δε χρειάζεται να δεσμεύσω χώρο για το char, αφού του δίνω αρχική τιμή ;)