Boost::matrix-Deklaration in einer Klasse

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
zois
Beiträge: 10
Registriert: 18.10.2010, 15:37

Boost::matrix-Deklaration in einer Klasse

Beitrag 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
joggel

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag von joggel »

Was wird denn für eine Fehlermeldung ausgegeben?
zois
Beiträge: 10
Registriert: 18.10.2010, 15:37

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag 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!
joggel

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag 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)
{}
zois
Beiträge: 10
Registriert: 18.10.2010, 15:37

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag 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!
joggel

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag 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)
{}
zois
Beiträge: 10
Registriert: 18.10.2010, 15:37

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag 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!
joggel

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag 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... :)
Zuletzt geändert von joggel am 09.02.2011, 17:39, insgesamt 1-mal geändert.
zois
Beiträge: 10
Registriert: 18.10.2010, 15:37

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag 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?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag 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
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag 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.
zois
Beiträge: 10
Registriert: 18.10.2010, 15:37

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag 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!
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag 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.
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: Boost::matrix-Deklaration in einer Klasse

Beitrag 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
Antworten