Turing Maschine probleme bei zweidimensionalem Array vom typ eigene Klasse



  • So hallo miteinander,
    bin hier neu ich hoffe ihr könnt mir helfen.
    in der folgenden Funktion wird aus einer datei eine Tabelle eingelesen.
    und in einem zweidimensionalen array vom typ UebertragungsFunktionsElement gespeichert. die klasse UebertragungsFunktionsElement hat drei private Var, char ausgabeZeichen, char bewegungSL, int folgeZustand, ich hab zwei Konstruktoren einen ohne argumenten und einen der alle drei private variablen auf den übergebenen wert setzt.

    Vielen Dank schon mal im voraus 🙂

    void UebertragungsFunktion::readTable(char *fname)
    {
    char zeile[10];

    fstream datei;
    datei.open(fname, ios::in);

    if(!datei.is_open())
    {
    cout<<"Datei konnte nicht geoeffnet werden"<<endl;
    }
    else
    {
    datei.getline(zeile, 5);
    anzZust = (int) zeile[0] - 48;
    anzEing = (int) zeile[2] - 48;
    matrix = new UebertragungsFunktionsElement* [anzZust]; // dyn array von zeigern
    eingabeZeichen = new char [anzEing];

    //matrix
    //Zeile
    for (int iZeile = 0; iZeile < anzZust; iZeile++)
    {
    char a = ' ', b = ' ';
    int f=0;
    datei.getline(zeile, 10); // Zeile einlesen

    // an jeden Zeiger ein array anlegen
    matrix[anzZust] = new UebertragungsFunktionsElement[anzEing];

    //Spalte
    for ( int iSpalte = 0; iSpalte < anzEing; iSpalte++)
    {
    eingabeZeichen[iSpalte] = zeile[1];
    a=zeile[4];
    b=zeile[6];
    f=zeile[8];
    matrix[iZeile][iSpalte].set(a, b, f);
    /**/Hier taucht das Problem auf "matrix 0x...{ausgabezeichen=???...} ... Fehler Ausdruck kann nicht ausgewertet werden.
    **Wahrscheinlich hat er mit der Initialisierung probleme
    }
    }

    }

    }



  • versuch mal die features des Forums zu nutzen:

    void UebertragungsFunktion::readTable(char *fname) //versuch solange du mit c++ Arbeitest std::string zu verwenden
    {
    	char zeile[10]; //s.o.
    
    	fstream datei;
    	datei.open(fname, ios::in);
    
    	if(!datei.is_open())
    	{
    		cout<<"Datei konnte nicht geoeffnet werden"<<endl;
    	}
    	else
    	{
    		datei.getline(zeile, 5);  //wie wäre es, wenn du strukturierst, wie die Datei überhaupt aufgebaut ist
    		anzZust = (int) zeile[0] - 48; //man kann integer auch besser in einer Datei auslesen und speichern.
    		anzEing = (int) zeile[2] - 48;
    		matrix = new UebertragungsFunktionsElement* [anzZust];				// dyn array von zeigern
    		eingabeZeichen = new char [anzEing];
    
    		//matrix
    		//Zeile
    		for (int iZeile = 0; iZeile < anzZust; iZeile++)
    		{	
    			char a = ' ', b = ' ';
    			int f=0;
    			datei.getline(zeile, 10);	// Zeile einlesen
    
    	        // an jeden Zeiger ein array anlegen
                      matrix[anzZust] = new UebertragungsFunktionsElement[anzEing];
    
    			//Spalte
    			for ( int iSpalte = 0; iSpalte < anzEing; iSpalte++)
    			{
    				eingabeZeichen[iSpalte] = zeile[1];
    				a=zeile[4];
    				b=zeile[6];
    				f=zeile[8];
    				matrix[iZeile][iSpalte].set(a, b, f); //du brauchst um sowas machen zu können ein pointer-pointer, also ein UebertragungsFunktionsElement**
    				//Hier taucht das Problem auf "matrix 0x...{ausgabezeichen=???...} ... 
    				//Fehler Ausdruck kann nicht ausgewertet werden. 
    				//Wahrscheinlich hat er mit der Initialisierung probleme
    			}
    		}
    	}
    }
    

    beispiel zur schöneren Dateibehandlung

    int a,b,c;
    string str;
    datei >> a >> b >> c >> str;
    

    wenn die datei so aussieht

    10 1254 42 murx
    

    haben die Variablen folgende werte:
    a: 10
    b: 1254
    c: 42
    str: "murx"



  • so sieht die tabelle aus:

    3 3

    1 0 0 R 1

    1 1 1 R 1

    1 # # L 2

    2 0 1 L 3

    2 1 0 L 2

    2 # 1 L 3

    3 0 0 L 3

    3 1 1 L 3

    3 # # L 0
    in der ersten zeile steht die anzahl zustände und die anzahl eingabe-zeichen. jede folgende zeile hat den aufbau:
    zustand, eingabe zeichen, ausgabe zeichen, bewegung s/l kopf, folgezustand
    wobei das einlesen der werte ja nicht das problem darstellt erst wenn ich die werte der matrix übergeben will tauchen die probleme auf.
    //du brauchst um sowas machen zu können ein pointer-pointer, also ein UebertragungsFunktionsElement
    UebertragungsFunktionsElement ** matrix; steht in der header datei**



  • du kannst dir viel arbeit sparen, wenn du mit

    datei >> anzZust  >> anzEing;
    

    anfängst. zudem verbessert es die kompatiblität mit Zahlen größer 9 ;).
    Aber wie schon gesagt, dein array ist eindimensional, du musst es schon zweidimensional anlegen.

    Beispiel

    class A{}
    
    a** 2darray = new A*[size];
    for (int i = 0; i < size; i++)
      2darray[i] = new A[len];
    
    ...
    
    cout << 2darray[1][2];
    


  • Krux schrieb:

    du kannst dir viel arbeit sparen, wenn du mit

    datei >> anzZust  >> anzEing;
    

    anfängst. zudem verbessert es die kompatiblität mit Zahlen größer 9 ;).
    Aber wie schon gesagt, dein array ist eindimensional, du musst es schon zweidimensional anlegen.

    ich habe es doch zweidimensional angelegt
    in der headerdatei steht UebertragungsFunktionsElement ** matrix;

    übrigens ich bin hier neu und hab nicht ganz verstanden was du mit features des forums gemeint hast. wäre nett wenn du mir das kurz erläuterst



  • sry, was auch hilft, ist wenn man die daten nicht direkt in das array packt, sondern nur deren adressen, also ein dreifacher pointer. dann kann man mit new sicher gehen mit der initialisierung. Mit feature des Forums mein ich

    vor und
    

    nach dem Quelltext zu posten, dann siehts übersichtlicher aus.



  • Krux schrieb:

    sry

    kein thema. danke dass du deine zeit opferst und einem armen verzweifelten menschen hilfst 🙂



  • Krux schrieb:

    sry, was auch hilft, ist wenn man die daten nicht direkt in das array packt, sondern nur deren adressen, also ein dreifacher pointer. dann kann man mit new sicher gehen mit der initialisierung. Mit feature des Forums mein ich

    vor und
    

    nach dem Quelltext zu posten, dann siehts übersichtlicher aus.

    ich packe ja auch gar nicht die daten in das array ich hab ein zweidimensionales array. durch die zwei schleifen(aussen schleife für zustände, innen schleife für anzahl an eingabe-zeichen) wird eine zweidimensional "matrix" vom typ UebertragungsFunktionsElement erstellt jedes dieser einzelnen array felder gehört zu dieser klasse und diese klasse bietet methoden auf die ich zugreifen will die daten werden dabei nicht direkt in das array geschrieben sonder sie werden den private variablen zugeordnet



  • gib mal die Klasse UebertragungsFunktionsElement vieleicht ist da ja der Fehler. Übrigens ein guter weg an ein Problem bzw Fehler heran zu gehen, ist diesen zu isolieren, das heißt das Projekt kopieren, und die Kopie soweit abspecken, dass nach möglichkeit nurnoch der Fehler übrigbleibt. Und wenn du es bis dahin selbst nicht gefunden hast, was das Problem ist, ist das der ideale Quellcode, den du in ein Forum zur hilfe posten kannst. Dann geht die hilfe auch schneller.



  • #include "StdAfx.h"
    
    #include "UebertragungsFunktionsElement.h"
    
    UebertragungsFunktionsElement::UebertragungsFunktionsElement(void)
    
    {
    
    	this->ausgabeZeichen = ' ';
    
    	this->bewegungSL = ' ';
    
    	this->folgeZustand = 0;
    
    }
    
    UebertragungsFunktionsElement::UebertragungsFunktionsElement(char a, char b, int f)
    
    {
    
    	this->ausgabeZeichen = a;
    
    	this->bewegungSL = b;
    
    	this->folgeZustand = f;
    
    }
    
    UebertragungsFunktionsElement::~UebertragungsFunktionsElement(void)
    
    {
    
    }
    
    void UebertragungsFunktionsElement::set(char a, char b, int f)
    
    {
    
    	this->ausgabeZeichen = a; [b]// genau hier will er nicht mehr [/b]
    
    	this->bewegungSL = b;
    
    	this->folgeZustand = f;
    
    }
    
    char UebertragungsFunktionsElement::getAusgabeZeichen()
    
    {
    
    	return ausgabeZeichen;
    
    }
    
    char UebertragungsFunktionsElement::getBewegungSL()
    
    {
    
    	return bewegungSL;
    
    }
    
    int UebertragungsFunktionsElement::getFolgeZustand()
    
    {
    
    	return folgeZustand;
    
    }
    
    void UebertragungsFunktionsElement::print()
    
    {
    
    	cout << ausgabeZeichen;
    
    	cout << bewegungSL;
    
    	cout << folgeZustand <<", ";
    
    }
    

Log in to reply