Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

30.12.2011, 18:41

[C++] Speicherzugriffsfehler auf std::string::assign / Fehler bei Laufzeit

Hallo Community,







ich versuche mir eine kleine KI zu bauen. Ich bin momentan noch an der Dateneingabe zur Person dran.







Den Code findet ihr auf http://github.com/daemonTutorials/dt_tutorials_listing im Unterordner c++/intelligent_program.d







Der Compiler kompiliert alles ohne beschwerden, dann setze ich den Debugger an, da ein Speicherzugriffsfehler kommt und hier ist das was er ausspuckt:



Quellcode

1
SIGSEGV (Segmentation fault) at 0xb7f6b519 in function std::string::assign(std::string const&)() at ??:?? from /usr/lib/libstdc++.so.6








Anscheinend hat es damit was zu tun, dass er die strings nicht aneinanderfügen kann. Sollte doch eigentlich so klappen, oder?







C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
#include 



string foo = "hello";string bar = "world";string foobar = foo + bar + "!";



std::cout << foobar << std::endl;








Anscheinend wird aber an genau der Stelle im Code(person.class.h Person::getAll()) ein Speicherzugriffsfehler ausgelöst.







Das Programm benötigt nicht weiter als die C Standard Librarys. (iostream und cstdlib)







Ich hoffe ihr könnt mir helfen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »daemonTutorials« (30.12.2011, 20:34)


2

30.12.2011, 18:44

Hallo,

mach mal

C-/C++-Quelltext

1
2
3
std::stringstream stream;
stream << foo << bar << "!";
std::cout << stream.str();
dafür musst du <sstream> inkludieren.

Mfg

C++-Coder

Edit: Willkommen im Forum :D

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »C++-Coder« (30.12.2011, 18:50)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

30.12.2011, 18:47

Das wird nichts ändern. Der Fehler muss woanders liegen. Debugst du mit der Debugversion? Benutzt du Arrays?

Der Link funktioniert nicht.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

4

30.12.2011, 19:23

Der Link geht nicht...

Evtl. sind die Strings Member eines Objektes, das schon nicht mehr, oder noch nicht existiert. Wenn du über einen ungültigen Zeiger Methoden von Objekten aufrufst, geht das so lange gut, bis du auf Member zugreifst, dann knallt es an Stellen, wo scheinbar gar nichts ist.
Lieber dumm fragen, als dumm bleiben!

5

30.12.2011, 20:23

Der Link geht nicht...

Evtl. sind die Strings Member eines Objektes, das schon nicht mehr, oder noch nicht existiert. Wenn du über einen ungültigen Zeiger Methoden von Objekten aufrufst, geht das so lange gut, bis du auf Member zugreifst, dann knallt es an Stellen, wo scheinbar gar nichts ist.



Der Link: https://github.com/daemonTutorials/dt_tutorial_listings

Ich instanziere die Klasse global und füge Daten ein, solange geht alles gut. Nachdem die Daten eingefügt wurden und dann wieder ausgegeben wurden, kommt der Fehler.

Warte mal, ich deklariere "person" als Zeiger. Ich muss ihn ja noch instanzieren. Ich schau mal eben nach...

Nee, ich deklariere Person so:

C-/C++-Quelltext

1
Person *person;


Hmmm....

An alle Flamer: Ja ich weiß jetzt, dass ich die Deklarierung der Klasse Person lieber in einer gesonderten *.cpp Datei machen sollte und die Implementierung in der *.h Datei. Ich bin mich da noch am einlesen.


Vielen Dank für die nette Begrüßung :D

Maik

6

30.12.2011, 21:18

Der Link geht jetzt, aber da werden nirgendwo strings zusammen gesetzt. Kannst du nicht einfach die relevaten Codeausschnitte hier posten?
Lieber dumm fragen, als dumm bleiben!

7

30.12.2011, 22:38

Der Link geht jetzt, aber da werden nirgendwo strings zusammen gesetzt. Kannst du nicht einfach die relevaten Codeausschnitte hier posten?



Die Datei auf github.com im Branch draft: https://github.com/daemonTutorials/dt_tutorial_listings/blob/draft/c++/intelligent_program.d/person.class.h



Hier nochmal im Forum:







C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/* 
 * Title: Person Class
 * Description: The Instances of this class describe a person. 
 * Author: Maik
 * Date: 2011/12/28 
 * 
 */



class Person {
    private: 
    
    public:
        
        string firstName; 
        string lastName; 
        string age; 
        string birthday;
        Person();
        string getAttribute(int nameindex);
        int setAttribute(int nameindex, string content);
        string getAll();
};

// Konstruktor
Person::Person()
{
    this->firstName = "Frank";
    this->lastName = "Mueller";
    this->age = "14";
    this->birthday = "19970109";
}

string Person::getAttribute(int nameindex)
{
    switch (nameindex)
    {
    case 1:
        return this->firstName;
        break;
        
    case 2:
        return this->lastName;
        break;
        
    case 3:
        return this->age;
        break;
        
    case 4:
        return this->birthday;
        break;
        
    default:
        return "I have no params";
        break;
    }
    
    return 0;
}

int Person::setAttribute(int nameindex, string content)
{
    switch (nameindex)
    {
    case 1:
        this->firstName = content;
        return 0;
        break;
        
    case 2:
        this->lastName = content;
        return 0;
        break;
        
    case 3:
        this->age = content;
        return 0;
        break;
        
    case 4:
        this->birthday = content;
        return 0;
        break;
        
    default:
        return 1;
        break;
    }
    
    return 0;
}

string Person::getAll()
{
    string all = this->firstName + ", " + this->lastName + " | " + this->age + " | " + this->birthday;
    return all;
}



In der Funktion Person::getAll() habt ihr zu suchen.Ich deklariere und definiere all als string und füge alle Strings zusammen, danach gebe ich sie zurück.



Jetzt habe ich in der Hauptdatei(intelligent_program.cpp) eine Hilfe eingebunden. Wenn die Daten geschrieben wurden, kommt der Fehler, da der Hinweis auf "Daten gefuellt" nicht kommt.



Also habe ich doch irgendwas an der Klassen-Implementation falsch gemacht. Die Attribute sind unter private gestellt.



Ich setze sie mal in Public...



Trotzdem kommt ein Fehler. Langsam verzweifel ich. Ist vllt. irgendwas im Speicher kaputt? Muss ich irgendeinen Speicher leeren?



Maik

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

30.12.2011, 22:52

Lern doch erstmal die Grundlagen bevor du mit Objektorientierung anfängst...

Wieso ist Person *person; überhaupt global? Packs in die Mainfunktion und lass das Sternchen weg, dann gehts. :D

Wie lernst du eigentlich C++? Über Tutorials oder so?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

9

30.12.2011, 22:59

Lern doch erstmal die Grundlagen bevor du mit Objektorientierung anfängst...







Wieso ist Person *person; überhaupt global? Packs in die Mainfunktion und lass das Sternchen weg, dann gehts. :D







Wie lernst du eigentlich C++? Über Tutorials oder so?












Momentan habe ich es mit Tutorials versucht, jetzt habe ich ja ein Ordentliches Buch was ich auch durcharbeiten werde.







Da ich Objektorientierung kenne, weiß ich wie das geht, aber die Tücken von C++ muss ich noch rausfinden.







Okay, was sagst du dazu:







Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
g++ -Wall -g -o "intelligent_program" "intelligent_program.cpp" (im Verzeichnis: /media/Daten/github/dt_tutorials_listings/c++/intelligent_program.d)



intelligent_program.cpp: In Funktion »int main()«:



intelligent_program.cpp:51:28: Fehler: Basisoperand von »->« hat Nicht-Zeiger-Typ »Person«



intelligent_program.cpp: In Funktion »void fillIn(std::string, std::string, std::string, std::string)«:



intelligent_program.cpp:72:5: Fehler: »person« wurde in diesem Gültigkeitsbereich nicht definiert



Kompilierung fehlgeschlagen.

Gut, ich habe die "person->" durch "person." ersetzt und die fillIn Methode in die Main-Funktion reingepackt. JEtzt funzt es!
Maik

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

30.12.2011, 23:06

Könntest du versuchen ein paar Zeilenumbrüche weniger zu schreiben?

Der erste Fehler lässt sich beheben indem du die -> durch . ersetzt.
Für den zweiten Fehler musst du die Person an die fillIn(string firstName, string lastName, string age, string birthday); übergeben oder es einfach als Memberfunktion schreiben.

Arbeite lieber dein Buch durch und nutze die Werkzeuge erst wenn du was drüber gelesen hast. Die strings solltest als Referenz auf const übergeben.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige