Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » arrays, unterschiedliche Datentypen und Methodenaufrufe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] [ 3 ] > 4 <
030
03.07.2004, 01:02 Uhr
songbird



@typecast: ok, sorry... ich hab das so gesehen wie Windalf... da die Probleme hier doch sehr spezifisch waren, dachte ich dass ich dann mit so riesen posts hier nur nerve...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
031
03.07.2004, 01:10 Uhr
typecast
aka loddab
(Operator)


Da bin ich anderer Meinung. Ich habe hier z.B. viel gelernt nur indem ich Probleme von anderen gesehen habe und dann auch gleich die Lösung bekommen habe.

Dann hast du noch einen sehr aussagekräftigen Titel gewählt, so dass man auch gleich am Titel erkennt, ob man den Thread brauchen kann oder nicht.
Deshalb besteht hier auch die Möglichkeit das jemand den Thread bis zum ende durchliest (also wenn ich ein Problem habe und einen Thread mit einem gut gewählten Titel sehe, dann lese ich ihn bis zum Ende durch).
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
032
03.07.2004, 01:37 Uhr
songbird



ok, dann weiß ich für's nächste Mal Bescheid und nochmal sorry.

Das nächste Mal ist übrigens auch schon da :


C++:
//head.cpp
//hier ist der Einstieg

void Head::createProject(Project* projects[], Staff* persons[])
{
       Project pro;
       //hier werden einige Daten zum erstellen eines Staffs und eines Projektes abgefragt (mit pro passiert aber nix mehr)
       pro.setMembers(*persons[setter]);
}


//project.cpp

void Project::setMembers(Staff _member)
{
    int writer = 0;
    
    while(&members[writer] != NULL)//erste nicht besetzte Array-Stelle suchen
    {
        writer++;
    }
    for(int i = 0; i < writer; i++)
    {
        if(members[i].getPersonalNr() == -1)//falls irgendwo ein Default-Konstruktor steht, soll der überschrieben werden
        {
            writer = i;
        }
    }
    members[writer] = _member;
}


//project.h

Staff members[20];




Das Problem ist jetzt, dass das Programm einfach anhält, nachdem es in setMembers(...) verzweigt ist.

Erst hatten wir es so, dass setMembers(...) direkt die erste leere Array-Stelle mit übergeben wurde. Da sah setMembers() also nur so aus:

C++:
void Project::setMembers(Staff _member, int writer)
{
       members[writer] = _member;
}


und wurde natürlich durch pro.setMembers(*persons[setter], i); aufgerufen.
Da ging alles wunderbar.
So konnten wir es aber nicht lassen, da wir auf i bzw writer nicht überall Zugriff haben und es so nicht generell übergeben können...

Der Fehler muss also in dem Teil liegen:

C++:
int writer = 0;
    
    while(&members[writer] != NULL)//erste nicht besetzte Array-Stelle suchen
    {
        writer++;
    }
    for(int i = 0; i < writer; i++)
    {
        if(members[i].getPersonalNr() == -1)//falls irgendwo ein Default-Konstruktor steht, soll der überschrieben werden
        {
            writer = i;
        }
    }


Wie gesagt, der Kompiler meckert nicht und das Programm hält einfach nur an und scheint auf irgendwas zu warten

Weiß jemand Rat?

Dieser Post wurde am 03.07.2004 um 01:38 Uhr von songbird editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
033
03.07.2004, 02:14 Uhr
typecast
aka loddab
(Operator)


So und da haben wir auch gleich mal eine Bestätigung dafür, dass du deine Probleme nicht löschen solltest. Denn du hast das Problem nicht gelöst

Zuerst mal hierzu:

C++:
Project* projects[]



Was willst du damit machen? Willst du wirklich einen Pointer auf ein Project-array?
Oder willst du nicht viel mehr nur ein Array mit Projects?

Also

C++:
Project projects[];
//oder
Project* projects;



Der Fehler zieht sich durch das ganze Programm.

Der Grund warum das Programm nicht funktioniert liegt daran:

C++:
    while(&members[writer] != NULL)//erste nicht besetzte Array-Stelle suchen
    {
        writer++;
    }



Das Ding kann nicht funktionieren. Das müsste sogar abstürzen (eigentlich kannst du gar nicht soviel Glück haben, dass es da in einer Endlosschleife hängen bleibt ).
Durchsuch das Array nicht, sondern merk dir, wo das letze Element steht (oder besser die Stelle an der das steht)

Allerdings würde ich dir da die Klasse std::vector ans Herz legen:

C++:
std::vector<Staff*> members;
members.push_back(&_member);



Und schon ist die Sache gegessen.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 03.07.2004 um 02:18 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
034
03.07.2004, 02:32 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


um mal nochmal auf dein problem zu kommen

schreib dir als erstes eine Klasse Staff...
und dann noch deine anderen 3-4 klassen die du von staff ableitest...
soweit warst du ja hoffentlich schon

so jetzt willst du ein array von staffs haben die du wenn ichs richtig verstanden habe in der klasse Projekt verwalten willst...
das problem was es dabei gibt ist das in deinem fall die verschiedenen objekte nicht alle die gleiche grösse im speicher belgen was zur folge hat das du sie nicht direkt in ein array packen kannst weil in einem array immer alle objekte die gleiche grösser haben... deswegen musst du eine array von zeigern nehmen welche (die zeiger selber wiederum haben nämlich alle die gleiche grösse) welche dann auf die stelle in speicher zeigen an der du ein konkretes objekt angelegt hast...

also entweder so


C++:
Staff* members[20];



oder so

C++:
Staff** members= new Staff*[20];  //in diesem fall könntest du später nocheinmal speicher nachallokieren wenn 20 nicht reicht was du im obigen fall nicht tun könnntest...




so das ganze willst du in die klasse Projekt packen wenn ichs richtig verstanden habe.. also sieht deine Klasse Projekt so aus...


C++:
class Projekt{

Staff* members[20];
int anzahl; // am besten speicherst du hier wieviele members du shcon ins array eingfügt hast um nicht bei jedem einfügen nochmal das array durchgehen zu müssen
int reserved; //dies bräuchtest du nur wenn du die lösung mit dem speicher nachallokieren machen willst... dann müsstest du immer anzahl mit reserved vergleichen... sowie anzahl genauso gross ist wie reserved müsstest du speicher nachallokieren...  

public:
//so nun zum konstruktor
Staff(){anzahl=0; reserved=20; //und hier ggf mit  new allokieren wenn du die dynamische lösung wählen solltest
}
~Staff(){
//hier den speicher wieder freigeben, als erstes mit ner schleife bis anzahl für jedes member und danach für das ggf allokierte array
}

//so und dann brauchst du noch ne funktion addmember
void addmember(Staff *member){members[anzahl]=member;++anzahl} //hier sonst ggf noch den check machen ob überhaupt noch ein member ins feld passt

}



so und deine main sollte in etwa wie folgt aussehen

C++:
int main(){

Projekt pro;
pro.addmember(new Manager(....));
pro.addmember(new Employee(....));
pro.addmember(new Manager(....));
pro.addmember(new Manager(....));
...

}



ach so und das was du da oben gepostet hast würd ich schleunigst in die tonne treten das kriegst du so nie zum laufen (auch wenns der kompiler frisst )
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 03.07.2004 um 02:45 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] [ 3 ] > 4 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: