Class Matrix (Array füllen****)

Hi,
ich habe leider keine Zeit das auszuprobieren, wollte dir aber trotzdem versuchen zu helfen. Wieso nutzt du memcpy, wenn du ja garnicht weißt, was es macht. Man kann es durchaus im Internet recherchieren, z.B. hier

Da ich in diesem Zusammenhang aber auch nicht damit gearbeitet habe bisher, würde ich dir einen anderen Weg vorschlagen, der eigentlioch viel offensichtlicher ist, wie du ihn (wie ich erade sehe auch beim Zuweisungoperator genutzt hast).

C++:
matrix::matrix(const matrix& Mat)
{
	this->zeilen  = Mat.zeilen;            
	this->spalten = Mat.spalten;
 
	this->Z = new double* [zeilen];
 
	for(int k = 0; k < zeilen; k++) {
		this->Z[k] = new double [spalten];
	}
	
	for(int i = 0; i < zeilen; i++) {
		for(int j = 0; j < spalten; j++) {
			this->Z[i][k] = Mat.Z[i][k];
		}
	}
}

Der Code ist wie gesagt nicht getestet und wenn er nicht funktionieren sollte müsstest du etwas genauer sein, als nur zu sagen das er nicht funktioniert.

Viele Grüße
 
Da bin ich auch schon wieder... bin fast durch mit dem Projekt.

Gerade versuche ich mich an dem einlesen von daten über eine Textdatei:

C++:
include <fstream>
fstream getA;

	getA.open(argv[0], ios::in);		

	if(!getA)
{
		cerr<<"#### Fehler beim Einlesen der Matrixelemente ####"<<endl;
		exit(1);
}

for(int i = 0 ; i< zeilen ; i++)
{
for(int j = 0 ; j< spalten ; j++)
     {
			getA>>A.Z[i][j];
     }

}
	getA.close();

das möchte ich gerne in meine funktion "fill()" einbauen, die ja einen matrix über tastaturpuffer füllt.

fill() sieht so aus:

C++:
void matrix::fill(void)
{
for (int i = 0 ; i<zeilen ; i++)
	{
for (int k = 0 ; k<spalten ; k++)
		{
			cout<<"Bitte Element "<<i+1<<","<<k+1<<" eingeben"<<endl;
			cin>>Z[i][k];
		}
	}
}



mein main.cpp sieht in etwa so aus:

C++:
#include <iostream>
#include "matrix.h"
#include <fstream>


using namespace std;



void main(int argc, char *argv[])
{
	matrix a(3,3);

	a.show();
	
}

show() soll mir die matrix am ende ausgeben..

wie verbaue ich jetzt das einlesen einer Datei in meine fill()**** leider keine Ahnung..
wenn ich schreibe:

C++:
getA.open(argv[1], ios::in);

geht das leider nicht.. das argv[index] ist doch der parameter, welche datei der lesen soll... oder?

über die konsole rufe ich es folgendermaßen auf:

MatrixAlgebra.exe Matrix.txt


Die Elemente in "Matrix.txt" sind durch leerzeichen getrennt... zur probe habe ich eine 3x3 matrix genommen...also 9 elemente.
 
Also. Wenn ich dich richtig verstehe, willst du den Code in deiner main minimal halten und das einlesen der Werte in eine Matrix-Methode packen******

Das sollte eigentlich recht einfach sein. Übergib das Argument, indem dein filename steht einfach dem Konstruktor, oder deiner fill-Methode. Keine Ahnung wie du das aufrufen willst, also entweder:

C++:
 void main(int argc, char *argv[])
{
    matrix a(3,3, argv[1]);
 
    a.show();
    
}

oder:

C++:
void main(int argc, char *argv[])
{
    matrix a(3,3);
    a.fill(argv[1]);
    a.show();
    
}

Das einlesen aus der Datei ist eigentlich ziemlich analog zu dem von der Tastatur, nur halt der andere Eingabestream. Datei in der Funktion öffnen und auch schließen nicht vergessen. Wenn das nicht dein Problem löst, oder die herangehensweise erklärt, dann habe ich dein Problem nicht verstanden :)

Grüße
 
ahja Danke, hat geklappt :-)

ich bekomme beim Kompilieren immer einen eigenartigen Fehler:

Fehler bla bla bla (pfad)

Expression: (file != NULL)


was bedeutet das? finde bei google leider nichts.


habe den IFstream jetzt so gelöst:

C++:
void matrix::fill(char* argv[])
{
	int txtnum;
	cout<<"Welche datei soll eingelesen werden um die Matrix zu fuellen? Bitte den Counter angeben"<<endl;
	cin>>txtnum;

	ifstream element;
	element.open(argv[txtnum], ios::in);

if(!element)
	{
		cerr<<"####Fehler beim Einlesen der Matrixelemente####"<<endl;
		element.close();
		exit(-1);
	}

if (zaehlen(argv,txtnum) != (this->zeilen*this->spalten) )
{
	cerr<<"Nicht ausreichend oder zu viele Elemente fuer die Matrix in der Datei: "<<argv[txtnum]<<endl;
	exit(1);
}

else
{
for (int i = 0 ; i<zeilen ; i++)
	{
for (int k = 0 ; k<spalten ; k++)
		{
			element>>this->Z[i][k];
		}
	}
element.close();
}
}

wo wir auch bei einem anderen problem vom mir wären:
Ich würde gerne die Anzahl der Elemente in einer Textdatei zählen lassen. damit ich bzw. das programm weiß, dass genau die geforderte anzahl an elementen vorhanden ist. also #elemten = (zeilen*spalten)
 
Hallo,

woher soll ich wissen, was dein Compiler bemängelt? Da wäre ein kompletter Fehler und eine Zeile, wo dieser auftritt schon ganz hilfreich.

Zu deinem anderen Problem. Lies die Datei einfach komplett ein (z.B. in einen Vektor) und vergleiche die Anzahlen danach. Falls du eine sinnvolle Codierung in deiner Textdatei hast, wie z.B. jede Zeile ein Wert, oder Werte durch Kommata, Leerzeichen o.ä. getrennt, dann zähle eben diese Zeichen.
Oder schreib die Gesamtanzahl der Werte als ertes oben in die Textfile. Dann musst du nur einen Wert lesen, ohne die gesamte Datei ggf. Mehrfach abzuarbeiten. Und wenn es dann doch zu Fehlern kommt, muss halt ein Fehler geworfen werden.

Grüße
 
Zurück