C++ Funktion integrieren

fox40phil

Rear Admiral
Registriert
Okt. 2008
Beiträge
6.012
Mahlzeit!

Ich sitzte immer noch an dem größeren C++ Programm und habe grade folgendes Problem:
In deine TextBox wird eine Zahl eingegeben, die wird dann vom String in ein Int umgewandelt, anschließend soll mit der eingegebenen Zahl sofort eine Berechnung durch geführt werden, die aber im Hintergrund agiert und nicht ausgegeben wird!

Bisher hat jede ToolBox ja eine eigene Funktion gehabt die von oben nach unten ablief.
Ich möchte jetzt nur eine Funktion die etwas berechnet. Diese hab ich schon erstellt, aber leider wird sie nicht gestartet. Ich weiß nicht wo genau ich sie jetzt öffnen oder sonst was tun muss.

Code:
// header Dateien etc.

pupublic ref class Form1 : public System::Windows::Forms::Form
	{
public:
                Form1(void)
	{

		InitializeComponent();
		//
		//TODO: Konstruktorcode hier hinzufügen.
		//
		[B]void berechne_SSM_anz_pro_WR();[/B]
			

	}
[COLOR="yellowgreen"]//[.....] [/COLOR]
//--------------------------------------------------------------------------
// TextBox String pro Wechselrichter
private: System::Void tB_Str_pro_WR_TextChanged(System::Object^  sender, System::EventArgs^  e) 
{

			
	String^ test= tB_Str_pro_WR->Text;
			
	strWR_anzahl=System::Convert::ToInt32(test);

}[COLOR="YellowGreen"] // Bis hier hin läuft das Programm [/COLOR]
//--------------------------------------------------------------------------
// Berechne SSM anzahl pro Wechselrichter
void [B]berechne_SSM_anz_pro_WR()[/B]
{
	int x;
	int y;
	int i;
			
	ssm_anzahl_pro_WR;

                [COLOR="YellowGreen"]// Dies ist eine Berechnung in einem 2 demensionalen Array, bei dem das Ergebnis aufgerundet wird (ohne Nullstellen)[/COLOR]
	for(x=0;x<3; x++)
	{
		i= 1;
		y=0;
		ssm_anzahl_pro_WR[x][y]= strWR_anzahl / i / anzahl_Eingänge_Gerät[i] +1;

		for(y=0;y<3;y++)
		{	
			ssm_anzahl_pro_WR[x][y]= strWR_anzahl / i / anzahl_Eingänge_Gerät[i] +1;
		}
				
		y++;
		i++;
		
	}
}
}; // Ende der Form1

das ist jetzt die form.h in der Kalkulator.cpp steht eigt nicht viel. Ich dachte mir ich mach die ganzen Sachen (Berechnen, Ausgeben etc.) in der form.h

Gruß Phil
 
Deine Funktion berechne_SSM_anz_pro_WR sollte einfach einen Rückgabewert haben (nicht void). Also z.B. double.

Dann rufst Du die Funktion einfach so auf:

double dErgebnis = berechne_SSM_anz_pro_WR(übergabewerte);

Die notwendigen Werte solltest Du auch übergeben oder wo kommen die her ?

In der Variabale dErgebnis steht dann der entsprechende Wert.

edit:
noch eine Sache - Funktionen gehören eigentlich nicht direkt in die header-Datei, dort sollte nur die implentierung der Funktionsdatei sein.
 
Zuletzt bearbeitet:
also strWR_anzahl hatte ich über den Namespace gesetzt und wäre somit Global.
hmm aber die Funktion berechnet viele Werte, also in dem Array 3x3, das kann ich ja dann nicht zurückgeben.

hmm dann probiere ich mal die Funktion aus der Header-Datei zu entnehmen.
 
Na klar, kannst doch auch nen array zurückgeben bzw. nen pointer darauf.

Wird bei mehrdimensionalen arrays natürlich immer schwerer vorstellbar.

Was ist mit anzahl_Eingänge_Gerät[] ...wo ist das definiert ?

Vlt überlegst Du ob die Berechnung nicht "unterteilt" werden können, also in 3x 1D-arrays z.b. oder in Zwischenwerte welche an eine andere Funktion übergeben werden.
Das sorgt auch dafür, dass Du bei der Fehlersuche (sofern eFehler bei der Berechnung aufkommen) die Vorgänge besser nachvollziehen und vorstellen kannst.

Und nochmal, besser ist es wenn Du Werte übergibst und Ergebnisse zurücklieferst. Wenn das keine "normalen" Werte sind, dann übergibst Du eben pointer.
 
also ich hab jetzt mal die Funktion in eine Klasse gepackt und in die Hauptfunktion gesteckt.


Code:
// Configurator.cpp: Hauptprojektdatei.

#include "stdafx.h"
#include "Form1.h"

using namespace Configurator;

class Wechselrichter
{
private:
	int ssm_anzahl_pro_WR[3][3];
	int anzahl_Eingänge_Gerät[3] = {24,32,64};

public:
	void berechne_SSM_anz_pro_WR();
};
//----------------------------------------
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
	Wechselrichter SunnyBoy;

	// Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden
	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false); 


	// Hauptfenster erstellen und ausführen
	Application::Run(gcnew Form1());

	SunnyBoy.berechne_SSM_anz_pro_WR();

	return 0;
};

// Berechne SSM anzahl pro Wechselrichter
void Wechselrichter::berechne_SSM_anz_pro_WR()
{
			int x;
			int y;
			int i;
			
			ssm_anzahl_pro_WR;

			for(x=0;x<3; x++)
			{
				i= 1;
				y=0;
				ssm_anzahl_pro_WR[x][y]= strWR_anzahl / i / anzahl_Eingänge_Gerät[i] +1;

				for(y=0;y<3;y++)
				{	
					ssm_anzahl_pro_WR[x][y]= strWR_anzahl / i / anzahl_Eingänge_Gerät[i] +1;
				}
				
				y++;
				i++;
				
	}
}


Nun kommen folgende Fehler

Fehler 1 error C2059: Syntaxfehler: '{' c:\Dokumente und Einstellungen\xxx\Eigene Dateien\Visual Studio 2008\Projects\Configurator\Configurator\Configurator.cpp 12
Fehler 2 error C2334: Unerwartete(s) Token vor '{'; sichtbarer Funktionstext wird übersprungen c:\Dokumente und Einstellungen\xxx\Eigene Dateien\Visual Studio 2008\Projects\Configurator\Configurator\Configurator.cpp 12
Fehler 3 error C2065: 'anzahl_Eingänge_Gerät': nichtdeklarierter Bezeichner c:\Dokumente und Einstellungen\xxx\Eigene Dateien\Visual Studio 2008\Projects\Configurator\Configurator\Configurator.cpp 49
Fehler 4 error C2065: 'anzahl_Eingänge_Gerät': nichtdeklarierter Bezeichner c:\Dokumente und Einstellungen\xxx\Eigene Dateien\Visual Studio 2008\Projects\Configurator\Configurator\Configurator.cpp 53
 
Das wird ja immer komplizierter ;)

Übergebe der Berechnen-Funktion doch einfach die Werte und gib das Ergebnis-Array als pointer zurück.

Und nicht in die Klasse packen oder so. Dein erster Ansatz war doch soweit gut, nur halt Übergabe-/Rückgabewerte müssten nur eingebunden werden.
Und eben die Funktion nicht in den header, sondern in eine funktion.cpp Datei und die einfach im header einbinden.
 
Also ganz schnell erklärt, brauchst du folgende Dateien:

hauptprogramm.cpp
funktionen.cpp
header.h

In header.h trägst Du die funktionen.cpp ein. Diese header-Datei bindest Du dann im hauptprogramm ein.

Zu dem array, probier es mal so:

const int ANZAHL = 3;
int anzahl_Eingänge_Gerät[ANZAHL] = {24,32,64};

Glaube nicht jeder compiler kommt damit klar, dass direkt der Wert eingetragen wird.
 
alles klar.

hast du vielleicht ne Ahnung ob man eine bestimmte header-Datei brauch damit man array[3] = {24,32,64}; machen kann? Mit dem Biespiel von dir klappts auch nicht. Ich bin der Meinung, dass da eine Header-Datei fehlt, weil er sich mit den {} schwer tut, ohne geht es nämlich!

Ich benutze Visual Studio 2008.

€dit: Bei der Funktionen.cpp muss dann aber auch die Klasse Wechselrichter drin sein oder?^^
 
Zuletzt bearbeitet:
Das ist die standardmäßige Initialisierung, dafür brauchst du keinen extra Header.

Gruß,

badday
 
Muss ich jetzt noch die Klasse in der Funktionen.cpp in dem Hauptprogramm der main.cpp als Objekt deklarieren? Und danach die Funktion aufrufen oder wie läuft das jetzt?^^ Und wie bekomm ich einen Wert aus der header.h zur main.cpp die dann in die Funktionen.cpp übergeben wird?

Code:
// Configurator.cpp: Hauptprojektdatei.

#include "stdafx.h"
#include "stdio.h"
#include "Form1.h"

using namespace Configurator;

//----------------------------------------
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
[COLOR="YellowGreen"]	Wechselrichter Sunny;[/COLOR]

	// Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden
	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false); 


	// Hauptfenster erstellen und ausführen
	Application::Run(gcnew Form1());

	[COLOR="YellowGreen"]Sunny.berechne_SSM_anz_pro_WR();[/COLOR]

	return 0;
};

achso und wie würdet ihr bei einem array die Werte vorinitialisieren?


€dit: Also wenn ich in die Form1.h #include "Funktionen.cpp" einbinde gibt es irg.wie noch mehr Fehler.
Der erkennt dann gar nicht mehr die Klasse "Wechselrichter" in der Funktionen.cpp und den damit verbundenen Rest aucht nicht.
 
Zuletzt bearbeitet:
Das nimmt ja immer größere Ausmasse an ;)

Um eine Klasse aus der Funktionen.cpp zu erwenden, musst Du natürlich auch ein Objekt davon irgendwo erstellen, halt da wo Du damit arbeiten willst.
Denk dran, dass die getter / setter public sein müssen, sonst kannst Du die nicht nutzen.

Zum header nochmal:
In die Datei header.h musst Du eigentlich nur die Funktionen.cpp eintragen. Das dient ja letzendlich nur der Übersichtlichkeit, damit eben nicht jede Funktion zusammen mit der main-Funktion in einer Datei stehen.

Um ein paar Fehlerquellen auszuschliessen, kannst Du ja die Funktionen auch einfach in die main.cpp schreiben, dann brauchst Du die header nicht mehr einbauen.
Wenn es nur wenige Funktionen sind geht das ja....

Zu dem array nochmal;
badday hat es schon geschrieben - das ist die Standard-Initialisierung von arrays. Sollte immer klappen, ausser Du arbeitest evt. mit einem veralteten compiler, wobei das bei VS 2008 wohl nicht der Fall ist.

Notfalls musst Du es manuell machen, also so:
array[0] = 5;
array[1] = 27;
usw.
 
Zurück
Oben