case 'char' mit mehr als einem Zeichen

Servus!

Jo n steht für die Länge des Strings und S(1), S(2), S(3) ...S(x) stehen für das jeweilige Zeichen an der Indexposition x.


Gruss Tom
 
Zuletzt bearbeitet:
-

Original geschrieben von Mr.Undertaker
@rook
Integer ist ein ordinaler Datentyp (das bedeutet nämlich ein abzählbarer Datentyp).Und da char integerwerte enthält ist der einwand von caminus zwar richtig, aber nur klug******erei ;-) ;-). Das kennt er wahrscheinlich von Pascal, oder??
Richtig!
Auch bei Pascal kann man als Marken nur ordinale Datentypen verwenden.

Aber ich weiß nicht so recht, was du hiermit meinst:
Und da char integerwerte enthält
??
 
Mh, am besten ich erklärs am Source-Code :-) :

char test=65;
std::cout<<test;

Natürlich nicht 65, sondern das A aus der ASCII-Tabelle an der Stelle 65. Der Compiler geht mit chars auch um wie mit integern, siehe

++test;
std::cout<<test;

da gibt er nun B aus.
Logisch oder?
 
-

Selbstverständlich ist das logisch, deshalb sind es ja ordinal Zahlen. :)
Trotzdem hat der Ordianalwert eines Zeichens nichts mit einem Integer zu tun.
Aber ist ja auch egal, wir wissen ja beide bescheid. ;-]
 
hm, also ich hab das so gemacht. Ist das falsch tard2?
Als Ergebnis komme immer eine negative Zahl raus...

Der String wird richtig uebergeben und die Anzahl der Buchstaben stimmt auch! Aber fuer Hallo kommt -858978080 raus...

Code:
#include <iostream>
#include <string>

using namespace std;

int hash (char s[]) {
	int n = strlen(s);
	unsigned long hashValue;
	int x = 0;

	do {
		hashValue += s[x]*31^(n-(x+1));

		x++;
	} while (x<n);

	return hashValue;
}

int main () {
	int test;

	test = hash ("Hallo");

	cout << test;

	return 0;
}
 
Zuletzt bearbeitet:
Original geschrieben von goela
Ich schätze, entweder Du realisierst dies mit dem Hashcode oder machst eine ordinäre if-else Anweisung.

Andere Möglichkeit: Du steigst auf C# um, da geht so was von Haus aus! :-)

wie in java schon lange *SCNR* ;)
 
Servus!

Versuchs mal so...:

int hashCode(char[] s) {
int h = 0;
int off = 0;
char val[] = s;
int len = strlen(s);

for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}

return h;
}

...

Gruss Tom
 
hm, jetzt geht's ohne Probleme :)

hab vergessen int hashValue auf 0 zu setzen.

hashValue war ja gar nicht initialisert also wurde einfach was dazugezaehlt!
So geht's:
Code:
int hash (char s[]) {
	int n = strlen(s);
	unsigned long hashValue = 0;
	int x = 0;

	cout << s << "\n" << n << "\n" << endl;

	do {
		hashValue += s[x]*31^(n-(x+1));

		x++;
	} while (x<n);

	return hashValue;
}

Danke nochmal tdar2!!!
 
so,
ich hab das jetzt versucht einzubauen:
Code:
/*
================================================================================
H_HashCode () : returns hash code
================================================================================
*/
int H_HashCode::hash (char s[]) {
	this->n = strlen (this->s);

	do {
		this->hashValue += this->s[this->x]*31^(this->n-(this->x+1));

		this->x++;
	} while (this->x < this->n);

	return hashValue;
}

/*
================================================================================
ReadCFG () : Read all important data from CFG File
================================================================================
*/
void GL_ReadCFG::ReadCFG (void) {
	if ((this->f = fopen ("mpark.txt", "r")) != NULL) {
		while ((fscanf(f, "%d.%s", &this->value, this->var)) != EOF) {
			int myHash = 0;

			myHash = this->hash->hash (this->var);

			switch (myHash) {
			case this->hash->hash ("width"):
				this->width = this->value;
				break;

			case this->hash->hash ("height"):
				this->height = this->value;
				break;
			
			case this->hash->hash ("bpp"):
				this->bpp = this->value;
				break;

			default:
				break;
			}
		}
	} else {
		this->CreateCFG ();
	}
}
Die Klasse sieht so aus:
Code:
// H_HashCode
class H_HashCode {
public:
	H_HashCode ();
	~H_HashCode ();

	unsigned int		hashValue;

	int	hash (char s[]);

private:
	int					n;
	int					x;
	char				s[50];
};


// GL_ReadFromFile
class GL_ReadCFG {							// Reads data from File
public:
	int					width;
	int					height;
	int					bpp;

	FILE*				f;
	char				var[50];
	int					value;

	H_HashCode			*hash;

	void ReadCFG(void);
	void CreateCFG(void);
};

Allerdings kommt jetzt als Fehlermdeldung:
Code:
D:\gl\mpark\g_framework.cpp(312) : error C2051: case-Ausdruck ist keine Konstante
D:\gl\mpark\g_framework.cpp(316) : error C2051: case-Ausdruck ist keine Konstante
D:\gl\mpark\g_framework.cpp(320) : error C2051: case-Ausdruck ist keine Konstante
D:\gl\mpark\g_framework.cpp(326) : warning C4065: switch-Anweisung enthaelt 'default', aber keine case-Marken
Fehler beim Ausführen von cl.exe.

mpark.exe - 3 Fehler, 1 Warnung(en)

Was hab ich da jetzt falsch gemacht???
 
Zuletzt bearbeitet:
Zurück