Zum Inhalt springen

Problem mit ermitteln von Zahlenwert


Empfohlene Beiträge

Geschrieben

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

Geschrieben
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.

Geschrieben

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;

}

Geschrieben

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???

Geschrieben
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.

Geschrieben

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]

Geschrieben
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',';',':','#'};

Geschrieben

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;

}

Geschrieben
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?

Geschrieben
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];

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...