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

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

Δημοσ.
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(τραγικό!)).Πιστεύω να μη σας κούρασα. Θα εκτιμούσα οποιαδήποτε βοήθεια με βγάλει από το τέλμα. Ευχαριστώ.

Δημοσ.

Εξήγησε μας λίγο τι θέλεις να κάνεις: Πχ το 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.

Δημοσ.
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 που πρέπει να φτιάξω για να γίνει μια διαδικασία ( άσχετη με την ερώτησή μου).

Δημοσ.
6 λεπτά πριν, guitarist2 είπε

Το new_fd είναι accept() από socket και έρχεται μέσα σε ένα while(1) loop στη main, και πρέπει να το βάλω στην ουρά αναμονής ώστε να το πάρουν τα worker threads που πρέπει να φτιάξω για να γίνει μια διαδικασία ( άσχετη με την ερώτησή μου).

Σχετικά με τα υπόλοιπα που ανέφερα;

Δημοσ.
5 λεπτά πριν, kaliakman είπε

Σχετικά με τα υπόλοιπα που ανέφερα;

Τη παλεύω την ουρά εδώ και κάτι μέρες (προθεσμία για όλη την άσκηση είναι η Δευτέρα), οπότε η αναζήτηση online για βοήθεια είναι η τελευταία μου ελπίδα. Αλλιώς του χρόνου.

Δημοσ. (επεξεργασμένο)

Βελτίωσα λίγο την υλοποίηση μου και τελικά έχω αυτόν τον κώδικα με ένα μόνο πρόβλημα:

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' .

Επεξ/σία από guitarist2
Δημοσ.

Έχεις αγνοήσει τα περισόττερα που ανέφερα στην πρώτη απάντηση. Θα έλεγα να το ξανακοιτάξεις. Το πρόβλημα που έχεις το έχω αναφέρει και είναι ότι τις έχεις βάλει μέσα στην main σου.

Δημοσ.
22 λεπτά πριν, kaliakman είπε

Έχεις αγνοήσει τα περισόττερα που ανέφερα στην πρώτη απάντηση. Θα έλεγα να το ξανακοιτάξεις. Το πρόβλημα που έχεις το έχω αναφέρει και είναι ότι τις έχεις βάλει μέσα στην main σου.

Δοκίμασα και εκτός main και παίρνω πάρα πολλά undeclared.

Δημοσ.
5 λεπτά πριν, guitarist2 είπε

Δοκίμασα και εκτός main και παίρνω πάρα πολλά undeclared.

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

Διάβασε για scopes στην C

Δημοσ.
42 λεπτά πριν, kaliakman είπε

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

Διάβασε για scopes στην C

Έκανα μερικά declare κάποιες μεταβλητές πριν την main και δουλεύει. Τώρα πρέπει να επικεντρωθώ στο κυρίως κομμάτι της άσκησης και του μαθήματος  (multithreading).Ευχαριστώ για τη βοήθεια και που ανέχτηκες τις βλακείες μου. 

Δημοσ.

Καλό είναι εφόσον μιλάμε για μια απλή δομή δεδομένων κι όχι κάτι αντίστοιχο ενός module ή μιας κλάσης όπου στη java θα έβαζες τη main κει μέσα για να τη τρέξει, να βάλεις την υλοποίηση σε ένα ξεχωριστό source file που θα κάνεις link με το main αρχείο σου και να ορίσεις προσεκτικά μια διεπαφή σε header με τις συναρτήσεις όπου θα καλείς εξωτερικά (creation,deletion,push,pop κλπ) όπως και έναν typedef'd pointer που θα δείχνει στην ουρά σου.

 

Απλά μου ακούγεται παράξενο γιατί βλέπω μιλάς για sockets  και threads αν έχεις να κατασκευάσεις κάτι τέτοιο αλλά δυσκολεύεσαι με τέτοια θέματα έχεις κενά κατά τη γνώμη μου που πρέπει να φτιάξεις πρώτα.

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

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

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

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

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

Σύνδεση

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

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