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; } } }; #endifroutine.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); }; #endifwenn ich kompilieren möchte kommt
error C3861: 'routine': identifier not foundich 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); #endifroutine.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); #endifstep.h
#ifndef _STEP_ #define _STEP_ #include <iostream> #include "variabeln.h" #include "tabelle.h" #include "ctrlStepArray.h" #include "routine.h" void step(int wordpos); #endifctrlStepArray.h
#ifndef _ctrlStepArray_ #define _ctrlStepArray_ #include "variabeln.h" #include <iostream> bool ctrlStAr(int x, int y, int wordpos); #endifvariabeln.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]; #endifbrauch 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 sidas 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
sinmin. 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 istgreetz 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 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++)