Probleme mit Char-Zeigern und arrays



  • habe ich probiert... ähnliches/gleiches problem!

    Mache ich es genau so, wie du geschrieben hast, kommt die Meldung in der Zwei.cpp, dass die Variable bla keinen Datentyp hat und int angenommen wird... dafür sind die Linkerfehler weg!

    Mache ich das extern davor und weise trotzdem Wert im Header zu, kommt wieder der Linkerfehler (halbwegs logisch, nach definiton von extern, die ich erst mal googlen musste)



  • KalrHeinz schrieb:

    habe ich probiert... ähnliches/gleiches problem!

    dann hast du es falsch probiert.

    KalrHeinz schrieb:

    Mache ich es genau so, wie du geschrieben hast, kommt die Meldung in der Zwei.cpp, dass die Variable bla keinen Datentyp hat und int angenommen wird... dafür sind die Linkerfehler weg!

    klar hat bla nen datentyp, den machst du ja in der *.h datei bekannt.
    in Zwei.cpp muss natürlich die *.h datei, in der

    int bla;
    

    steht, mit include eingebunden werden.

    KalrHeinz schrieb:

    Mache ich das extern davor und weise trotzdem Wert im Header zu, kommt wieder der Linkerfehler (halbwegs logisch, nach definiton von extern, die ich erst mal
    googlen musste)

    im header wird nix zugewiesen, das machst du in einer *.c datei.

    🙂



  • edit: extern vergessen.

    //bla.h
    #ifndef BLA_H
    #define BLA_H
    extern int bla;
    #endif
    
    //bla.c
    #include "bla.h"
    bla = 3;
    
    //main.c
    #include "bla.h"
    ...
    printf("%d", bla);
    ...
    

    Ausgabe: 3



  • vllt. hast du auch die include guards vergessen.



  • ja doch schon so gemacht also:

    //header.h
    
    extern int bla;
    extern unsigned char ARRAY[15];
    
    //Zwei.cpp
    
    #include "header.h"
    
    bla=3;
    ARRAY[1]=0x13; //Beispielehaft
    

    und dann kommt bei bla=3 unbekannter Datentyp!



  • KalrHeinz schrieb:

    ja doch schon so gemacht also:

    //header.h
    
    extern int bla;
    extern unsigned char ARRAY[15];
    
    //Zwei.cpp
    
    #include "header.h"
    
    bla=3;
    ARRAY[1]=0x13; //Beispielehaft
    

    und dann kommt bei bla=3 unbekannter Datentyp!

    shit. du hast recht. man muss wohl auch in der *.c datei den datentypen angeben.
    also

    // bla.c
    #include bla.h
    int bla = 3;
    

    sorry!
    vllt. waren es die include guards, die du vergessen hast?



  • auch nicht ganz, gebe ich in der cpp nochmal int davor an, gibt er mir den Fehler Doppeldeklaration...

    Trotzdem Danke... ich werde morgen nochmal schauen, für heute ist Schicht im Schacht!



  • KalrHeinz schrieb:

    auch nicht ganz, gebe ich in der cpp nochmal int davor an, gibt er mir den Fehler Doppeldeklaration...

    Trotzdem Danke... ich werde morgen nochmal schauen, für heute ist Schicht im Schacht!

    daher die frage nach den include-guards ...



  • nein Header.h ist immer mit

    #include "Header.h"
    

    dabei. Und im header eben

    #pragma once
    

    und dann Variablen...



  • oh, ok.
    pragma once als include guard kannte ich noch gar nicht.



  • Funktioniert übrigends immenroch nicht... verstehe es nicht...
    keiner Eine Idee? Habe keine 2 gleiche Funktione, keine 2 main oder sowas! in Eins.Cpp wird Funktion aus Zwei.cpp aufgerufen und in zwei.cpp wird eine funktion aus drei.cpp aufgerufen... also auch ablaufreihenfolge ist klar!
    Habe nun probiert, die Variablen ganz aus dem Header zu nehmen, weil ein Header für drei cpps, und dann eben die Variablen explizit beim Funktiosnaufruf auch mit zu übergeben, da brachte einen Teilerfolg, aber nicht alle Linkerfehler sind beseitigt!



  • KalrHeinz schrieb:

    ja doch schon so gemacht also:

    //header.h
    
    extern int bla;
    extern unsigned char ARRAY[15];
    
    //Zwei.cpp
    
    #include "header.h"
    
    bla=3;
    ARRAY[1]=0x13; //Beispielehaft
    

    und dann kommt bei bla=3 unbekannter Datentyp!

    Wo steht denn das bla=3 ?
    In einer Funktion oder außerhalb ?



  • außerhalb


  • Mod

    KalrHeinz schrieb:

    außerhalb

    Zuweisungen können nicht außerhalb von Funktionsblöcken stehen.



  • seit wann das? Außerhalb ist es eine globale Variable, innerhalb eine für nur diese Funktion!



  • drei dateien sind das? lade doch mal irgendwo hoch das ganze, vllt erbarmt sich ja jemand ...

    wieso haben deine dateien eigentlich die endung cpp?
    das ist eher ungewöhnlich und manch ein compiler schaltet dann in den c++ modus.
    nicht dass es jetzt für dein problem unbedingt relevant sein müsste, nur ne frage am rande ...


  • Mod

    KalrHeinz schrieb:

    seit wann das?

    Immer schon und das wird auch ewig so bleiben. Wann sollte denn dieser Code ausgeführt werden, wenn er zu keiner Funktion gehört? Du denkst vermutlich gerade an die Definition einer Variablen mit gleichzeitiger Zuweisung.



  • weil ich das ganze im Visual Studio 2008 mache und es dort kein wirklich reines C mehr gibt... außerdem nutzte ich auch die << Operatoren usw. also einen schönen Misch-Masch aus beiden!

    Hab einen Teil des Fehlers wohl beseitigt, hatte (wie das so oft kommt) ein Strichpunkt vergessen... warum dann Linker Fehler kommen, ist mir fraglich. Jetzt hab ich noch einen Linkerfehler, der mir sagt, ich hätte ein unaufgelöstes Symbol, was wohl nicht mehr das Problem ist, was ich bisher hatte.

    Also nochmal Danke für die Hilfe!



  • @SeppJ

    nene Beispiel:

    #include "sonstwas"
    
    int a = 3; // globale Variable, die in jeder Funktion dieser Datei verwendet werden kann, oder falls es ein Header ist in jeder Funktion, die den Header kennt
    
    int main(void) {
       Funktiona()
       }
    
    int Funtkiona {
      a=4; // neuen Wert zuweisen
    }
    

    und so mache ich das seit immer eigendlich...



  • Aber in deinem anderen Beispiel war da doch drei Dateien mit Headern.

    Dann wäre das doch so:

    #include "was"
    
    extern int a; // steht sonst in einem Header
    
    a = 3; // Und hier bekommst du deinen Fehler
    
    int foo(void) {
       Funktiona()
       }
    
    int Funtkionb {
      a=4; // neuen Wert zuweisen
    }
    

Anmelden zum Antworten