Duale Eingabe in C-Programm



  • Vielleicht hat ja der ein oder andere noch ein paar optimierungs tips.

    Warum nicht int 's (oder sowas) für die Zahlen nehmen und das XOR den Prozessor in einem Schritt machen lassen? Dann könntest du dir den ganzen itoa()-Wahnsinn sparen. Der ist nämlich echt völlig unnötig.
    🙂



  • µngbd schrieb:

    Vielleicht hat ja der ein oder andere noch ein paar optimierungs tips.

    Warum nicht int 's (oder sowas) für die Zahlen nehmen und das XOR den Prozessor in einem Schritt machen lassen? Dann könntest du dir den ganzen itoa()-Wahnsinn sparen. Der ist nämlich echt völlig unnötig.
    🙂

    Meinst du in der Hamming Funktion ?
    Wenn ja habe ich das deshalb gemacht das ich die 1 aus dem XOR Produkt zählen kann.

    Als Bsp.: Wenn ich die Zahlen 1010 und 1111 als int übergeben würde und diese XOR Verknüpfe bekäme ich als Return ja ne 5 (Binär 101). Da wüsste ich jetzt nicht wie ich die 1 zählen kann. Dann müsste ich ja erst wieder die 5 in ne Dualzahl mittels ner Funktion umwandeln, diese in einem String speichern und dann die Anzahl von 1en Zählen.

    Deshalb dachte ich mir das ich die String umwandlung gleich am Anfang vornehme.

    Nur habe ich immer noch das Problem mit der führenden 0, die dann ja abgesägt wird.



  • µngbd schrieb:

    ausser man baut alles aus den Axiomen zusammen, aber das ist wiederum eine epische Laufzeitverschwendung

    es gibt eine programmiersprache, die mit 'axiomen' arbeitet? wie geht das? oder bedeutet der begriff da was anderes?

    µngbd schrieb:

    C++ hat sicher irgendeinen Zauberspruch, den man zwischen cin und die Variable schreiben muss, damit die Zahl zur Basis 17 genommen wird. Fragt dann wahrscheinlich insgeheim bei strtol() nach, weil Zaubern gar nicht so einfach ist, und deshalb von einem Magier geerbt werden muss.

    in c++ macht man sowas mit templates, dabei rechnet der compiler die werte für alle möglichen bitmuster eines 'unsigned' im voraus aus und speichert sie in einem 4GB array *fg*

    Chris12 schrieb:

    Leider darf ich keine andere Sprache als C nehmen. Da ich momentan im 1.Semester nur ANSI C behandele.

    C ist schon ok, für low-leveliges bitgewurschtel gibt es kaum besseres.

    Chris12 schrieb:

    Vielleicht hat ja der ein oder andere noch ein paar optimierungs tips.

    deine hammingdistanz-funktion sieht seltsam aus. wenn sie mit strings arbeiten soll (und es sieht so aus), dann hat das XOR dort doch nichts verloren. vorschlag (ungetestet):

    // geht davon aus, dass beide strings gleich lang sind
    int HammingDistance (char Code[],char Code2[])
    {
        int Hamming;
        for (Hamming=0; *Code; Code++, Code2++)
            if (*Code != *Code2)
                Hamming++;
        return Hamming;
    }
    

    Chris12 schrieb:

    Wenn ich 0100 eingeben wird an die Funktion 100 übergeben was mir auch logisch erscheint. Wie könnte ich die führende 0 erhalten

    bei der ausgabe z.b. kannste ja vorn nullen anhängen soviel du willst.
    🙂



  • fricky schrieb:

    deine hammingdistanz-funktion sieht seltsam aus. wenn sie mit strings arbeiten soll (und es sieht so aus), dann hat das XOR dort doch nichts verloren. vorschlag (ungetestet):

    // geht davon aus, dass beide strings gleich lang sind
    int HammingDistance (char Code[],char Code2[])
    {
        int Hamming;
        for (Hamming=0; *Code; Code++, Code2++)
            if (*Code != *Code2)
                Hamming++;
        return Hamming;
    }
    

    Wenn ich das richtig erkenne würde dann allerdings deine Funktion nur überprüfen ob die beiden Codewörter unterschidlich sind. Ich muss allerdings die enthaltenen 1 aus dem XOR Produkt der beiden Codwörter zählen.

    fricky schrieb:

    bei der ausgabe z.b. kannste ja vorn nullen anhängen soviel du willst.
    🙂

    Ich brauche die aber nicht bei der Ausgabe sondern bei der Übergabe an die Hamming Distance.

    Bsp.:

    0101
    1111
    ----
    1010 Hamming Distance von 2

    Da der Rechner aber die 0 abschneidet kommt das raus:
    101
    1111
    ----
    010 HD von 1



  • Ok hab gerade deine Funktion getestet, die funktioniert einwandfrei, ich verstehe allerdings nicht wieso.



  • fricky schrieb:

    es gibt eine programmiersprache, die mit 'axiomen' arbeitet? wie geht das? oder bedeutet der begriff da was anderes?

    Das ist ein lustiger Sport in funktionalen Sprachen, nämlich möglichst alle Funktionen durch andere definieren, und zwar solange, bis nur mehr eine Handvoll überbleibt. Die werden dann gerne Axiome ganannt, wahrscheinlich um damit anzugeben, dass es nur so wenige sind. Mit Sprachen die nur bei Bedarf auswerten, geht das echt wunderbar, weil zB ein if eine ganz normale Funktion sein kann.

    Chris12 schrieb:

    Wenn ja habe ich das deshalb gemacht das ich die 1 aus dem XOR Produkt zählen kann.

    Aber eine Lösung für int's zu finden, wäre nicht wirklich schwer gewesen:
    http://en.wikipedia.org/wiki/Hamming_distance#Algorithm_example
    🙂



  • Chris12 schrieb:

    Wenn ich das richtig erkenne würde dann allerdings deine Funktion nur überprüfen ob die beiden Codewörter unterschidlich sind. Ich muss allerdings die enthaltenen 1 aus dem XOR Produkt der beiden Codwörter zählen.

    XOR kannst nehmen, wenn die codewörter binär vorliegen (die summe der 1-bits ist dann die hamming-distanz). aber wenn du strings (0 und 1 als ascii-zeichen) verwendest, dann musste eigentlich nur die unterschiede zählen.

    Chris12 schrieb:

    fricky schrieb:

    bei der ausgabe z.b. kannste ja vorn nullen anhängen soviel du willst.
    🙂

    Ich brauche die aber nicht bei der Ausgabe sondern bei der Übergabe an die Hamming Distance.

    klar, dafür müssen die strings gleich lang sein. also, den kürzeren vorn mit nullen auffüllen, bis er so lang ist, wie der längere.

    Chris12 schrieb:

    Ok hab gerade deine Funktion getestet, die funktioniert einwandfrei, ich verstehe allerdings nicht wieso.

    na, die zählt einfach nur ungleiche zeichen. so ist doch die hamming-distanz definiert, oder verwechsle ich das jetzt mit irgendwas?
    🙂



  • [/quote]
    na, die zählt einfach nur ungleiche zeichen. so ist doch die hamming-distanz definiert, oder verwechsle ich das jetzt mit irgendwas?
    :)[/quote]

    Ne ne das stimmt schon so, habs beim Debuggen auch gecheckt, ich verstehe nur nicht wie die for schleife funktioniert.

    Ich habe bisher die for schleife nur so kennengelernt for(i=0; i<=x ;i++)
    Ich verstehe die Schleifenbedingung nicht so ganz weil du sagst ja, wenn ich das richtig verstehe, das die schleife solange laufen soll wie der Zeiger auf Code ist und zählst dann Code und Code2 hoch.



  • na, die zählt einfach nur ungleiche zeichen. so ist doch die hamming-distanz definiert, oder verwechsle ich das jetzt mit irgendwas?

    Könnte man meinen, weil's Wikipedia in dem Python-Beispiel genauso macht. Aber ich glaub auch, dass das so stimmt.

    Ich verstehe die Schleifenbedingung nicht so ganz weil du sagst ja, wenn ich das richtig verstehe, das die schleife solange laufen soll wie der Zeiger auf Code ist und zählst dann Code und Code2 hoch.

    while (*Code != '\0')       // Solange der Zeiger auf ein Byte zeigt, das kein "Nullzeichen" ist
    // "Nullzeichen" sind einfach nur Null, deshalb ist das gleiche das wie
    while (*Code != 0)      
    // und weil ein != entweder Null oder Eins ergibt, ist das das gleiche wie
    while (*Code)
    

    Man gewöhnt sich gerne dran.
    🙂



  • Chris12 schrieb:

    Ich habe bisher die for schleife nur so kennengelernt for(i=0; i<=x ;i++)
    Ich verstehe die Schleifenbedingung nicht so ganz weil du sagst ja, wenn ich das richtig verstehe, das die schleife solange laufen soll wie der Zeiger auf Code ist und zählst dann Code und Code2 hoch.

    in for-schleifenköpfe kannste alles mögliche einbauen, for (a;b;c) heisst
    a - initialisierung, geschieht nur vor dem ersten schleifendurchlauf (kann auch vor die for-anweisung gesetzt werden).
    b - abbruchbedingung, wenn b==0 dann ist schluss.
    c - was nach jedem schleifendurchlauf gemacht werden soll (kann auch ganz unten in der schleife stehen).
    🙂



  • µngbd schrieb:

    na, die zählt einfach nur ungleiche zeichen. so ist doch die hamming-distanz definiert, oder verwechsle ich das jetzt mit irgendwas?

    Könnte man meinen, weil's Wikipedia in dem Python-Beispiel genauso macht. Aber ich glaub auch, dass das so stimmt.

    ja, hier: http://de.wikipedia.org/wiki/Hammingdistanz#Definition
    diese summenformel da addiert einsen, wenn x(i) != y(i), passt schon.
    🙂



  • Ok habs verstanden,
    die Funktion von Wiki funktioniert einwandfrei. Das macht des Programm um einiges Kompakter. Danke an euch zwei. Damit ist die erste Teil aufgabe fertig ^^.
    Werd für heute Pause machen und morgen die Hamming Funktion fertig schreiben. Danach muss ich noch Paritätsbits erstellen, bin mal gespannt ob das wenigstens reibungslos von statten geht.

    Ansonst weis ich ja wo man mir evtl helfen kann 🙂

    Also danke nochmal und gute Nacht.ψ



  • Ok habs verstanden,
    die Funktion von Wiki funktioniert einwandfrei. Das macht des Programm um einiges Kompakter. Danke an euch zwei. Damit ist die erste Teil aufgabe fertig ^^.
    Werd für heute Pause machen und morgen die Hamming Funktion fertig schreiben. Danach muss ich noch Paritätsbits erstellen, bin mal gespannt ob das wenigstens reibungslos von statten geht.

    Ansonst weis ich ja wo man mir evtl helfen kann 🙂

    Also danke nochmal und gute Nacht.



  • ich weiss ja nicht, ob haskell schnellen ... Glaub ich nicht. Das Ding ist lazy.

    Ja, Haskell kann. Und Glauben braucht man fuer Religionen nicht zum Programmieren.

    vorschlag (ungetestet):

    Dem geuebten Auge fallen sofort einige Sachen auf. Was, wenn Strings nicht gleichlang sind?



  • knivil schrieb:

    ich weiss ja nicht, ob haskell schnellen ... Glaub ich nicht. Das Ding ist lazy.

    Ja, Haskell kann.

    Echt? Wie? Weil den Code nur durch den GHC jagen reicht ja nicht.


Anmelden zum Antworten