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

11

27.04.2014, 19:53

Oder gleich 'n std::stringstream. :|

MfG
Check

Superwayne

Treue Seele

  • »Superwayne« ist der Autor dieses Themas

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

12

27.04.2014, 20:58

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

using namespace std;


int main()
{

    cout << "  1 2 3 4 5 6 7" << endl;
    for(int i = 0x0; i <= 0xf; i++)
    {
        for(int j = 0x0; j <=0x7; j++)
        {

            string s = "0x" + std::to_string(j) + std::to_string(i);
            int zahl = atoi(s.c_str());
            if(j == 0x0)
            {
                cout << i << " ";
            }
            cout << toascii(zahl) << " ";
            if(j == 0x7)
            {
                cout << endl;
            }
        }
    }
}


Hab mir erlaubt die Klammerfehler und den Einstiegspunkt zu korrigieren, deswegen bevorzuge ich btw auch dieses Eine-Klammer-Pro-Zeile-Layout, so kommt man weniger durcheinander mit den Klammern.
Das da kompiliert.

EDIT: Du benutzt den C++11 Standard aber kein C++11? Sachen gibts...

MfG
Check


Das mit dem Einstiegspunkt ist Absicht. Da wir pro Übungszettel n Haufen Aufgaben bekommen und ich nicht für jede Aufgabe ein neues Projekt wollte, habe ich eine main Funktion, mit der ich die Funktionen zu den einzelnen Aufgaben dann aufrufe ;)
Klammerfehler habe ich jetzt keine gefunden. Habe dein Code nochmal mit meinem abgeglichen, finde aber bis auf die neuen Zeilenumbrüche keine Änderungen? Ob man nun '{' am Ende einer Zeile oder in einer extra Zeile findet ist, denke ich, Geschmackssache. Ich nutze seit Jahren die erste Variante ;)

Das mit dem C++11 ist so ne Sache.. Habe den Standard erst gestern in Eclipse zum Laufen bekommen, weiß daher noch nicht, was damit noch alles möglich ist. Bisher habe ich es nur für to_string gebraucht.


Toascii ist nicht im std namespace deklariert. Wenn du std::toascii schreibst, sucht der Compiler in diesem namespace jedoch...


Oh, danke! Da habe ich wohl was falsch verstanden gehabt.


Zitat

Jetzt muss ich mir nur noch mal anschauen, wieso die Tabelle nur Nullen enthält


atoi konveriert nur Strings, die Integerzahlen darstellen. Nutze strtol stattdessen.

Weitere Informationen: http://h30097.www3.hp.com/docs/base_doc/…N3/0104____.HTM



Ich sollte mich echt besser über die Funktionen erkundigen, die ich bei Google finde.. Danke!


Jetzt sieht die Ausgabe schon etwas besser aus. Leider aber immer noch nicht ganz richtig.
z.B. "0x2a" liefert ein ? statt '*', also strtol scheint keine buchstaben als hexzahl zu erkennen.
Habe die Zeile mit dem toascii jetzt durch folgendes ersetzt:

C-/C++-Quelltext

1
2
char c = zahl;
cout << c << " ";


toascii hatte nur Zahlen geliefert (sowas wie 117, keine einzelnen Zahlen als Zeichen).

Außerdem scheint 0x09 bei mir das gleiche zu bewirken wie die Tab-Taste, obwohl auf dem Aufgabenzettel an der Stelle ein nicht druchbares Zeichen ist?
Und wie kann ich die Fragezeichen (nicht druckbare Zeichen) durch einen . ersetzen? Also ich könnte einfach mit if-Anweisungen die Stellen selbst durch einen . ersetzen, aber das ist nicht der Sinn der Übung, denke ich :D

Oder gleich 'n std::stringstream. :|

MfG
Check


Ich kenne mich damit noch absolut nicht aus. Habe bisher hauptsächlich mit C# gearbeitet und habe jetzt erst seit 4 Wochen C++ an der FH. Habe bei Google atoi gefunden, was angeblich einfacher sein sollte als std:stringstream.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Superwayne« (27.04.2014, 21:11)


13

27.04.2014, 21:10

Zitat

toascii hatte nur Zahlen geliefert (sowas wie 117, keine Zeichen).


Du solltest dich wirklich besser über die Funktionen erkundigen, die du nutzt.

Zitat

toascii converts the integer c to ASCII by clearing all but the lower 7 bits. This gives a value in the range 0 to 127. Returns the converted value of c.


Wenn du 8-Bit mapping suchst, nutze itoa() bzw. std::to_string()

Zitat

Außerdem scheint 0x09 bei mir das gleiche zu bewirken wie die Tab-Taste, obwohl auf dem Aufgabenzettel die Stelle angeblich nicht belegt ist?

Vermutlich bezeichnet man das Tab-Zeichen als nicht belegt, da man es nicht sehen kann..
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Superwayne

Treue Seele

  • »Superwayne« ist der Autor dieses Themas

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

14

27.04.2014, 21:30

Zitat

toascii hatte nur Zahlen geliefert (sowas wie 117, keine Zeichen).


Du solltest dich wirklich besser über die Funktionen erkundigen, die du nutzt.

Zitat

toascii converts the integer c to ASCII by clearing all but the lower 7 bits. This gives a value in the range 0 to 127. Returns the converted value of c.


Wenn du 8-Bit mapping suchst, nutze itoa() bzw. std::to_string()

Zitat

Außerdem scheint 0x09 bei mir das gleiche zu bewirken wie die Tab-Taste, obwohl auf dem Aufgabenzettel die Stelle angeblich nicht belegt ist?

Vermutlich bezeichnet man das Tab-Zeichen als nicht belegt, da man es nicht sehen kann..


Oh man, es tut mir echt Leid, dass ich euch hier mit meiner Dämlichkeit belästige. Leider fällt bei uns durch den ersten Mai die Übungsgruppe aus, wo die Aufgaben besprochen werden sollten und nun will ich versuchen, die Aufgabe selbst zu lösen, wenn der Prof es schon nichtmehr mit uns macht.

Ich dachte toascii liefert ein ascii Zeichen, hätte ich aber auch drauf kommen können, dass das ja gar kein Sinn macht, weil es das gleich wäre wie (char)zahl ...

Habe es im anderen Beitrag noch korrigiert. Es heißt bei uns nicht darstellbar statt nicht belegt. Das macht beim Tab-Zeichen dann durchaus Sinn, so wie du es erklärt hast.

Ich habe mal die Zahl so ausgegeben und ich erhalte für long int zahl = strtol(s.c_str(), nullptr, 16); bei s = "0x0a" bis "0x0f" dann 16-19 statt 11-16? Bei 0x1a wird es dann 572, bei 0x2a 528 und weitere solche Werte.


Denke ich vielleicht einfach zu kompliziert bei der Aufgabenstellung? Bei den Vorlesungen sind wir gerade bei Schleifen und Sprunganweisungen.. Allerdings mussten wir beim ersten Übungszettel auch schon if/else benutzen und eingelesene longzahlen in der Binärdarstellung auf 1er Drillinge untersuchen und so etwas, obwohl wir in der Vorlesung höchstens mal ein "Hello World" gesehen haben..

15

27.04.2014, 21:50

was ist denn 'long int'?

C-/C++-Quelltext

1
std::to_string(j) + std::to_string(i)


to_string gibt einen String zurück, der eine Dezimalzahl wiedergibt, keine hexadezimalzahl.

wenn bei dir dann j = 0 und i = 0xa heißt das: "0" + "10" -> 0x010 = 16
für j = 1 und i = 0xa heißt das: "1" + "10" -> 0x110 = 272 (du hast dich verschrieben)
für j = 2 und i = 0xa heißt das: "2" + "10" -> 0x210 = 528
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Superwayne

Treue Seele

  • »Superwayne« ist der Autor dieses Themas

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

16

27.04.2014, 22:05

long int stand bei deinem Link als Rückgabewert von strtol. Ist das nicht das selbe wie einfach nur long?


Benutze jetzt _itoa um das Problem zu lösen:

C-/C++-Quelltext

1
2
3
char iHex[128] = {0};
_itoa(i, iHex, 16);
string s = "0x" + to_string(j) + iHex;


Jetzt funktioniert es :)

Jetzt muss ich nur noch die nicht druckbaren Zeichen rausfiltern. Geht das auch anders, als mit einer if Anweisung einfach bei unter 0x20 einen Punkt statt dem Zeichen auszugeben=

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Superwayne« (27.04.2014, 22:18)


17

27.04.2014, 22:36

long int stand bei deinem Link als Rückgabewert von strtol. Ist das nicht das selbe wie einfach nur long?

Ja.

Benutze jetzt _itoa um das Problem zu lösen:

C-/C++-Quelltext

1
2
3
char iHex[128] = {0};
_itoa(i, iHex, 16);
string s = "0x" + to_string(j) + iHex;

Was spricht eigentlich ganz grundsätzlich gegen zahl = j * 16 + i;?
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Superwayne

Treue Seele

  • »Superwayne« ist der Autor dieses Themas

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

18

28.04.2014, 08:02


Benutze jetzt _itoa um das Problem zu lösen:

C-/C++-Quelltext

1
2
3
char iHex[128] = {0};
_itoa(i, iHex, 16);
string s = "0x" + to_string(j) + iHex;

Was spricht eigentlich ganz grundsätzlich gegen zahl = j * 16 + i;?


Danke! Das ist genau der Ansatz, auf den ich einfach nicht gekommen bin.

Werbeanzeige