Templateversion != C Version?



  • Hi,

    ich bin am verzweifeln! Meine Templatefunktion unterscheidet sich total im ergebnis von der C version! Hier beide codes:

    template <class T> inline bool compare (const T * mem1, const T * mem2, unsigned int count) 
        { 
            while((*mem1 && *mem2) && (*mem1++ == *mem2++) && (--count>0));
    
            return !(*mem1 - *mem2); 
        }
    
        int memcmp2 ( const void *mem1, const void *mem2, unsigned int count) 
        {
            register const unsigned char *str1 = (unsigned char*)mem1;
            register const unsigned char *str2 = (unsigned char*)mem2;
    
            if (count > 0) 
            {
                for (count++; (count > 0) && (*str1++ == *str2++); --count);
    
                return !( *--str1 - *--str2 );
            }
    
            return -1;
        }
    
    #include <iostream.h>
    int main() 
    { 
        int x[4]= {0,1,2,3};
        int y[4]= {0,1,2,3};
        if (memcmp2(x,y,4))
            cout << "Gleich bei memcpy2!" << endl;
    
        if (compare(x,y,4))
            cout << "Gleich bei compare!" << endl;
    
        cin.get();
    }
    

    wo liegt der Fehöer?



  • Ich weiss zwar nicht was zu deinem Fehler führt aber ein anderer ist mir gerade aufgefallen,
    wenn bei deiner compare Funktion als count eine 0 übergeben wird und du --count machst, dann is das bei einem unsigned int nicht -1 sondern ...ähm... 2^32 -1 (???),
    Also funktioniert die Überprüfung für den Fall nicht wirklich...
    hoffe du verstehst was ich meine ^^

    edit:
    und wieso genau machst du das ?

    (*mem1 && *mem2)
    

    macht das das count nicht gleich ganz überflüssig ?

    edit2:
    Frage an alle (bin grad verwirrt)
    wird *mem++ als *(mem++) oder als (*mem)++ ausgewertet?

    edit3: (tag der edits -.-)
    und mach doch bitte #include<iostream>

    edit4:
    arg, ich depp ^^

    also, ich denk der fehler liegt hier:

    (*mem1 && *mem2)
    

    du schaust hier ob beide WERTE ungleich 0 sind, und was is der erste wert in dem Array? Richtig ! eine Null !



  • Irgendwie ist hier vieles Murks:

    1. #include <iostream.h>
    2. In der C Version vergleichst du die ersten 4 Char des Arrays. Wenn ein Int 32 Bit hat, können dies 0,0,0,1 sein.
    3. (*mem1 && *mem2) Wenn beide auf 0 zeigen, ist dies schon false.
    4.
    Die Template Version könnte sein:

    template <class T> inline bool compare (const T * mem1, const T * mem2, unsigned int count) 
         { 
             while((*mem1++ == *mem2++ ) and (count > 0)) {
                --count;
             };
    
             return count == 0;
         }
    

    oder besser:

    template <class T> inline bool compare (const T * mem1, const T * mem2, unsigned int count) 
         { 
             while((*mem1 == *mem2 ) and (count > 0)) {
                ++mem1;
                ++mem2;
                --count;
             };
    
             return count == 0;
         }
    

    Die C version würde ich entsprechend Implementieren.

    Edit:
    5. Das "register" in der C version ist überflüssig.
    6. Warum hantiert man überhaupt so mit Speicher?



  • k1ro schrieb:

    Frage an alle (bin grad verwirrt)
    wird *mem++ als *(mem++) oder als (*mem)++ ausgewertet?

    *(mem++)

    Ponto schrieb:

    Irgendwie ist hier vieles Murks

    😃 👍

    @---
    Soll compare eigentlich C-Strings oder einfach nur Speicher vergleichen?


Anmelden zum Antworten