Εμφάνιση 1-9 από 9
  1. #1
    Εγγραφή
    14-05-2017
    Μηνύματα
    25
    Downloads
    1
    Uploads
    0
    ISP
    HOL
    Θέλω να με βοηθίσετε ξανά σε ένα θέμα πιό χειροπιαστό. Έχω ένα αρχείο .cpp που έχει μερικές μεταβλητές και ήθελα να ρωτήσω πώς μπορώ να κάνω ένα αρχείο .h (Header File) το οποίο να έχει τις μεταβλητές μέσα αλλά να μπορώ να τις χρησιμοποίησω και από το αρχείο .cpp αλλά και από μια συνάρτηση από άλλο αρχείο .h. Ξέρω ότι η περιγραφή δεν είναι και η καλήτερη απλά θέλω να κάνω κάτι τέτοιο.

    Variable.h (Εδώ οι μεταβλητές)
    Fun.h (Εδώ η συνάρτηση που θα χρησιμοποίσει τις μεταβλητές από το αρχείο Variable.h)

    Και όλα αυτά include στο αρχείο main.cpp. (Φυσικά να μπορώ να χρησιμοποίησω τις μεταβλητές ακόμα και από το αρχείο main.cpp που κάνω include τις βιβλιοθήκες)

    Δοκίμασα να βάλω μπροστά από τις μεταβλητές την δεσμευμένη λέξη 'extern'. Το είχα βρέι στο ίντερνετ αλλά δεν έκανε δεν ξέρω αν φτέει που εχώ ubuntu αν και δεν νομίζω.
    Ευχαριστώ για άλλη μια φορά που έστω το διαβάσατε.

    Στο ιντερνέτ δεν βρήκα κάτι της προκοπής για τα Header Files.

  2. #2
    Εγγραφή
    05-10-2004
    Περιοχή
    Santa Clara, CA, USA
    Ηλικία
    38
    Μηνύματα
    1.307
    Downloads
    9
    Uploads
    0
    Τύπος
    Cable
    Ταχύτητα
    200/5 Mbps
    ISP
    Comcast
    Router
    Netgear C7000v2
    Στο Variable.h θα ορίσεις κανονικά τις μεταβλητές σου, π.χ.
    Κώδικας:
    int var1;
    double var2;
    και στο Fun.h θα τις δηλώσεις ως extern:
    Κώδικας:
    extern int var1;
    extern double var2;

  3. #3
    Εγγραφή
    14-05-2017
    Μηνύματα
    25
    Downloads
    1
    Uploads
    0
    ISP
    HOL
    Δεν μπορώ να κάνω include στο Fun.h το αρχείο Variable.h και να τις χρησιμοποίησω απευθίας και έτσι απλά να κάνω #include <Variable.h> και να έχω τις μεταβλητές που χρειάζομε. Γίνετε με κάποιον τρόπο

    Ευχαριστώ.

    Π.χ
    Variable.h
    int x = 0;

    Fun.h
    #include <Variable.h>
    void Fun(){
    x = 3;
    }

    Κάτι τέτοιο έτσι το έχω στο μυαλό μου αλλά έτσι δεν γίνετε μήπως υπάρχει τρόπος να μην τις ξαναδηλώνω στο Fun.h

  4. #4
    Εγγραφή
    20-12-2005
    Μηνύματα
    3.196
    Downloads
    4
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    49997/4997
    ISP
    ΟΤΕ Conn-x
    DSLAM
    ΟΤΕ - ΞΑΝΘΗ
    Router
    Speedport W 724V
    SNR / Attn
    24,4(dB) / (dB)
    Παράθεση Αρχικό μήνυμα από djtkyri Εμφάνιση μηνυμάτων
    Δεν μπορώ να κάνω include στο Fun.h το αρχείο Variable.h και να τις χρησιμοποίησω απευθίας και έτσι απλά να κάνω #include <Variable.h> και να έχω τις μεταβλητές που χρειάζομε. Γίνετε με κάποιον τρόπο

    Ευχαριστώ.

    Π.χ
    Variable.h
    int x = 0;

    Fun.h
    #include <Variable.h>
    void Fun(){
    x = 3;
    }

    Κάτι τέτοιο έτσι το έχω στο μυαλό μου αλλά έτσι δεν γίνετε μήπως υπάρχει τρόπος να μην τις ξαναδηλώνω στο Fun.h
    Το variable.h το κάνεις include σε πολλά αρχεία; Τι μήνυμα λάθους παίρνεις; Μήπως "redefinition of x";

    Ας δούμε κάποιες εκδοχές αυτού που έγραψες:

    1)
    Κώδικας:
    % cat fun.h 
    #include "variable.h"
    
    void fun()
    {
    	x = 3;
    }
    Το fun.h είναι πάντα το ίδιο οπότε θα το γράψω μία φορά (καλό είναι σε headers να μπαίνουν μόνο τα prototypes και όχι η υλοποίηση των συναρτήσεων αλλά τώρα σε μια τόσο μικρή άσκηση ας το παραβλέψουμε αυτό).

    Κώδικας:
    % cat variable.h 
    int x = 0;
    
    % cat main.c 
    #include <stdio.h>
    #include "fun.h"
    
    int main(void)
    {
    	printf("x=%d\n",x);
    	fun();
    	printf("x=%d\n",x);
    	return 0;
    }
    
    % cc -Wall -O2 main.c && ./a.out 
    x=0
    x=3
    Στο variable.h υπάρχει μόνο η μεταβλητή x όπως ακριβώς την έχεις και μετά στο main.c γίνεται include μόνο το fun.h (το οποίο εσωτερικά εισάγει και το variable.h) και όλα παίζουν σωστά.

    2) Ας αλλάξουμε τώρα την main ώστε να κάνει include και το variable.h

    Κώδικας:
    % cat main.c                     
    #include <stdio.h>
    #include "fun.h"
    #include "variable.h"
    
    int main(void)
    {
    	printf("x=%d\n",x);
    	fun();
    	printf("x=%d\n",x);
    	return 0;
    }
    
    % cc -Wall -O2 main.c && ./a.out 
    In file included from main.c:3:
    variable.h:1:5: σφάλμα: redefinition of ‘x’
     int x = 0;
         ^
    In file included from fun.h:1,
                     from main.c:2:
    variable.h:1:5: σημείωση: previous definition of ‘x’ was here
     int x = 0;
         ^
    Ώπ αυτό δεν παίζει. Για αυτό σε ρώτησα πριν αν το variable.h το εισάγεις σε πολλά αρχεία. Τι γίνεται σε αυτήν την περίπτωση; Εισάγεις το variable.h και το fun.h το οποίο όμως εισάγει με τη σειρά του ξανά το variable.h οπότε καταλήγεις να έχεις την έκφραση "int x = 0;" δύο φορές το οποίο είναι λάθος γιατί δεν μπορείς να έχεις δύο διαφορετικές μεταβλητές με ίδιο όνομα. Το ίδιο θα γινόταν αν έκανες include μόνο το variable.h ή μόνο το fun.h αλλά σε δύο αρχεία (πχ στο main.c και στο other.c).

    Πώς μπορείς λοιπόν να το αλλάξεις αυτό ώστε να παίζει;

    3)
    Κώδικας:
    % cat variable.h 
    int x;
    
    % cat main.c 
    #include <stdio.h>
    #include "fun.h"
    #include "variable.h"
    
    int main(void)
    {
    	x = 0;
    	printf("x=%d\n",x);
    	fun();
    	printf("x=%d\n",x);
    	return 0;
    }
    
    % cc -Wall -O2 main.c && ./a.out 
    x=0
    x=3
    Ωπ καλά τώρα γιατί παίζει σωστά; Στο variable.h αφαιρέσαμε το "=0" το οποίο κάνει τεράστια διαφορά. Το σκέτο "int x;" είναι δήλωση (declaration). Μπορείς να δηλώσεις μια μεταβλητή 25 φορές (αρκεί να μην είναι διαφορετικές κάθε φορά οι δηλώσεις) χωρίς να έχεις πρόβλημα. Η δήλωση δεν κάνει τίποτα άλλο από το να πει στον compiler ότι μεγάλε εγώ θα χρησιμοποιήσω κάπου το όνομα x και θέλω να ξέρεις ότι αυτό είναι τύπου int. Από εκεί και πέρα όμως ούτε εκχωρείται μνήμη ούτε τίποτα.

    Όταν όμως γράψεις "int x = 0;" τότε έχεις ορισμό (definition) οπότε η μεταβλητή παίρνει σάρκα και οστά ας πούμε μπακάλικα και αυτό μπορεί να γίνει μόνο μία φορά. Μαζί με τις κυκλικές αναφορές, οι πολλαπλοί ορισμοί είναι ένα από τα πιο συνήθη προβλήματα που συναντάς σε header files για αυτό είθισται να μην έχεις definitions σε header files αλλά μόνο declarations. Υπάρχουν άπειροι οδηγοί στο διαδίκτυο και απαντήσεις στο stackoverflow απλά ίσως δεν ήξερες πώς να το ψάξεις.

    Επειδή όμως αφαιρέσαμε τον ορισμό από το variable.h έπρεπε να κάνουμε ακόμη μία αλλαγή που ήταν να προσθέσουμε στο main.c το "x = 0".
    "I like offending people, because I think people who get offended should be offended" - Linus Torvalds

    "Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
    κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
    Γα.... την πολιτική ορθότητα.

  5. #5
    Εγγραφή
    14-05-2017
    Μηνύματα
    25
    Downloads
    1
    Uploads
    0
    ISP
    HOL
    Θέλω να το κάνω ναι σε πολλά αρχεία πάραδειγμα
    Παράδειγμα.
    Variable.h
    #include <string>
    using namespace std;
    string x;

    Fun.h
    #include <Variable.h>

    void fun(){
    x="Hello World";
    }

    Print.h
    #include <cstdio>
    #include <iostream>
    #include <Variable.h>
    using namespace std;
    void print(){
    cout << x << endl;
    }

    main.cpp
    #include <cstdio>
    #include <iostream>
    #include <Variable.h>
    #include <Fun.h>
    #include <Print.h>
    int main(){
    fun();
    print();
    }
    (g++)
    Κάτι τέτοιο. Θέλω να μπορώ να τις τραβάω από το Variable.h ...

    Για να σου πώ ακριβώς τη θέλω να βάλω μέσα διότι δεν είναι και τόσο απλά αυτό που θέλω να κάνω.
    1)const int
    2)3x chars
    3)two integers (int)
    4)4x maps
    5)two boolean (bool)
    6)three enums
    7)one ifstream...
    Αύτα πάνω κάτω απλά δεν τα ανέφερα για να καταλάβω πρώτα την απλή έκδοση. Όσο για το stackoverflow μπένω κάθε μέρα είναι πολύ καλό σίτε αλλά δεν εχώ βρεί τίποτα αξιόλογο πάνω σε αυτό το θέμα και κοντά σε αυτό που θέλω... Ευχαριστώ εκτοπροτέρον που βοηθίσες!

  6. #6
    Εγγραφή
    20-12-2005
    Μηνύματα
    3.196
    Downloads
    4
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    49997/4997
    ISP
    ΟΤΕ Conn-x
    DSLAM
    ΟΤΕ - ΞΑΝΘΗ
    Router
    Speedport W 724V
    SNR / Attn
    24,4(dB) / (dB)
    Με "extern string x" στο variable.h και προσθήκη "string x" στο main.cpp δουλεύει αλλά μάλλον δεν σε βολεύει.
    "I like offending people, because I think people who get offended should be offended" - Linus Torvalds

    "Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
    κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
    Γα.... την πολιτική ορθότητα.

  7. #7
    Εγγραφή
    14-05-2017
    Μηνύματα
    25
    Downloads
    1
    Uploads
    0
    ISP
    HOL
    Ναι αυτό το ξέρω αλλά δεν θέλω να ξανά δηλώνω την μεταβλητή...

    Αυτός δηλαδή ο κώδικας δεν είναι σωστός έτσι;

    (Variable.h
    #include <string>
    using namespace std;
    string x;

    Fun.h
    #include <Variable.h>

    void fun(){
    x="Hello World";
    }

    Print.h
    #include <cstdio>
    #include <iostream>
    #include <Variable.h>
    using namespace std;
    void print(){
    cout << x << endl;
    }

    main.cpp
    #include <cstdio>
    #include <iostream>
    #include <Variable.h>
    #include <Fun.h>
    #include <Print.h>
    int main(){
    fun();
    print();
    })

  8. #8
    Εγγραφή
    13-11-2011
    Περιοχή
    Χολαργός
    Ηλικία
    37
    Μηνύματα
    1.442
    Downloads
    1
    Uploads
    0
    Τύπος
    VDSL2
    Ταχύτητα
    24000 / 4500
    ISP
    Wind
    DSLAM
    Wind - ΧΟΛΑΡΓΟΣ
    Path Level
    Interleaved
    Γιατί δεν φτιάχνεις ενα class με static τις μεταβλητές που θέλεις και στα αλλα αρχεία να το καλείς απο εκει;
    Variables.h
    Κώδικας:
    class variables{
    public:
      static string x;
    }
    Και παντού αλλού απλα την χρησιμοποιείς με "variables::χ".

    Αναγκαστικά βάζεις το όνομα της κλάσης μπροστά, αλλα σίγουρα γίνεται πιο ευαναγνωστος ο κωδικάς σου!

  9. #9
    Εγγραφή
    14-05-2017
    Μηνύματα
    25
    Downloads
    1
    Uploads
    0
    ISP
    HOL
    Εντάξη απλά μπερδέυομαι γενικότερα με τα object στην C++ τα ξερώ καλήτερα στην Java. Αλλά δεν έχει αντηκείμενα εδώ άρα...

    Θα μπορούσα ομώς να κάνω και struct αλλά δεν μου βγάνει. Ευχαριστώ πάντος μάλλον έτσι θα το κάνω...

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας