guitarist2 Δημοσ. 22 Μαρτίου 2018 Δημοσ. 22 Μαρτίου 2018 struct queue{ int a; //new_fd int b; //gettimeofday() }; int main(){ int head, tail; head = tail = -1; struct queue queue1[QUEUE_SIZE]; //other code void enqueue(struct queue queue1[]){ if ((head == 0 && tail == QUEUE_SIZE-1) ||(tail == head-1)){ printf("\nQueue is Full"); // full queue here return; } else if (head == -1) { // Insert First Element head = tail = 0; queue1[tail].a =new_fd; queue1[tail].b =gettimeofday(&tv,NULL); } else if (tail == QUEUE_SIZE-1 && head != 0){ tail = 0; queue1[tail].a =new_fd; queue1[tail].b =gettimeofday(&tv,NULL); } else{ tail++; queue1[tail].a =new_fd; queue1[tail].b =gettimeofday(&tv,NULL); } } int dequeue(){ struct queue ab; if (head == -1){ printf("\nQueue is Empty"); //empty queue here return 0; } int ab.a = queue1[head].a; int ab.b = queue1[head].b; queue1[head].a = -1; queue1[head].b = -1; if (head == tail){ head = -1; tail = -1; } else if (head == QUEUE_SIZE-1) head = 0; else head++; return ab; } } Έχω το παραπάνω κομμάτι κώδικα (εμπνευσμένο αλλά όχι αντιγραμμένο από εδώ: https://www.geeksforgeeks.org/circular-queue-set-1-introduction-array-implementation/ ) για μια υλοποίηση κυκλικής ουράςFIFO με πίνακα. Η ουρά αυτή χρειάζεται σε μια άσκηση πολυνημματικού server και παίρνει accept() ως πρώτο όρισμα,(και την ώρα ως δεύτερο).Ενώ σε ότι αφορά την κύρια άσκηση καταλαβαίνω τι πρέπει να κάνω, είμαι noobας σε C γιατί δεν είχα πάρει μάθημα προηγούμενου εξαμήνου . Ξέρω τι λάθη έχω περίπου(πχ η dequeue πρέπει να επιστρέφει struct και όχι int και online που έψαξα δεν κατάλαβα τις υλοποιήσεις τους για το πως γίνεται αυτό, ακόμα είμαι τόσο άσχετος από τη γλώσσα που δεν ξέρω πως να καλέσω τις enqueue,dequeue για την queue1(τραγικό!)).Πιστεύω να μη σας κούρασα. Θα εκτιμούσα οποιαδήποτε βοήθεια με βγάλει από το τέλμα. Ευχαριστώ.
kaliakman Δημοσ. 22 Μαρτίου 2018 Δημοσ. 22 Μαρτίου 2018 Εξήγησε μας λίγο τι θέλεις να κάνεις: Πχ το new_fd τι είναι και που ορίζεται; Κάποιες παρατηρήσεις: Αρχικά τις συναρτήσεις τις έχεις ορίσει μέσα στην main. Εννοώ αυτό υποηστηρίζεται σε κάποιες εκδόσεις του gcc δεν συνίσταται. Δεύτερον έχεις ονομάσει ένα struct queue και έχεις βάλει μέσα δυο πεδία. Εννοιολογικά αυτό δεν στέκει και μπερδεύει όποιον το δει. Αυτό που θες ενδεχομένως είναι ένα struct queueNode και να φτιάξεις ένα struct Queue που θα περιέχει πίνακα από queueNodes για να δημιουργήσεις ένα επίπεδο abstraction δηλαδή κάτι τέτοιο: #define QUEUE_MAX_SIZE 100 typedef struct queueNode{ int data; ... }QueueNode; typedef struct queue{ QueueNode arr[QUEUE_MAX_SIZE]; }Queue; Στο enqueue υπάρχει πλεονασμός στις δυό τελευταίες περιπτώσεις ενώ θα μπορούσε απλά να παίξεις με Modulo operator για να δημιουργήσεις "κύκλο". Kαι άλλα που μπορούν να αναπτυχθούν στην συνέχεια. Όπως το βλεπω ο κώδικας σου έχει πολλά λάθη που δεν θα έπρεπε να υπάρχουν πχ έχεις ονομάσει μεταβλητές χρησιμοποιώντας "." που απαγορεύται ή όπως λες δεν ξέρεις(ή χειρότερα δεν καταλαβαίνεις από άλλα παραδείγματα πως να αλλάξεις τον τύπο επιστροφής μιας συνάρτησης). Κατα συνέπεια ίσως πρέπει να ξανασκεφτείς αν πρέπει να κάνεις εργασία πολυνηματικού server σε C ή να περιμένεις να πάρεις κάποιο εισαγωγικό μάθημα προηγουμένως. Τα παραπάνω δεν τα λεω επιθετικά αλλά θέλω να είσαι σίγουρος/η ότι όντως μπορείς να κάνεις την εργασία/μάθημα/whatever.
guitarist2 Δημοσ. 22 Μαρτίου 2018 Μέλος Δημοσ. 22 Μαρτίου 2018 16 λεπτά πριν, kaliakman είπε Εξήγησε μας λίγο τι θέλεις να κάνεις: Πχ το new_fd τι είναι και που ορίζεται; Κάποιες παρατηρήσεις: Αρχικά τις συναρτήσεις τις έχεις ορίσει μέσα στην main. Εννοώ αυτό υποηστηρίζεται σε κάποιες εκδόσεις του gcc δεν συνίσταται. Δεύτερον έχεις ονομάσει ένα struct queue και έχεις βάλει μέσα δυο πεδία. Εννοιολογικά αυτό δεν στέκει και μπερδεύει όποιον το δει. Αυτό που θες ενδεχομένως είναι ένα struct queueNode και να φτιάξεις ένα struct Queue που θα περιέχει πίνακα από queueNodes για να δημιουργήσεις ένα επίπεδο abstraction δηλαδή κάτι τέτοιο: #define QUEUE_MAX_SIZE 100 typedef struct queueNode{ int data; ... }QueueNode; typedef struct queue{ QueueNode arr[QUEUE_MAX_SIZE]; }Queue; Στο enqueue υπάρχει πλεονασμός στις δυό τελευταίες περιπτώσεις ενώ θα μπορούσε απλά να παίξεις με Modulo operator για να δημιουργήσεις "κύκλο". Kαι άλλα που μπορούν να αναπτυχθούν στην συνέχεια. Όπως το βλεπω ο κώδικας σου έχει πολλά λάθη που δεν θα έπρεπε να υπάρχουν πχ έχεις ονομάσει μεταβλητές χρησιμοποιώντας "." που απαγορεύται ή όπως λες δεν ξέρεις(ή χειρότερα δεν καταλαβαίνεις από άλλα παραδείγματα πως να αλλάξεις τον τύπο επιστροφής μιας συνάρτησης). Κατα συνέπεια ίσως πρέπει να ξανασκεφτείς αν πρέπει να κάνεις εργασία πολυνηματικού server σε C ή να περιμένεις να πάρεις κάποιο εισαγωγικό μάθημα προηγουμένως. Τα παραπάνω δεν τα λεω επιθετικά αλλά θέλω να είσαι σίγουρος/η ότι όντως μπορείς να κάνεις την εργασία/μάθημα/whatever. Το new_fd είναι accept() από socket και έρχεται μέσα σε ένα while(1) loop στη main, και πρέπει να το βάλω στην ουρά αναμονής ώστε να το πάρουν τα worker threads που πρέπει να φτιάξω για να γίνει μια διαδικασία ( άσχετη με την ερώτησή μου).
kaliakman Δημοσ. 22 Μαρτίου 2018 Δημοσ. 22 Μαρτίου 2018 6 λεπτά πριν, guitarist2 είπε Το new_fd είναι accept() από socket και έρχεται μέσα σε ένα while(1) loop στη main, και πρέπει να το βάλω στην ουρά αναμονής ώστε να το πάρουν τα worker threads που πρέπει να φτιάξω για να γίνει μια διαδικασία ( άσχετη με την ερώτησή μου). Σχετικά με τα υπόλοιπα που ανέφερα;
guitarist2 Δημοσ. 22 Μαρτίου 2018 Μέλος Δημοσ. 22 Μαρτίου 2018 5 λεπτά πριν, kaliakman είπε Σχετικά με τα υπόλοιπα που ανέφερα; Τη παλεύω την ουρά εδώ και κάτι μέρες (προθεσμία για όλη την άσκηση είναι η Δευτέρα), οπότε η αναζήτηση online για βοήθεια είναι η τελευταία μου ελπίδα. Αλλιώς του χρόνου.
ajaxmonkey4hire Δημοσ. 23 Μαρτίου 2018 Δημοσ. 23 Μαρτίου 2018 queue implementation using stack: https://www.geeksforgeeks.org/queue-using-stacks/ queue implementation using array: https://www.geeksforgeeks.org/queue-set-1introduction-and-array-implementation/ another queue array implementation: https://www.tutorialspoint.com/data_structures_algorithms/queue_program_in_c.htm
guitarist2 Δημοσ. 23 Μαρτίου 2018 Μέλος Δημοσ. 23 Μαρτίου 2018 (επεξεργασμένο) Βελτίωσα λίγο την υλοποίηση μου και τελικά έχω αυτόν τον κώδικα με ένα μόνο πρόβλημα: typedef struct queue{ int a; //new_fd int b; //gettimeofday() }queue; void enqueue(struct queue queue123[]); queue dequeue(); int main() { int head, tail; head = tail = -1; queue queue1[QUEUE_SIZE]; while(1) { //other code enqueue(queue1); // auto edw exei problhma dequeue();// kai auto edw exei problhma } void enqueue(queue queue123[]){ if ((head == 0 && tail == QUEUE_SIZE-1) ||(tail == head-1)){ printf("\nQueue is Full"); // full queue here return; } else if (head == -1) { // Insert First Element head = tail = 0; queue1[tail].a =new_fd; queue1[tail].b =gettimeofday(&tv,NULL); } else if (tail == QUEUE_SIZE-1 && head != 0){ tail = 0; queue1[tail].a =new_fd; queue1[tail].b =gettimeofday(&tv,NULL); } else{ tail++; queue1[tail].a =new_fd; queue1[tail].b =gettimeofday(&tv,NULL); } } queue dequeue(){ queue ab; if (head == -1){ printf("\nQueue is Empty"); //empty queue here return ab; } ab.a = queue1[head].a; ab.b = queue1[head].b; queue1[head].a = -1; queue1[head].b = -1; if (head == tail){ head = -1; tail = -1; } else if (head == QUEUE_SIZE-1) head = 0; else head++; return ab; } } Την dequeue() προς το παρόν την αγνοώ. Το error είναι στο enqueue(queue1); : undefined reference to `enqueue' , ενώ την έχω δηλώσει κανονικά πιο πάνω. ***EDIT***την dequeue() την υλοποίησα έτσι και μου βγάζει το ίδιο λάθος στο compile : undefined reference to `dequeue' . Επεξ/σία 23 Μαρτίου 2018 από guitarist2
kaliakman Δημοσ. 23 Μαρτίου 2018 Δημοσ. 23 Μαρτίου 2018 Έχεις αγνοήσει τα περισόττερα που ανέφερα στην πρώτη απάντηση. Θα έλεγα να το ξανακοιτάξεις. Το πρόβλημα που έχεις το έχω αναφέρει και είναι ότι τις έχεις βάλει μέσα στην main σου.
guitarist2 Δημοσ. 23 Μαρτίου 2018 Μέλος Δημοσ. 23 Μαρτίου 2018 22 λεπτά πριν, kaliakman είπε Έχεις αγνοήσει τα περισόττερα που ανέφερα στην πρώτη απάντηση. Θα έλεγα να το ξανακοιτάξεις. Το πρόβλημα που έχεις το έχω αναφέρει και είναι ότι τις έχεις βάλει μέσα στην main σου. Δοκίμασα και εκτός main και παίρνω πάρα πολλά undeclared.
kaliakman Δημοσ. 23 Μαρτίου 2018 Δημοσ. 23 Μαρτίου 2018 5 λεπτά πριν, guitarist2 είπε Δοκίμασα και εκτός main και παίρνω πάρα πολλά undeclared. Και εδώ έρχεται αυτό που είπα. Δυστυχώς χωρίς να έχεις βάσεις για την γλώσσα δεν μπορείς να προχωρήσεις. Και δεν το λεω ειρωνικά/επιθετικά. Διάβασε για scopes στην C
guitarist2 Δημοσ. 23 Μαρτίου 2018 Μέλος Δημοσ. 23 Μαρτίου 2018 42 λεπτά πριν, kaliakman είπε Και εδώ έρχεται αυτό που είπα. Δυστυχώς χωρίς να έχεις βάσεις για την γλώσσα δεν μπορείς να προχωρήσεις. Και δεν το λεω ειρωνικά/επιθετικά. Διάβασε για scopes στην C Έκανα μερικά declare κάποιες μεταβλητές πριν την main και δουλεύει. Τώρα πρέπει να επικεντρωθώ στο κυρίως κομμάτι της άσκησης και του μαθήματος (multithreading).Ευχαριστώ για τη βοήθεια και που ανέχτηκες τις βλακείες μου.
the other one Δημοσ. 26 Μαρτίου 2018 Δημοσ. 26 Μαρτίου 2018 Καλό είναι εφόσον μιλάμε για μια απλή δομή δεδομένων κι όχι κάτι αντίστοιχο ενός module ή μιας κλάσης όπου στη java θα έβαζες τη main κει μέσα για να τη τρέξει, να βάλεις την υλοποίηση σε ένα ξεχωριστό source file που θα κάνεις link με το main αρχείο σου και να ορίσεις προσεκτικά μια διεπαφή σε header με τις συναρτήσεις όπου θα καλείς εξωτερικά (creation,deletion,push,pop κλπ) όπως και έναν typedef'd pointer που θα δείχνει στην ουρά σου. Απλά μου ακούγεται παράξενο γιατί βλέπω μιλάς για sockets και threads αν έχεις να κατασκευάσεις κάτι τέτοιο αλλά δυσκολεύεσαι με τέτοια θέματα έχεις κενά κατά τη γνώμη μου που πρέπει να φτιάξεις πρώτα.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα