M2000 Δημοσ. 7 Ιουνίου 2016 Δημοσ. 7 Ιουνίου 2016 Αφού ζητάει ένα πρόγραμμα και θέλει fork, σημαίνει ότι κάθε φορά που επιλέγεις μια από τις δυο κατηγορίες θα βγάζεις αντίγραφο με την fork, και το οποίο θα είναι όπως το αρχικό. Θα έχει επακριβώς τα ίδια αρχεία αρχεία (που είχε εκείνη τη στιγμή και τις μεταβλητές). Άρα από το σημείο του fork και μετά θα πρέπει στο βασικό να γυρίσεις στο μενού ενώ στο αντίγραφο να κάνεις τη διεργασία, πχ με την κινητή. κάθε πρόγραμμα καλεί τη fork() και παίρνει μια τιμή, αυτό που θα πάρει τιμή μη μηδενική είναι το πατρικό, το οποίο γυρνάει στο μενού, και το άλλο θα συνεχίσει στο επιλεγμένο. anon667, τι ζόρι τραβάς, ζήσε και άσε τους άλλους να ζήσουν...
_Gikoskos_ Δημοσ. 7 Ιουνίου 2016 Δημοσ. 7 Ιουνίου 2016 Τα ονόματα των εκτελέσιμων τα καθορίζεις εσύ, δεν παίζει κανέναν ουσιαστικό ρόλο δηλαδή, αρκεί να τα καλέσεις σωστά από το κυρίως πρόγραμμά σου χωρίς ορθογραφικά λάθη. Εδώ: ./ergasia1 –pr programmata –pe pelates –k kiniseis το εκτελέσιμο που εκτελείς είναι το ergasia1 και όλα τα υπόλοιπα είναι παράμετροι, δηλαδή ρυθμίσεις που περνάς στο πρόγραμμά σου. Τα προγράμματα σε γραφικό περιβάλλον έχουν κουμπιά, παράθυρα και διάφορα άλλα γραφικά για να τα ρυθμίζεις με πολύ απλό τρόπο, απλά πατώντας λίγα κλικ. Τα προγράμματα στην γραμμή εντολών δεν είναι τόσο φιλικά. Αντί για γραφικά, δέχονται τις λεγόμενες παραμέτρους (arguments ή parameters ή flags ή switches στα Windows). Για να περάσεις συγκεκριμένες ρυθμίσεις/παραμέτρους στο πρόγραμμά σου πρέπει να τις περάσεις σαν ξεχωριστές λέξεις/σύμβολα που διαχωρίζονται με κενά, μετά το όνομα του εκτελέσιμού σου. Κάποιες ρυθμίσεις ακολουθούνται και απο υπορυθμίσεις, δηλαδή αν γράψεις gcc main.c -o main.exe για να κάνεις compile το αρχείο πηγαίου κώδικα main.c, καλείς το πρόγραμμα gcc με παράμετρους το main.c, το -o και το main.exe. H παράμετρος -o είναι μία ειδική ρύθμιση που λέει στον compiler πως η παράμετρος που ακολουθάει είναι το όνομα του εκτελέσιμου που θα δημιουργήσει. Δηλαδή αν δώσεις σκέτο το -ο από μόνο του, δεν θα τρέξει η εντολή και θα σου βγάλει Σφάλμα. Κάποιες παράμετροι δουλεύουν με αυτόν τον τρόπο, δηλαδή διαβάζουν την παράμετρο μετά από αυτές και την ρυθμίζουν με τον αντίστοιχο τρόπο στο πρόγραμμα που εκτελείς. Ο καθηγητής σου σου λέει να υλοποιήσεις το ergasia1 έτσι ώστε να παίρνει 3 τέτοιες ειδικές παραμέτρους. Την -pr, την -pe και την -k, οι οποίες και οι τρεις διαβάζουν την επόμενη παράμετρο του προγράμματός σου και την ρυθμίζουν αντίστοιχα. Για να διαβάσεις τις παραμέτρους αυτές και να τις ρυθμίσεις αντίστοιχα στο πρόγραμμά σου, θα χρησιμοποιήσεις τις παράμετρους της main: int main (int argc, //argument count, δηλαδή το άθροισμα όλων των παραμέτρων που δόθηκαν char *argv[]) //argument vector, πίνακας συμβολοσειρών που περιέχουν τις παραμέτρους Μην ξεχνάς πως και το όνομα του προγράμματος θεωρείται παράμετρος. Δηλαδή αν τρέξεις το πρόγραμμά σου "./my_program" έτσι από μόνο του, θα ισχύει argc = 1 και argv[0] = "./my_program" Στο πρόγραμμα του καθηγητή σου "./ergasia1 –pr programmata –pe pelates –k kiniseis" ισχύει: argc = 8 και argv[0] = "./ergasia1", argv[1] = "-pr", argv[2] = "programmata" και πάει λέγοντας. Χρησιμοποιώντας τις παραμέτρους με αυτόν τον τρόπο θα μπορέσεις να ρυθμίσεις και το πρόγραμμά σου αντίστοιχα. Από εδώ και πέρα, κοίτα αυτήν την συνάρτηση για να διαβάζεις τις παραμέτρους στο πρόγραμμά σου εύκολα, αυτό το tutorial και το documentation της getopt. 1
M2000 Δημοσ. 7 Ιουνίου 2016 Δημοσ. 7 Ιουνίου 2016 http://stackoverflow.com/questions/21387349/how-does-the-fork-know-whether-it-is-in-child-process-and-in-parent-process να και για τη fork() τι κάνει κανείς!
ConstantinosNos Δημοσ. 7 Ιουνίου 2016 Μέλος Δημοσ. 7 Ιουνίου 2016 Κατάφερα να την τρέξω από τα Linux αλλά βγάζει πολλά σφάλματα και τώρα πρέπει να τα διορθώσω ένα-ένα.Προβλέπεται μεγάλο ξενύχτι.
ConstantinosNos Δημοσ. 8 Ιουνίου 2016 Μέλος Δημοσ. 8 Ιουνίου 2016 έπειτα από ώωωωωρες μου βγάζει μόνο 2 σφάλματα ergasia2.c:14:9: error: expected ‘)’ before ‘.’ token strcmp(s.phonenumber,phonenumber); ^ ergasia2.c: In function ‘searchrecords’: ergasia2.c:108:6: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration] if(strcmp(s.phonenumber,phonenumber)==0) και αυτός είναι ο κώδικας μετά από πολλές τροποποιήσεις και τις παρατηρήσεις : #include<stdio.h> #include<stdlib.h> struct subscriber { int phonenumber; float amount; }s; void addrecords(); void listrecords(); void modifyrecords(); void payment(); int strcmp(s.phonenumber,phonenumber); /error/ int main() { int password; char choice; printf("\n\t\t---TELECOMMUNICATION COMPANY SYSTEM---"); while (1) { printf("\n enter\n P : Prosthese neo arithmo.\n K : Katagrafh arithmwn"); printf("\n T : Tropopoihse arithmwn.\n P : Plhrwmh"); switch(choice) { case 'P': payment(); break; case 'A': addrecords(); break; case 'L': listrecords(); break; case 'M': modifyrecords(); break; case 'E': printf("\n\n\t\t\t\tEUXARISTOUME"); exit(0); break; default: printf("Lathos eisodos"); printf("\nPathste opoiodhpote koumpi gia na sunexisete"); } }; } void addrecords() { FILE *f; char test; f=fopen("c:/pelates_10.txt","ab+"); if(f==0) { f=fopen("c:/pelates_10.txt","wb+"); printf("Parakalw perimenete"); printf("/nPathste opoiodhpote koumpi gia na sunexisete"); } while(1) { printf("\n Plhktrologiste ton arithmo:"); scanf("%d",&s.phonenumber); printf("\n Plhktrologiste to poso:"); scanf("%f",&s.amount); fwrite(&s,sizeof(s),1,f); printf("1 To arxeio prostethike me epituxia"); printf("\n Press esc key to exit, any other key to add other record:"); if(test==27) break; } fclose(f); } void listrecords() { FILE *f; int i; if((f=fopen("c:/pelates_10.txt","rb"))==NULL) exit(0); printf("Phone Number\tAmount\n"); for(i=0;i<79;i++) printf("-"); printf("\n"); for(i=0;i<79;i++) printf("-"); fclose(f); } void searchrecords() { FILE *f; char phonenumber[20]; int flag=1; f=fopen("c:/pelates_10.txt","rb+"); if(f==0) exit(0); printf("Enter Phone Number to search in our database"); scanf("%s", phonenumber); while(fread(&s,sizeof(s),1,f)==1) { if(strcmp(s.phonenumber,phonenumber)==0) { printf(" Record Found "); printf("\n\nPhonenumber: %d \nAmount: Rs.%0.2f\n",s.phonenumber,s.amount); flag=0; break; } else if(flag==1) { printf("Requested Phone Number Not found in our database"); } } fclose(f); } void modifyrecords() { FILE *f; char phonenumber[9]; long int size=sizeof(s); if((f=fopen("c:/pelates_10.txt","rb+"))==NULL) exit(0); printf("Enter phone number of the subscriber to modify:"); scanf("%[^\n]",phonenumber); while(fread(&s,sizeof(s),1,f)==1) { if(strcmp(s.phonenumber,phonenumber)==0) /error/ { printf("\n Eisagete arithmo tilefwnou:"); scanf("%d",&s.phonenumber); printf("\n Eisagete poso: "); scanf("%f",&s.amount); fseek(f,-size,SEEK_CUR); fwrite(&s,sizeof(s),1,f); break; } } fclose(f); } void payment() { FILE *f; char phonenumber[20]; long int size=sizeof(s); float amt; int i; if((f=fopen("c:/pelates_10.txt","rb+"))==NULL) exit(0); printf("Enter phone number of the subscriber for payment"); scanf("%[^\n]",phonenumber); while(fread(&s,sizeof(s),1,f)==1) { if(strcmp(s.phonenumber,phonenumber)==0) { printf("\n Phone No.: %d",s.phonenumber); printf("\n Trexon poso: %f",s.amount); printf("\n"); for(i=0;i<79;i++) printf("-"); printf("\n\nEissagete to poso plirwmis :"); scanf(" %f",&amt); s.amount=s.amount-amt; fseek(f,-size,SEEK_CUR); fwrite(&s,sizeof(s),1,f); break; } } printf("Euxaristoume"); fclose(f); } καμία ιδέα;
Moderators Kercyn Δημοσ. 8 Ιουνίου 2016 Moderators Δημοσ. 8 Ιουνίου 2016 Τι ακριβώς παίρνει ως παραμέτρους η strcmp που έχεις γράψει; Αν το αφήσεις σήμερα και το κοιτάξεις αύριο θα δεις αμέσως το λάθος, φαντάζομαι τώρα είναι αργά και σου ξέφυγε μετά από τόσες ώρες.
_Gikoskos_ Δημοσ. 8 Ιουνίου 2016 Δημοσ. 8 Ιουνίου 2016 (επεξεργασμένο) Η δήλωση της strcmp ανήκει στο αρχείο κεφαλίδας string.h Απλά κάνε ένα #include <string.h> πάνω πάνω στο πηγαίο αρχείο κώδικα που καλεί αυτήν την συνάρτηση. Γενικά, σφάλματα του τύπου "implicit declaration of function ταδε" υποδηλώνουν πώς δεν κατάφερε να γίνει η διασύνδεση του προγράμματός σου με την συνάρτηση ταδε. Άρα ψάξε να δεις αν έχεις κάνει include τα σωστά αρχεία κεφαλίδας και αν κάνεις σύνδεση με την αντίστοιχη βιβλιοθήκη που υλοποιεί αυτήν την συνάρτηση. Στην περίπτωσή σου δεν χρειάζεται να κάνεις explicit σύνδεση με καμία βιβλιοθήκη γιατί οι συναρτήσεις του string.h ανήκουν στην στανταρ βιβλιοθήκη της C που γίνεται διασύνδεση αυτόματα από τον compiler στο πρόγραμμά σου. Απλά το μόνο που έλειπε ήταν η δήλωση της συνάρτησης strcmp, η οποία βρίσκεται στο αρχείο string.h Edit: Ξέχασα να αναφέρω πως το πρώτο σφάλμα που σου πετάει είναι επειδή κάνεις κλήση συνάρτησης (strcmp) έξω από συνάρτηση. Γενικά, στην C, έξω από συναρτήσεις δεν μπορείς να βάλεις προτάσεις όπως κλήσεις συναρτήσεων. Μόνο εντολές προεπεξεργαστή και διάφορες δηλώσεις global μεταβλητών/συναρτήσεων/δομών/κλάσεων κτλ επιτρέπονται σε C/C++ Επεξ/σία 8 Ιουνίου 2016 από _Gikoskos_ 1
groot Δημοσ. 8 Ιουνίου 2016 Δημοσ. 8 Ιουνίου 2016 Και όλα αυτά ενώ ο TS έχει ήδη λύση (όπως γράφει στο τίτλο του thread) και απλά ζητάει 2η γνώμη.
ConstantinosNos Δημοσ. 8 Ιουνίου 2016 Μέλος Δημοσ. 8 Ιουνίου 2016 στα windows έτρεχε κανονικά,στα linux υπήρχε τεράστιο θέμα.Δοκίμασα #include <string.h> αλλά τίποτα,γι αυτό έγραψα κι εδώ...Ευχαριστώ πάντως για τη βοήθεια
SIMkartaUK Δημοσ. 8 Ιουνίου 2016 Δημοσ. 8 Ιουνίου 2016 βάλε και κανα while not EOF.. try-catch.. να πάρεις επιπλέον πόντους.. Την strcmp δεν μπορείς να την χρησιμοποιήσεις χωρίς την header <string.h> όπως και πολλές άλλες έτοιμες συναρτήσεις (http://www.tutorialspoint.com/c_standard_library/string_h.htm) άσχετα το λειτουργικό σου..
_Gikoskos_ Δημοσ. 8 Ιουνίου 2016 Δημοσ. 8 Ιουνίου 2016 στα windows έτρεχε κανονικά,στα linux υπήρχε τεράστιο θέμα.Δοκίμασα #include <string.h> αλλά τίποτα,γι αυτό έγραψα κι εδώ...Ευχαριστώ πάντως για τη βοήθεια Διέγραψε την strcmp εκεί που την έχεις βάλει, και χρησιμοποίησέ την μέσα σε μία συνάρτηση. Δεν είναι legal η κλήση της εκεί που την έχεις βάλει. Αν δεν δουλέψει ούτε αυτό, γράψε τα σφάλματα που σου βγάζει.
SIMkartaUK Δημοσ. 8 Ιουνίου 2016 Δημοσ. 8 Ιουνίου 2016 τέτοια ώρα τέτοια λόγια αλλά αν μπορούσες να ρίξεις μιά ματιά στο e-Book "Advanced C" του Peter D. Hipson.. έχει πολλά παρόμοια παραδείγματα με αυτό που φτιάχνεις και αρκετά extra points για να κάνεις και εντύπωση.. άμα βρείς χρόνο ρίχτου μια ματιά.
kaliakman Δημοσ. 8 Ιουνίου 2016 Δημοσ. 8 Ιουνίου 2016 τέτοια ώρα τέτοια λόγια αλλά αν μπορούσες να ρίξεις μιά ματιά στο e-Book "Advanced C" του Peter D. Hipson.. έχει πολλά παρόμοια παραδείγματα με αυτό που φτιάχνεις και αρκετά extra points για να κάνεις και εντύπωση.. άμα βρείς χρόνο ρίχτου μια ματιά. Τώρα άμα στην πορεία γράψεις και πράγματα από άλλη γλώσσα μην αγχώνεσαι όλα καλά.. Άκου try catch. 2
_Gikoskos_ Δημοσ. 8 Ιουνίου 2016 Δημοσ. 8 Ιουνίου 2016 Τώρα άμα στην πορεία γράψεις και πράγματα από άλλη γλώσσα μην αγχώνεσαι όλα καλά.. Άκου try catch. Δεν παίρνω το μέρος κανενός σε αυτό το επιχείρημα και μάλλον ο SIMkartaUK δεν εννούσε αυτό που θα πω τώρα, αλλά στην C μπορείς να κάνεις exceptions σαν extension κάποιων compilers. Προσωπικά γνωρίζω πως με τον cl της Microsoft μπορείς να τρέξεις κανονικά κώδικα σαν αυτόν: #pragma comment(lib, "user32") #include <windows.h> int main (int argc, char* argv[]) { BYTE *tmp = NULL, c; int message_box_disposition; __try { c = *tmp; } __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION) { message_box_disposition = MessageBoxA(NULL, "Access violation to unaddressable memory was detected. " "Do you want to continue running the program?", "Segmentation fault!", MB_YESNO | MB_ICONWARNING); } if (message_box_disposition == IDYES) { int a = 5, b; __try { b = a / 0; } __finally { MessageBoxA(NULL, "Integer division by zero detected. " "Stop writing buggy code please!", "Division by 0!", MB_OK | MB_ICONERROR); } } exit(EXIT_SUCCESS); } και θα "πιάσει" κανονικά τα exceptions χωρίς πρόβλημα. Είναι κάτι σαν το try/catch της C++ απλά είναι λιγότερο φορητό και διαφέρει ελάχιστα στην υλοποίησή του (δεν δέχεται throw δηλαδή). Είναι χρήσιμο feature αν δεν θέλεις να τερματιστεί το πρόγραμμα κατευθείαν μετά από ένα exception, αλλά θα συνιστούσα καλύτερα να γράφετε σωστό κώδικα παρά να διαφεύγετε σε τέτοια hacks.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα