Seite 1 von 1

Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 15:33
von zois
Hallo,

ich habe ein kleines Problem!
ich arbeite in meinem Programm mit einer Matrix aus den boost-Bibs. Diese möchte ich jetzt in einer Klasse deklarieren. Dabei soll die Anzahl der Reihen und Spalten offen bleiben, diese möchte ich dann später durch in einer methode der klasse durch void resize() angeben.

meine Frage ist jetzt wie deklariere ich die Matrix jetzt am besten?

hier der Code....

Code: Alles auswählen

private:
	boost::numeric::ublas::matrix<double> mat(0,0);
--> wird als Fehler angezeigt!

Code: Alles auswählen

private:
	boost::numeric::ublas::matrix<double> mat();
--> wird als Fehler angezeigt!

Code: Alles auswählen

private:
	boost::numeric::ublas::matrix<double> mat;
--> gibt Warnungen raus, diese möchte ich aber auch vermeiden!

oder habt ihr andere Lösungen?


gruß

zois

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 16:23
von joggel
Was wird denn für eine Fehlermeldung ausgegeben?

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 16:35
von zois
beim 1.:
--> error C2059: Syntaxfehler: 'Konstante'
--> error C2228: Links von ".resize" muss sich eine Klasse/Struktur/Union befinden.
... dann noch weitere Fehler, die sich auf die matrix beziehen!

beim 2.:
--> error C2228: Links von ".resize" muss sich eine Klasse/Struktur/Union befinden.
... dann noch weitere Fehler, die sich auf die matrix beziehen!

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 16:54
von joggel
Mmm, das steht bei dir im Header.
Es wäre warscheinlich möglich, das Du sie in der CPP, beim Konstruktor aufrufen musst.
Also sowas:

Code: Alles auswählen

MyClass::MyClass() : mat(0,0)   // wobei das aber für mich kein Sinn macht. Also (0,0)
{}

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 16:59
von zois
sry, verstehe noch nicht ganz!
was meinst du mit "aufrufen", die matrix dort deklarieren?
... das ding ist ja, ich muss auf die matrix von jeder Methode aus der Klasse zugreifen können, deshalb auch im header, könnte diese als global machen, will dies aber vermeiden!

das mit (0,0): ich brauche eien matrix ohne festen größen für spalten udn zeilen, da habe ich das so gemacht, wenn du eine bessere lösung hast, das wäre super!

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 17:03
von joggel
zois hat geschrieben:sry, verstehe noch nicht ganz!
was meinst du mit "aufrufen", die matrix dort deklarieren?
Ich meine dort initialisieren.

So wie:
Header-Datei:

Code: Alles auswählen

Class MyClass
{
private:
   boost::numeric::ublas::matrix<double> mat;
public:
 MyClass();
}
CPP-Datei:

Code: Alles auswählen

MyClass::MyClass() : mat(0,0)
{}

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 17:12
von zois

Code: Alles auswählen

private:
	boost::numeric::ublas::matrix<double> mat;
gibt er mir folgende warnungen:

Code: Alles auswählen

C:\Projekte\CamForm.Cmd\boost-subset\boost/numeric/ublas/storage.hpp(94) : warning C4996: 'std::uninitialized_copy': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1>        C:\Programme\Microsoft Visual Studio 9.0\VC\include\memory(100): Siehe Deklaration von 'std::uninitialized_copy'
1>        C:\Projekte\CamForm.Cmd\boost-subset\boost/numeric/ublas/storage.hpp(89): Bei der Kompilierung der  Klassen-template der boost::numeric::ublas::unbounded_array<T>::unbounded_array(const boost::numeric::ublas::unbounded_array<T> &)-Memberfunktion
1>        with
1>        [
1>            T=double
1>        ]
1>        C:\Projekte\CamForm.Cmd\boost-subset\boost/numeric/ublas/matrix.hpp(73): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::numeric::ublas::unbounded_array<T>".
1>        with
1>        [
1>            T=double
1>        ]
1>        c:\projekte\camform.cmd\camform.kernel\Optimierung.h(20): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::numeric::ublas::matrix<T>".
1>        with
1>        [
1>            T=double
1>        ]
1>C:\Projekte\CamForm.Cmd\boost-subset\boost/numeric/ublas/storage.hpp(204) : warning C4996: 'std::copy': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1>        C:\Programme\Microsoft Visual Studio 9.0\VC\include\xutility(2576): Siehe Deklaration von 'std::copy'
1>        C:\Projekte\CamForm.Cmd\boost-subset\boost/numeric/ublas/storage.hpp(201): Bei der Kompilierung der  Klassen-template der boost::numeric::ublas::unbounded_array<T> &boost::numeric::ublas::unbounded_array<T>::operator =(const boost::numeric::ublas::unbounded_array<T> &)-Memberfunktion
1>        with
1>        [
1>            T=double
1>        ]
und damit kann ich gar nichts anfangen!

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 17:25
von joggel
Okay, ich glaube ich habe Mist geschrieben...
Verstehe das aber auch nicht ganz... :?

[Edit]
ich kann jetzt aber nix schlimmes an den Warnungen sehen.
Vlt. solltest das einfach wie in den Warnungen beschrieben abstellen... :)

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 17:39
von zois
ok!
dann versuche ich das mal ausführlich zu erklären!

ich habe ein programm, wo ich mit einer matrix arbeite! diese war vorher als global deklariert mit

Code: Alles auswählen

boost::numeric::ublas::matrix<double> mat(0,0);
die größe ist jedoch noch unbekannt, diese wird in einer methode der klasse mit void resize() festgelegt!
das lief auch alles!

jetzt will/muss ich alles in eine klasse umbauen! und globale var. vermeiden!
ist ja auch kein problem, da ich die matrix als prvate anlegen kann, und somit immer noch von allen methoden dadrauf zugegriffen werden kann!
ich dachte, dass müsste genauso gehen, wie global, aber net so...
kriege dann die Fehler/warn-Meldungen, siehe oben!

hier noch mal der code...

Code: Alles auswählen

#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

class myclass
{

private:
	boost::numeric::ublas::matrix<double> mat;    // ich möchte auf die matrix aus allen methoden zugreifen und die werte ändern! größe wird später festgelegt!
....
}
mein prib ist, dass ich nicht weis, wie ich das lösen soll?
vielleicht auch ein komplett anderer lösung?

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 17:40
von Schrompf
Doch, das stimmt, was Joggel da schrieb. Der Kern der Warnung lautet:
unction call with parameters that may be unsafe
Das ist eine Erfindung von Microsoft, um Pufferüberläufe und Speicherüberschreibungen zu verhindern, in dem die Funktion jederzeit prüft, ob die übergebenen Parameter auf korrekten Speicher verweisen. Da das nur begrenzt möglich ist, warnt der Compiler, wenn er die übergebenen Parameter nicht prüfen kann. Anscheinend benutzt boost eine Funktion, die Microsoft für unsicher hält.

Meine Empfehlung: folge der Empfehlung in der Warnung und schalte diese Warnung ab. Wie das geht, steht ja in der Warnung. Das eigentliche Problem, nämlich die Konstruktion der Matrix mit passenden Startparametern, hat Joggel ja für Dich gelöst

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 17:42
von Eisflamme
Also wenn man ein in einer Klasse befindliches Objekt initialisieren möchte, muss das natürlich im ctor initialisieren, daher ist das so schon korrekt.

Die Frage bezieht sich jetzt darauf, ob dieser matrix-ctor ok ist bzw. ob die Warnung wichtig ist. Musste vll. Mal zu googlen.

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 17:50
von zois
das problem ist ja, ich kann mit den warnungen nicht recht viel anfangen!!! :( :roll:
weis auch nicht, wie ich die abstellen soll?

ja, ich möchte die matrix nur deklarieren und die dimension später angeben!!! gefüllt wird die Matrix auch zu einem späteren zeitpunkt!

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 18:34
von eXile
zois hat geschrieben:das problem ist ja, ich kann mit den warnungen nicht recht viel anfangen!!! :( :roll:
weis auch nicht, wie ich die abstellen soll?
Füge _SCL_SECURE_NO_WARNINGS zu deinen Präprozessordefinitionen hinzu. Siehe auch die Antwort auf der boost-ML.

Re: Boost::matrix-Deklaration in einer Klasse

Verfasst: 09.02.2011, 22:05
von Eisflamme
zois:
Schrompf hat doch eben sehr schön erklärt, was es mit der Warnung auf sich hat.

Ansonsten bietet MSVC übersetzungseinheitswirksam auch eine Deaktivierung von Warnungen via:
#pragma warning(disable:xxxx) mit xxxx = Warnungsnummer an