void-funktion verursacht komische fehlermeldung
-
hallo zusammen,
ich benutze zurzeit den c++ builder 2007. heute habe ich mir das programmieren von funktionen beigebracht und poste erstmal meine .cpp datei.
[b]#include <vcl.h>
#pragma hdrstop#include "Unit16.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource ".dfm"
int Mache_Quadrat(int a)
{
int b=0;
b=aa;
Form16->Label1->Caption=IntToStr(a);
return b;
}void Zeige_Quadrate (int a)
{int c=a*a;
Form16->Edit3->Text=IntToStr(c);}
TForm16 Form16;
//---------------------------------------------------------------------------
__fastcall TForm16::TForm16(TComponent Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm16::Button1Click(TObject *Sender)
{
Edit2->Text=(IntToStr(Mache_Quadrat(StrToInt(Edit1->Text))));}
//---------------------------------------------------------------------------
void __fastcall TForm16::Button2Click(TObject *Sender)
{
Zeige_Quadrate(StrToInt(Edit1->Text));
}
//---------------------------------------------------------------------------wie ihr sichr sehen könnt ist das Programm folgendermassen gedacht. Wenn man Button1 drückt wird durch die int-Funktion das Quadrat der in Edit1 eingegebenen zahl berechnet und in Edit2 ausgegeben.
wenn man Button2 drückt passiert das gleiche, nur das die berechnung durch die void funktion erfolgt.
nun das problem: beim klicken eines buttons wenn das programm läuft erhalte ich folgende komische fehlermeldung:Zugriffsverletzung bei adresse 2013AE95 in Modul 'vcl100.bpl'. Lesen von Adresse FFC99E78
als anfänger versteh ich da leider nur bahnhof. habe schon nach rechtschreibfehlern etc... verglichen aber nix gefunden. und das verrückteste ist: ohne die void funktion gehts... d.h. wenn ich nur die int funktion benutze läuft alles wie geplant. muss irgendwie an der void funktion liegen...
kann mir jemand helfen? wäre sehr nett, bin mit meinem latein am ende und funktionen sind ja wichtig bei c++...
danke schonmal für jeden rat.
-
Hi,
versuch mal deine nicht Member Funktionen erst nach *TForm16 Form16; zu schreiben. Denke er wird da nich drauf kommen, oder inkludieren die 2Funktionen in deine Klasse, dann kannst du auf Form16-> verzichten.
mfg
-
danke für deinen hinweis!
kannst du das mit der member funktion mal vlt. anhand eines beispiel etwas erläutern. wär dir dankbar, weil so weit bin ich mit meinem selbststudium noch nicht. ich weiss über diese void dinger bisher nur, dass die keine werte mit return zurückliefern können...
vielen dank nochmal und wäre nett, wenn du mir nochal antworten würdest
-
CPP Datei:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- int __fastcall TForm1::Mache_Quadrat(int a) { int b=0; b=a*a; Label1->Caption = AnsiString(a); return b; } //--------------------------------------------------------------------------- void __fastcall TForm1::Zeige_Quadrate (int a) { int c=a*a; Edit3->Text = AnsiString(c); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //Try für den Fall, dass kein Integer vom Benutzer eingeben wird try { //Edit2->Text erwartet AnsiString deswegen machen wir eine Umwandlung //Mache_Quadrat erwartet int, deswegen .ToInt() Edit2->Text= AnsiString(Mache_Quadrat(Edit1->Text.ToInt())); } catch(...) { } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { //Zeige_Quadrate erwartet int, deswegen .ToInt() Zeige_Quadrate(Edit1->Text.ToInt()); } //---------------------------------------------------------------------------
Header Datei
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten TButton *Button1; TButton *Button2; TEdit *Edit1; TEdit *Edit2; TEdit *Edit3; TLabel *Label1; void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject *Sender); private: // Anwender-Deklarationen //Member Funktionen void __fastcall Zeige_Quadrate (int a); int __fastcall Mache_Quadrat(int a); public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
Du siehst, du hast im Prinzip schon alles richtig gemacht, nur wenn du auf Member einer anderen Klasse zugreifen willst, müssen diese Member eben den Funktionen auch verfügbar sein.
Die Exception aus deinem Beispiel hast du wohl deshalb erhalten, da die Funktionen nicht auf den Zeiger Form16 zugreifen konnten.
mfg
-
Manno, genau das wollte ich gerade sagen, habe alles geschrieben und dann warst du, Quadrat, schneller!! Blödi :p
lg, freakC++
PS.: Bitte verwende CPP - Tags. Davon kriegt man sonst Augenkrebs!!!
-
ok. vielen dank euch beiden. ich probiers mal so und meld mich dann wieder
-
hallo. danke nochmal für die hilfe. ich habe die funktion jetzt also in der header-datei eingetragen, aber jetzt krieg ich folgende fehlermeldung:
[ILINK32 Fehler] Error: Nicht aufl÷sbares externes 'TForm16::Zeige_Quadrate(int)' referenziert von C:\DOKUMENTE UND EINSTELLUNGEN\BENUTZERNAME\EIGENE DATEIEN\RAD STUDIO\PROJEKTE\DEBUG\UNIT16.OBJ
könnt ihr euch vielleicht nochmal erbarmen und schauen, ob ihr wisst, was damit gemeint ist?
glaub echt langsam, das ich zu blöd dafür bin...
-
EDIT:
hat sich erledigt. hing anscheinend zusammen dass ich ursprünglich kein fastcall benutzt hab. jetzt gehtsnochmals danke für eure erläuterungen und schönes wochenende