Diskuze: Úprava Linux funkce na Windows
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 3 zpráv z 3.
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Z toho co uvádíš lze těžko říci že vše předáváš správně. Neposkytuješ totiž deklarace argumentů volané funkce - d_prefix, d_solution, d_blockContainsSolution, rngSeed.
Když se podíváš na prototyp funkce:
void sha256_cuda(BYTE *prefix, BYTE *solution, int *blockContainsSolution, unsigned long baseSeed)
TYP *identifikator - může značit ukazatel na pole typu TYP nebo ukazatel na proměnnou, kde do proměnné pod identifikátorem se vrací hodnota z funkce. Podíváš-li se na tělo funkce tak zjistíš že:
první parametr je pro pole
druhý parametr je pro pole
třetí parametr je pro proměnnou, do které vracíš hodnotu z pole
čtvrtý parametr je proměnná, kterou neměníš
Dále když se podíváš na prototyp funkce pod windows
void sha256_cuda(BYTE* prefix, BYTE* solution, int* blockContainsSolution, uint64_t baseSeed)
Tak zjistíš, že poslední parametr se liší. uint64_t rozhodně neodpovídá typu unsigned long, který je menší, ale unsigned long long. Vnímej v jakém bitovém systému se nacházíš.
Co se týká BYTE, není nic jednoduššího než se podívat jak je deklarováno pomocí typedef.
Zkontroluj si také, jak a co do proměnných d_prefix, d_solution, d_blockContainsSolution, rngSeed ukládáš.
Začnu od konce. uint64_t jsem myslím změnil správně protože je délka
proměnné v Linuxu unisgned long = 8 bytů. Bez změny na uint64_t mi to ve
Windows vyházelo x chyb (mj. i u x ^= (x >> 35);
), protože
ve Windows je unsigned long jen 4 byty.
v sha256.cud je:
/**************************** DATA TYPES ****************************/
typedef unsigned char BYTE; // 8-bit byte
//typedef uint32_t DWORD; // 32-bit word, change to "long" for 16-bit machines
typedef struct {
BYTE data[64];
DWORD datalen;
unsigned long long bitlen;
DWORD state[8];
} SHA256_CTX;
__constant__ DWORD dev_k[64];
static const DWORD host_k[64] = {
0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
};
To DWORD
jsem musel okomentovat, protože mi to hlásilo chybu
dvojí deklarace "invalid redeclaration of type name "DWORD
". Ve
Windows je DWORD již standardně definováno. Kliknutím na náhled definice
odkazuje na řádek 156 typedef unsigned long DWORD;
v
souboru minwindef.h
Zobrazeno 3 zpráv z 3.