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

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

04.11.2015, 01:27

[GELÖST] C++ | Womit enden Strings?

Hi,
heute wurde meine Annahme revidiert, dass der Compiler stets ein '\0' an eine Zeichenkette anfügt.
Ich versuche zur Zeit folgende EBNF-Regeln in C++ zu implementieren:

Zitat



digitNN: "1" | "2" | ... | "9".
digit: "0" | digitNN.
number: digitNN {digit}.



Ich habe dafür diese drei Funktionen:

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
bool isDigitNN(char* pChar);
bool isDigit(char* pChar);
bool isNumber(char* pLine);

bool isDigitNN(char* pChar)
{
    switch(*pChar)
    {
         case '1':
         case '2':
         // ... 
         case '9':
             return true;
         default:
             false;
    }
}

bool isDigit(char* pChar)
{
    return ('0' == pChar) || isDigitNN(pChar);
}


bool isNumber(char* pLine)
{
            bool    bProcessing     = true;
            char*   pCurrentChar    = pCode;
            std::cout << pCurrentChar << std::endl;
            if(isDigitNN(pCurrentChar))
                while(bProcessing)
                {
                    pCurrentChar = pCurrentChar++;
                    std::cout << pCurrentChar << std::endl;
                    if('\0' == pCurrentChar)
                        return true;
                    else if(isDigit(pCurrentChar))
                        continue;
                    else
                        return false;
                }
}


Die Ausgabe auf der Konsole ist folgende:

Zitat


123456
23456
3456
456
56
6
<- Leerzeile, auch als auf der Ausgabe


Leider gibt mir "isNumber" immer 'false' raus, da aber jedes Zeichen durchiteriert wird, nehme ich an,
dass auf das falsche Zeichen geprüft wird. Wenn ich jetzt diese öminöse Leerzeile zu einem "int" caste dann kommt 0 raus.

Wieso wird bei mir nicht "true" zurückgegeben?

LG Julien

EDIT:
Fehler gefunden. Habe ein '*' im ersten 'if' der isNumber Funktion vergessen.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

2

04.11.2015, 01:34

C-/C++-Quelltext

1
pCurrentChar = pCurrentChar++;

Undefined behavior...
"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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

04.11.2015, 06:39

C-/C++-Quelltext

1
pCurrentChar = pCurrentChar++;

Undefined behavior...

Und auch ziemlich sinnlos. Entweder +=1 oder = pC+1 oder ++. Aber nicht alles auf einmal.
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]

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

4

06.11.2015, 03:22

Wieso ist das undefined behaviour und die anderen arithmetischen Operatoren nicht?
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

5

06.11.2015, 05:01

Ah, jetzt sehe ich den Fehler, hihi
Man vergisst das mit dem Post-Inkrement auch zu leicht.

Danke
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

6

06.11.2015, 23:16

Mit if('\0' == pCurrentChar) prüfst du, ob pCurrentChar ein nullptr ist. Da fehlt ein *. In der Funktion isDigit machst du den selben Fehler. Und ein return false; fehlt auch noch in isNumber.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

7

07.11.2015, 22:39

Verdammt :D

Aber ich glaube nicht, dass ein "false" fehlt.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

08.11.2015, 07:58

Doch, fehlt. Du betrachtest nur einen Fall im IF und gibst nur in einem der beiden Pfade etwas zurück. Kommt in Zeile 30 ein false raus, was gibt die Funktion dann in Zeile 41/42 zurück?
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]

9

08.11.2015, 08:52

Und was ist pCode in Zeile 28?
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

10

08.11.2015, 10:22

Verdammt, die Fehler sind echt peinlich.

@Magogan: Fehler beim abtippen gemacht. Ich habe eine Klasse geschrieben und dann nur diese drei Funktionen rauskopiert, weil ich mit denen diesen Fehler hat.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Werbeanzeige