Δημοσιεύτηκε: 05 Ιούλ 2011, 16:54
από linuxs
migf1 έγραψε:Τι εννοείς όταν λες κλήσεις συστήματος;

Την memcpy() χρησιμοποιεί για να αντιγράψει πρώτα τα περιεχόμενα του y σε ένα προσωρινό buffer που το ορίζει με όνομα: swap_temp (άρα αυτό το όνομα δεν μπορεί να χρησιμοποιηθεί πουθενά αλλού μέσα στο πρόγραμμα). Κατόπιν τη χρησιμοποιεί για να αντιγράψει τα περιεχόμενα του χ στο y, και μετά για να αντιγράψει τα περιεχόμενα του swap_temp στο x.

To βάζει όλο μέσα σε ένα do-while (0) για να καταστραφεί το buffer: swap_temp μόλις βρει το δεξί άγκιστρο, μιας και είναι ορισμένο ως τοπική μεταβλητή (auto) μέσα στο scope του loop, ενώ για μέγεθος του swap_temp απαιτεί ο χώρος που πιάνουν στη μνήμη τα x και y να είναι ισοδύναμος, αλλιώς ορίζει το μέγεθος του buffer σε -1.
Π.χ. άμα ως x του περάσουμε έναν int και ως y ένα char, το swap_temp ορίζεται με μέγεθος -1. Σε αυτή την περίπτωση η όλη διαδικασία αποτυγχάνει σιωπηλά δυστυχώς (ο compiler δεν το "πιάνει" μιας και οι παράμετροι των macros είναι ανεξάρτητες από τύπους δεδομένων).

Και τέλος, για να δουλέψει σωστά πρέπει να κάνουμε include το <string.h> για την memcpy().

ΥΓ. @star_light: :lol: Μην απογοητεύεσαι ρε συ, εγώ και τα διδάχτηκα σε πανεπιστημιακό επίπεδο και τα εξάσκησα και real-life επί πολλά χρόνια. Αν μάθεις όμως καλά τη C είναι περίπου σαν να έχεις μάθει όλες τις γλώσσες (πλην του αντικειμενοστραφούς προγραμματισμού, που κι αυτός όμως θα σου φανεί πολύ ευκολότερος).


Για κάποιον λόγο είιχα την εντύπωση ότι η memcpy() είναι κλήση στο σύστημα... :/ forget it!

Θέτω μια άσκηση...
Να υλοποιηθεί πρόγραμμα που να διαβάζει τα περιεχόμενα ενός αρχείου, και τέλος να επιστρέφει πόσους αριθμούς, χαρακτήρες και σύμβολα βρήκε. :/ Εύκολο? ...για να δούμε... :D

Παρατήρηση: Σίγουρα η πρώτη λύση είναι με πολλά cases και if! Μήπως υπάρχει κάτι πιο έξυπνο? :/