Fehler im Programmcode
-
Hallo Leute
ich bin dabei ein Project für die Schule zu machen. Dabei ist ein fehler Aufgetreten, den ich mir nicht erklären kann.
Ich habe hier den Teil der Programmcodes, der angeblich falsch ist://--------------------------------------------------------------------------- int lassAufzugFahren (bool faehrt) { if (! faehrt) { faehrt = true; timerFahrt->Enabled = true; } } //--------------------------------------------------------------------------- void __fastcall TForm1::timerFahrtTimer(TObject *Sender) { if (z == p) { timerFahrt->Enabled = false; } else if (z > p) { ++p; } else --p; } //---------------------------------------------------------------------------
der sinn ist, dass Die Funktion "lassAufzugFahren" den Timer "timerFahrt" aufruft.
Der Timer ist sowohl im Programmcode, als auch auf der Oberfläche.
Wenn ich das Programm starte, wird diese Zeile rot gefärbt:timerFahrt->Enabled = true;
und drunter steht die Fehlermeldung:
"Undefiniertes Symbol 'timerFahrt'
Hab ich irgend einen Fehler oder stimmt da was mit dem builder nicht?
Habe das auch schon in ein komplett leeres Projekt geschrieben->gleicher Fehler
-
Von welchem Typ ist denn timerFahrt?
-
Nathan schrieb:
Von welchem Typ ist denn timerFahrt?
wie meinst das? was für ne Komponente das ist?
-
Barnibas schrieb:
Nathan schrieb:
Von welchem Typ ist denn timerFahrt?
wie meinst das? was für ne Komponente das ist?
Nein, welchen Datentyp?
-
out schrieb:
Nein, welchen Datentyp?
keine Ahnung...ich wusst nicht mal, dass ein Timer einen Datentyp haben kann?!
-
Wenn timerFahrt ein Member von TForm1 ist (was ich deinem anderen Thread nach mal vermute), dann muss natürlich auch lassAufzugFahren ein Member von TForm1 sein, wenn du es dort benutzen möchtest. Vermutlich soll auch dein
faehrt
ein Member von TForm1 sein und den Funktionsparameter brauchst du gar nicht.
-
heist das, ich muss die Funktion anders vereinbaren?
weil in der schule haben wir es bisher so gelernt!
-
Barnibas schrieb:
heist das, ich muss die Funktion anders vereinbaren?
Ja, es sollte ungefähr so aussehen wie von mir im anderen Thread gezeigt. Du musst die Funktion natürlich noch zusätzlich in der Definition deiner Tform1-Klasse bekannt machen.
weil in der schule haben wir es bisher so gelernt!
Hmm, das kommt davon, wenn man alles zusammenklickt, anstatt richtig zu programmieren. Gehe ich Recht in der Befürchtung, dass du hier zwar die ganze Zeit Klassen und Memberfunktionen benutzt, dir diese Begriffe aber (noch) gar nichts sagen?
-
SeppJ schrieb:
Gehe ich Recht in der Befürchtung, dass du hier zwar die ganze Zeit Klassen und Memberfunktionen benutzt, dir diese Begriffe aber (noch) gar nichts sagen?
tust du vollkommen. Unser Lehrer hat es un bisher in etwa so erklärt:
Datentyp Funktionsname (datenty Variable,datentyp Variable, usw) { Befehle, die die Funtion ausführen soll (wenn es eine rechnung oder so was ist) return Wert/Variable }
-
Wenn ich das so mache, kommt die Fehlermeldung:
[C++ Fehler] Test_u.cpp(24): E2316 '_fastcall TForm1::lassAufzugFahren(int)' ist kein Element von 'TForm1'
und darunter noch diese: [C++ Fehler] Test_u.cpp(76): E2268 Aufruf der undefinierten Funktion 'lassAufzugFahren'
für jede Zeile in der "lassAufzugFahren" vorkommt.
Die Funktion habe ich jetzt so geschrieben:
//--------------------------------------------------------------------------- void __fastcall TForm1::lassAufzugFahren(int z) { if (! faehrt) { faehrt = true; tmrFahrt->Enabled = true; } } //---------------------------------------------------------------------------
-
Irgendwo in deinem Code (vermutlich in Test_u.h) muss es so etwas wie
class TForm1 { // Hier ganz viel Zeug };
oder
struct TForm1 { // Hier ganz viel Zeug };
geben. Da gehört eine entsprechende Deklaration der Funktion rein.
-
SeppJ schrieb:
Da gehört eine entsprechende Deklaration der Funktion rein.
Und diese Deklaration ist das, was du mir in dem anderen thread gezeigt hast?!
-
Das ist die Definition.
Die Deklaration ist etwas wie
void lassAufzugFahren(int z);
Da sollten noch jede Menge andere Deklarationen sein, da kannst du dich dran orientieren.
-
Ich hab das jetzt gemacht aber jetzt kommt wieder diese Fehlermeldung:
[C++ Fehler] Test_u.cpp(27): E2451 Undefiniertes Symbol 'tmrFahrt'
-
Leg dich fest, ob es tmrFahrt oder timerFahrt heißen soll!
-
hab ich...das wahren zwei verschiedene dateien ..... in dieser datei heist die komponente tmrFahrt
-
Barnibas schrieb:
hab ich...das wahren zwei verschiedene dateien ..... in dieser datei heist die komponente tmrFahrt
Soll das denn der gleiche Timer sein oder ein anderer?
Wie auch immer: Es existiert keine Variable mit diesem Namen. Du hast den Bezeichner zwar irgendwo eingeführt (deklariert), aber nirgendwo definiert. Das ist wieder dein Problem mit dem Unterschied zwischen Deklaration und Definition. Siehe zum Beispiel:
http://www.c-plusplus.net/forum/61231-full
-
ich habe den beitrag zum Thema Deklarieren und Definieren zwar noch nicht gelesen, aber ich glaube auch, dass das gar nichts damit zu tun hat.
Ich habe zu Testzwecken einen Button eingebaut mit dem Zweck den Timer "tmrFahrt" zu aktivieren. Mit exakt der gleichen Zeile, die auch in meiner Funktion steht. Da funktioniert es und der Timer an sich arbeitet auch wie er soll. Der Timer startet wie er soll. Daher glaube ich, dass C++ ein Problem hat, denn außerhalb einer Funktion funktioniert der Befehl, aber innerhalb nicht. Ich habe davon unabhängig auch die Funktion getestet, die ohne diesen Befehl einwandfrei arbeitet. So langsam drehe ich durch
-
C++ hat mit Sicherheit kein Problem sonder du.
Die OnClick-Funktion deines neuen Buttons hat ja schon deine Oberfläche ordentlich deklariert und definiert. Deswegen geht es. Schau einfach mal in deine Headerdatei (Form1.h) und suche die passende Deklaration.
Lies dir bitte erstmal wirklich was zum Thema Deklaration durch.
-
aber warum funktioniert der Befehl dann im Timer und in der Ereignisroutine des Buttons, aber in der Funktion nicht?