migf1 Δημοσ. 17 Απριλίου 2012 Δημοσ. 17 Απριλίου 2012 Aντι για την memcpy μπορεις να χρησιμοποιησεις την memmove() ειναι πιο ευελικτη επειδη μπορει να χειριστει την επικαλυψη των μπλοκ της μνήμης. Είναι πιο ευέλικτη η memmove() αλλά ταυτόχρονα και πιο αργή από την memcpy(). Όταν δεν συντρέχει ειδικός λόγος, δηλαδή στη μεγάλη πλειοψηφία των περιπτώσεων, δεν χρειάζεται. Σε κάθε περίπτωση, αν δεν είναι κάποιος εξοικειωμένος είναι προτιμότερο να χρησιμοποιεί τις str???? συναρτήσεις όταν διαχειρίζεται c-strings στη C, και τις σχετικές κλάσεις στην C++.
imitheos Δημοσ. 17 Απριλίου 2012 Δημοσ. 17 Απριλίου 2012 Με την strncpy που εχω ειναι insecure; ή να το κανω με memcpy οπως λες; Παλαιότερα χρησιμοποιούνταν πολύ κάποιες συναρτήσεις όπως οι gets, strcpy, κτλ οι οποίες δημιούργησαν πολλά προβλήματα. Έτσι δημιουργήθηκαν συναρτήσεις (πχ snprintf, strncat, κτλ) οι οποίες δέχονται ένα όρισμα που λέει πόσους χαρακτήρες μπορούν να αντιγράψουν. Στο πλαίσιο της προστασίας των νέων προγραμματιστών από λάθη, διάφορα άρθρα, βιβλία, οδηγοί, πρότειναν να χρησιμοποιείται η τάδε συνάρτηση στην θέση της δείνα συνάρτησης. Αυτό γενικεύτηκε και γεννήθηκε η θεώρηση "οι strn* συναρτήσεις είναι ασφαλείς εκδοχές των str* συναρτήσεων" με συνέπεια προγραμματιστές να χρησιμοποιούν την strncpy μη γνωρίζοντας τι κάνει και νομίζοντας ότι συμπεριφέρεται όπως η strcpy. Όλες (καλά σχεδόν όλες ) οι συναρτήσεις είναι ασφαλείς αν ξέρεις τι κάνουν και τις χρησιμοποιείς σωστά. Αν ακολουθήσεις αυτό που είπε ο migf1 και παρουσίασε ο Παπί, τότε είσαι οκ. Αυτό που ήθελα να ξεκαθαρίσω με το προηγούμενο μήνυμά μου (και όπως πάντα πιθανώς να μην το διατύπωσα καλά) είναι ότι η strncpy δεν ανταποκρίνεται στην παραπάνω θεώρηση και ο σκοπός της εισαγωγής της ήταν για το λόγο που περιέγραψα πριν και όχι για χρήση με zero-terminated c strings. Είναι πιο ευέλικτη η memmove() αλλά ταυτόχρονα και πιο αργή από την memcpy(). Όταν δεν συντρέχει ειδικός λόγος, δηλαδή στη μεγάλη πλειοψηφία των περιπτώσεων, δεν χρειάζεται. Σε κάθε περίπτωση, αν δεν είναι κάποιος εξοικειωμένος είναι προτιμότερο να χρησιμοποιεί τις str???? συναρτήσεις όταν διαχειρίζεται c-strings στη C, και τις σχετικές κλάσεις στην C++. Αν κάποιος είναι εξοικειωμένος ή γνωρίζει την σύνταξη και την λειτουργία των πολλών για αυτή τη δουλειά συναρτήσεων, τότε μπορεί να χρησιμοποιήσει όποια θεωρεί καλύτερη. Ένας νέος χρήστης (που μπορεί στο στάδιο που βρίσκεται να μην καταλαβαίνει καν τι συνέπειες έχει το "overlap") δεν θα πάθει κάτι να χρησιμοποιεί παντού την memmove. Άλλωστε οι περισσότερες υλοποιήσεις της memmove ελέγχουν αν υπάρχει overlap και αν όχι καλούν την memcpy οπότε είναι πιο αργές κατά 1-2 if και 1 function call.
Re4cTiV3 Δημοσ. 17 Απριλίου 2012 Μέλος Δημοσ. 17 Απριλίου 2012 Αν ήταν string θα μπορούσα πολύ εύκολα με ένα substr να τελειώνω..Ίσως μας έβαλε αυτήν την άσκηση για να μάθω για την memset, strn/mem cpy, memmove. Τι ακριβώς είναι το overlap??Στην κλάση που έχουμε, την τελική, υπάρχει κάποιο θέμα overlap ή τίποτα τέτοιο;Υπάρχει περίπτωση να με κόψει βαθμό;
παπι Δημοσ. 17 Απριλίου 2012 Δημοσ. 17 Απριλίου 2012 Πρεπει να κανεις και ενα deallocation (delete[]) κατα προτιμηση στο destructor και εισαι κομπλε
Re4cTiV3 Δημοσ. 17 Απριλίου 2012 Μέλος Δημοσ. 17 Απριλίου 2012 (επεξεργασμένο) Πρεπει να κανεις και ενα deallocation (delete[]) κατα προτιμηση στο destructor και εισαι κομπλε ναι εχω κανει ;-) Επεξ/σία 17 Απριλίου 2012 από Re4cTiV3
imitheos Δημοσ. 18 Απριλίου 2012 Δημοσ. 18 Απριλίου 2012 Τι ακριβώς είναι το overlap??Στην κλάση που έχουμε, την τελική, υπάρχει κάποιο θέμα overlap ή τίποτα τέτοιο;Υπάρχει περίπτωση να με κόψει βαθμό; > char s[50] = "Hello World - Kalhmera Kosme"; char s2[50] = "Hello World - Kalhmera Kosme"; memmove(s + 6, s, 12); printf("s after memmove is: %s\n", s); memcpy(s2 + 6, s2, 12); printf("s after memcpy is: %s\n", s2); Έξοδος: > s after memmove is: Hello Hello World mera Kosme s after memcpy is: Hello Hello Hello mera Kosme Όπως βλέπεις, θέλουμε να γράψουμε 12 χαρακτήρες από ένα πίνακα στον ίδιο πίνακα 6 θέσεις μετά την αρχή. Η memmove που λαμβάνει υπόψη της το overlap αντιγράφει σωστά το "Hello World " στην θέση που ήταν το World. Η memcpy δεν προβλέπει overlap οπότε δεν λαμβάνει μέτρα για την αποφυγή του και καταλήγουμε στο 2ο λάθος αποτέλεσμα (στην θέση που είναι το World γράφεται κανονικά το Hello. μετά όμως ενώ θα έπρεπε να γράψει τους χαρακτήρες World αυτοί έχουν αντικατασταθεί από το Hello που μόλις αντιγράψαμε οπότε ξανα βάζει αυτό και πάει λέγοντας).
Re4cTiV3 Δημοσ. 18 Απριλίου 2012 Μέλος Δημοσ. 18 Απριλίου 2012 Χμμμ θέλει εξάσκηση γι αυτά τα πράγματα... Η strncpy προβλέπει για overlap?
migf1 Δημοσ. 18 Απριλίου 2012 Δημοσ. 18 Απριλίου 2012 Χμμμ θέλει εξάσκηση γι αυτά τα πράγματα... Η strncpy προβλέπει για overlap? Όχι, καμία από τις strXXXX().
Re4cTiV3 Δημοσ. 18 Απριλίου 2012 Μέλος Δημοσ. 18 Απριλίου 2012 Όχι, καμία από τις strXXXX(). τότε δεν είναι πιο ασφαλείς να χρησιμοποιούμε αυτές;
migf1 Δημοσ. 18 Απριλίου 2012 Δημοσ. 18 Απριλίου 2012 Πιο ασφαλείς είναι όσες προβλέπουν για overlap, αλλά για char * δεν υπάρχουν (τουλάχιστον στην C)... είναι ένας από τους λόγους που σου είπαμε εξαρχής να χρησιμοποιήσεις έτοιμες κλάσεις. ΥΓ. Στην υπογραφή μου υπάρχει ένα link, μεταξύ άλλων προσπαθώ να εξηγήσω με απλά λόγια στα Ελληνικά τα strings στη C (char *)
m1cRo Δημοσ. 19 Απριλίου 2012 Δημοσ. 19 Απριλίου 2012 Το ασφαλές είναι να αποφεύγεις γενικός την χρήση των raw pointers. Αφού υπάρχουν τα ωραία containers της stl που είναι και κομμάτι της c++ γιατί να βάζετε τα raw pointers μέσα? για string έχεις std::string για binary data std::vector κτλ. Αντί για strcpy strncpy κανεις απλά std::string myString = "something"; std::string myString2 = myString; Ο κώδικας γενικός δεν είναι κώδικας c++ αλλα c με cout της c++
Timonkaipumpa Δημοσ. 19 Απριλίου 2012 Δημοσ. 19 Απριλίου 2012 Το ασφαλές είναι να αποφεύγεις γενικός την χρήση των raw pointers. Αφού υπάρχουν τα ωραία containers της stl που είναι και κομμάτι της c++ γιατί να βάζετε τα raw pointers μέσα? για string έχεις std::string για binary data std::vector κτλ. Αντί για strcpy strncpy κανεις απλά std::string myString = "something"; std::string myString2 = myString; Ο κώδικας γενικός δεν είναι κώδικας c++ αλλα c με cout της c++ Α να γεια σου! Σε Java μία χαρά θα το κάνανε με containers της Java... Το γεγονός πως η C++ δίνει την δυνατότητα για χρήση "συνηθειών" της C έχει σαν αποτέλεσμα να υπάρχουν αρχεία .cpp γραμμένα σε C με "cout"
nplatis Δημοσ. 23 Απριλίου 2012 Δημοσ. 23 Απριλίου 2012 Ο φίλος κάπου αναφέρει ότι τους έχουν ζητήσει να το κάνουν με δείκτες. Νομίζω ότι και η εξάσκηση με τους δείκτες έχει την αξία της. Εξάλλου η C++ έχει το καλό ότι την κάνεις ό,τι θέλεις εσύ, ενώ στην Java αυτό δεν γίνεται...
migf1 Δημοσ. 23 Απριλίου 2012 Δημοσ. 23 Απριλίου 2012 Ο φίλος κάπου αναφέρει ότι τους έχουν ζητήσει να το κάνουν με δείκτες. Νομίζω ότι και η εξάσκηση με τους δείκτες έχει την αξία της. Εξάλλου η C++ έχει το καλό ότι την κάνεις ό,τι θέλεις εσύ, ενώ στην Java αυτό δεν γίνεται... +1
m1cRo Δημοσ. 23 Απριλίου 2012 Δημοσ. 23 Απριλίου 2012 Ο φίλος κάπου αναφέρει ότι τους έχουν ζητήσει να το κάνουν με δείκτες. Νομίζω ότι και η εξάσκηση με τους δείκτες έχει την αξία της. Εξάλλου η C++ έχει το καλό ότι την κάνεις ό,τι θέλεις εσύ, ενώ στην Java αυτό δεν γίνεται... Δυστυχώς αυτή η ευελιξία είναι και το κύριο μειονέκτημα της c++. Δουλεύοντας την επαγγελματικά μπορώ να πω ότι δύσκολα συναντάς άτομο που πραγματικά να γνωρίζει την c++ και όχι c με κλάσεις. Ναι πρέπει να ξέρουμε πως λειτουργούν οι δείκτες (αναγκαστικά) αλλα στη δουλειά κοιτάς πρώτα από όλα να γράψεις ασφαλής και κατανοητό κώδικα. Με δείκτες αυτό που καταφέρνεις είναι απλά να αυξήσεις την πολυπλοκότητα εκεί που δεν χρειάζεται. Και αν την αυξάνεις εκεί που δεν χρειάζεται τι γίνεται εκεί που αναγκαστικά την έχεις αλγοριθμικά ( έχεις λοιπόν διπλή )? Η java το καλο που έχει είναι ότι αποτρέπει να κανεις λάθος πράγματα και αυτό είναι καλο όταν δουλεύεις σε ομάδα και κάποια άτομα δη είναι και τόσο δυνατά, τους τα βάζει η γλώσσα στο σωστό δρόμο.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα