Kann funktion trotz include nicht finden



  • 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++



  • oh dann muss der fehler hier liegen.
    i++

    for (int i=stepArray[wordpos].iStep; i<=8; i++)
    


  • Ramsis schrieb:

    oh dann muss der fehler hier liegen.

    Sorry, aber das ist Schwachsinn und mit 100% Sicherheit nicht das Problem... Und davon abgesehen ist im Zweifel ++i immer i++ vorzuziehen. Dazu gibt es aber einen eigenen Thread.

    cu André



  • asc schrieb:

    Sorry, aber das ist Schwachsinn und mit 100% Sicherheit nicht das Problem... Und davon abgesehen ist im Zweifel ++i immer i++ vorzuziehen. Dazu gibt es aber einen eigenen Thread.

    1. Naja werden wir sehen!

    2. Das ist ein C Array, diese beiden operatoren werden von Compiler
    bereitgestellt ( ++i und i++ ), die anderen die du meinst sind die überladene
    Operatoren der STL ( std::vector, std::map, ... ), dort gilt was du gesagt hast,
    bei C Arrays ist es ein bischen anders.



  • zu 2.
    i ist kein Array, i ist ein Integer. Und was hat das eine mit dem anderen zu tun?

    zu 1.
    Begründe doch bitte mal wieso der Fehler bei i++ liegt.



  • Ramsis schrieb:

    die anderen die du meinst sind die überladene
    Operatoren der STL

    ... Wo sind hier Beim Inkrement/Deinkrement überladene Operatoren der STL (oder wo bitte ist hier das Thema STL gefallen)? Und das i kein Array ist, wurde ja auch schon erwähnt.

    cu André



  • Hab gerade ausprobiert, du hattest recht. 🙄
    Diese beiden for schleifen machen genau das gleiche.

    #include <iostream>
    using namespace std;
    
    int main(void)
    {   
    
    	for( int i = 0; i<=4; i++)
    	{
    		switch(i)
    		{
    		case 0:
    			cout << "case 0" << endl;
    			break;
    
    		case 1:
    			cout << "case 1" << endl;
    			break;
    
    		case 2:
    			cout << "case 2" << endl;
    			break;
    		case 3:
    			cout << "case 3" << endl;
    			break;
    		case 4:
    			cout << "case 4" << endl;
    			break;
    
    		}
    	}
    
    	cout << endl << endl;
    
    	for( int i = 0; i<=4; ++i)
    	{
    		switch(i)
    		{
    		case 0:
    			cout << "case 0" << endl;
    			break;
    
    		case 1:
    			cout << "case 1" << endl;
    			break;
    
    		case 2:
    			cout << "case 2" << endl;
    			break;
    		case 3:
    			cout << "case 3" << endl;
    			break;
    		case 4:
    			cout << "case 4" << endl;
    			break;
    
    		}
    	}
    
        return 0;
    }
    


  • Ramsis schrieb:

    Hab gerade ausprobiert, du hattest recht. 🙄
    Diese beiden for schleifen machen genau das gleiche.

    Wie sollten sie auch etwas anderes machen? Ich hatte die Erklärung für for-Schleifen schon einmal kurz gemacht:

    for(<1>;<2>;<3>)...

    1. Einmalig am Anfang
    2. Prüfung einmal pro Schleifenbegin
    3. Einmal pro Schleifendurchlauf am Ende

    Und wenn du in eine Zeile "++i;" statt "i++;" schreibst macht dies nunmal keinen Unterschied (außer das beim i++ unter Umständen eine temporäre Kopie erzeugt wird, was bei ++i nicht der Fall sein sollte - es sei den irgendwer hält sich nicht an die Üblichen Implementierungsregeln).

    cu André


Anmelden zum Antworten