IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Pascal Discussion :

Transcription d'un code en C vers Pascal


Sujet :

Langage Pascal

  1. #1
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut Transcription d'un code en C vers Pascal
    Bonjour à tous je suis confronté à un petit problème j'essayes de convertir le code qui se trouve à la fin de ce chapitre

    les bouts de code qui me pose problème sont :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    static void BuildGET(struct PointListHeader * VertexList,
          struct EdgeState * NextFreeEdgeStruc, int XOffset, int YOffset)
    for (;;) {
                FollowingEdge = *FollowingEdgeLink;
                if ((FollowingEdge == NULL) ||
                      (FollowingEdge->StartY > StartY) ||
                      ((FollowingEdge->StartY == StartY) &&
                      (FollowingEdge->X >= StartX))) {
                   NewEdgePtr->NextEdge = FollowingEdge;
                   *FollowingEdgeLink = NewEdgePtr;
                   break;
                }
                FollowingEdgeLink = &FollowingEdge->NextEdge;
             }

    et

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    static void MoveXSortedToAET(int YToMove) {
    ....
    for (;;) {
             AETEdge = *AETEdgePtr;
             if ((AETEdge == NULL) || (AETEdge->X >= CurrentX)) {
                TempEdge = GETPtr->NextEdge;
                *AETEdgePtr = GETPtr;  /* link the edge into the AET */
                GETPtr->NextEdge = AETEdge;
                AETEdgePtr = &GETPtr->NextEdge;
                GETPtr = TempEdge;   /* unlink the edge from the GET */
                break;
             } else {
                AETEdgePtr = &AETEdge->NextEdge;
             }
          }

    Comment, par quoi remplaceriez vous ces boucles for (;;) ?



    Merci d'avance

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour

    Citation Envoyé par BeanzMaster Voir le message
    Comment, par quoi remplaceriez vous ces boucles for (;;)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    While True do
      Begin
      ...
      End;
    Cordialement

  3. #3
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut merci Acaumes ça compile

    maintenant petite question sur la gestion des pointeurs

    à un moment j'ai ça

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    /* Describes the beginning and ending X coordinates of a single
       horizontal line */
    typedef struct {
       int XStart;
       int XEnd;
    } HLine;
     
    /* Describes a Length-long series of horizontal lines, all assumed to
       be on contiguous scan lines starting at YStart and proceeding
       downward (used to describe a scan-converted polygon to the
       low-level hardware-dependent drawing code) */
    typedef struct {
       int Length;
       int YStart;
       HLine * HLinePtr;
    } HLineList;
     
     
      /* Set the # of scan lines in the polygon, skipping the bottom edge */
       if ((WorkingHLineList.Length = MaxPoint_Y - MinPoint_Y) <= 0)
          return(1);  /* there's nothing to draw, so we're done */
       WorkingHLineList.YStart = YOffset + MinPoint_Y;
     
    /* Get memory in which to store the line list we generate */
       if ((WorkingHLineList.HLinePtr =
             (struct HLine *) (malloc(sizeof(struct HLine) *
             WorkingHLineList.Length))) == NULL)
          return(0);  /* couldn't get memory for the line list */
     
       /* Scan the first edge and store the boundary points in the list */
       /* Initial pointer for storing scan converted first-edge coords */
       EdgePointPtr = WorkingHLineList.HLinePtr;

    Jusque là pas de soucis. On alloue l'espace mémoire de HLine et notre objet à donc x WorkingHLineList.Length fois HLine, si que qui correspond à un HLine par ligne

    mais ensuite j'ai

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ScanEdge(VertexPtr[PreviousIndex].X + XOffset,
                VertexPtr[PreviousIndex].Y,
                VertexPtr[CurrentIndex].X + XOffset,
                VertexPtr[CurrentIndex].Y, 1, 0, &EdgePointPtr);

    et dans cette méthode j'ai

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct HLine *WorkingEdgePointPtr;
     
       WorkingEdgePointPtr = *EdgePointPtr; /* avoid double dereference */

    puis

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (i = Height - SkipFirst; i-- > 0; WorkingEdgePointPtr++) {
             /* Store the X coordinate in the appropriate edge list */
             if (SetXStart == 1)
                WorkingEdgePointPtr->XStart = X1;
             else
                WorkingEdgePointPtr->XEnd = X1;
          }

    Plusieurs questions sachant que l'on peut avoir plusieurs "HLine" par ligne dans "WorkingHLineList", est ce que la taille de cette structure en mémoire automatiquement alloué /réajusté en C, car il n'y pas de trace de "malloc" par la suite ?

    et est ce du à l'opérateur & que l'on voit ici ?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ScanEdge(VertexPtr[PreviousIndex].X + XOffset,
                VertexPtr[PreviousIndex].Y,
                VertexPtr[CurrentIndex].X + XOffset,
                VertexPtr[CurrentIndex].Y, 1, 0, &EdgePointPtr);

    ou à cause du * dans WorkingEdgePointPtr = *EdgePointPtr; /* avoid double dereference */


    & correspond-t-il à @ ou on peut s'en passer, comme je le pense ???? et le * dans WorkingEdgePointPtr = *EdgePointPtr que signifie-t-il pour le coup ?

    Si quelqu'un peut éclairer ma lanterne pour ce truc

    Je pense que je vais devoir rajouter des GetMem et modifier la façon de gérer les pointers pour porter convenablement ce code en pascal, mais j'aimerai bien comprendre avant.

    Merci d'avance

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #4
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour,

    Citation Envoyé par BeanzMaster Voir le message
    & correspond-t-il à @ ou on peut s'en passer, comme je le pense ???? et le * dans WorkingEdgePointPtr = *EdgePointPtr que signifie-t-il pour le coup ?
    En fait en C le & prend l'adresse de la variable et te permets de modifier ta variable lorsque tu l'as déclarée avec une étoile (qui dit que c'est une adresse) dans les paramètres de ta fonction.
    En pascal ceci est plutôt utilisé en indiquant le mot clé var dans les paramètres de la fonction et c'est le compilateur qui s'en arrange (pas besoin de décorateur lors de l'appel).

    Cordialement

  5. #5
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par acaumes Voir le message
    Bonjour,



    En fait en C le & prend l'adresse de la variable et te permets de modifier ta variable lorsque tu l'as déclarée avec une étoile (qui dit que c'est une adresse) dans les paramètres de ta fonction.
    En pascal ceci est plutôt utilisé en indiquant le mot clé var dans les paramètres de la fonction et c'est le compilateur qui s'en arrange (pas besoin de décorateur lors de l'appel).

    Cordialement
    Ok merci (vu que c'est un pointeur pas besoin de var) mais quand est-il de cette allocation de mémoire dynamique ? le C la gère automatiquement dans le cas présent à l'appel de WorkingEdgePointPtr++ en plus d'incrémenter sa position, car à la base un seul élément est alloué ?

    Merci

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Ok merci (vu que c'est un pointeur pas besoin de var) mais quand est-il de cette allocation de mémoire dynamique ? le C la gère automatiquement dans le cas présent à l'appel de WorkingEdgePointPtr++ en plus d'incrémenter sa position, car à la base un seul élément est alloué ?
    Le C ne gère rien automatiquement si le programmeur n'a rien prévu et rien ne se passe! Pour ce que j'en ai vu, l'allocation est faite en une fois pour tous les HLine de la structure en cause (WorkingHLineList.Length).

    De cette manière, le pointeur peut également être vu comme un tableau et le WorkingEdgePointPtr++ suit les HLine.

    Cependant il te faut regarder toutes les références et tous les accès pour vérifier comment cela est fait (je ne vois qu'une partie du code et je crains de ne pas tout maîtriser)

  7. #7
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par acaumes Voir le message
    Le C ne gère rien automatiquement si le programmeur n'a rien prévu et rien ne se passe! Pour ce que j'en ai vu, l'allocation est faite en une fois pour tous les HLine de la structure en cause (WorkingHLineList.Length).

    De cette manière, le pointeur peut également être vu comme un tableau et le WorkingEdgePointPtr++ suit les HLine.

    Cependant il te faut regarder toutes les références et tous les accès pour vérifier comment cela est fait (je ne vois qu'une partie du code et je crains de ne pas tout maîtriser)
    Salut pour expliquer vite fait on a une structure

    de x éléments "WorkingHLineList" =
    - ystart
    - hline

    HLine peut-être également vu comme un tableau = [StartX, EndX], [StartX, EndX], [StartX, EndX],[StartX, EndX] ect.....

    d'ou mon questionnement sur cette allocation dynamique par "WorkingEdgePointPtr++"

    Le code complet en c se trouve à la fin du chapitre ici

    Bref je pense que je vais changer le type par une liste chaînée, cela devrai faire l'affaire

    Merci

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  8. #8
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour

    Citation Envoyé par BeanzMaster Voir le message
    Bref je pense que je vais changer le type par une liste chaînée, cela devrai faire l'affaire
    Pour être plus près du C c'est un array of Hline avec un setlength de WorkingHLineList.Length
    L'accès devrait être plus rapide (et je crois que c'est l'intention du programmeur en C).

    Cordialement

Discussions similaires

  1. Transcription d'un code vba Excel vers vbs
    Par issoram dans le forum VBScript
    Réponses: 4
    Dernier message: 11/02/2012, 18h40
  2. Réalisation d'un traducteur de C vers Pascal
    Par houyam dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 28/12/2007, 16h24
  3. Convertion code Delphi.net vers C#
    Par RamDevTeam dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 31/03/2006, 21h08
  4. [Linux]différence de code de windows vers unix sous eclipse
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 05/01/2005, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo