2015-08-13 2 views
-4

J'essaye de convertir ce bit de code de this wikipedia article de C en Delphi.Calculer XY en D pour la courbe hilbert (Convertir le code C)

//convert (x,y) to d 
int xy2d (int n, int x, int y) { 
    int rx, ry, s, d=0; 
    for (s=n/2; s>0; s/=2) { 
     rx = (x & s) > 0; 
     ry = (y & s) > 0; 
     d += s * s * ((3 * rx)^ry); 
     rot(s, &x, &y, rx, ry); 
    } 
    return d; 
} 

Je ne peux pas trouver un équivalent à la fonction de pourriture utilisé il

+2

La fonction 'rot' est dans l'article wikipedia. –

+0

Je ne peux pas croire que je l'ai manqué. Puisque la question a été répondue, je n'ai pas pu la supprimer. J'ai modifié la question pour en faire la conversion de code à la place. – Ali

+1

@Ali J'ai annulé votre édition. Il est trop tard pour poser une question différente. Vous avez déjà demandé et accepté une réponse. –

Répondre

2

Vous pouvez utiliser le le Var mot-clé pour passer des fonctions par référence à Delphes, ce qui permet d'obtenir le même résultat que passant des pointeurs à ints dans le code lié C:

procedure Rot(N : Integer; RX, RY : Boolean; Var X, Y : Integer); 
var 
    T : Integer; 
begin 
    If Not RY then 
    begin 
    If RX then 
    begin 
     X := N - 1 - X; 
     Y := N - 1 - Y; 
    end; 
     T := X; 
     X := Y; 
     Y := T; 
    end; 
end; 

Notez que l'ordre des paramètres a modifié. J'ai regroupé les paramètres passés par référence et ceux passés par valeur ensemble. Vous pouvez utiliser Booleans au lieu de Integer pour RX et RY (assurez-vous d'adapter le code d'appel de manière appropriée).

+0

Vous n'avez pas expliqué d'où provenait cette fonction, ni pourquoi vous avez modifié l'ordre des paramètres. –

+0

@DavidHeffernan Je supposais que l'OP avait vu la fonction car il était juste là dans l'article lié, mais ne savait pas comment le traduire – samgak

+0

Je ne pense pas. Je l'ai lu que la pourriture attendue est une fonction standard et ne pas simplement lire attentivement l'article. De plus, si vous vous sentez enclin à traduire ceci pour l'utilisateur, n'utilisez pas 'int' où' Boolean' devrait être utilisé. –

0

Cette rot n'est pas une fonction standard. Cela fait plutôt partie du code que vous traduisez. Vous devez simplement continuer à lire l'article auquel vous liez. Quelques lignes sur vous trouverez ceci:

//rotate/flip a quadrant appropriately 
void rot(int n, int *x, int *y, int rx, int ry) { 
    if (ry == 0) { 
     if (rx == 1) { 
      *x = n-1 - *x; 
      *y = n-1 - *y; 
     } 

     //Swap x and y 
     int t = *x; 
     *x = *y; 
     *y = t; 
    } 
} 

Vous devez traduire cette fonction avec le code dans votre question. Je suis sûr que vous n'avez pas besoin de moi pour faire la traduction d'une fonction aussi simple. Je dirais que rx et ry sont vraiment des booléens et vous pouvez être mieux les coder de cette façon. Le code dans l'article est écrit dans une saveur C qui précède les types booléens C. Cela dit, la fonction dans la question effectue de l'arithmétique sur ces «booléens», il est donc un peu difficile d'écrire une traduction littérale propre.

Les paramètres passés en tant que pointeurs sont probablement meilleurs en tant que paramètres var et donc transmis par référence. Encore une caractéristique que C manque.