Δημοσιεύτηκε: 09 Σεπ 2011, 15:52
Δεν πολυ-καταλαβαίνω τι με ρωτάς (είσαι πολύ λακωνικός). Υποψιάζομαι όμως πως δεν έχεις πιάσει τι ακριβώς κάνει το union. Το union είναι ένας τρόπος να εκφράσεις μια μεταβλητή σε πολλούς τύπους δεδομένων, με την προϋπόθεση πως υπάρχει λογική αντιστοίχιση μεταξύ τους . Π.χ...
Η τιμή 65 ανατέθηκε ως int στο .intype αλλά ταυτόχρονα ενημερώθηκαν και τα υπόλοιπα πεδία του union. Οπότε το 65 αυτό μπορείς να το διαχειριστείς σαν να το είχες περάσει ως οποιονδήποτε από τους 3 τύπους που έχεις ορίσει στο union, χρησιμοποιώντας το αντίστοιχο πεδίο.
Π.χ. μπορείς να περάσεις το χαρακτήρα 'Α' στο var.chartype και κατόπιν να τον διαχειρίζεσαι σαν να ήταν long χρησιμοποιώντας το var.longtype (αντί του var.chartype με το οποίο διάβασες αρχικά τον χαρακτήρα).
ΥΓ1. Βέβαια στη πράξη πρέπει να προσέχεις τα πεδία που βάζεις μέσα στο union να έχουν ίδιο μέγεθος ή έστω ο κώδικάς σου να κάνει σχετικούς ελέγχους. Για παράδειγμα, αν διαβάσεις μέσω του var.longtype την τιμή 2345678 και μετά πας να την εξετάσεις μέσω του var.chartype θα έχεις πρόβλημα, διότι δεν υπάρχει χαρακτήρας με τέτοιο ASCII code... το πολύ μέχρι 255 είναι τα ASCI codes... (0-255 είναι οι τιμές που μπορούν να απεικονιστούν σε ένα byte).
ΥΓ2. Λοιπόν, αισθάνομαι ότι σας βομβάρδισα πολύ ξαφνικά με πολύ πράγμα και μάλλον δεν ήταν καλή ιδέα. Θέλετε να δώσω και τον portable κώδικα για διαχείριση διευθύνσεων δεικτών κι ότι καταλάβετε, και να επιστρέψουμε στα strings; Ή αν έχετε βαρεθεί τα strings να πούμε για δομές (struct) ;
- Κώδικας: Επιλογή όλων
#include <stdio.h>
typedef union manytypes {
long int longtype;
int intype;
char chartype;
} ManyTypes;
// -------------------------------------------------------------------------------------------------------
int main( void )
{
ManyTypes var;
var.inttype = 65;
...
}
Η τιμή 65 ανατέθηκε ως int στο .intype αλλά ταυτόχρονα ενημερώθηκαν και τα υπόλοιπα πεδία του union. Οπότε το 65 αυτό μπορείς να το διαχειριστείς σαν να το είχες περάσει ως οποιονδήποτε από τους 3 τύπους που έχεις ορίσει στο union, χρησιμοποιώντας το αντίστοιχο πεδίο.
Π.χ. μπορείς να περάσεις το χαρακτήρα 'Α' στο var.chartype και κατόπιν να τον διαχειρίζεσαι σαν να ήταν long χρησιμοποιώντας το var.longtype (αντί του var.chartype με το οποίο διάβασες αρχικά τον χαρακτήρα).
ΥΓ1. Βέβαια στη πράξη πρέπει να προσέχεις τα πεδία που βάζεις μέσα στο union να έχουν ίδιο μέγεθος ή έστω ο κώδικάς σου να κάνει σχετικούς ελέγχους. Για παράδειγμα, αν διαβάσεις μέσω του var.longtype την τιμή 2345678 και μετά πας να την εξετάσεις μέσω του var.chartype θα έχεις πρόβλημα, διότι δεν υπάρχει χαρακτήρας με τέτοιο ASCII code... το πολύ μέχρι 255 είναι τα ASCI codes... (0-255 είναι οι τιμές που μπορούν να απεικονιστούν σε ένα byte).
ΥΓ2. Λοιπόν, αισθάνομαι ότι σας βομβάρδισα πολύ ξαφνικά με πολύ πράγμα και μάλλον δεν ήταν καλή ιδέα. Θέλετε να δώσω και τον portable κώδικα για διαχείριση διευθύνσεων δεικτών κι ότι καταλάβετε, και να επιστρέψουμε στα strings; Ή αν έχετε βαρεθεί τα strings να πούμε για δομές (struct) ;