Προς το περιεχόμενο

static struct


I@n15

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια και χαρα σε ολους τους φιλους,η ερωτηση μου ειναι πως μπορω να χρησιμοποιησω στατικα struct,δινω το παρακατω παραδειγμα και θα θελα να μου πειτε αν ειναι προγραμματιστικα σωστο διοτι το αποτελεσμα ειναι ενταξει.Απλα εμφανιζω τους αριθμους απο 0-5

 

>#include <stdio.h>

struct mystruct{

   int x;
};

static struct mystruct st;


void func1()
{
   extern struct mystruct st;

   printf("%i\n",st.x++);
}

int main()
{
   int i;
   
   for(i = 0; i <= 4; i++)
   {
       func1();
   }
}

Δημοσ.

Έτσι όπως είναι δηλωμένο, μπορεί να χρησιμοποιηθεί σε όποιο σημείο θες. Αν βγάλεις το extern blabla μέσα από την func1 δεν θα έχει κάποια επίδραση στο πως λειτουργεί το πρόγραμμα.

 

Αν το struct είχε δηλωθεί σαν static μέσα στην func1 (και καθόλου από έξω), τότε το scope του θα ήταν μόνο μέσα στην func1, αλλά μεταξύ κλήσεων θα συνέχιζε να διατηρεί την τελευταία τιμή που του έδωσες.

Δημοσ.

To extern απ ότι διάβασα εδώ χρησιμοποιήται για να διαχειριστείς μια μεταβλητή η οποία έχει δηλωθεί στον κώδικα άλλου προγράμματος C που εκτελείται την ίδια χρονική στιγμή.

 

Και δεν έχει ουσία όπως είπε και ο προλαλήσαντας να το χρησιμοποιήσεις για να διαχειριστείς μεταβλητή που έχει δηλωθεί.. στο ίδιο πρόγραμμα..

Δημοσ.
To extern απ ότι διάβασα εδώ χρησιμοποιήται για να διαχειριστείς μια μεταβλητή η οποία έχει δηλωθεί στον κώδικα άλλου προγράμματος C που εκτελείται την ίδια χρονική στιγμή. αρχείου .c/.cpp του ίδιου προγράμματος

 

Και δεν έχει ουσία όπως είπε και ο προλαλήσαντας να το χρησιμοποιήσεις για να διαχειριστείς μεταβλητή που έχει δηλωθεί.. στο ίδιο πρόγραμμα..

...........................
Δημοσ.

bxenos μπορείς να εξηγήσεις λίγο περισσότερο γιατί σαν νέος δεν το έπιασα..! Η αλήθεια ότι και μένα δεν μου κόλλαγε καλά έτσι όπως το κατάλαβα στην αρχή..

Τι εννοείς δλδ όταν λές άλλο αρχείο .c στο ίδιο πρόγραμμα..? Κάθε .c δεν έχει και το δικό του εκτελέσιμο...?

Δημοσ.

Εγω παντος, το extern το ξερω ως extern "C" και ξερω οτι ειναι για import & export functions (σε cpp).

Μια απορια.

>[color="#8000ff"]int[/color] value;
[color="#8000ff"]int[/color] main()
{
}

Αυτο δεν ειναι στην ουσια

>[color="#0000ff"][b]static[/b][/color] [color="#8000ff"]int[/color] value;
[color="#0000ff"][b]static[/b][/color] [color="#8000ff"]int[/color] main()
{
}

Δημοσ.

το extern "C" είναι επιπλέον δήλωση για να γνωρίζει ο μεταγλωττιστης την ονοματολογία.

Δηλαδή οι συναρτησεις void xxx(int) και double xxx(char *) στην C αποθηκεύονται στο object (compiled) αρχείο με το ίδιο ονομα (αρα δεν μπορουν να υπάρχουν στο ιδιο project), ενω στη cpp αποθηκεύονται με διαφορετικό όνομα το οποίο περιλαμβάνει και τους τύπους των ορισμάτων (ας πούμε xxxint και xxxcharp - παράδειγμα λέω, δεν θυμάμε πως μεταφράζονται τα ονόματα!).

Ο linker που πέρνει όλα τα μεταγλωττισμένα (obj) και φτιάχνει το exe, πρέπει να βρεί ίδια ονόματα στη συνάρτηση κατα τον ορισμό και κατα την κλήση της.

Αν λοιπόν έχουμε ενωσει ένα C αρχειο με ένα cpp και θέλουμε να καλούμε (ή να μπορουμε να καλέσουμε) συναρτησεις του ενός στο άλλο, πρέπει να διαλέξουμε κοινη ονοματολογια. Και το μόνο κοινο μεταξύ c/cpp είναι η ονοματολογια της C.

 

---------- Το μήνυμα προστέθηκε στις 12:44 ----------

 

...

>
int value;
int main()
{
}

Αυτο δεν ειναι στην ουσια

>
static int value;
static int main()
{
}

το static int main() δεν θα μπορεσει να το βρεί ο linker αρα δεν θα κάνει exe, διότι το όνομα που θα πάρει η main στο object file είναι μοναδικό για όλο το project.

Αρα δεν θα μπορέσει ο "loader" της C που καλεί τη main να τη βρεί, αρα ο Linker δεν μπορεί να κάνει link την main στον loader.

 

Το static int value πέρνει και αυτό τυχαίο όνομα, αλλα αναλογα με τη λογική του προγραμματος, μπορεί να μην μας αφορα (αν δεν προσπαθούμε να προσπελάσουμε την value απο άλλο αρχείο ή δεν δηλώσουμε static value και σε άλλο αρχείο)

 

---------- Το μήνυμα προστέθηκε στις 12:44 ----------

 

Σ'αρεσαν τα χρωματάκια του karnage εεε;

Δημοσ.

[οφτοπικ]

@bxenos :D Αυτο το πραμα δε μου αρεσει με τη c++, δηλαδη, μερικοι compiler μπορουν να το κανουν μερικοι οχι κλπ κλπ.... πχ αυτο που παραθεσα, σε vc express edition γινετε compile χωρης warnings errors etc...:mad:

 

re: σε αρεσαν τα... Αμε :)

Δημοσ.

@Εvgenios:

Καλά πως το έβγαλες το bwoxen;:shock::-D

 

---------- Το μήνυμα προστέθηκε στις 13:07 ----------

 

bxenos μπορείς να εξηγήσεις λίγο περισσότερο γιατί σαν νέος δεν το έπιασα..! Η αλήθεια ότι και μένα δεν μου κόλλαγε καλά έτσι όπως το κατάλαβα στην αρχή..

Τι εννοείς δλδ όταν λές άλλο αρχείο .c στο ίδιο πρόγραμμα..? Κάθε .c δεν έχει και το δικό του εκτελέσιμο...?

>
//αρχείο x1.c
int xxx = 3;
static int yyy = 4;

 

>
//αρχείο x2.c
#include <stdio.h>

extern int xxx;//η μεταβλητη είναι σε άλλο .c αρχειο

int main(){
    printf("xxx=%d",xxx);
}

 

cl x1.c x2.c

ή

gcc x1.c x2.c

ένωσε τα δύο αρχεία .c για να φτιάξεις ένα exe.

Π.χ σκέψου πως είναι γραμμένο ένα οποιοδήποτε πρόγραμμα (που δεν είναι απλά μια σχολική άσκηση). Εχει χιλιάδες γραμμές κώδικα, δεν είναι βολικο να το επεξεργαζόμαστε έτσι μεγάλο αν είναι σε ένα αρχείο.

Βέβαια δεν το κόβουμε με τον αριθμό γραμμών αλλά με τη λειτουργικότητα του περιεχομένου του.

 

άσχετο: αλλα τους πραγματικους αριθμους float/double τους κατάλαβες; δεν είχα πάρει απάντηση τοτε

Δημοσ.

άσχετο: αλλα τους πραγματικους αριθμους float/double τους κατάλαβες; δεν είχα πάρει απάντηση τοτε

 

Είχα ρίξει αρκετές ώρες διάβασμα τότε για να καταλάβω τι παίζει γενικότερα.. μπορώ να πώ στο μεγαλύτερο ποσοστό ότι τα έχω κατανοήσει..! Σόρρυ που δεν απάντησα τότε αλλά είχες κάνει πολύ καλή δουλειά και βοήθησε πολύ..

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...