Kann funktion trotz include nicht finden



  • (Siehe bitte 4. Beitrag für "Funktionproblem"; wollte das forum nicht zumüllen 🙂

    Hi Leute,

    ich möchte gerne Variablen definieren, die über jede Quellcodedatei erreichbar und änderbar ist.

    Ist das mit 'extern' möglich?

    ich würde das ganze gerne etwas eleganter schreiben, aber ich finde zur zeit leider
    nichts.

    greetz johnc.



  • JohnC. schrieb:

    ich möchte gerne Variablen definieren, die über jede Quellcodedatei erreichbar und änderbar ist.
    Ist das mit 'extern' möglich?

    Ja, vllt hättest du es einfach ausprobieren sollen 😃

    JohnC. schrieb:

    ich würde das ganze gerne etwas eleganter schreiben, aber ich finde zur zeit leider nichts.

    Schau dir eventuell mal das Singelton an. Mir kommt ein so allgemeiner Zugriff auf Variablen, wie du ihn planst, aber wenig sinnvoll vor. Ein Singelton, das nur zur Kapselung von globalen Variablen dient, ist auch nicht gerade optimal. Meist gibt es da bessere Alternativen.

    Gruß
    Don06[url][/url]



  • Don06 schrieb:

    Ein Singelton, das nur zur Kapselung von globalen Variablen dient, ist auch nicht gerade optimal.

    Manchmal aber notwendig, Stichwort „Registry“.



  • Hi, ich brauch mal wieder einen kleinen Schubs 🙂

    folgender Code:
    step.h

    #ifndef _STEP_
    #define _STEP_
    
    #include <iostream>
    #include "variabeln.h"
    #include "tabelle.h"
    #include "ctrlStepArray.h"
    #include "routine.h"
    using namespace std;
    
    void step(int wordpos)
    {
    bool ctrl;
       for (int i=1; i<=8; ++i)
          {
          switch(i)
             {
             case 1:  if (stepArray[wordpos].y-1 >= 0)
                         {
                         ctrl = ctrlStAr(0,-1, wordpos);
                         if (ctrl == false)
                            {
                            int x = stepArray[wordpos].x;
                            int y = stepArray[wordpos].y-1;
                            routine(x,y,wordpos);
                            }
                         }
                      break;
             case 2: break;
             case 3: break;
             case 4: break;
             case 5: break;
             case 6: break;
             case 7: break;
             case 8: break;    
             }
    
          }
    };
    
    #endif
    

    routine.h

    #ifndef _ROUTINE_
    #define _ROUTINE_
    
    #include "variabeln.h"
    #include "step.h"
    #include "tabelle.h"
    using namespace std;
    
    void routine(int x, int y, int wordpos)
    {
       tabelle lolol;
       lolol.ctrl[0] = false;
       lolol.ctrl[1] = false;
       word = word + tab[x][y];
       ++wordpos;
       lolol = db.control(word, wordpos);
    
       if (lolol.ctrl[0])
    	   {
    	   if (lolol.ctrl[1])
    		   {
    			cout << word << endl;
    		   }
    	   }
       else
    	   {
    		int sfrtg = word.size();
          word.erase(sfrtg-1,1);
          --wordpos;
    	   }
       step(wordpos);
    };
    #endif
    

    wenn ich kompilieren möchte kommt
    error C3861: 'routine': identifier not found

    ich frag mich bloß warum 😕

    in der main habe ich routine.h genauso inlcudet, und dort findet er 'routine'

    greetz johnc.



  • Hallo JohnC.,
    dein Fehler kommt zu stande, weil du das project falsch organisierst.

    Ein Beispiel wie es gemacht wird.
    routine.h

    #ifndef _ROUTINE_
    #define _ROUTINE_
    
    #include "variabeln.h"
    #include "step.h"
    #include "tabelle.h"
    
    void routine(int x, int y, int wordpos);
    
    #endif
    

    routine.cpp

    #include "routine.h"
    
    void routine(int x, int y, int wordpos)
    {
       tabelle lolol;
       lolol.ctrl[0] = false;
       lolol.ctrl[1] = false;
       word = word + tab[x][y];
       ++wordpos;
       lolol = db.control(word, wordpos);
    
       if (lolol.ctrl[0])
           {
           if (lolol.ctrl[1])
               {
                cout << word << endl;
               }
           }
       else
           {
            int sfrtg = word.size();
          word.erase(sfrtg-1,1);
          --wordpos;
           }
       step(wordpos);
    }
    

    Du solltest alle deine Dateien in eine *.h Datei (Header)
    und eine *.cpp Datei (implementation) teilen.

    PS: verwende nie using namespace std; oder andere in einer Hederdatei,
    verwende sie nur in der implementationdatei.



  • ok ich probier das gleich mal aus ➡

    greetz



  • ich krieg jetzt lauter Linker Fehelr

    ctrlStepArray.obj : error LNK2005: "class datenbank db" (?db@@3Vdatenbank@@A) already defined in racer_main.obj

    main.cpp

    #include <iostream>
    #include <fstream>
    #include <string>
    #include "datenbank.h"
    #include "tabelle.h"
    #include "variabeln.h"
    #include "routine.h"
    using namespace std;
    

    routine.h

    #ifndef _ROUTINE_
    #define _ROUTINE_
    
    #include "variabeln.h"
    #include "step.h"
    #include "tabelle.h"
    #include <iostream>
    #include <string>
    
    void routine(int x, int y, int wordpos);
    
    #endif
    

    step.h

    #ifndef _STEP_
    #define _STEP_
    
    #include <iostream>
    #include "variabeln.h"
    #include "tabelle.h"
    #include "ctrlStepArray.h"
    #include "routine.h"
    
    void step(int wordpos);
    
    #endif
    

    ctrlStepArray.h

    #ifndef _ctrlStepArray_
    #define _ctrlStepArray_
    
    #include "variabeln.h"
    #include <iostream>
    
    bool ctrlStAr(int x, int y, int wordpos);
    
    #endif
    

    variabeln.h

    #ifndef _VARIABELN_
    #define _VARIABELN_
    #include "datenbank.h"
    #include "tabelle.h"
    
    const int ct = 2;
    datenbank db;
    string word = "";
    tabelle stepArray[10];
    char tab[ct][ct];
    
    #endif
    

    brauch ich für variablen.h auch eine cpp?



  • JohnC. schrieb:

    brauch ich für variablen.h auch eine cpp?

    Ja

    Was machst du eigentlich für ein programm?
    Wieviel Dateien sind in dem Project?



  • hm die fehler sind immer noch da, wie soll denn die Variablen.cpp aussehen? ich hab in der header doch nur variablen deklariert.

    Was machst du eigentlich für ein programm?

    nehmen wir an es gibt eine Tabelle bestehend aus buchstaben

    01
    0 en
    1 si

    das ist jetzt mal ne kleine Tabelle 🙂

    ich programmiere gerade ein programm, was die wörter herausfindet, welche mit diesen buchstaben möglich sind.

    Allerdings darf jeder buchstaben nur einmal vorkommen, und nur benachbarte Buchstaben folgen (diagonal, vert,horizont)

    bei diesem beispiel gehen:
    ein
    eins
    eis
    ins
    nie
    sei
    sein
    sie
    sin

    min. 3 B.staben

    Wieviel Dateien sind in dem Project?

    es besteht aus der main
    dann aus der routine(func) datei die dazu dient selbst aufgerufen zu werden 🙂
    die step(func) datei, die die schritte 1 bis 8 durchgeht(oben, obenrechts, rechts) etc.
    die datenbank Klasse, zum einlesen, der datenbank txt-file, und kontrollieren der wörter
    und die ctrlStepArray(func) die kontrolliert, wenn ein schritt möglich ist, ob der buchstabe nicht schon im Wort vorhanden ist

    greetz johnc.



  • Ok, verschiebe alle variable aus Variable.h in die main.cpp
    mache überall wo du eine bestimte variable verwendest
    eine extern deklaration.
    z.B.
    du verwendest in der routine.cpp " tab " also mach in der
    Datei routine.h folgendes

    const int ct = 2;
    extern char tab[ct][ct];
    

    sagen wir du verwendest die Variable " tab "
    nur in der datei routine.cpp, dann kannst du dort

    const int ct = 2;
    char tab[ct][ct];
    

    schreiben und sost nirgend wo.

    PS:
    Giebt es eine Datei namens racer_main.cpp oder racer_main.h?
    Was ist in der tabelle.h drin?



  • jo super, ich hatte das schon vorher mit extern versucht, aber jetzt glaub ich hab ich das prinzip verstanden.

    Giebt es eine Datei namens racer_main.cpp oder racer_main.h?
    Was ist in der tabelle.h drin?

    es gibt eine racer_main.cpp

    in der tabelle.h habe ich eine Klasse

    #ifndef _TABELLE_
    #define _TABELLE_
    
    class tabelle
    { 
    public:
       int x,y,iStep;
       bool ctrl[2];
    
       tabelle();
    };
    #endif
    


  • Hi John,

    gewöhn Dir an, nur die wirklich notwendigen Includes in eine Headerdatei zupacken. Wenn Du in jeden Header <iostream> einfügst, dann verlangsamt das die Compilezeit von Deinem Projekt nur unnötig, ohne etwas zu nützen, und so wie's scheint, benötigst Du den Header in Wahrheit nirgendwo.

    (Wenn Du einfach auf eine Deklaration aus <iostream> zurückgreifen willst, z.B. 'std::basic_ostream', dann reicht es außerdem, wenn Du statt <iostream> den Header <iosfwd> einbindest, der enthält nur die notwendigen Vorwärtsdeklarationen. Dadurch beschleunigst Du die Compilezeit auch.)

    Und noch etwas: nie, nie 'using namespace …' in einem Header! Das führt zu Namenskonflikten.



  • Jo, Vielen Dank,

    ich benutze an und an cout zum debuggen, deswegen binde ich das überall ein. Aber ich merke gerade, dass das mit dem Debugger wesentlich, einfacher ist 🙂

    apropos: Gerade bin ich voll dabei und es gibt da eine Sache(wesentlich mehr=), die ich nicht verstehe

    #include "step.h"
    
    using namespace std;
    
    void step(int wordpos)
    {
    extern tabelle stepArray[10];
    const int ct = 2;
    
    bool ctrl;
       for (int i=stepArray[wordpos].iStep; i<=8; ++i)
          {
          switch(i)
             {
             case 1:  if (stepArray[wordpos].y-1 >= 0)
                         {
                         ctrl = ctrlStAr(0,-1, wordpos);
                         if (ctrl == false)
                            {
                            int x = stepArray[wordpos].x;
                            int y = stepArray[wordpos].y-1;
                            stepArray[wordpos].iStep = i;
                            routine(x,y,wordpos);
                            }
                         }
                      else
                         {
                         break;
                         }
             case 2: if ((stepArray[wordpos].x+1 <= ct)&&(stepArray[wordpos].y-1 >= 0))
                         {
                         ctrl = ctrlStAr(+1,-1, wordpos);
                         if (ctrl == false)
                            {
                            int x = stepArray[wordpos].x+1;
                            int y = stepArray[wordpos].y-1;
                            routine(x,y,wordpos);
                            }
                         }
                     break;
             case 3: if (stepArray[wordpos].x+1 <= ct)/*&&(stepArray[wordpos].y >= 0)*/
                         {
                         ctrl = ctrlStAr(+1,0, wordpos);
                         if (ctrl == false)
                            {
                            int x = stepArray[wordpos].x+1;
                            int y = stepArray[wordpos].y;
                            routine(x,y,wordpos);
                            }
                         }
                     break;
             case 4: if ((stepArray[wordpos].x+1 <= ct)&&(stepArray[wordpos].y+1 <= ct))
                         {
                         ctrl = ctrlStAr(+1,+1, wordpos);
                         if (ctrl == false)
                            {
                            int x = stepArray[wordpos].x+1;
                            int y = stepArray[wordpos].y+1;
                            routine(x,y,wordpos);
                            }
                         }
                     break;
             case 5: if /*((stepArray[wordpos].x+1 <= ct)&&*/(stepArray[wordpos].y+1 <= ct)
                         {
                         ctrl = ctrlStAr(0,+1, wordpos);
                         if (ctrl == false)
                            {
                            int x = stepArray[wordpos].x;
                            int y = stepArray[wordpos].y+1;
                            routine(x,y,wordpos);
                            }
                         } 
                     break;
             case 6:  if ((stepArray[wordpos].x-1 >= 0)&&(stepArray[wordpos].y+1 <= ct))
                         {
                         ctrl = ctrlStAr(-1,+1, wordpos);
                         if (ctrl == false)
                            {
                            int x = stepArray[wordpos].x-1;
                            int y = stepArray[wordpos].y+1;
                            routine(x,y,wordpos);
                            }
                         }
                      break;
             case 7:  if (stepArray[wordpos].x-1 >= 0)/*&&(stepArray[wordpos].y-1 >= 0))*/
                         {
                         ctrl = ctrlStAr(-1,0, wordpos);
                         if (ctrl == false)
                            {
                            int x = stepArray[wordpos].x-1;
                            int y = stepArray[wordpos].y;
                            routine(x,y,wordpos);
                            }
                         }
                      break;
             case 8:  if ((stepArray[wordpos].x-1 >= 0)&&(stepArray[wordpos].y-1 >= 0))
                         {
                         ctrl = ctrlStAr(-1,-1, wordpos);
                         if (ctrl == false)
                            {
                            int x = stepArray[wordpos].x-1;
                            int y = stepArray[wordpos].y-1;
                            routine(x,y,wordpos);
                            }
                         }
                      break;    
             }
    
          }
    };
    

    bei break, springt er nicht aus switch raus in die schleife zurück sondern, geht einfach auf die nächste case-Bedingung zu, obwohl ich da break; stehen habe 😕

    greet johnc.



  • 😮 😮 😮
    Sorry, aber der Code ist ja grausig !!

    Mein Tipp als Erstes: Lege im switch-Block nur fest, ob und mit welchen Offsets später routine() aufgerufen werden soll und mache den Aufruf nach dem Block.

    Gruß,

    Simon2.



  • jo, aber break; ignoriert er ja trotzdem 😞



  • In der ersten case Anweisung benutz du if:

    if(...)
    //kein break; fehler
    else
        break;
    

    Kommt diese fehler immer noch

    ctrlStepArray.obj : error LNK2005: "class datenbank db" (?db@@3Vdatenbank@@A) already defined in racer_main.obj



  • Jo, das hatte ich nur zum ausprobieren.
    ich versteh nicht warum das nicht geht 😡
    Egal was ich machen, er springt immer weiter zu case 2 😕

    Nee die ganzen linkerfehler sind jetzt weg(dank extern), VielenDank!!! dafür 🙂

    greetz johnc.



  • case 1:  if (stepArray[wordpos].y-1 >= 0)
                         {
                         ctrl = ctrlStAr(0,-1, wordpos);
                         if (ctrl == false)
                            {
                            int x = stepArray[wordpos].x;
                            int y = stepArray[wordpos].y-1;
                            stepArray[wordpos].iStep = i;
                            routine(x,y,wordpos);
                            }
                         }
                      break; // break am ende
    
             case 2: if ((stepArray[wordpos].x+1 <= ct)&&(stepArray[wordpos].y-1 >= 0))
    


  • So hatte ich das ursprünglich, er springt aber dennoch zu case 2 ohne zur schleife zu kommen 😞

    greetz johnC++



  • so hab jetzt in vc++ 2008 neues projekt gelegt, die dateien einfach reinkopiert, und siehe da es geht 😕

    ich hab einfach nur dei dateien ins projekt "geaddet".

    greetz johnC++


Anmelden zum Antworten