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;
}
Valamit rosszul csináltam (vagy valamelyik for ciklust néztem be, vagy valamilyen változót olyannak definiáltam, amilyennek nem kellett volna).
Ha {$R+} direktívával bekapcsolom a range checking opciót, futáskor rögtön kiakad, sajnos.
„Ha {$R+} direktívával bekapcsolom a range checking opciót, futáskor rögtön kiakad, sajnos.”
Nekem is... A hozzá nem értésem miatt nem látom át ennek a direktívának a működését, de gyanakszom, hogy az első ciklus értékadásaiba akad bele, ahol -- ha jól értem -- hatalmas számokat szorzol össze egymással, és az eredmény nem fér el a tömbelemben. Erre utal, hogy a tömbnek nagyobb típust (pl. qword) választva valamivel később fut hibára. Szerintem egyszerűen ne kapcsold be. :)
Ide feltettem a tegnapi programom kódját:
Ide meg egy olyan szövegfájlt, amelyben felváltva egymás alá írtam a programjaink egymásnak megfelelő sorait:
A két változat nagyon hasonlít egymásra. A csillagozott kommenttel jelzett eltérések közül a második kevésbé érdekes, mindössze más számokat eredményez. Az első miatt viszont kisebb változóba olvasod a nagy tömbelemeken végzett művelet értékét, amivel csonkolod a számot. Ahogy látom, ennek a két dolognak a kiigazítása akkor is a C-programéval megegyező eredményt ad, ha egyebet nem változtatsz a programodban.
Az eredmény decimális kiíratása egyszerűen: WriteLn(y)
(formatálva azért kell a szögletes zárójel, mert egy stringet ír ki, karakterenként indexelve).
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!