Δημοσιεύτηκε: 09 Σεπ 2011, 12:27
@Star_Light: στον κώδικα σωστά τα είχες, εκτός από το %d... στα σχόλια είχες κάτι λάθη.
@Stamatiou: ένας τύπος δεδομένων είναι και το void (όπως οι int, float, κλπ) που τον χρησιμοποιούμε όταν θέλουμε να αναφερθούμε σε δεδομένα που μας είναι αδιάφορα.
Unions λοιπόν!
Συντακτικά είναι πανομοιότυπα με τα struct, μόνο που αντί για το keyword struct χρησιμοποιούμε το union. Η ειδοποιός διαφορά τους όμως είναι πως τα πεδία που ορίζουμε μέσα στο union αναφέρονται ΟΛΑ σε μια και μόνο εσωτερική μεταβλητή, ενώ στα struct τα πεδία του νοητικά μπορούν να εκληφθούν ως ξεχωριστές εσωτερικές μεταβλητές της δομής, κάτι σαν υπο-μεταβλητές αν το καταλαβαίνετε καλύτερα. Στα union όλα τα πεδία του είναι μια και μόνη υπο-μεταβλητή.
Το συνολικό μέγεθος μνήμης ενός struct είναι το άθροισμα των υπο-μεταβλητών του, π.χ. αν έχουμε...
Σε ένα union το συνολικό του μέγεθος στη μνήμη είναι το μέγεθος του μεγαλύτερου από τα πεδία του, π.χ. αν έχουμε...
Με άλλα λόγια σε ένα union μπορούμε να αποθηκεύσουμε μια μεταβλητή, μετατρέποντάς την αυτόματα σε οποιονδήποτε άλλο τύπο έχουμε ορίσει ως ξεχωριστό πεδίο μέσα στο union. Και όχι μόνο αυτό, αλλά όταν αναθέτουμε τιμή σε μια μεταβλητή τύπου union, η τιμή αυτή μπορεί να δοθεί σε οποιονδήποτε από τους τύπους που έχουμε ορίσει ως πεδία μέσα στο union.
Το απλούστερο παράδειγμα που μου έρχεται για αρχή είναι ένα union που θα μετατρέπει μια μεταβλητή από int σε char και αντίστροφα. Δείτε τον παρακάτω κώδικα που δείχνει ακριβώς αυτό, και πείτε μου αν είμαστε ΟΚ, για να συνεχίσουμε.
* για να μη γεμίζω τον κώδικα με printf κάθε φορά που αναθέτω διαφορετική τιμή στη μεταβλητή τύπου union, το έκανα ξεχωριστή συνάρτηση το τύπωμά της.
@Stamatiou: ένας τύπος δεδομένων είναι και το void (όπως οι int, float, κλπ) που τον χρησιμοποιούμε όταν θέλουμε να αναφερθούμε σε δεδομένα που μας είναι αδιάφορα.
Unions λοιπόν!
Συντακτικά είναι πανομοιότυπα με τα struct, μόνο που αντί για το keyword struct χρησιμοποιούμε το union. Η ειδοποιός διαφορά τους όμως είναι πως τα πεδία που ορίζουμε μέσα στο union αναφέρονται ΟΛΑ σε μια και μόνο εσωτερική μεταβλητή, ενώ στα struct τα πεδία του νοητικά μπορούν να εκληφθούν ως ξεχωριστές εσωτερικές μεταβλητές της δομής, κάτι σαν υπο-μεταβλητές αν το καταλαβαίνετε καλύτερα. Στα union όλα τα πεδία του είναι μια και μόνη υπο-μεταβλητή.
Το συνολικό μέγεθος μνήμης ενός struct είναι το άθροισμα των υπο-μεταβλητών του, π.χ. αν έχουμε...
- Κώδικας: Επιλογή όλων
typedef struct test {
int integer;
char character;
} Test;
Σε ένα union το συνολικό του μέγεθος στη μνήμη είναι το μέγεθος του μεγαλύτερου από τα πεδία του, π.χ. αν έχουμε...
- Κώδικας: Επιλογή όλων
typedef union test {
int integer;
char character;
} Test;
Με άλλα λόγια σε ένα union μπορούμε να αποθηκεύσουμε μια μεταβλητή, μετατρέποντάς την αυτόματα σε οποιονδήποτε άλλο τύπο έχουμε ορίσει ως ξεχωριστό πεδίο μέσα στο union. Και όχι μόνο αυτό, αλλά όταν αναθέτουμε τιμή σε μια μεταβλητή τύπου union, η τιμή αυτή μπορεί να δοθεί σε οποιονδήποτε από τους τύπους που έχουμε ορίσει ως πεδία μέσα στο union.
Το απλούστερο παράδειγμα που μου έρχεται για αρχή είναι ένα union που θα μετατρέπει μια μεταβλητή από int σε char και αντίστροφα. Δείτε τον παρακάτω κώδικα που δείχνει ακριβώς αυτό, και πείτε μου αν είμαστε ΟΚ, για να συνεχίσουμε.
- Κώδικας: Επιλογή όλων
#include <stdio.h>
typedef union converted {
int integer;
char character;
} Converted;
// ------------------------------------------------------------
void print_union( Converted uni )
{
printf("as integer : %d\n", uni.integer );
printf("as character: %c\n\n", uni.character );
return;
}
// ------------------------------------------------------------
int main( void )
{
Converted uni = { .integer = 65 }; // αρχικοποίηση δομής σύμφωνα με την αναθεώρηση C99 (πριν δεν μπορούσαμε να αρχικοποιούμε δομές)
// η τελεία, το όνομα του πεδίου και το = είναι προαιρετικά, θα μπορούσε να γραφτεί κι έτσι: Converted uni = { 65 };
print_union( uni );
uni.character = 'Z';
print_union( uni );
uni.integer = 66;
print_union( uni );
return 0;
}
* για να μη γεμίζω τον κώδικα με printf κάθε φορά που αναθέτω διαφορετική τιμή στη μεταβλητή τύπου union, το έκανα ξεχωριστή συνάρτηση το τύπωμά της.