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

20.03.2013, 11:07

inkorrekte Ausgabe von Array durch cout

Hallo Zusammen,

ich bin nun auf Seite 126 bzw. bei Listing 5.3 im Buch "C++ für Spieleprogrammierer" angekommen, welches in auch brav abgetippt hab und ein wenig dran rumzuspielen. Das problem ist, dass die vollständige Ausgabe des Arrays mit dem cout-Befehl nicht korrekt ausgegeben wird, zumindest nicht so wie im Buch. Die Frage ist nun, wieso es anders aussieht. Liegt das an dem Compiler? Was sind die Möglichkeiten dieses Problem zu umgehen oder zu beheben.
BTW: Ich benutze xCode auf meinem MacBook.
Die Ausgabe sieht so aus:
String 1
String 2
Teil 1
Teil 1¿Teil 2¿¿¿¿¿¿¿


Sollte aber so aussehen:



String 1
String 2
Teil 1
Teil 1 Teil 2


Für die, die das Buch nicht (vor) sich haben um den Code einzusehen, wollte ich fragen ob es rechtlich erlaubt ist den Code des Listings aus dem Buch zu posten, wenn ich die Quele angebe? :)
Möchte mir keinen Ärger einhandeln


freundliche Grüße


Lukas

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

20.03.2013, 12:00

Zeig Deinen Code einfach, ohne den können wir Dir sonst eh nicht helfen, ob mit Buch oder ohne ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

20.03.2013, 12:21

Heiko hat sich hier soweit ich weiß noch nie drüber beschwert, dass Codes getestet werden. Ist ja auch im Interesse des Autors, wenn die Leute mit ihrem Buch zufrieden sind. So empfehlen sie es weiter. Von daher kannst du es ruhig posten, bzw solltest dies auch tun.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

20.03.2013, 12:32

Mal eine ganz wilde Vermutung: Deine Arrays sind nicht nullterminiert. Aber ohne Code kann man natürlich eigentlich nix sagen...

5

20.03.2013, 13:19

Habt ja vermutlich recht :) also hier aus dem Buch "c++ für Spieleprogrammierer"

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
#include <iostream>

using namespace std;

//Hauptprogramm
int main()
{
char cAZeichenfolge1[]= "String 1";
char cAZeichenfolge2[9]= "String 2";
char cAZeichenfolge3[20]= "Teil 1\0Teil 2";

//Ausgabe der Strings
//
cout << cAZeichenfolge1 << endl;
cout << cAZeichenfolge2 << endl;
cout << cAZeichenfolge3 << endl;

for (int i=0;i<20;i++)
  cout << cAZeichenfolge3[i];

cout << endl;

return 0;

}

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Lukkal« (20.03.2013, 13:31) aus folgendem Grund: fehlendes Code-Tag


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

20.03.2013, 13:28

Die Ausgabe ist korrekt. Zwischen den Strings und nach dem letzten String ist Müll im Array, der natürlich auch als Müll ausgegeben wird, wenn man jedes Zeichen einzeln ausgeben lässt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

20.03.2013, 13:34

ah, okay. Wie könnte man das dann beheben?
Müsste man erst alle arrays erst auf Null setzen und dann überschreiben? Falls das zu irgendeinem Zeitpunkt in meiner Karriere als Programmierer wichtig ist :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

20.03.2013, 13:37

ah, okay. Wie könnte man das dann beheben?

Ganz einfach: Nur Buchstaben ausgeben bis ein '\0' daherkommt. Genau das ist ja die Idee eines nullterminierten String; '\0' markiert das Ende...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

20.03.2013, 13:37

Das könnte man beheben, indem man das for komplett rauswirft, denn es hat keinen logischen Zweck, außer zu zeigen, dass zwischen den Strings im Müll ist und dass cout nur bis zum \0 ausgibt. Wahlweise kann man den Array natürlich auch mit Leerzeichen füllen, damit keine unsinnigen (auch \0 ist in diesem Zusammenhang unsinnig) Zeichen erscheinen.
Insgesamt ist es aber überhaupt sehr unsinnig mehrere char* in einem Array abzulegen. Selbst die Verwendung von char* an sich ist sehr zweifelhaft, denn nicht umsonst gibt es std::string und auch nur der sollte Anfängern vorrangig gelehrt werden, denn das ist C++. char* ist ein furchtbares Relikt aus C und macht nur an relativ wenig Stellen richtig Sinn.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

10

20.03.2013, 17:05

Ja, du solltest wirklich strings benutzen. Auch wenn in deinem Buch etwas anderes steht. Leider lehren viele C++ Anfängerbücher kein 'richtiges' C++, sondern benutzen oft Konstrukte aus C, die in C++ zwar weiterhin benutzen, für die es aber um Welten besser Alternativen gibt. Da sich C++ auch weiterentwickelt, mögen sich manche erst mit der Zeit durchgesetzt haben, was erklärt, dass die Autoren noch selber die "alten" Wege benutzen und entsprechend lehren, das ändert aber nicht an der Tatsache, dass man das nicht tun sollte. Nimm std::string statt char*, und zwar immer. Es gibt ganz selten mal Situationen, wo du mit dieser Strategie nicht weiter kommst, aber dann kannst du ja noch einmal nachfragen :)
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige