2009-09-30 9 views
1

Je le prochain code en langage C++:Code Traduction de C++ pour Delphi

for (long i=0; i < num_iter ; i++) 
{ 
    bp->bpgt(data[i%8], &data[i%8][3]); 

    if(bp->mse(&data[i%8][3]) < thresh) 
     break; 
} 

où bpgt est une procédure, et MSE est une fonction, thresh est un type double, des données est une matrice bi-dimensionnelle de Double types.

void bpgt(double *in,double *tgt); 
double mse(double *tgt); 
double data[][4]={ 
     0,0,0,0, 
     0,0,1,1, 
    1,1,1,1 }; 

J'ai essayé de le transmettre à code Delphi:

for i := 0 to FNum_Iter - 1 do begin 
    FBPN.bpgt(FData[i mod 8], ^FData[i mod 8,3]); 

    if FBPN.mse(@FData[i mod 8, 3]) < FThresh then 
     Break; 
end; 

mais j'ai échoué, parce que je suis un débutant en C++ et je ne sais pas à traduire l'opérateur « & » . Quelqu'un peut-il m'aider?

Merci d'avance.

Répondre

0

Le & vous permet d'envoyer l'adresse de la variable dans la fonction, plutôt que sa valeur. Cet appel par référence permet à la fonction de modifier la valeur de la variable. Je ne connais pas le mécanisme Delphi équivalent, mais vous voulez y passer la référence de votre variable, ou changer la procédure en fonction, renvoyer la valeur et la stocker dans la variable d'origine.

+0

L'équivalent Delphi de & is @, et ptr^est équivalent à * ptr (de la mémoire très rouillée). Mais la méthode habituelle dans Delphi est d'utiliser un paramètre var comme suggéré par fvu. –

2

Je traduirais

void bpgt(double *in,double *tgt); 

comme

procedure bpgt(var in:double; var tgt: double) 

Eh bien, quelque chose comme ça, mon Delphi est un peu rouillé ....

De cette façon, en bpgt, vous pouvez change la valeur de tgt (et in).

Votre appel bpgt sera

FBPN.bpgt(FData[i mod 8], FData[i mod 8,3]); 

En effet var Delphi (appel par référence) est assez souvent utilisable comme un équivalent fonctionnel exact de passage des pointeurs de C/C++.

+1

Oui, vous avez la sémantique correcte. Vous pouvez simplifier un peu l'en-tête de la fonction en disant "var in, tgt: double". Cela ne fonctionne pas en C++, mais en Delphi. Le seul inconvénient est qu'un paramètre C * (pass-by-pointer) peut définir le pointeur sur NULL, alors qu'avec un paramètre Delphi ** var ** (pass-by-reference), le pointeur ne peut jamais être ** nil * * sur un type de valeur, tel que des nombres. Vous devez être conscient de cela lors de la traduction d'un en-tête C que vous appelez de Delphi, car il pourrait casser un invariant de programme si la routine C définit le pointeur sur NULL. –

+0

Eh bien, je ne pense pas que ce soit la solution, car les paramètres pour BPGT et MSE sont des tableaux de types Double. Je sais que & (C++) et @ (Delphi) sont des équivalents mais j'ai toujours une erreur de types incompatibles. Le code C++ original peut être trouvé à: http://www.codeproject.com/KB/recipes/BP.aspx Je l'ai couru et travaille, donc je finis confus. –

+0

Billiardo, s'il vous plaît lisez Mason et ma réponse à nouveau. Vous n'avez plus besoin du @ ou quoi que ce soit d'autre. Si votre objectif final est d'apprendre quelque chose sur les réseaux de neurones, il est probablement plus simple d'obtenir du code Delphi NN et de jouer avec. Comme celui-ci, trouvé sur Torry's http://www.torry.net/authorsmore.php?id=6870 – fvu

0

Vous êtes proche, essayez ceci:

for i := 0 to FNum_Iter - 1 do begin 
    FBPN.bpgt(FData[i mod 8], FData[i mod 8,3]); 

    if FBPN.mse(FData[i mod 8, 3]) < FThresh then 
     Break; 
end; 

Désolé, mais je n'ai pas delphi ici pour compiler et essayer par moi-même.

2

Ceci est basé sur votre réponse à la réponse de Fvu. Si ce sont des tableaux, cela peut compliquer les choses, puisque C n'a pas de véritables tableaux, juste des pointeurs saupoudrés d'un léger enrobage de sucre syntactique en poudre. La solution dépend si vous traduisez complètement ceci dans Delphi, ou essayez d'écrire une routine Delphi qui fonctionnera avec le code C.

Si vous faites pur Delphi, déclare un type de tableau, comme si

type 
    TDoubleArray = array[0..length] of double; //or "array of double" for a dynamic array 

le paramètre déclare de la fonction var Data: TDoubleArray. Si cela est un tableau dynamique, demandez à votre boucle aller de 0 to high(Data);

Si cela doit travailler avec C:

Parce que C ne possède pas des tableaux réels, vous devez faire un travail supplémentaire.Déclarer votre type comme ceci:

type 
    TCDoubleArray = array[0..65535] of double; 
    PCDoubleArray = ^TCDoubleArray; 

Toute valeur suffisamment importante fonctionnera pour la limite supérieure du tableau. Nous n'allons pas tout utiliser de toute façon. Il doit juste être plus grand que jamais. Définissez le type de paramètre sur PCDoubleArray, ce qui correspond à double *. Vous devrez passer un paramètre supplémentaire, qui vous indique où se trouve le point final du tableau. Avoir votre boucle for aller de 0 au point de fin, et y accéder en disant quelque chose comme FData^[i mod 8].

0

Au-dessus de Rudy's Delphi Corner, il a un excellent article about the pitfalls of converting C/C++ to Delphi. À mon avis, c'est une information essentielle lorsque vous tentez cette tâche. Voici la description:

Cet article est destiné à tous ceux qui a besoin de traduire les en-têtes de C/C++ pour Delphi. Je souhaite partager certains des pièges que vous pouvez rencontrer lorsque vous convertissez à partir de C ou C++. Cet article n'est pas un tutoriel, juste une discussion de cas fréquemment rencontré cas. Il est destiné au débutant comme ainsi que pour le traducteur expérimenté de C et C++.

Il a également écrit un "Conversion Helper Package" qui installe dans l'IDE Delphi qui aide à la conversion du code C/C++ pour Delphi:

alt text http://rvelthuis.de/images/convertpackshaded.png

Ses autres articles pertinents sur ce sujet, notamment: