Function Problem



  • Hey dudes ^^,
    habe ne totale noob frage xD
    weiß irgentwie im moment voll nicht wie das geht ...

    ich habe mehrere variablen die ich in einer header datei deklariere

    dann eine function die die variablen ändert...

    aber es passiert nur inerhalb der function .. was mach ich falsch? ^^

    here code :
    main.cpp=

    #include "functionen.h"
    
    int main(){
    cout << carray1 << endl << carray2 << endl << variable1 << endl;
    tuuttuut();
    cout << carray1 << endl << carray2 << endl << variable1 << endl;
    }
    

    functionen.h=

    #include "iostream.h"
    
    static char carray1[20] = "Lukas";
    static char carray2[10] = "Monotoooo";
    static unsigned int variable1 = 9999;
    
    void tuuttuut();
    

    functionen.c=

    #include "functionen.h"
    
    void tuuttuut(){
    carray1 = "manu12"
    carray1 = "manuuuu1231u"
    variable1 = 12}
    

    Mfg NOOB ^^



  • das sollte gar nicht kompilieren.
    um zeichenketten zu kopieren, verwende die funktion strcpy (oder strncpy) aus cstring oder steige gleich auf std::string um.

    außerdem sind die variablen, die du in der header-datei definierst static. ich nehme an, das hast du gemacht, weil es sonst nicht kompilieren würde.

    das war aber an der falschen stelle geändert, denn durch das static bekommt jede übersetzungseinheit (das wären bei dir main.c und funktionen.c) ihre eigenen variablen carray1 und variable1 usw.

    die lösung: im header nur deklarationen unterbringen und in einer übersetzungseinheit die definition für die variablen.
    das funktioniert so:

    //functionen.h
    extern char carray1[];
    extern int variable1;
    void tut();
    
    //functionen.c
    #include "functionen.h"
    #include <cstring>
    
    char carray1[] = "Foo";
    int variable1 = 42;
    
    void tut ()
    {
       strcpy (carray1, "Bar");
       variable1 = 23;
    }
    

    ps: mit ein grund, warum globale variablen zu vermeiden sind.



    1. Man kann Arrays nichts zuweisen, das dürfte so nicht durch den Compiler gehen.
    2. Deine Variablen sind static, haben also interne Bindung. In main.cpp und funktionen.c gibt es also jeweils einen eigenen Satz dieser Variablen, und das ist der Grund, dass du die Änderungen in der main nicht siehst.


  • Bashar schrieb:

    In main.cpp und funktionen.c gibt es also jeweils einen eigenen Satz dieser Variablen, und das ist der Grund, dass du die Änderungen in der main nicht siehst.

    Sollte man dann static Variablen immer in .c Source-Dateien definieren und nie im Header?



  • static ist eine art primitiver datenkapselungsmechanismus, von daher wird wohl meistens die verwendung im header nicht das gewünschte resultat liefern. prinzipiell wäre das aber kein fehler, und wenn dir eine situation einfällt, in der du dieses verhalten brauchst...

    (ps: dass static durch anonyme namespaces abgelöst werden soll, deutet diesen verwendungszweck ebenfalls an.)



  • queer_boy schrieb:

    wenn dir eine situation einfällt, in der du dieses verhalten brauchst...

    http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter



  • für strings in c++ std::string und nicht char*



  • Also static Variablen gelten, wenn man sie in dem Modul als global deklariert, nur in diesem Modul, obwohl sie global deklariert sind? Und wenn man in einer Funktion eine Variable static deklariert, dann ist sie zwar lokal, wird aber, wenn man die Funktion verlässt, nicht zerstört, behält also quasi ihren Speicherbereich noch?

    Ist das das Einzige was static bringt?



  • schließlich gibt es noch statische klassenvariablen/funktionen, die dann für alle instanzen dieselben sind.



  • kk habe ja gesagt noob frage 😛
    schon lange nicht mehr programmiert..

    naja jetzt dann ne frage:

    also wie soll ich das machen ..

    ich möchte eine function die mit

    DWORD WINAPI GetPrivateProfileString(
      __in   LPCTSTR lpAppName,
      __in   LPCTSTR lpKeyName,
      __in   LPCTSTR lpDefault,
      __out  LPTSTR lpReturnedString,
      __in   DWORD nSize,
      __in   LPCTSTR lpFileName
    );
    

    daten aus einer ini datei ließt

    habe in main.cpp
    nur den aufruf der funktion laden und dann gibt der das aus also

    #include "windows.h"
    #include "function.h"
    ...
    ...
    ...
    lesedateiaus();
    cout << blabla1[] << testtaa[] << muuuuh[];
    ...
    ...
    ...
    

    ind function.h habe ich die arrays deklariert(und die function halt)

    #include <iostream>
    
    extern char blablal[20]; //muss ne größe angeben für function später
    extern char testtaa[20];
    extern char muuuuh[20];
    
    void lesedateiaus();
    

    dann in function.c die funktion halt.

    #include "windows.h"
    #include "function.h"
    
    lesedateiaus(){
    GetPrivateProfileString("test","array1","Error",blablal,sizeof(blablal),"C:\\test.ini");
    //das dann noch für die anderen arrays
    GetPrivateProfileString("test","array2","Error",testtaa,sizeof(testtaa),"C:\\test.ini");
    GetPrivateProfileString("test","array2","Error",muuuuh,sizeof(muuuuh),"C:\\test.ini");
    }
    

    also das ist jetzt falsch...
    aber wie könnte ich es """professionell""" lösen?^^

    Mfg NOOB ^^



  • weiß das keiner? o.o

    ka wie ich das machen soll



  • Was funktioniert denn nicht (Compilerfehler, Laufzeitfehler, falsche Rückgabewerte)?

    P.S. Dies ist dann eher eine Frage für das WinAPI-Forum...



  • da kommt das ich die variable nicht deklariert habe ...



  • Dann deklariere sie doch, wo ist da das Problem?

    btw, wenn sich der Linker beschwert, liegt es vermutlich an einer fehlenden Definition - dem reicht der extern-Eintrag im Header nämlich nicht aus. Da mußt du am Anfang der "funktion.c" noch die Definitionen ergänzen.



  • bekomme jetzt ganz oft so einen error :

    [Linker error] undefined reference to `variablen_name'
    

    also füre jede variable 2-3 mal
    denke ma pro aufruf oder so.

    Mfg NOOB ^^



  • omg geschaft ^^ sry xD
    mega noob einfach zu faul gewesen sorry


Anmelden zum Antworten