Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Linkerproblem: "undefined reference to"

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 <
010
19.03.2005, 18:10 Uhr
Oliver
S2-Pixelgeneral


.c_str() von deinem string-Objekt aufrufen.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
19.03.2005, 19:29 Uhr
Solour



super danke :p

die liste funzt jetzt, mit genau einem element, aber wenn ich mehrere hinzufüge klappt das schon nicht mehr :/
hab auch fehlersuche betrieben und hier mein resultat:

erst nochmal der aktuelle code

main.cpp

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

#define MAIN_VERSION 0
#define APP_TITLE "ListTest"

using namespace std;

int main(int argc, char* argv[]){
    std::cout << APP_TITLE"\n";
    
    Log logObj("logFile.txt", "errFile.txt");
    
    logObj.pLn("test1");
    logObj.logLn("test2");
    logObj.logLn("test3");
    logObj.logLn("test4");
    
    List xl;
    Element elem("value1");
    xl.pushFront(&elem);
    elem.setValue("value2");
    xl.pushFront(&elem);
    elem.setValue("value3");
    xl.pushFront(&elem);
    elem.setValue("value4");
    xl.pushFront(&elem);
    std::cout << (*(xl.popBack())).getValue() << "\n";
    std::cout << (*(xl.popBack())).getValue() << "\n";
    std::cout << (*(xl.popBack())).getValue() << "\n";
    std::cout << (*(xl.popBack())).getValue() << "\n";
    //block until user types something
    fgetc(stdin);
    return 0;
}



list.cpp

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

using namespace std;


// constructor
List::List(){
    first= NULL;
    last= NULL;
    size= 0;
}

// destructor
List::~List(){
    first= NULL;
    last= NULL;
    size= 0;
}

void List::pushFront(Element *elem){
    Element newElem((*elem).getValue());
    std::cout << "new element pos: " << &newElem << "\n";
    Element *tmp= &newElem;
    size++;
    if(first==NULL){
        first= tmp;
        last= tmp;
        (*tmp).setNext(NULL);
        (*tmp).setPrev(NULL);
        return;
    }
    (*tmp).setNext(first);
    (*first).setPrev(tmp);
    (*tmp).setPrev(NULL);
    first= tmp;
}

void List::pushBack(Element *elem){
    size++;
    if(first==NULL){
        first= elem;
        last= elem;
        (*elem).setNext(NULL);
        (*elem).setPrev(NULL);
        return;
    }
    (*first).setNext(elem);
    (*elem).setPrev(first);
    (*elem).setNext(NULL);
    last= elem;
}

Element* List::popFront(){
    if(size==0)
        return NULL;
    Element *result= first;
    if(size==1){
        first= NULL;
        last= NULL;
    }else{
        first= (*first).getNext();
        (*first).setPrev(NULL);
    }
    (*result).setNext(NULL);
    (*result).setPrev(NULL);
    size--;
    return result;
}

Element* List::popBack(){
    if(size==0)
        return NULL;
    Element *result= last;
    if(size==1){
        first= NULL;
        last= NULL;
    }else{
        last= (*last).getPrev();
        (*last).setNext(NULL);
    }
    (*result).setNext(NULL);
    (*result).setPrev(NULL);
    size--;
    return result;
}



element.cpp

C++:
#include <iostream>
#include "element.h"

using namespace std;

Element::Element(){
}

Element::Element(std::string value){
    setValue(value);
    setNext(NULL);
    setPrev(NULL);
}

void Element::setPrev(Element *p){
    prev= p;
}

Element* Element::getPrev(){
    return prev;
}

void Element::setNext(Element *n){
    next= n;
}

Element* Element::getNext(){
    return next;
}

void Element::setValue(std::string val){
    value= val;
}

std::string Element::getValue(){
    return value;
}

int Element::compareTo(std::string value2) {
    return value>value2;
}

void Element::swapElems(Element *e1, Element *e2){
    std::string tmp((*e1).getValue());
    (*e1).setValue((*e2).getValue());
    (*e2).setValue(tmp);
}



das Problem:
bei der pushFront methode wird dem neuen Element immer wieder der alte platz zugewiesen,


Code:
D:\workspace\ListC>main
ListTest
test1
new element pos: 0x22fdf0
new element pos: 0x22fdf0
new element pos: 0x22fdf0
new element pos: 0x22fdf0



dann gibt es eine exception bei
(*last).setNext(NULL);
in der popBack methode, da last in der Zeile auf NULL zeigt

es werden also irgendwie keine kopien von den elementen angelegt

hoffe mal das ihr mir da wieder helfen könnt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
21.03.2005, 11:47 Uhr
Th



Du mußt die Elemente auch mit new anlegen, also entweder eine Kopie in "PushFront/PushBack" anlegen oder aber den Aufruf ändern zu:

C++:
    xl.pushFront(new Element ("value1"));
    xl.pushFront(new Element ("value2"));
    // ...



Da du immer wieder dieselbe Variable "elem" benutzt, ändert sich natürlich auch die Adresse nicht, außerdem wäre die Liste nicht mehr korrekt, falls die Variable "out of scope" gelangt.

Denk dran, dann entsprechend in den Pop-Methoden auch "delete" aufzurufen.

Vielleicht solltest du doch einfach die Standard-Templates "list", "vector", "stack" oder "queue" benutzen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
21.03.2005, 19:16 Uhr
Solour




Zitat von Th:
Du mußt die Elemente auch mit new anlegen, also entweder eine Kopie in "PushFront/PushBack" anlegen oder aber den Aufruf ändern zu:

C++:
    xl.pushFront(new Element ("value1"));
    xl.pushFront(new Element ("value2"));
    // ...





mhh ich dachte das wenn ich in der Liste in den push-methoden jeweils neue Elemente erzeuge das ausreichen müsste??
bzw. warum reichts das nicht?


Zitat:

Da du immer wieder dieselbe Variable "elem" benutzt, ändert sich natürlich auch die Adresse nicht, außerdem wäre die Liste nicht mehr korrekt, falls die Variable "out of scope" gelangt.



solange die OOP in C korrekt funktioniert dürfte das nicht passieren oder?
d.h. gibt es einen Fall in dem das passieren könnte?


Zitat:

Denk dran, dann entsprechend in den Pop-Methoden auch "delete" aufzurufen.


werd ich noch "reinbauen"


Zitat:

Vielleicht solltest du doch einfach die Standard-Templates "list", "vector", "stack" oder "queue" benutzen?


pfft und mir den spaß nehmen :p
nee es geht bei dem projekt eigentlich genau darum Listen/Bäume/Graphen und sowas zu implementieren... (die aufgaben waren zwar eigentlich für java gedacht aber in C müsste das ja eigentlich auch ohne große probleme funkionieren, auch wenn ich von C (noch) net so den plan hab)

Also danke für die antwort, wenn ich zuhause bin werd ich das mal gleich probieren
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (WinAPI, Konsole) ]  


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: