VR6 Geschrieben 11. Februar 2008 Teilen Geschrieben 11. Februar 2008 Hallo liebe Community, ich habe ein Problem mit C. Und zwar möchte ich aus einem String einen ganz einfachen Hashwert ermitteln. Also eine Art Prüfsumme. Und zwar wird in einer Schleife der Index des zu codierenden Strings angesprochen, und diesen mit einem Array vergleicht. Ist dieser char vorhanden, dann nehme den Index und schaue an der Stelle im Zahlenarray und addiere den mit der Variable "hash". Und so geht das den ganzen String durch. Aber irgendwie addiert mein Programm "Hash" nicht auf. Ich glaube auch das itoa beim umwandeln nur zahlen bringt. Habt ihr ne Idee was ich falsch mache bzw. was ich besser machen könnte??? #include <stdlib.h> #include <ctype.h> #include <string.h> #include <stdio.h> #include "asuro.h" int volt, zaehler, HashWert, hash, i,length_cwert; // Char-Array / das gleiche wie Strings char text2[100]; char text[100]; char test[100]; char string[255]; char tmp[255]; char cWerte[38][1] = {"1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",";",":","#"}; int iWerte[38] = {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}; int ermittleHash(char string[255]) { hash = 10; int zahl = 0; length_cwert = sizeof(cWerte) / sizeof(cWerte[0]); while(zahl < strlen(string)) { for(i=0; i<length_cwert; i++) { itoa(string[zahl], tmp, 10); if(strcmp(tmp, cWerte[i]) == 0) { hash += iWerte[i]; } } zahl++; } return hash; } int main(void) { Init(); while(1) { // alle 1000 Durchläufe ausführen if(zaehler % 30000 == 0) { // copy des Quellstring nach char Test strcpy(test, "id:asr_001:bat:"); // Batteriewerte werden ermittelt int a = Batterie(); int b = Batterie(); if (a == volt = a; // wandelt volt (int) in ein char-Array itoa(volt, text, 10); // Alternativ auch ... // strcat hängt den parameter an den ersten strcat(test, text); strcat(test, ";"); // ErmittleHash HashWert = ermittleHash(test); itoa(HashWert, text2, 10); strcat(test, text2); strcat(test, "#"); SerPrint(test); } zaehler++; } } [/code] Danke & Gruß xXx Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 11. Februar 2008 Teilen Geschrieben 11. Februar 2008 itoa(string[zahl], tmp, 10);Mit dieser Anweisung erhältst du einen String, der die dezimale Schreibweise des ASCII-Codes des Zeichens an der Stelle zahl enthält. Das ist sicher nicht, was du willst. Du brauchst hier weder itoa noch strcmp, du willst doch nur Zeichen mit Zeichen vergleichen. Wandle cWerte um in ein Array von char: char cWerte[38] = {'1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',';',':','#'}; Dann kannst du string[zahl] und cWerte direkt vergleichen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VR6 Geschrieben 11. Februar 2008 Autor Teilen Geschrieben 11. Februar 2008 Danke für die schnelle Antwort. ok also das weglassen. aber komischerweise bleibt der hashwert beim Standardwert 0. Eigentlich müsste er es doch aufaddieren. Hier die geänderte Funktion: int ermittleHash(char string[255]) { hash = 0; int zahl = 0; length_cwert = sizeof(cWerte) / sizeof(cWerte[0]); while(zahl < strlen(string)) { for(i=0; i<length_cwert; i++) { if(string[zahl] == iWerte[i]) { hash += iWerte[i]; } } zahl++; } return hash; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 11. Februar 2008 Teilen Geschrieben 11. Februar 2008 Du musst mit cWerte vergleichen, nicht iWerte. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VR6 Geschrieben 11. Februar 2008 Autor Teilen Geschrieben 11. Februar 2008 achja ... hatte ich mich nur verschrieben sry... jetzt bringt der compilier aber noch eine warnung: test.c:30: warning: comparison between pointer and integer was meint der damit??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 11. Februar 2008 Teilen Geschrieben 11. Februar 2008 was meint der damit???"Der" meint "damit", dass du eine Zahl mit einem Zeiger vergleichst, was generell fragwürdig ist. Ich vermute, du hast cWerte nicht so abgeändert, wie ich es vorgeschlagen habe. Falls doch, musst du nochmal den Code zeigen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VR6 Geschrieben 11. Februar 2008 Autor Teilen Geschrieben 11. Februar 2008 Hm eigentlich hab ich schon den Code abgeändert... #include <stdlib.h> #include <ctype.h> #include <string.h> #include <stdio.h> #include "asuro.h" int volt, zaehler, HashWert, hash, i,length_cwert; // Char-Array / das gleiche wie Strings char text2[100]; char text[100]; char test[100]; char string[255]; char tmp[255]; char cWerte[39][1] = {"1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",";",":","#", "_"}; int iWerte[39] = { 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}; int ermittleHash(char string[255]) { hash = 0; int zahl = 0; length_cwert = sizeof(cWerte) / sizeof(cWerte[0]); while(zahl < strlen(string)) { for(i=0; i<length_cwert; i++) { if(string[zahl] == cWerte[i]) { hash += iWerte[i]; } } zahl++; } return hash; } int main(void) { Init(); while(1) { // alle 1000 Durchläufe ausführen if(zaehler % 30000 == 0) { // copy des Quellstring nach char Test strcpy(test, "id:asr_001:bat:"); // Batteriewerte werden ermittelt int a = Batterie(); int b = Batterie(); if (a == volt = a; // wandelt volt (int) in ein char-Array itoa(volt, text, 10); volt); // strcat hängt den parameter an den ersten strcat(test, text); strcat(test, ";"); // ErmittleHash HashWert = ermittleHash(test); itoa(HashWert, text2, 10); strcat(test, text2); strcat(test, "#"); SerPrint(test); } zaehler++; } } [/code] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 11. Februar 2008 Teilen Geschrieben 11. Februar 2008 Hm eigentlich hab ich schon den Code abgeändert... :mod: Wandle cWerte um in ein Array von char: char cWerte[38] = {'1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',';',':','#'}; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VR6 Geschrieben 11. Februar 2008 Autor Teilen Geschrieben 11. Februar 2008 na das cWerte war doch schon ein char Array oder nicht??? na jedenfalls hab ich das jetzt ein bissl anders gelöst ... ich hab einfach die dezimalen Code des ASCII Zeichens genommen und addiert. Das reicht erstmal. int ermittleHash(char string[255]) { hash = 0; int zahl = 0; //length_cwert = sizeof(cWerte) / sizeof(cWerte[0]); while(zahl < strlen(string)) { itoa(string[zahl], tmp, 10); hash += atoi(tmp); zahl++; } return hash; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 11. Februar 2008 Teilen Geschrieben 11. Februar 2008 na das cWerte war doch schon ein char Array oder nicht???Nein, es war ein Array von char-Arrays. Das ist etwas ganz anderes. na jedenfalls hab ich das jetzt ein bissl anders gelöst ... ich hab einfach die dezimalen Code des ASCII Zeichens genommen und addiert. Das reicht erstmal. ... itoa(string[zahl], tmp, 10); hash += atoi(tmp);[/code] Du wandelst eine Zahl in einen String um, und gleich danach wandelst du diesen String wieder in eine Zahl um. Etwas umständlich, findest du nicht? Warum addierst du nicht gleich string[zahl] auf deinen Hash? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VR6 Geschrieben 11. Februar 2008 Autor Teilen Geschrieben 11. Februar 2008 na wie bekomm ich denn den dezimalen wert des buchstaben heraus??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 11. Februar 2008 Teilen Geschrieben 11. Februar 2008 na wie bekomm ich denn den dezimalen wert des buchstaben heraus??? Da gibt es nicht herauszubekommen, der Buchstabe ist selbst ein Zahlenwert. char ist ein Ganzzahldatentyp, der "Wert" ist der ASCII-Code des Zeichens. Und einen "dezimalen Wert" gibt es nicht. Zahlensysteme braucht man nur für die Darstellung, das ist keine Eigenschaft eines Wertes. 0xff, 255, 0377 und b11111111 sind nur unterschiedliche Darstellungen für denselben Wert, das brauchst du beim Rechnen nicht zu berücksichtigen. Zahlensystem sind nur dann von Interesse, wenn du Zahlen in Text oder Text in Zahlen umwandelst. Intern speichert der Computer sowieso alle Zahlen im Dualsystem. Schreib also einfach hash += string[zahl]; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.