katerinakipat Δημοσ. 20 Ιανουαρίου 2013 Μέλος Δημοσ. 20 Ιανουαρίου 2013 Γιατι χρησιμοποιεις to1 και from1 ? Χρησιμοποιησε τα to και from απευθειας και μεσα στην συναρτηση. Τα to και from μεσα στην συναρτηση σαν μεταβλειτες δεικτη αμφοτερα θα ειναι ΔΙΑΦΟΡΕΤΙΚΑ απο αυτα στην main Σαν τοπικες μεταβλητες λοιπον με εμβελεια μεσα στο μπλοκ της συναρτησης σου πρεπει να ξαναδηλωθουν στην λιστα παραμετρων ωστε να μπορουν να χρησιμοποιηθουν μετα μεσα στην συναρτηση. Επισης οπως σου προτεινει και ο migf1 δηλωσε και αρχικοποιησε μια ακομη μεταβλητη δεικτη ονομασε την tmp πχ η οποια θα δειχνει στην αρχη του to το οποιο τροποποιείται απο την αναθεση με το from. Γενικα τα to1 και from1 που χρησιμοποιεις τωρα ειναι ΑΝΤΙΓΡΑΦΑ. Δεν ειναι οι αυθεντικες μεταβλητες δεικτων απλα κανουν δουλεια επειδη κατα την κληση αρχικοποιούνται με αυτες. Φυσικα και τα to και from σκετα μεσα στην συνάρτηση και αυτα αντιγραφα θα ειναι απλα θα εχουν ιδιο ονομα. Πρεπει να τα ξεκαθαρισεις αυτα αν θες να εισαι αποτελεσματικοτερη. p.s Οταν ολοκληρώσεις οτι χρειάζεται αυτο που θα πρεπει να επιστρέφει η συνάρτηση ειναι ο tmp. Ο οποιος θα δειχνει στην αρχη του τροποποιημένου πλεον to ή to1 οπως το έχεις τωρα αρχικά γιατί χρησιμοποίησα to1 from1,το ξέρω ότι είναι διαφορετικά είναι μια συνήθεια.συνήθως γράφω τις μεταβλητές και το αρχικό γράμμα της συνάρτησης γιατι στην αρχή τα ψιλό μπέρδευα..οποτε οι αλλαγές που πρεπει να κάνω είναι αυτες char * mystrcpy(char *to1, char *from1) { //os orismata 2 deiktes se XARAKTIRA char *tmp=to1; while (*from1 != '\0') //elegxos oso to PERIEXOMENO tou from1 na einai diaforo *to1++=*from1++ ; // oso einai diaforo ana8esi timis tou periexomenou from1 sto periexomeno tou to1 ; return tmp; //epistrofi ts timis tou prwto orismatos diladi tou to1 } οποτε για να καταλάβω, με αυτόν τον τρόπο επιστρέψω την τιμή του πρώτο ορίσματος πριν αλλάξει σωστά?
Star_Light Δημοσ. 20 Ιανουαρίου 2013 Δημοσ. 20 Ιανουαρίου 2013 Κοιταξε στην έκφραση : *to1++ = *from1 ++ ; μετακινείς τους 2 δείκτες. Οσο το στοιχειο *from1 δεν έχει το ASCII του '\0' ή με αλλα λογια δεν εχεις φτασει στο τελος του string θα συνεχίσεις να αυξάνεις τους 2 δεικτες και επισης να αλλαζεις τα περιεχομενα της κάθε θέσης του to1 με αυτα της from1 . Oταν τελειωσει το loop ο to1 θα δειχνει στο τέλος της λέξης. Οποτε αν το βάλεις να σου εκτυπωθει δεν θα καταφερεις και πολλα.Οποτε ΠΡΙΝ κανεις οτι κάνεις κρατάς ενα backup ουσιαστικα βαζεις εναν αλλο δεικτη να δειχνει στην αρχη του to1 επειδη ο δευτερος θα μετακινηθει μετα για να γινει η δουλεια που πρεπει οπως ειπαμε. Τελικα με τροποποιημένα τα περιεχομενα της μνήμη του to1 και τον tmp να δειχνει στην ΑΡΧΗ ΤΗΣ!!!! Επιστρέφεις τον tmp. O tmp δειχνει στον 1ο χαρακτήρα του string οποτε αν μετα στην main τον δώσεις μεσα σε μια puts ή σε μια printf με %s θα σου εκτυπώσει το string που θες. Οποτε επιστρέφεις την τιμή του 1ου ορισματος αφοτου άλλαξε. Ο tmp δεν αλλαξε επειδη δεν τον εβαλες να δειχνει καπου αλλου , δειχνει στην αρχη του to1 string που ειναι αλλαγμενο ως προς τα περιεχομενα . 1
migf1 Δημοσ. 20 Ιανουαρίου 2013 Δημοσ. 20 Ιανουαρίου 2013 ...οποτε οι αλλαγές που πρεπει να κάνω είναι αυτες char * mystrcpy(char *to1, char *from1) { //os orismata 2 deiktes se XARAKTIRA char *tmp=to1; while (*from1 != '\0') //elegxos oso to PERIEXOMENO tou from1 na einai diaforo *to1++=*from1++ ; // oso einai diaforo ana8esi timis tou periexomenou from1 sto periexomeno tou to1 ; return tmp; //epistrofi ts timis tou prwto orismatos diladi tou to1 } οποτε για να καταλάβω, με αυτόν τον τρόπο επιστρέψω την τιμή του πρώτο ορίσματος πριν αλλάξει σωστά? Επιγραμματικά, ναι. Λίγο πιο περιφραστικά, ο λόγος είναι πως εφόσον μετακινείς τον to1 (με το to1++ μέσα στο loop) έχεις χάσει την διεύθυνση από την οποία εκκινoύσε ο to1 όταν πρωτο-περάστηκε στην συνάρτηση Ίσως σου είναι λίγο πιο προφανές αν χρειαστεί αργότερα να ξαναδεις τη συνάρτηση για να καταλάβεις πως λειτουργεί, αν αντί να μετακινείς τον to1 μέσα στο loop και να επιστρέφεις τον tmp, να μετακινείς τον tmp και να επιστρέφεις τον το1. 2
katerinakipat Δημοσ. 20 Ιανουαρίου 2013 Μέλος Δημοσ. 20 Ιανουαρίου 2013 ευχαριστώ πάρα πολύ για τον χρόνο σας....ήσασταν κατατοπιστικότατοι ..!!!! ας ελπίσουμε να το ρωτήσει αύριο στην εξέταση
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα