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

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

Δημοσ.

Καλησπέρα, έχω έναν buffer 500 θέσεων, και θέλω να τον μοιράσω σε 8 μικρότερους 64 θέσεων. 

Θέλω να γίνει πχ από 1 εως 64 του buffer να πάει σε έναν μικρότερο από 65 εως 128 να πάει σε έναν άλλο κτλπ. Έχω βρει κάποιες συναρτήσεις αλλά χωρίς να μπορώ να μεταφέρω τμηματικά κομμάτια του buffer. 

  • Απαντ. 38
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Δημοσ.

Πως έχεις σκεφτεί ότι πρέπει να δουλεύει;

Για δοκίμασε με χαρτί και μολύβι και περιέγραψέ το μας.

 

EDIT: Ποια είναι η λογική μοιρασιάς; Ποια είναι τα δεδομένα σου; Ποια από αυτά ξέρεις πριν το run-time; Το ρωτάω γιατί 8 * 64 = 512 > 500. Αν δεν πρόκειται για κάποιο γενικό αλγόριθμο και τα δεδομένα που χρειάζεσαι είναι αυτά που ανέφερες, τότε it isn't get any easier.

Δημοσ.

Λαμβάνω ασύρματα κάποια δεδομένα σίγουρα λιγότερα από 500 και τα χωρίζω σε 64 γιατί τα στέλνω μέσω usb sto pc. Μπορώ να στείλω μόνο μέχρι 64 bit την φορά, αν και αυτό πρέπει λίγο να το ψάξω, και δεν με νοιάζει αν χαθούν κάποια γιατί λογικά είναι μηδενικά. Θέλω απλά να χωρίσω τον buffer σε τμήματα. Εκτός και αν μπορώ να κάνω κάτι πχ buffer[0-64] και να το στέλνω έτσι τμηματικά. 

Δημοσ.

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

 

Στη χειρότερη περίπτωση μπορείς να έχεις τον αρχικό σου buffer και να φτιάξεις και έναν δεύτερο με το επιθυμιτό μήκος. Έπειτα με έναν memcpy να περνάς (π.χ. τα 64 bytes) και ταυτόχρονα να αυξάνεις κάποιο δείκτη για το Index του αρχικού buffer.(πολλύ προσοχή αν είναι μεταβλητό το μήκος του αρχικού buffer γιατί θα βγαίνεις εκτός index και δεν θα το βρίσκει και ο compiler..)

Δημοσ.

ένας δείκτης για τον υπό-buffer και ένας δείκτης δρομέας πάνω σε αυτόν. 

 

επιστρέφεις τον πρώτο και με τον δεύτερο αντιγράφεις δεδομένα. 


Ξέρεις ( ; ) τι δεδομένα έχεις οπότε μπορείς να υπολογίζεις πόσο θα κινηθεί ο δείκτης δρομέας. 

 

Μόλις γεμίσει τον περνάς στην "send" που έχεις. 


Αλλά.... εφόσον έχεις ήδη τον αρχικό γιατί δεν κάνεις ένα απλό memcpy; 

 

Η εφαρμογή για την λήψη απλά θα ενώσει τα δεδομένα και είσαι ΟΚ... σαν να είχες τον αρχικό. 

Δημοσ.

Η memcpy ήταν από αυτές που βρήκα απλά δεν βρήκα πως να κάνω αντιγραφή τμηματικά τον buffer. Δηλαδή πως θα του πω να αντιγράψει από το 65 μέχρι το 128? 

 

Βλέπω ότι η memcpy δηλώνετε έτσι 

 

void * memcpy ( void * destination, const void * source, size_t num );

 

το num είναι ο αριθμός των byte που θα μεταφερθούν. Παίρνει και άλλες παραμέτρους? 

 

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

 

Στη χειρότερη περίπτωση μπορείς να έχεις τον αρχικό σου buffer και να φτιάξεις και έναν δεύτερο με το επιθυμιτό μήκος. Έπειτα με έναν memcpy να περνάς (π.χ. τα 64 bytes) και ταυτόχρονα να αυξάνεις κάποιο δείκτη για το Index του αρχικού buffer.(πολλύ προσοχή αν είναι μεταβλητό το μήκος του αρχικού buffer γιατί θα βγαίνεις εκτός index και δεν θα το βρίσκει και ο compiler..)

 

Το σπάω γιατί ο buffer της usb δεν παίρνει πάνω από 64 byte την φορά. 

Και με την memcpy αν κάνω πχ 

 

memcpy ( 64bytebuffer, 500bytebuffer, 64 );

 

θα μου αντιγράψει τα πρώτα 64. Τα υπόλοιπα? 

Δημοσ.

Η memcpy ήταν από αυτές που βρήκα απλά δεν βρήκα πως να κάνω αντιγραφή τμηματικά τον buffer. Δηλαδή πως θα του πω να αντιγράψει από το 65 μέχρι το 128? 

 

Βλέπω ότι η memcpy δηλώνετε έτσι 

 

το num είναι ο αριθμός των byte που θα μεταφερθούν. Παίρνει και άλλες παραμέτρους? 

 

Μπορείς να περάσεις στην παράμετρο source, τη διεύθυνση της θέσης 65.

Δημοσ.

Βλέπω ότι η memcpy δηλώνετε έτσι 

 

το num είναι ο αριθμός των byte που θα μεταφερθούν. Παίρνει και άλλες παραμέτρους? 

Όχι , τί άλλες να παίρνει; Αφού βλέπεις πως είναι η δήλωση της...

 

Στο dest βάζεις τη διεύθυνση μνήμης του buffer[64],στο source τη διεύθυνση του i-στου byte και στο num 64.

Δημοσ.

Και με την memcpy αν κάνω πχ 

 

memcpy ( 64bytebuffer, 500bytebuffer, 64 );

 

θα μου αντιγράψει τα πρώτα 64. Τα υπόλοιπα?


Όχι , τί άλλες να παίρνει; Αφού βλέπεις πως είναι η δήλωση της...

Στο dest βάζεις τη διεύθυνση μνήμης του buffer[64],στο source τη διεύθυνση του i-στου byte και στο num 64.

 

Δηλαδή με pointers??? 

Δημοσ.

 

Και με την memcpy αν κάνω πχ 

 

memcpy ( 64bytebuffer, 500bytebuffer, 64 );

 

θα μου αντιγράψει τα πρώτα 64. Τα υπόλοιπα?

 

Δηλαδή με pointers??? 

 

 

Ναι.. με σημειογραφία pointers (γιατί οι πίνακες δεν είναι pointers).

Δημοσ.

Κάνε το buffer σου 512 (αντί για 500) που διαιρείται με το 64 και μετα...

char *temp = malloc(64);
char *stop = buf + 512;
for (char *cp = buf; cp < stop; cp += 64) {
    memcpy( temp, cp, 64 )
    send( temp )
}
free( temp )
Δημοσ.

 

Και με την memcpy αν κάνω πχ 

 

memcpy ( 64bytebuffer, 500bytebuffer, 64 );

 

θα μου αντιγράψει τα πρώτα 64. Τα υπόλοιπα?

 

Δηλαδή με pointers??? 

 

Όχι

 


char sourceBuffer[500];
char fragmentBuffer[64];

// fill sourceBuffer

/*
 *
 */

// onSend 
memcpy(fragmentBuffer, &sourceBuffer[0], 64);
send(fragmentBuffer);

Έτσι αντιγράφεις 64 bytes.Αν θες να αντιγράψεις κι άλλες 64αδες,υπάρχει και το for..

Δημοσ.

Τα έχει παίξει το φορουμ, δεν με αφήνει να κάνω edit. Στην παραπάνω for βγάλε τα * από το condition.

 

edit:

 

Ότι να 'ναι! Τώρα με άφησε να κάνω edit (κι έκανα)

 

edit 2:

 

Τώρα μόλις είδα πως μπορεί να μην είναι γεμάτο το buffer, οπότε ή μπορείς να βάλεις ένα sentinel byte στο σημείο που τελειώνουν τα δεδομένα μέσα στο buffer και θα κοπιάρεις ένα-ένα byte μέχρι να βρεις πολλαπλάσιο του 64 ή τον sentinel (όποιο έρθει πρώτο), ή για πιο καλύτερα, εφόσον ξέρεις το μήκος των δεδομένων σου, προσάρμοσε το παραπάνω for loop και όπου έχω 512 βάλε αυτό το μήκος (θα χρειαστεί να to αλλάξεις ώστε αν το τελευταίο τμήμα του buffer είναι μικρότερο από το expected πολλαπλάσιο του 64, να κοπιάρεις (expected πολλαπλάσιο του 64 - το μήκος των δεδομένων σου) bytes.

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

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

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

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

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

Σύνδεση

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

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