Kann funktion trotz include nicht finden
-
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 folgendesconst int ct = 2; extern char tab[ct][ct];sagen wir du verwendest die Variable " tab "
nur in der datei routine.cpp, dann kannst du dortconst 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 EndeUnd 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é
-
Mein logikfehler
war, dass diese ++ beiden Operatoren (post, pre )
seiteneffekte auch in der for schleife produzieren, was nicht der fall ist.ausgabe der beiden for schleifen mit dem logikfehler:
case 0
case 1
case 2
case 3
case 4case 1
case 2
case 3
case 4