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

09.12.2009, 21:24

Listing 9.5, Kommasetzung bei Ausgabe

Hallo liebe Spieleprogrammierer-Mitglieder,

stehe wieder vor einem kleinen Rätsel. Und zwar ist Listing 9.5 in der Ausgabe so gesetzt, dass jedes mal nach "cout << *i" ein Komma ausgeworfen wird (Also cout << *i << ", "; ) Das ist aber von mir nicht gewünscht. Das Komma soll nicht erscheinen, wenn "i" am Ende der Liste angelangt ist.

Daher habe ich folgende Schleife programmiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (i = vDaten.begin(); i < vDaten.end(); i++)
    {
         cout << (*i); 
         
         if (i != (vDaten.end()-1))
         {
                cout << ", ";
         }
         
         else
         {
             cout << " ";
         }
                
    }


Diese funktioniert bei Listing 9.2 wunderbar. Setze ich diese aber bei Listing 9.5 ein

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
void ZeigeListe(list<int> lListe)
{
     list<int>::iterator i;
     int Temp; 
     
     cout << "Anzahl der Elemente in der Liste: ";
     Temp = static_cast<int>(lListe.size());
     cout << Temp << endl << endl;
     
     cout << "Inhalt der Liste: ";
     
     if (lListe.empty() == false)
     {
         for (i = lListe.begin(); i != lListe.end(); ++i)
         {
         cout << *i;
               if (i != (Temp-1))
               {
                cout << ", ";
               }
         
               else
               {
               cout << " ";
               }
         
         }
     }
     else
     {
         cout << "Leer! \n\n";
     }
     
     cout << endl;
}


versagt die Schleife. Kann mir jemand erklären, warum dies so ist?

Danke vorab!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

09.12.2009, 21:33

Du machst so überhaupt nicht das gleich im ersten und zweiten Listing..

Beim zweiten hast du plötzlich einen Vergelich von einem Iterator und einem Integer.. Das sollte nicht mal kompilieren..

3

09.12.2009, 21:40

Hallo drakon,

danke für die schnelle Antwort. Ich gebe aber zu, dass ich aus dieser nicht wirklich schlau werde. Ich habe gedacht, der Iterator wäre ein Integer (der wurde doch so deklariert und entsprechend hochgerechnet in der Schleife). Und das i im ersten Listing ist doch auch ein iterator. Und zwar einer für einen Vektor. Oder habe ich da etwas nicht mitbekommen?


Edit:
Ich setze mal sicherheitshalber den Code des ersten Listing ein.


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
int main()
{
    vector<int> vDaten(3);
    vector<int> vMehrDaten;
    vector<int>::iterator i;
    
    cout << "aktuelle Zahl an Eintraegen (vDaten): ";
    cout << static_cast<int> (vDaten.size()) << endl << endl;
    
    cout << "aktuelle Zahl an Eintraegen (vMehrDaten): ";
    cout << static_cast<int> (vMehrDaten.size()) << endl << endl;
    
    
    cout << "Daten werden geschrieben!\n\n"  ;
    
    vDaten[0] = 150;
    vDaten[1] = 200;
    vDaten[2] = 220;
    vDaten.push_back (320);
    vDaten.push_back (400);
    
    vMehrDaten.push_back (20);
    vMehrDaten.push_back (40);
    vMehrDaten.push_back (60);
    vMehrDaten.push_back (80);
    vMehrDaten.pop_back();
    
    cout << "Aktuelle Zahl an Eintraegen (vDaten): ";
    cout << static_cast<int> (vDaten.size()) << endl;
    
    cout << "Aktuelle Zahl an Eintraegen (vMehrDaten): ";
    cout << static_cast<int> (vMehrDaten.size()) << endl;
    
    cout << "Inhalt des Vektors (vDaten): " << endl;
    
    for (i = vDaten.begin(); i < vDaten.end(); i++)
    {
         cout << (*i); 
         
         if (i != (vDaten.end()-1))
         {
                cout << ", ";
         }
         
         else
         {
             cout << " ";
         }
                
    }
         

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

09.12.2009, 21:46

Nein. Ein Iterator ist ein völlig von der Implementierung losgelöstes Konzept. Wahrscheinilch ist es als so etwas, wie einen Zeiger implementiert, muss aber nicht sein.

Am besten stellst du dir einen Iterator wahrscheinlich wirklich als einen Zeiger vor.

Hier machst du es korrekt und vergleichst einen Iterator mit einem anderem.

Zitat

C-/C++-Quelltext

1
if (i != (vDaten.end()-1)) 


Und das solltest du im zweiten Beispiel auch so machen. Das ist eigentlich ganz analog.

5

09.12.2009, 21:53

Das hatte ich auch, aber der wollte mir das aufs verrecken nicht kompilieren. Das war die erste Version:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
 for (i = lListe.begin(); i != lListe.end(); ++i)
         {
         cout << *i;
         
         if (i != (lList.end()-1))
         {
                cout << ", ";
         }
         
         else
         {
             cout << " ";
         }


Zugehörige Fehlermeldung beim Dev-C++

Zitat

C:\Dokumente und Einstellungen\PC-xyz\Desktop\C++-Projekte\STL\STL.cpp In function `void ZeigeListe(std::list<int, std::allocator<int> >)':


Diese Fehlermeldung kommt auch, wenn ich dies über die obige Version mit der Variable "Temp" versuche (wg. der besseren Lesbarkeit).

Ich weiß: Ich mache meinem Nick mal wieder alle Ehre :D

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

09.12.2009, 22:21

Abgesehen davon, dass du den Bezeichnern falsch benennst und eine schliessende Klammer fehlt, musst du den Iterator mit dem dereferenzierungsoperator -- verändern. (+/- ist lediglich für Random Access erlaubt, was bei einer Liste nicht der Fall ist).

Daher:

C-/C++-Quelltext

1
if (i != (--lListe.end())) 


Und mach die Einrückung bitte noch anständig. Dann würdest du die Klammer auch nicht vergessen. ;)

7

09.12.2009, 22:27

Sorry, habe geschludert, weil ich das eben schnell hier ins Forum getippselt hatte, ohne nochmal drüber zu lesen.

Das war mir nicht bekannt mit dem Random Access. Das hättest du mir aber auch gleich sagen können, dass ich bei Listen anders vorgehen muß, dann hätte ich mir das unsinnige Getippsel da oben natürlich sparen können.

Ich werde es mal morgen Nachmittag ausprobieren und dir mitteilen, ob alles geklappt hat (Für Heute habe ich erst einmal genug). :D

EDIT:
Habe es mal eben schnell eingetippt, und sehe da: drakon hatte mal wieder recht gehabt! Alles geklappt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
     if (lListe.empty() == false)
     {
         for (i = lListe.begin(); i != lListe.end(); ++i)
         {
         cout << *i;
         
         if (i != (--lListe.end())) 
         {
               cout << ", ";
         }
         else
         {
             cout << "\n";
         }
         
         }
     }


Somit hat sich das Thema erledigt

Nochmals: Vielen, vielen Dank für deine erneute Hilfe

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

09.12.2009, 22:42

np.

Warum hast du den Code nicht einfach kopiert?!

/Keine Ahung, aber das machen noch sehr viele Leute. Copy/Pasten Code, was das Zeugs hält, aber wenn es darum geht ins Forum zu posten, fangen alle an das abzutippen.. :roll:

9

09.12.2009, 22:51

Weil nur Übung den Meister macht :D

Keine Ahnung, frag mich was leichteres. In meinem Fall habe ich mehrere Listings zusammengefaßt und ein wenig damit herum experimentiert (wie du sehen kannst). Ich war wohl einfach zu faul die Stelle zu suchen und dachte die Handvoll Zeilen mal eben selber schnell zu tippen (zumal ich in meinem jetzigen Übungs-Listing die Temp-version drin habe).

Wie auch immer. Mal eine andere Frage, da das Topic sich hier ja eh erledigt hat: Ist das Buch von David Scherfgen wirklich so ein guter Nachfolgeband zu Heiko Kalistas Ausgabe. Ich habe mal kurz reingestöbert in die ersten Listings und habe nur Bahnhof verstanden, bin allerdings auch erst noch bei Multimaps bei Kalista (erst als nächstes kommt Windowsprogrammierung an die Reihe). Kannst du mir dazu etwas sagen, oder irgendwer hier im Forum?

Grüße
vom Anfänger mit dem Wurstfingersyndrom

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

09.12.2009, 22:54

Es ist ein gutes Anschluswerk, welches sich gut für den 3D Einstieg eignet. Aber ich würde bevor du das Buch anfängst zu lesen mal etwas "grösseres" selbst schreiben, weil nur damit bekommst du die Übung.
Und C++ mässig wird im Buch eigentlich nichts erklärt und daher solltest du die Mittel bereits kennen, oder dann halt selbst nachschauen, wenn du sie noch nicht kennst.

Werbeanzeige