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

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

111

22.01.2008, 14:48

Oh, das ist schlecht.
Eigentlich dachte ich, mit den paar Tests alle potenziellen Fehler aufdecken zu können. Wenn das so ist, dann muss ich die Auswertung wohl noch einmal neu machen ... :/

@entenwickler:
Was heißt Data Dump und Pre Data Dump?
Woher hast du diese Testdaten?
Warum sind die so seltsam kodiert?

112

22.01.2008, 14:56

Ich erzeug zuerst ein großes Array, aber übergebe erst am einem bestimmten Offset (das davor hab ich pre-data genannt).
Als nächsten Schritt könnte man einen kleinen Iterator basteln mit Bound-Checks, der eventuell eine Exception wirft, wenn die Bounds überschritten werden.

Habe folgenden Testcode verwendet, bin grade in der Uni und hab nicht mal Syntaxhighlight ;)
Die zwei fehlerhaften Funktionen sind aus der Liste bereits raus, kannst ja wieder reinpacken.

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
int main() {
   typedef size_t (*func_t)(const char*);
   func_t func[] = {palindrome_reference, palindrome_entenwickler,palindrome_davidscherfgen,palindrome_stefanseegel,palindrome_maxim,palindrome_florianx};
   char* funcstr[] = {"palindrome_reference", "palindrome_entenwickler","palindrome_davidscherfgen","palindrome_stefanseegel","palindrome_maxim","palindrome_florianx"};
   bool run = true;
   srand(time(0));
   while(run) {
       size_t size = rand() % 500 + 1;
       char * test = new char[size];
       for(size_t i=0; i<size-1; ++i)
           test[i] = rand();
       test[size-1] = '\0';
       char * begin = test + (rand() % 100);
       size_t reference = (*func[0])(begin);
       for(size_t i=1; i<sizeof(func)/sizeof(func[0]); ++i) {
           if((*func[i])(begin) != reference) {
               cout << "Fehler bei Fkt #" << funcstr[i] << endl;
               cout << "Reference: " << reference << " / " << funcstr[i] << ": " << (*func[i])(begin) << endl;
               cout << "Pre-Data Dump: " << endl;
               for(char* c=test; c<begin; ++c)
                   cout << hex << (int)(unsigned char)(*c) << " ";
               cout << endl << "Data Dump: " << endl;
               for(char* c=begin; *c; ++c)
                   cout << hex << (int)(unsigned char)(*c) << " ";
               cout << endl;
               run = false;
           }
       }
    }
}
[/cpp]

p0llux

Treue Seele

Beiträge: 101

Wohnort: Aachen

Beruf: HiWi (theo. Inf.)

  • Private Nachricht senden

113

22.01.2008, 15:33

Haha. Ich kann ja nicht sagen, dass ich irgendwie noch durchblicke, was die Top-Lösungen gemacht haben, aber es ist natürlich echt voll doof das nur mit ein paar Strings zu testen ^^ Da kann man ja echt Glück haben :P

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

114

22.01.2008, 15:35

Danke, ich habe mir jetzt einen eigenen Zufallstest geschrieben und kann die Fehler bestätigen.
Die übrigen Lösungen sollten nun aber wirklich richtig funktionieren.
Sorry nochmal. Ich kann eigentlich nichts zu meiner Entlastung sagen :(

Hier die neue Auswertung

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

115

22.01.2008, 15:54

Na dann. Herzlichen Glüchwunsch S.Seegel. :D

Hmm..imernoch auf dem letzten Rang.. :(

Aber wie ich an den Lösungen sehe, seit ihr mir alle "ein wenig" vor(r)aus. ;-)

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

116

22.01.2008, 15:57

Ihr dürft natürlich gerne weiter nach Fehlern in den "angeblich korrekten" Lösungen suchen.
Bei 1 Million Tests dürfte aber ein Hinauslesen hinter/vor den String irgendwann einmal schiefgehen.
Armer Helmut ... naja, der nächste Contest kommt bestimmt! 8)

Anonymous

unregistriert

117

22.01.2008, 17:01

Wenn ich noch einen neuen bzw. reparierten Code poste, koenntet ihr den auch noch durch euer Test-Programm laufen lassen? f'`8k


Gruß, TGGC (making great games since 1992)

118

22.01.2008, 20:04

Da bin ich ja echt froh, das mein Programm funktioniert.
Hab mein Prog nämlich gar net so genau auf Richtigkeit geprüft und war sogar überrascht, als es mit den 5 Teststrings fast auf Anhieb funktionierte^^

@TGGC: Das Testprog kannst doch runterladen und selber testen

Anonymous

unregistriert

119

22.01.2008, 20:38

So, mal ein paar Fehler beseitigt, ist aber auch laenger.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int TGGCsSuperGeheimeFunktion(const char* ZFXModusDeactivated, int TGGCsIQ)
{
    int NormalerIQ= -1;
    while( ++NormalerIQ < TGGCsIQ )
    {
        if( ZFXModusDeactivated[ TGGCsIQ - 1 - NormalerIQ ] - ZFXModusDeactivated[ NormalerIQ ] )
        {
            int ExquadrilationsFaktor= TGGCsSuperGeheimeFunktion( ZFXModusDeactivated, --TGGCsIQ );
            TGGCsIQ= TGGCsSuperGeheimeFunktion( ++ZFXModusDeactivated, TGGCsIQ );
            return TGGCsIQ > ExquadrilationsFaktor ? TGGCsIQ : ExquadrilationsFaktor;
        }
    }
    return TGGCsIQ;
}

size_t my_palindrome(const char* p_string)
{
    int NormalerIQ= 0;
    while(p_string[NormalerIQ]) NormalerIQ++;

    return TGGCsSuperGeheimeFunktion( p_string, NormalerIQ );
}
@Florianx: Leider ist mein PC zu langsam. f'`8k


Gruß, TGGC (making great games since 1992)

120

23.01.2008, 10:35

Neue Fehler:

Quellcode

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
DATA: (length=39,entropy=4,run=0)
"aacdbcdddaabdbabccaadbcbbcdcbbaadabdabb"
CALL: reference = 7
CALL: davidscherfgen = 7
CALL: stefanseegel = 7
CALL: maxim --> BoundPointer Exception: access violates left boundary
CALL: florianx = 7
CALL: entenwickler = 7
CALL: databyte --> BoundPointer Exception: access violates right boundary
CALL: bugger = 7
CALL: neido --> BoundPointer Exception: access violates left boundary
CALL: helmut = 7
CALL: davidpb = 4
CALL: phili = 7
CALL: bigmuff = 7
CALL: sicaine --> BoundPointer Exception: access violates right boundary
CALL: christianreiter --> BoundPointer Exception: access violates left boundary
REMOVED: maxim databyte neido davidpb sicaine christianreiter 

DATA: (length=218,entropy=5,run=29)
"ebddeebabcbbeacaaaddddaedceaeeaadeddceeeeeeeddaacd"
"ebabeaceaaadbedbbcbeeeccbdbeaacbdecaacebdbabcceeeb"
"cedebbeccdbaeeccecdcdaeddcbdacbcceccdecaecedabdbdc"
"abbbcbccbaaedaeadcbceeaeabdaaaecccbabaaddcbecaaebb"
"ebacdcbaaecbeeebdd"
CALL: reference = 7
CALL: davidscherfgen = 7
CALL: stefanseegel = 7
CALL: florianx = 7
CALL: entenwickler = 7
CALL: bugger = 7
CALL: helmut = 8
CALL: phili = 7
CALL: bigmuff = 7
REMOVED: helmut 

DATA: (length=138,entropy=6,run=90)
"effebadcadcdfcfbacecbfcccefccbabddfefbccdadcccdbee"
"bfbfffdecfbeaebcfbaacebcffabddbffebdfebbabecbcbeaf"
"edafcdcdeecfadeeeeedffadabdedeccdabbad"
CALL: reference = 7
CALL: davidscherfgen = 7
CALL: stefanseegel = 7
CALL: florianx = 7
CALL: entenwickler = 7
CALL: bugger = 7
CALL: phili = 7
CALL: bigmuff --> BoundPointer Exception: access violates right boundary
REMOVED: bigmuff 

DATA: (length=0,entropy=7,run=366)
""
CALL: reference = 0
CALL: davidscherfgen = 0
CALL: stefanseegel = 0
CALL: florianx = 0
CALL: entenwickler = 0
CALL: bugger = 0
CALL: phili --> BoundPointer Exception: access violates right boundary
REMOVED: phili 

RUNS = 10367 (last 10,000 without error)
CLEAN: 
* reference
* davidscherfgen
* stefanseegel
* florianx
* entenwickler
* bugger


Hab leider kein Debugger (doch, gdb auf der Konsole höhö), also kann ja mal jemand debuggen, ob die Exceptions wirklich in den Fällen auftreten, Strings sind nun schöner zum Copy&Paste.

@TGGC: Dein Code produziert endlos-loops, oder er braucht für ein Test länger als 5min ;)

PS: Dieser Beitrag wurde Ihnen prästentiert von: Langweilige Vorleseungen®

Werbeanzeige