Alábbi C-ben írt kódot Pascal-ra átírni mennyire lenne egyszerű? (bővebben lent)
Alábbi C kód átírása érdekelne Pascal-ba.
Én sajnos csak addig jutok, hogy egységesen "longint" változóként deklarálom a tömböt - és változókat.
Túl sok a bitművelet, meg mutatózás, melyeket nem tudok Pascal-ban megvalósítani, a C nyelv hiányos ismerete miatt.
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t mt[624];
mt[0] = 0; /* itt lehet állítani a kiindulási értéket */
for (int i = 1; i < 624; i += 1)
mt[i] = 0x6c078965 * (mt[i-1] ^ (mt[i-1] >> 30)) + i;
unsigned index = 0;
for (int j = 0; j < 10; j += 1) {
/* 624 kérésenként egy új tömböt keverünk ki*/
if (index == 0) {
for (int i = 0; i < 624; i += 1) {
uint32_t y = (mt[i] & (1 << 31)) | (mt[(i+1) % 624] & ~(1 << 31));
mt[i] = mt[(i + 397) % 624] ^ (y >> 1);
if ((y % 2) != 0)
mt[i] = mt[i] ^ 0x9908b0df;
}
}
/* a tömbből kivett számokat még tovább kavarjuk */
uint32_t y = mt[index];
y ^= (y >> 11);
y ^= (y << 7) & 0x9d2c5680;
y ^= (y << 15) & 0xefc60000;
y ^= (y >> 18);
index = (index + 1) % 624;
/* az előállt véletlenszám, 0..(1<<32)-1 */
printf("%08x\n", (unsigned) y);
}
return 0;
}
"Túl sok a bitművelet, meg mutatózás, melyeket nem tudok Pascal-ban megvalósítani, a C nyelv hiányos ismerete miatt."
Mi vaan???
Némi segítség:
* uint32_t helyett uint32 vagy longword vagy cardinal
* mt[624] helyett mt[0..623]
* for ciklusnál ügyelj:
j = 0; j < 10;
az
j := 0 to 9
* int helyett integer vagy smallint
* unsigned helyett word vagy uint16
* 0x helyett $
* ^ helyett xor
* >> helyett shr
* << helyett shl
* & helyett and
* | helyett or
* % helyett mod
* != helyett <>
* a ^= bonyolultabb, nincs értékadó operátor párja, szóval:
y ^= (y >> 18);
helyett
y := y xor (y shr 18);
* formázott kimenethez (sysutils kell hozzá):
format('%08x', [y])
Források:
* [link]
* [link]
* [link]
* [link]
Nagyon köszönöm a rendkívül precíz segítségnyújtást.
A "<<" és ">>" műveleteket nem kellett lecserélni, Pascal ezeket tudja.
A végén a kiiratásnál miképpen kaphatnám meg a számot normál, decimális értékével?
A sima "y" értéke lesz az, úgy sejtem.
Simán csak y értékét kell kiiratni kekkor, vagy csinálni kell vele még valamit?
Az "y" túl szabályosnak tűnik, lehet azért, mert 0 a kezdőérték. :-)
program szam;
uses SysUtils;
var
mt : array[0..623] of uint32;
i, j : integer;
y, index : uint16;
begin
mt[0] := 0; { itt lehet állítani a kiindulási értéket }
for i :=0 to 623 do
mt[i] := $6c078965 * (mt[i-1] xor (mt[i-1] >> 30)) + i;
index := 0;
for j := 0 to 9 do
begin
{ 624 kérésenként egy új tömböt keverünk ki}
if (index = 0) then begin
for i := 0 to 623 do
begin
y := (mt[i] and (1 << 31)) or (mt[(i+1) mod 624] and not (1 << 31));
mt[i] := mt[(i + 397) mod 624] xor (y >> 1);
if ((y mod 2) <> 0) then
mt[i] := mt[i] xor $9908b0df;
end;
end;
{ a tömbből kivett számokat még tovább kavarjuk }
y := mt[index];
y := y xor (y >> 11);
y := y xor (y << 7) and $9d2c5680;
y := y xor (y << 15) and $efc60000;
y := y xor (y >> 18);
index := (index + 1) mod 624;
{ az előállt véletlenszám, 0..(1<<32)-1 }
{printf(" mod 08x\n", (unsigned) y);}
WriteLn(format('%08x', [y]));
end;
end.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!