Struktur übergeben -Call by Reference

chefsalat-

Mitglied
Hallo zusammen,
ich melde mich mal wieder mit nem Problem. :)
In C++ hab ich eine Struktur und ein Enum erstellt:
C++:
enum ParameterTyp {
	PTyp_int,
	PTyp_double,
	PTyp_float,
	PTyp_bool,
	PTyp_default
};

struct AdsParameter {
	ParameterTyp paramTyp;
	
	union {
		int iVal;
		double dVal;
		float fVal;
		bool bVal;
	};
	char Paramname[20];
	bool bChanged;
	bool bOK;
	CString sError;
	CString sWert;
};

Dann hab ich mir in einer Header-Datei ein Array erstellt:
C++:
const int ANZPARAMS = 17;
AdsParameter adsParam[ANZPARAMS];

Beim Starten des Dialogs sollen alle Werte außer Paramname genullt werden, also
C++:
for (int i=0; i<ANZPARAMS; i++) {
	adsParam[i].bChanged = false;
	adsParam[i].bOK = false;
	adsParam[i].iVal = 0;
	adsParam[i].paramTyp = PTyp_default;
	//adsParam[i].sError = "";
	//adsParam[i].sWert = "";
}

Bei den Zahlenwerten klappt das auch ganz gut. Den Paramname kann ich von Hand auch setzen.
C++:
strcpy(adsParam[0].Paramname, "param1");

Nur die beiden CString-Variablen (sError und sWert) lassen sich nicht setzen.
Bei folgendem Code kommt die Fehlermeldung:
C++:
strcpy(adsParam[0].Paramname, ".N_KISTE_MAX_IO1");

error C2664: 'strcpy' : Konvertierung des Parameters 1 von 'class CString' in 'char *' nicht moeglich
Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden

Bei folgendem Code kommt keine Fehlermeldung, aber beim Starten des Dialogfensters bricht das Programm mit der unten stehenden Fehlermeldung ab.
C++:
adsParam[i].sWert = "";

/* Fehlermeldung 
Debug Assertion Failed
File: afx.inl
Line: 122 */

Weiß jemand Rat und kann mir helfen
Wäre super dankbar.

Gruß chefsalat-
 
Hallo,

Bei mir funktioniert dein Code.
Ich glaube dir fehlt die StdAfx.h
Sie ist wichtig für die Typinformation der CString-Klasse.
Deshalb funktioniert nicht bei dir die Anweisung:
Code:
         adsParam[i].sError = "";


In ein char-Array kannst einen String so schreiben:
Code:
	char test[20];
	sprintf(test,"%s","TEST");
 
Morgen,
danke für deinen Rat. Bei mir ist die stdafx.h aber überall drin.
Wenn ich im Konstruktor, der ja beim erstellen des Dialogs aufgerufen wird einen CString erstelle und diesen dann mit Text belege, bekomme ich keine Fehlermeldung.

Genauso, wenn ich einen CString in der Headerdatei erstelle und dann im Konstruktor belege. Funktioniert auch...

Nur bei den CStrings von der Struktur gibts Probleme

Kannst du mir mal dein Projekt schicken, mit dem du es getestet hast?
Würd mich zu gern interessieren, was ich da schon wieder anders gemacht hab.

Gruß chefsalat-
 
Jetzt bin ich mal soweit gekommen, dass ich rausgefunden hab, dass es an folgendem liegt:
C++:
const int ANZPARAMS = 17;

Weil, wenn ich im Header ein Array anlege:
C++:
AdsParameter adsParam2[17];
Und dann im Konstruktor wieder auf den CString zugreife, dann bekomme ich keine Fehlermeldung.

Wenn ich ANZPARAMS allerdings über #define festlege, funktioniert die ganze Geschichte wieder nicht.

Wie kann ich die ANZPARAMS denn so festlegen, dass ich von jeder Klasse aus drauf zugreifen kann und mit ihr auch (Struktur-) Arrays anlegen kann

Gruß chefsalat-
 
Hey titanic,
danke für dein Beispiel!!
Leider hat es mir nicht geholfen. Durch weiteres rumprobieren bin ich draufgekommen, dass ein zuvor ausgeführtes
C++:
memset(adsParam, 0x00, sizeof(adsParam));
die Ursache dafür war, das ich die CString's nicht mehr ändern konnte.

Trotzdem danke!!

Gruß chefsalat-
 
Gibt es einen gravierenden Unterschied zwischen diesen beiden Möglichkeiten, dass man sagen kann, nimm lieber die eine als die andere?
Mit "strcpy" wird nur eine Zeichenkette kopiert, während "sprintf" eine formatierte Ausgabe (ähnlich "printf") erzeugt. Vom Ergebnis ist es dasselbe. Wenn es nur darum geht, eine Zeichenkette in einen Buffer zu schreiben, ist "strcpy" ausreichend und wohl auch etwas performanter.

Zu deinem memset-Problem:
Die Sache ist die, dass "CString" kein nativer Datentyp ist. Wenn du das in die Struktur packst, wird bereits ein Objekt der Klasse "CString" angelegt. Wenn du nun die ganze Struktur mit "memset " plättest, hast du hinterher eben kein "CString" mehr und der Crash ist die Folge davon.

Gruß
MCoder
 
Hey MCoder,
vielen Dank für deine ausführliche Antwort!! Da ich das Plugin eigentlich schon recht schlank halten sollte, werde ich es bei strcpy belassen.

Gruß chefsalat-
 

Neue Beiträge

Zurück