Neue Datentypen nicht global?

Olaf Lehmann

Mitglied
Hallo,

nun hab ich folgendes Problem:
ich lese auf folgende Weise viele Zeichenketten und Intergerwerte aus einer Datei:
Code:
BinaryReader ^Datei = gcnew BinaryReader (File::Open( sPfad, FileMode::Open  ));
........
int Welch[100];
array <unsigned char> ^Buffer=gcnew array <unsigned char>(33);
.........
Welch[xf]=Datei->ReadInt32();
Buffer=Datei->ReadBytes(16);
Der ganze Code dazu steckte bisher unter Button1 und alles läuft prima.
Die Zeichenketten aus Buffer werden dann in ein Stringarray gesteckt:
Code:
Vorname = System::Text::Encoding::ASCII->GetString(Buffer);
arVor[x] = Vorname;
Die Deklaration des Arrays sieht so aus:
Code:
array<String^> ^arVor = gcnew array<String^>(20);

Nun muss ich aber von anderen Buttons aus auf die Daten der Arrays zugreifen. Damit das geht brauche ich also globale Deklarationen. Mit dem normalen int Array war das kein Problem.
Das NET Stringarray ^arVor kann ich aber nicht global machen. Es kommt die Fehlermeldung: "globale Variable darf nicht array Typ so und so aufweisen." Das kann doch nicht wahr sein! Was nützen denn dann diese für mich neuen ^Arrays? Man muss doch immer wieder global auf dergleichen Daten zugreifen können.

Wenns denn so ist:
Code:
Buffer=Datei->ReadBytes(16);
besteht auf
Code:
array <unsigned char> ^Buffer=gcnew array <unsigned char>(33);
.

Der gute alte normale C++Datentyp
Code:
unsigned char Buffer[20];
, verträgt sich mit der Dateiauslesefunktion nicht. Wie kann ich denn jetzt aus dem NET char in ein zweidimensionales normales C++ char Array konvertieren, oder wenigstens erstmal in ein eindimensionales normales char, damit ich von anderen Buttons aus auf die Daten zugreifen kann?

MfG Olaf
 
Zuletzt bearbeitet:
Nein, das ist gut so. Wenn du auf globale Variabeln angewiesen bist, dann hast du einen Fehler im Design deines Algorithmus'. Du kannst dieses Array nicht im Klassenbereich definieren?
 
Au, ich muss sagen, ich bin Autodidakt und nutze zwar mit Begeisterung Klassen wie MFC - die unter 2008 Express leider futsch ist.:( - und betreibe in Windows Programmen insoweit OOP als der Code für verschiedenen Buttons, etc. dann automatisch in verschiedenen Funktionen steht. Das wars dann aber schon mit OOP und Klassen.
Wenn ich etwas höre von Klassenbereich oder Klasse erstellen, wird mir abwechselnd kalt und heiß. Null Ahnung davon.

Meine Arbeitsweise war immer so, dass ich globale Daten hier
Code:
namespace Replaydatas {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	using namespace System::IO;
	int Weiter=0;  //geht
         int Welch[21];  //geht
         array<String^> ^arVor = gcnew array<String^>(20);  //geht nicht
deklariere (oder definiere - mit die Begriffe hab ichs auch nicht so)
Mit den normalen Datentypen/Arrays funktioniert das ja auch noch immer.

Wenn ich es hier drin versuche,
Code:
	public ref class Form1 : public System::Windows::Forms::Form
	{ }
kommt auch immer eine Fehlermeldung.

MfG Olaf
 
Zuletzt bearbeitet:
Es ist nunmal so, dass wenn du auf globale Variabeln angewiesen du mal dein Programmdesign überdenken sollst, es ist eigentlich allgemein akzeptiert, dass globale Variabeln eher kontraproduktiv sind.

Welche Fehler erhälst du denn, wenn du die Variabeln, die in der ganzen Klasse verfügbar sein sollen als Member dieser Klasse definierst?
 
Also, ich gebs auf,

der Unterschied zwischen C++/CLI und normalem C++ ist mir einfach zu groß. Auch wenn ich das oft anders gelesen habe.
Nicht mal mehr strcat und dergleichen gibts im CLI Bereich. Ist mir einfach zu aufwendig mein Hirn wieder völlig umzuprogrammieren.

Schade, dass Visual C++6.0 nicht mehr unter Vista läuft oder 2008 Express MFC hat.

Danke Cromon für Deine Tipps!:)

Gruß Olaf
 
strcat ist Teil von C und nicht C++. In C++ verwendest du std::string und den Operator +=. Genau gleich machst du es in C++/CLI.
C++:
String^ myStr = "Im a string";
myStr += " and now im appended!";
 
Hallo Cromon,

ja Du recht strcat ist ohne ++.
Allerdings komme ich nicht dran vorbei, weil mir die Möglichkeit zur "Globalisierung" der fehlenden neu Variablen/Arrays fehlt.
Code:
	Buffer=Datei->ReadBytes(16);
fordert diesen Datentyp:
Code:
array <unsigned char> ^Buffer=gcnew array <unsigned char>(17);
Die gewonnen Daten kriege ich dann in völliger Handarbeit:
Code:
char xxx[17];
xxx[0]=Buffer[0];
usw...,(letztlich dann natürlich in einer Schleife) in ein normales char Array, das ich global anlegen kann.
Und dann brauche ich strcat und Geschwister um sie weiterzuverarbeiten.

Unendlicher Stress, weil die Datentypen/Arrays nicht global sein dürfen. Es hängt alles letztlich nur an diesem Punkt.

Ich lege meine Variablen auch so lokal wie möglich an, aber manchmal gehts halt schlecht anders - zumindest für den normal Sterblichen.
Die Daten, die eingelesen werden sollen sind viele. Das dauert ne knappe Minute. Der Anwender kann nicht jedesmal wenn er mit einem anderen Button andere Detail anzeigen will, die Datei neu laden. Das würde wieder ne Minute dauern - na gut vielleicht dann nur 57 Sekunden, weil es paar weniger wären.
Und der ganze Ärger nur, weil diese blöden Datentypen, nach denen C++/CLI schreit nicht global angelegt werden können...:(

MfG Olaf
:)
 
Zuletzt bearbeitet:
Wie gesagt, dass die nicht global angelegt werden ist nicht ein "können", sondern ein "sollen". Wenn du auf globale Variablen angewiesen bist machst du was falsch.

In deinem konkreten Fall: Warum kann das ganze nicht Member der Klasse sein?
 
So, Problem ist gelöst.

Ich hab endlich die richtige Stelle hier drin
Code:
public ref class Form1 : public System::Windows::Forms::Form
gefunden und das Schlüsselwort static vor meine Arraydefition gestellt.

MfG Olaf
 
Meine Frage ist immernoch hängig:
Warum muss das ganze global verfügbar sein? Warum nicht als Member der Klasse mit einer entsprechenden get-Funktion?
 
Zurück