CtrlFreak Δημοσ. 25 Μαΐου 2014 Δημοσ. 25 Μαΐου 2014 Καλησπέρα, έχω έναν buffer 500 θέσεων, και θέλω να τον μοιράσω σε 8 μικρότερους 64 θέσεων. Θέλω να γίνει πχ από 1 εως 64 του buffer να πάει σε έναν μικρότερο από 65 εως 128 να πάει σε έναν άλλο κτλπ. Έχω βρει κάποιες συναρτήσεις αλλά χωρίς να μπορώ να μεταφέρω τμηματικά κομμάτια του buffer.
gon1332 Δημοσ. 25 Μαΐου 2014 Δημοσ. 25 Μαΐου 2014 Πως έχεις σκεφτεί ότι πρέπει να δουλεύει; Για δοκίμασε με χαρτί και μολύβι και περιέγραψέ το μας. EDIT: Ποια είναι η λογική μοιρασιάς; Ποια είναι τα δεδομένα σου; Ποια από αυτά ξέρεις πριν το run-time; Το ρωτάω γιατί 8 * 64 = 512 > 500. Αν δεν πρόκειται για κάποιο γενικό αλγόριθμο και τα δεδομένα που χρειάζεσαι είναι αυτά που ανέφερες, τότε it isn't get any easier.
CtrlFreak Δημοσ. 25 Μαΐου 2014 Μέλος Δημοσ. 25 Μαΐου 2014 Λαμβάνω ασύρματα κάποια δεδομένα σίγουρα λιγότερα από 500 και τα χωρίζω σε 64 γιατί τα στέλνω μέσω usb sto pc. Μπορώ να στείλω μόνο μέχρι 64 bit την φορά, αν και αυτό πρέπει λίγο να το ψάξω, και δεν με νοιάζει αν χαθούν κάποια γιατί λογικά είναι μηδενικά. Θέλω απλά να χωρίσω τον buffer σε τμήματα. Εκτός και αν μπορώ να κάνω κάτι πχ buffer[0-64] και να το στέλνω έτσι τμηματικά.
SpirosLouis Δημοσ. 25 Μαΐου 2014 Δημοσ. 25 Μαΐου 2014 Δεν μπορώ να καταλάβω γιατί πρέπει να το σπάσεις αφού παίρνεις συγκεκριμένα δεδομένα. Στη χειρότερη περίπτωση μπορείς να έχεις τον αρχικό σου buffer και να φτιάξεις και έναν δεύτερο με το επιθυμιτό μήκος. Έπειτα με έναν memcpy να περνάς (π.χ. τα 64 bytes) και ταυτόχρονα να αυξάνεις κάποιο δείκτη για το Index του αρχικού buffer.(πολλύ προσοχή αν είναι μεταβλητό το μήκος του αρχικού buffer γιατί θα βγαίνεις εκτός index και δεν θα το βρίσκει και ο compiler..)
Timonkaipumpa Δημοσ. 25 Μαΐου 2014 Δημοσ. 25 Μαΐου 2014 ένας δείκτης για τον υπό-buffer και ένας δείκτης δρομέας πάνω σε αυτόν. επιστρέφεις τον πρώτο και με τον δεύτερο αντιγράφεις δεδομένα. Ξέρεις ( ; ) τι δεδομένα έχεις οπότε μπορείς να υπολογίζεις πόσο θα κινηθεί ο δείκτης δρομέας. Μόλις γεμίσει τον περνάς στην "send" που έχεις. Αλλά.... εφόσον έχεις ήδη τον αρχικό γιατί δεν κάνεις ένα απλό memcpy; Η εφαρμογή για την λήψη απλά θα ενώσει τα δεδομένα και είσαι ΟΚ... σαν να είχες τον αρχικό.
CtrlFreak Δημοσ. 25 Μαΐου 2014 Μέλος Δημοσ. 25 Μαΐου 2014 Η 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. Τα υπόλοιπα?
gon1332 Δημοσ. 25 Μαΐου 2014 Δημοσ. 25 Μαΐου 2014 Η memcpy ήταν από αυτές που βρήκα απλά δεν βρήκα πως να κάνω αντιγραφή τμηματικά τον buffer. Δηλαδή πως θα του πω να αντιγράψει από το 65 μέχρι το 128? Βλέπω ότι η memcpy δηλώνετε έτσι το num είναι ο αριθμός των byte που θα μεταφερθούν. Παίρνει και άλλες παραμέτρους? Μπορείς να περάσεις στην παράμετρο source, τη διεύθυνση της θέσης 65.
ChRis6 Δημοσ. 25 Μαΐου 2014 Δημοσ. 25 Μαΐου 2014 Βλέπω ότι η memcpy δηλώνετε έτσι το num είναι ο αριθμός των byte που θα μεταφερθούν. Παίρνει και άλλες παραμέτρους? Όχι , τί άλλες να παίρνει; Αφού βλέπεις πως είναι η δήλωση της... Στο dest βάζεις τη διεύθυνση μνήμης του buffer[64],στο source τη διεύθυνση του i-στου byte και στο num 64.
CtrlFreak Δημοσ. 25 Μαΐου 2014 Μέλος Δημοσ. 25 Μαΐου 2014 Και με την memcpy αν κάνω πχ memcpy ( 64bytebuffer, 500bytebuffer, 64 ); θα μου αντιγράψει τα πρώτα 64. Τα υπόλοιπα? Όχι , τί άλλες να παίρνει; Αφού βλέπεις πως είναι η δήλωση της...Στο dest βάζεις τη διεύθυνση μνήμης του buffer[64],στο source τη διεύθυνση του i-στου byte και στο num 64. Δηλαδή με pointers???
gon1332 Δημοσ. 25 Μαΐου 2014 Δημοσ. 25 Μαΐου 2014 Και με την memcpy αν κάνω πχ memcpy ( 64bytebuffer, 500bytebuffer, 64 ); θα μου αντιγράψει τα πρώτα 64. Τα υπόλοιπα? Δηλαδή με pointers??? Ναι.. με σημειογραφία pointers (γιατί οι πίνακες δεν είναι pointers).
CtrlFreak Δημοσ. 25 Μαΐου 2014 Μέλος Δημοσ. 25 Μαΐου 2014 Όπα τι σημειογραφία? Αν κάνω κάτι τέτοιο? memcpy( 64bytebuffer, *buffer[65], 64 );
migf1 Δημοσ. 25 Μαΐου 2014 Δημοσ. 25 Μαΐου 2014 Κάνε το 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 )
ChRis6 Δημοσ. 25 Μαΐου 2014 Δημοσ. 25 Μαΐου 2014 Και με την 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..
migf1 Δημοσ. 25 Μαΐου 2014 Δημοσ. 25 Μαΐου 2014 Τα έχει παίξει το φορουμ, δεν με αφήνει να κάνω edit. Στην παραπάνω for βγάλε τα * από το condition. edit: Ότι να 'ναι! Τώρα με άφησε να κάνω edit (κι έκανα) edit 2: Τώρα μόλις είδα πως μπορεί να μην είναι γεμάτο το buffer, οπότε ή μπορείς να βάλεις ένα sentinel byte στο σημείο που τελειώνουν τα δεδομένα μέσα στο buffer και θα κοπιάρεις ένα-ένα byte μέχρι να βρεις πολλαπλάσιο του 64 ή τον sentinel (όποιο έρθει πρώτο), ή για πιο καλύτερα, εφόσον ξέρεις το μήκος των δεδομένων σου, προσάρμοσε το παραπάνω for loop και όπου έχω 512 βάλε αυτό το μήκος (θα χρειαστεί να to αλλάξεις ώστε αν το τελευταίο τμήμα του buffer είναι μικρότερο από το expected πολλαπλάσιο του 64, να κοπιάρεις (expected πολλαπλάσιο του 64 - το μήκος των δεδομένων σου) bytes.
CtrlFreak Δημοσ. 25 Μαΐου 2014 Μέλος Δημοσ. 25 Μαΐου 2014 Άρα μόνο με for?? for(i = 0; i < 512;){ for (y =0; y<=64; y++{ fram[y] = buffer i++; } y = 0; } κάτι τέτοιο.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα