PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c++ vektoren initialisieren



ulzf
27-09-2004, 15:55
hallo leute brauche einen Konstructor zur initialiserung mehren Vektoren und Matrizen
hier sind die Vektoren


typedef std::vector<double> Flaeche;// 1d Vektor : eine Fläche besteht aus n Punkte
typedef std::vector<Punkt> Ecken;//1d Vektor : Liste der Ecken des Modells
typedef std::vector<Flaeche> Flaechen;//2d Matrix : Liste der Flächen des Modells
die klasse sieht so aus:

class Modell{
private:

int Ecken_Anzahl;
int Flaechen_Anzahl;

Ecken * Modell_Ecken;
Flaechen * Modell_Flaechen;

public:

Modell();
~Modell();
//other functions...
}


ich habe sowas gemcht.. aber funzt nicht richtig


Modell::Modell(){

Modell_Ecken (max_punkte);
Flaechen(max_flaechen);
int i;
for(i = 0 ; i < max_flaechen;i++){
Modell_Flaechen[i] = Flaeche(max,0);
}

}

kann mir jemand helfen

anda_skoa
27-09-2004, 20:16
Nachdem beide Variablen Pointer auf Vektoren sind, musst du erstmal den jeweiligen Vektor erzeugen.
also zB


Modell_Ecken = new Ecken(max_ecken); // vector mit größe max_ecken erzeugen


Die Variablen Ecken_Anzahl und Flaechen_Anzahl kannst du dir eigentlich schenken, der jeweilige Vektor weiß eh immer, wie groß er ist.

Ciao,
_

ulzf
28-09-2004, 08:21
es ist schon klar...
ich habe es auch so wie du gesagt hast gemacht.. aber der code


Modell_Ecken = new Ecken(max_punkte);
Flaechen = new Flaechen(max_flaechen);

for(i = 0 ; i < max_flaechen;i++){
Modell_Flaechen[i] = new Flaeche(max,0);
}
bringt diese Fehlermeldungen

modell.cpp: In constructor `Modell::Modell()':
modell.cpp:17: error: parse error before `=' token
modell.cpp:20: error: no match for 'operator=' in '
*(this->Modell::Modell_Flaechen + (+(i * 12))) = (operator new(12), ((true,
(<anonymous>->std::vector<_Tp, _Alloc>::vector [with _InputIterator = int,
_Tp = double, _Alloc = std::allocator<double>](20, 0,
(&allocator<double>())), (<anonymous> <unknown operator> false))),
<anonymous>))'
/usr/include/c++/3.3/bits/vector.tcc:128: error: candidates are:
std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const
std::vector<_Tp, _Alloc>&) [with _Tp = Flaeche, _Alloc =
std::allocator<Flaeche>]

wraith
28-09-2004, 09:36
Zum roten Fehler: Das sollte links vom = Modell_Flaechen stehen (Flaechen ist der Typ).Und statt den () sollten [] Klammern da stehen.In deinem Bsp legst du _einen_ vector an, aber du willst wohl (dem restlichen Code nach), eine Menge von vectoren anlegen.

Zum blauen Fehler: Die Dereferenzierung von dem Zeiger gibt keinen Zeiger, den du aber bräuchtest, wenn du mit new angelegten Speicher zuweisen willst.

Aber das mit dem Zeiger ist fehleranfällig, benutz doch gleich einen vector


class Modell
{
std::vector<Flaechen> Modell_Flaechen;
...
};

Modell::Modell() : Modell_Flaechen(max_flaechen,Flaechen(max,0))
{

}

locus vivendi
28-09-2004, 09:37
Modell_Flaechen ist ein Zeiger auf "Flaechen". Flaechen ist ein std::vector<Flaeche>. Also ist Modell_Flaechen[i] vom Typ std::vector<Flaeche>. Und von diesem Typ gibt es keinen Zuweisungsoperator der eine "Flaeche", also einen std::vector<double> akzeptiert.
Ich vermute das du statt dem Ausdruck "Modell_Flaechen[i] = new Flaeche(max,0);" dieses hier möchtest "(*Modell_Fleachen)[i] = new Flaeche(max, 0);". Vielleicht ist es aber auch besser in deiner Klasse keinen Zeiger auf einen std::vector<>, sondern den vector direkt zu speichern.

ulzf
28-09-2004, 10:57
erstamal danke...

also hier ist die gesamte datei

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#include <string.h>
#include <vector>

using std::vector;

#define max_p_f 20 //maximale Zahl der Punkte aus denen eine Fläche besteht.
#define max_flaechen 10000//maximale Zahl der Flächen
#define max_punkte 100000//maximale Zahl der Punkte

typedef struct {
double x;
double y;
double z;
}Punkt;
//end Struct Punkt

typedef vector<double> Flaeche;// 1 Vektor : eine Fläche besteht aus n Punkte
typedef vector<Punkt> Ecken;//1 Vektor : Liste der Ecken des Modells
typedef vector<Flaeche> Flaechen;//2d Matrix : Liste der Flächen des Modells

class Modell{
private:

int Ecken_Anzahl;
int Flaechen_Anzahl;


Ecken * Modell_Ecken;
Flaechen * Modell_Flaechen;

public:

Modell();
~Modell();

Ecken * getEcken(){return Modell_Ecken;};
Flaechen * getFlaechen(){return Modell_Flaechen;};

int getEcken_Anzahl(){return Ecken_Anzahl;};
int getFlaechen_Anzahl(){return Flaechen_Anzahl;};

void setEcken(Ecken ecken){Modell_Ecken = &ecken;};
void setFlaechen(Flaechen flaechen){Modell_Flaechen = &flaechen;};

void setEcken_Anzahl(int a){Ecken_Anzahl = a;};
void setFlaechen_Anzahl(int a){Flaechen_Anzahl = a;};

int Modell_laden(const char*);
// int Ecken_einlesen(FILE*,Ecken*);
//int Flaechen_einlesen(FILE*,Flaechen*);

//int Modell_speichern(const char*);

};
//-------------------------------------------------
Modell::Modell(){

Modell_Ecken = new Ecken(max_punkte);
Modell_Flaechen = new Flaechen(max_flaechen,Flaeche(max_p_f));
}
//-------------------------------------------------
Modell::~Modell(){

}
//-------------------------------------------------
int Modell:: Modell_laden(const char* filename){
FILE* fp = fopen(filename,"r");
if(fp == NULL){
printf("fehler beim lesen\n");
exit(1);
}
return(1);
}
//--
int main( int argc, char *argv[] ){

Modell * mod = new Modell();
mod->Modell_laden(argv[1]);
return(0);
}

Compilieren (gcc -o all.o -c all.cpp) funzt super.
beim erzeugen der ausführbaren datei (gcc -o prog all.o)
bekomme ich u.a. diese fehlermeldungen:

all.o(.text+0x15): In function `Modell::Modell[not-in-charge]()':
: undefined reference to `operator new(unsigned)'
all.o(.text+0x54): In function `Modell::Modell[not-in-charge]()':
: undefined reference to `operator delete(void*)'
all.o(.text+0x77): In function `Modell::Modell[not-in-charge]()':
: undefined reference to `operator new(unsigned)'
all.o(.text+0x12f): In function `Modell::Modell[not-in-charge]()':
: undefined reference to `operator delete(void*)'

locus vivendi
28-09-2004, 11:12
GCC hat mehrere Frontends die aufgerufen werden können. Wenn man z.B. "gcc" aufruft erkent GCC anhand der Dateiendung welches Backend aufgerufen werden muss. Aber das gilt soweit nur für das Kompilieren. Welche Bibliotheken hinzugelinkt werden sollen, muss durch entsprechende flags angegeben werden (also in diesem Fall -lstdc++). Mann kann aber auch anstatt dem "allgemeinen" Frontend "gcc" das Frontend "c++" aufrufen. Dann geht der gesamte Compiler davon aus das es sich um ein C++ Programm handelt und linkt die C++ Standardbiblitothek automatisch hinzu, ohne das du das auf der Kommandozeile mit angeben müsstest.

ulzf
28-09-2004, 11:29
vielen dank
es hat geklappt