Kezdőoldal » Számítástechnika » Programozás » Alábbi C-ben írt kódot Pascal-...

Alábbi C-ben írt kódot Pascal-ra átírni mennyire lenne egyszerű? (bővebben lent)

Figyelt kérdés

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;

}



2019. jan. 2. 18:19
1 2
 11/13 A kérdező kommentje:

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.

2019. jan. 3. 04:46
 12/13 tabaki ***** válasza:

„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:

[link]

Ide meg egy olyan szövegfájlt, amelyben felváltva egymás alá írtam a programjaink egymásnak megfelelő sorait:

[link]

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).

2019. jan. 3. 11:22
Hasznos számodra ez a válasz?
 13/13 anonim ***** válasza:
{$COPERATORS ON}
2019. jan. 3. 11:43
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!