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

Free Pascal Discussion :

Compilation d'une unité écrite pour Turbo Pascal [Free Pascal]


Sujet :

Free Pascal

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Compilation d'une unité écrite pour Turbo Pascal
    Bonjour tout le monde.

    J'ai deux simples questions :

    -les unités faites pour turbo pascal sont-elles utilisables pour free pascal ? (je cherche à compiler ces unités ; d'ailleurs merci à l'auteur s'il passe par là)

    -et comment fait-on pour compiler ces unités ?

    Merci d'avance pour vos réponses.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par zilbou Voir le message
    -les unités faites pour turbo pascal sont-elles utilisables pour free pascal ? (je cherche à compiler ces unités ; d'ailleurs merci à l'auteur s'il passe par là)

    -et comment fait-on pour compiler ces unités ?
    Bonjour ! En principe, Free Pascal peut compiler les unités écrites pour Turbo Pascal. Cependant, les unités proposées sur la page que vous indiquez ont été écrites spécialement pour le système d'exploitation DOS, avec des morceaux en assembleur : donc il est probable que ces unités ne soient pas utilisables en l'état. Quel est votre système d'exploitation ?

    Autrement, pour essayer de compiler une unité, il n'y a rien de particulier à faire. Vous pouvez par exemple commencer par un programme vide, avec le nom de l'unité après le mot-clé uses, et essayer de compiler le programme. Il sera bon d'utiliser la directive de compilation {$MODE TP} (à ajouter aussi dans l'unité).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    program Essai;
     
    {$MODE TP}
     
    uses Unite;
     
    begin
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Ah merci pour l'éclaircissement.

    Puisque c'est impossible avec ces unités, j'ai pu m'arranger avec graph déjà définie (cependant, qu'est-ce qu'une directive de compilation ?).

    Mais un autre problème est apparu : lors de l'éxécution du programme, le compilateur m'informe "invalid file {chemin/monprogramme}.exe". Il se trouve que j'avais déplacé juste le fichier.pas sans le .exe sur un autre ordinateur. Pourtant, j'avais déjà déplacé des fichier .pas sans toucher au .exe sans qu'il y ait de problèmes, l'application étant recrée automatiquement.
    J'ai essayé de ramener l'ancien fichier .exe (mais j'ai modifié mon programme après déplacement) et de le mettre dans le même dossier mais toujours le même problème ...

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Une directive de compilation, c'est une instruction qui modifie le comportement du compilateur. Elle est placée entre des accolades et commence par le caractère "$".

    Par exemple voici un programme qui affiche la valeur maximale du type integer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    program Exemple1;
     
    begin
      WriteLn(
        High(integer) // 2147483647
      );
     
      Write('Appuyez sur la touche Entr'#130'e... ');
      ReadLn;
    end.
    Maintenant le même code, mais avec la directive {$MODE TP}, qui est faite pour compiler du code écrit pour Turbo Pascal. Le code est le même, mais le programme donne un résultat différent, parce que le mode de compilation change la définition du type integer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    program Exemple2;
     
    {$MODE TP}
     
    begin
      WriteLn(
        High(integer) // 32767
      );
     
      Write('Appuyez sur la touche Entr'#130'e... ');
      ReadLn;
    end.
    Pour le reste, j'avoue que je ne vois pas trop quel est le problème que vous rencontrez. Que voulez-vous faire exactement ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Je souhaite simplement éxécuter mon programme mais je reçois le message "invalid filename d:\documents ... \monprogramme.exe"

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par zilbou Voir le message
    Je souhaite simplement éxécuter mon programme mais je reçois le message "invalid filename d:\documents ... \monprogramme.exe"
    Désolé, je ne vois pas. Je n'ai jamais rencontré cette erreur.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Je vais essayer de réinstaller free pascal dans le même disque dur que le système d'exploitation, on verra bien.

    Edit : pas de changement mais je viens de voir que c'est un problème qui est traité dans la faq.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Malheuresement, la faq n'a pas résolu mon problème puisque ça concernait en fait seulement turbo pascal.

    J'ai réessayé avec un autre ordinateur et cette fois-ci le problème est "exitcode 1" ce qui correspond à "invalid function number" et apparemment, cela va dire que j'ai utilisé une fonction dos inexistante. Comment savoir où est le problème ?

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par zilbou Voir le message
    Comment savoir où est le problème ?
    Franchement, la description du problème n'est pas assez précise. Pour qu'on puisse vous aider, il faudrait reprendre les choses depuis le début. Quel est le code que vous essayez de compiler ? Le problème rencontré survient-il au moment de compiler le programme, ou au moment de l'exécuter ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Toutes mes excuses.

    Ce que j'essaie de compiler est un programme qui tente de mettre en évidence le blocage de cardans à l'aide des quaternions. Pour cela j'ai utilisé l'unité graph qui permet de représenter graphiquement l'axe de la rotation lorsque j'interpole les angles d'Euler d'une rotation.

    La compilation ne posait aucun problème.
    Mais pour l'exécution, on me répond "invalid file name c:\...\quater.exe" (quater est le nom de mon programme.) Devant l'échec de résolution du problème, j'ai essayé sur un autre ordinateur.

    Sur celui-ci pas de problème pour la compilation mais par contre pour l'éxécution, je recevais "c:\...\quater (2).pas exited with exit code 1". Selon la FAQ, ce code correspondrait à une tentative de ma part à utiliser une fonction dos inexistante et que c'est lié à une interruption 21h (je n'ai pas très bien compris la phrase).

    Mais j'écris "recevais", car en écrivant ce message, je me suis rendu compte que l'erreur provenant peut-être de ce (2) après "quater" (qui provient de la copie du fichier sur ma clé usb). En effet, en renommant le fichier, le programme s'est exécuté.

    Mais les problèmes se succédant impitoyablement, je rencontre une nouvelle difficulté sûrement liée à ma méconnaissance du tracé de graphique en pascal.
    Voici la procédure principale de mon code:
    Code : 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
     
    uses graph;
     
    ...
     
    procedure tracer(ai,af:angleeuler);
    var a:angleeuler; m:matrice; q:quaternion; t:real; i,gd,gm:integer;   
     
    {angleeuler est un tableau 1*3, matrice 3*3 et quaternion un couple composé d'un réel et d'un tableau 1*3}
     
    begin
         gd:=Detect;
         initgraph(gd,gm,'');                {je crée le graphique}
         if grOk<>0 then begin
                         t:=0;
                         while t<1 do begin
                                      for i:=1 to 3 do a[i]:=t*af[i]+(1-t)*ai[i];   {j'interpole les angles d'euler}
                                      eulermat(a,m); matquater(m,q);               {je calcule la matrice associée à la rotation puis le quaternion unitaire : j'ai testé ces procédures, elles fonctionnent.}
                                      for i:=1 to 3 do PutPixel(105*i+trunc(100*t),trunc(10*q.imaginaire[i]),10); {je trace pixel par pixel}
                                      t:=t+0.01;
                                      end;
                          end
         else writeln('Erreur graphique');
     
    end;
    Le problème est le suivant : après avoir rentré les angles d'euler initiaux et finaux, j'ai beau appuyer sur entrer, rien ne se passe, rien ne s'affiche.

    Merci de votre attention au problème, en tout cas.

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Pour commencer, il faut savoir qu'il y a mieux que l'unité Graph, quoique cette dernière puisse rendre des services, notamment lorsqu'on veut essayer rapidement un code initialement écrit pour Turbo Pascal. Hormis ce cas, il vaut mieux se tourner vers d'autres unités, qui offrent de meilleures possibilités. Mais bon, pour le moment ce n'est pas le sujet.

    Dans le code que vous avez posté, il y a une confusion. En effet, grOK est une constante qui vaut 0, donc cette condition : if grOk <> 0 n'est jamais vraie. Ce que vous vouliez écrire, c'est plutôt : if GraphResult = grOk.

    Voici un exemple de code qui fonctionne.

    Code : 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
    program Graph_01;
    {$APPTYPE CONSOLE}
     
    uses
      Graph, WinCrt;
     
    function OpenGraph: boolean;
    var
      d, m: smallInt;
    begin
      d := d8bit;
      m := m800x600;
      InitGraph(d, m, '');
      result := (GraphResult = grOK);
    end;
     
    begin
      if OpenGraph then
      begin
        SetColor(Yellow);
        Rectangle(10, 10, GetMaxX - 10, GetMaxY - 10);
        OutTextXY(20, 20, 'Appuyez sur une touche pour me fermer...');
        ReadKey;
        CloseGraph;
      end else
      begin
        WriteLn('Erreur lors du passage au mode graphique.');
        Write('Appuyez sur la touche Entr'#130'e... ');
        ReadLn;
      end;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    J'ai suivi le modèle de votre programme en rajoutant {$apptype console}, en changeant les gm, gd et la condition graphresult qui posait problème. Mais le programme semble avoir de l'humour puisque j'ai de nouveau le droit à un "exit code 1" ...

  13. #13
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Impossible de dire ce qui ne va pas sans voir le code (en entier) !
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Code : 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
    program blocagedecardan;
    {$APPTYPE console}
    uses graph, wincrt;
     
     
    procedure tracer(ai,af:angleeuler);
    var a:angleeuler; m:matrice; q:quaternion; t:real; i:integer; gm,gd:smallint;
    begin
         gd:=d8bit;
         gm:=m800x600;
         initgraph(gd,gm,'');
         if graphresult<>grOk then begin
                         t:=0;
                         rectangle(0,0,10,10); readln; {juste pour voir si le problème provient de initgraph}
                         while t<1 do begin
                                      for i:=1 to 3 do a[i]:=t*af[i]+(1-t)*ai[i];
                                      eulermat(a,m); matquater(m,q);
                                      for i:=1 to 3 do PutPixel(105*i+trunc(100*t),trunc(10*q.imaginaire[i]),10);
                                      t:=t+0.01;
                                      end;
                          end
         else writeln('Erreur graphique');
     
    end;

  15. #15
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Le code que vous avez posté n'étant pas complet, il est impossible de vous aider (comme je l'ai déjà dit plus haut).

    Toutefois, il est certain que cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if graphresult <> grOk then
    doit être remplacée par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if graphresult = grOk then
    Pour le reste, il faudrait une boule de cristal.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Voilà, mais c'est un peu long. Pour l'instant, je n'utilise pas la plupart des procédures et je sais que blocage et déblocage sont fausses.
    Code : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    program blocagedecardan;
    {$APPTYPE console}
    uses graph, wincrt;
     
    type vecteur = array [1..3] of real;
     
    type quaternion = record
                      reel:real;
                      imaginaire:vecteur;
                      end;
     
    type matrice = array[1..3,1..3] of real;
     
    type angleeuler = array[1..3] of real;
     
    var a,b:angleeuler;m,n,o,p:matrice;c,d:integer;q1,q2,q3:quaternion;
     
    function norme(u:vecteur):real;
    begin
        norme:=sqrt(sqr(u[1])+sqr(u[2])+sqr(u[3]));
    end;
     
    procedure unitaire(u:vecteur; var v:vecteur);
    var i:integer;
    begin
      if (u[1]=0) and (u[2]=0) and (u[3]=0) then begin
                                                 v[1]:=0;
                                                 v[2]:=0;
                                                 v[3]:=0;
                                                 end
         else begin
              for i:=1 to 3 do
              v[i]:=u[i]/norme(u);
              end;
    end;
     
    procedure ajout(a,b:angleeuler;var c:angleeuler);
    var i:integer;
    begin
      for i:=1 to 3 do
         if b[i]+a[i]>=pi then c[i]:=a[i]+b[i]-2*pi
         else c[i]:=a[i]+b[i];
    end;
     
    procedure quatermat(q:quaternion; var m:matrice);
    begin
      m[1,1]:=sqr(q.reel)+sqr(q.imaginaire[1])-sqr(q.imaginaire[3])-sqr(q.imaginaire[2]);
      m[1,2]:=-2*(q.reel*q.imaginaire[3]+q.imaginaire[1]*q.imaginaire[2]);
      m[1,3]:=2*(q.reel*q.imaginaire[2]-q.imaginaire[1]*q.imaginaire[3]);
      m[2,1]:=2*(q.reel*q.imaginaire[3]+q.imaginaire[2]*q.imaginaire[3]);
      m[2,2]:=sqr(q.reel)+sqr(q.imaginaire[2])-sqr(q.imaginaire[1])-sqr(q.imaginaire[3]);
      m[2,3]:=-2*(q.reel*q.imaginaire[1]+q.imaginaire[2]*q.imaginaire[3]);
      m[3,1]:=-2*(q.reel*q.imaginaire[2]+q.imaginaire[1]*q.imaginaire[3]);
      m[3,2]:=2*(q.reel*q.imaginaire[1]+q.imaginaire[2]*q.imaginaire[3]);
      m[3,3]:=sqr(q.reel)+sqr(q.imaginaire[3])-sqr(q.imaginaire[1])-sqr(q.imaginaire[2]);
    end;
     
     
    procedure multquater(q1,q2:quaternion; var q:quaternion);
    var i:integer;
    begin
       q.reel:=q1.reel*q2.reel;
       for i:=1 to 3 do q.reel:=q.reel-q1.imaginaire[i]*q2.imaginaire[i];
        q.imaginaire[1]:=q1.reel*q2.imaginaire[1]+q2.reel*q1.imaginaire[1]+q1.imaginaire[2]*q2.imaginaire[3]-q1.imaginaire[3]*q2.imaginaire[2];
        q.imaginaire[2]:=q1.reel*q2.imaginaire[2]+q2.reel*q1.imaginaire[2]+q1.imaginaire[3]*q2.imaginaire[1]-q1.imaginaire[1]*q2.imaginaire[3];
        q.imaginaire[3]:=q1.reel*q2.imaginaire[3]+q2.reel*q1.imaginaire[3]+q1.imaginaire[1]*q2.imaginaire[2]-q1.imaginaire[2]*q2.imaginaire[1];
    end;
     
    procedure mult(m,n:matrice; var l:matrice);
    var i,j,k:integer;
    begin
       for i:=1 to 3 do
          for j:=1 to 3 do begin
                           l[i,j]:=0;
                           for k:=1 to 3 do
                              l[i,j]:=l[i,j]+m[i,k]*n[k,j];
                           end;
    end;
     
    procedure identite(var m:matrice);
    var i,j:integer;
    begin
        for i:=1 to 3 do
           for j:=1 to 3 do
               if j=i then m[i,j]:=1 else m[i,j]:=0;
    end;
     
    procedure resolutiondeGauss(m:matrice; var u:vecteur);
    var i:integer;l:matrice;
    begin
        for i:=1 to 3 do m[i,i]:=m[i,i]-1;
        identite(l);
        if m[1,3]<>0 then begin
                          for i:=1 to 3 do l[i,3]:=m[1,2]*l[i,3]-m[1,3]*l[i,2];
                          for i:=1 to 3 do m[i,3]:=m[1,2]*m[i,3]-m[1,3]*m[i,2];
                          end;
        if m[1,2]<>0 then begin
                          for i:=1 to 3 do l[i,2]:=l[i,2]*m[1,1]-m[2,1]*l[i,1];
                          for i:=1 to 3 do m[i,2]:=m[i,2]*m[1,1]-m[2,1]*m[i,1];
                          end;
        if abs(m[2,2]*m[3,3]-m[2,3]*m[3,2])<0.1 then for i:=1 to 3 do u[i]:=m[2,2]*l[i,3]-m[2,3]*l[i,2]
                                                else for i:=1 to 3 do u[i]:=m[2,2]*l[i,1]-m[2,1]*l[i,2];
    end;
     
    procedure matquater(m:matrice; var q:quaternion);
    var u,v:vecteur;i:integer;si,tr:real;
    begin
         tr:=m[1,1]+m[2,2]+m[3,3];
         q.reel:=sqrt((1+tr)/4);
         si:=sqrt((3-tr)/4);
         resolutiondeGauss(m,u); unitaire(u,v);
         for i:=1 to 3 do  q.imaginaire[i]:=si*v[i];
    end;
     
     
    function arccos(x:real):real;
    begin
       if x<>-1 then arccos:=2*arctan(sqrt((1-x)/(1+x)))
                else arccos:=pi;
    end;
     
    procedure mateuler(m:matrice; var a:angleeuler);
    var phi,psi:real;
    begin
       if m[3,3]=1 then begin
                        a[2]:=0;
                        a[1]:=arccos(m[1,1])/2;
                        a[3]:=a[1];
                        end
       else if m[3,3]=-1 then begin
                             a[2]:=pi;
                             a[1]:=arccos(-m[1,1]);
                             a[3]:=2*a[1];
                             end
       else begin
            a[2]:=arccos(m[3,3]);
            psi:=arccos(m[3,1]/sin(a[2]));
            phi:=arccos(-m[1,3]/sin(a[2]));
            if m[3,2]>0 then a[1]:=-psi else a[1]:=psi;
            if m[2,3]>0 then a[3]:=-phi else a[3]:=phi;
            end;
    end;
     
    procedure matrices(a:angleeuler; var m1,m2,m3:matrice);
    var i:integer;
    begin
       m1[1,1]:=cos(a[3]); m1[1,2]:=-sin(a[3]); m1[2,1]:=sin(a[3]); m1[2,2]:=cos(a[3]);
       m3[1,1]:=cos(a[1]); m3[1,2]:=-sin(a[1]); m3[2,1]:=sin(a[1]); m3[2,2]:=cos(a[1]);
       m2[1,1]:=cos(a[2]); m2[1,3]:=-sin(a[2]); m2[3,1]:=sin(a[2]); m2[3,3]:=cos(a[2]);
       for i:=1 to 3 do
                     begin
                     m1[3,i]:=0; m1[i,3]:=0; m2[i,2]:=0; m2[2,i]:=0; m3[3,i]:=0; m3[i,3]:=0;
                     end;
                     m1[3,3]:=1; m2[2,2]:=1; m3[3,3]:=1;
    end;
     
    procedure eulermat(a:angleeuler; var m:matrice);
    var m1,m2,m3,m4:matrice;
    begin
       matrices(a,m1,m2,m3);
       mult(m1,m2,m4);
       mult(m4,m3,m);
    end;
     
    procedure inverse(a:angleeuler; var m:matrice);
    var i:integer; b:angleeuler; m1,m2,m3,m4:matrice;
    begin
       for i:=1 to 3 do b[i]:=-a[i];
       matrices(b,m1,m2,m3);
       mult(m3,m2,m4);
       mult(m4,m1,m);
    end;
     
    function egalite(m,n:matrice):boolean;
    var i,j:integer;b:boolean;
    begin
      b:=true;
      for i:=1 to 3 do
        for j:=1 to 3 do b:=b and (abs(m[i,j]-n[i,j])<0.1);
    egalite:=b;
    end;
     
    procedure blocage(a:angleeuler; m:matrice; var r,n:matrice);
    var p,q,s:matrice;b,c:angleeuler;
    begin
      mateuler(m,b);
      ajout(a,b,c);
      eulermat(c,n);
      eulermat(a,p);
      inverse(a,s);
      mult(m,p,q);
      mult(q,s,r);
      if egalite(r,n) then writeln ('pas de blocage')
      else   writeln ('situation de blocage');
    end;
     
    function egaliteq(q1,q2:quaternion):boolean;
    var b:boolean;i:integer;
    begin
        b:=abs(q1.reel-q2.reel)<0.1;
        for i :=1 to 3 do b:=b and (abs(q1.imaginaire[i]-q2.imaginaire[i])<0.1);
    egaliteq:=b;
    end;
     
    procedure deblocage(a:angleeuler; m:matrice; var r,p:matrice);
    var n,k,l:matrice;q1,q2:quaternion;
    begin
       eulermat(a,n);
       matquater(n,q1);
       matquater(m,q2);
       multquater(q2,q1,q3);
       mult(m,n,p);
       quatermat(q3,r);
       if egalite(r,p) then writeln ('pas de blocage')
       else writeln ('situation de blocage');
    end;
     
    procedure afficherm(m:matrice);
    var i,j:integer;
    begin
      for i:=1 to 3 do begin
                       for j:=1 to 3 do write(m[i,j]);
                       writeln;
                       end;
      writeln;
    end;
     
    procedure afficherq(q:quaternion);
    var i:integer;
    begin
       write(q.reel);
       for i:=1 to 3 do write(q.imaginaire[i]);
       writeln;
    end;
     
    procedure affichera(a:angleeuler);
    var i:integer;
    begin
       for i:=1 to 3 do write(a[i]);
       writeln;
    end;
     
    procedure entrera(var a:angleeuler);
    begin
        writeln('Rentrez les coordonn‚es dEuler du solide. Les angles doivent ˆtre compris entre -pi et +pi');
        write('psi = '); readln(a[3]);
        write('theta = '); readln(a[2]);
        write('phi = '); readln(a[1]);
        writeln;
    end;
     
    procedure entrerm(var m:matrice);
    var i,j:integer;
    begin
        writeln('Rentrez la matrice de rotation. Elle doit ˆtre orthogonale.');
        for i:=1 to 3 do begin
                         write('ligne ');writeln(i);
                         for j:=1 to 3 do read(m[i,j]);
                         writeln;
                         end;
    end;
     
    procedure entrerq(var q:quaternion);
    var i:integer;
    begin
        writeln('Rentrez le quaternion. Il doit ˆtre norm‚');
        read(q.reel); for i:=1 to 3 do read(q.imaginaire[i]);
    end;
     
     
    procedure tracer(ai,af:angleeuler);
    var a:angleeuler; m:matrice; q:quaternion; t:real; i:integer; gm,gd:smallint;
    begin
         gd:=d8bit;
         gm:=m800x600;
         initgraph(gd,gm,'');
         if graphresult=grOk then begin
                         t:=0;
                         rectangle(0,0,10,10); readln;
                         while t<1 do begin
                                      for i:=1 to 3 do a[i]:=t*af[i]+(1-t)*ai[i];
                                      eulermat(a,m); matquater(m,q);
                                      for i:=1 to 3 do PutPixel(105*i+trunc(100*t),trunc(10*q.imaginaire[i]),10);
                                      t:=t+0.01;
                                      end;
                          end
         else writeln('Erreur graphique');
     
    end;
     
     
    begin
        entrera(a); entrera(b); tracer(a,b); readln;
     
    end.

  17. #17
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    L'ennui, c'est que je n'ai aucune idée des valeurs à entrer, ni du résultat attendu. Peut-être serait-il commode de remplacer provisoirement les valeurs entrées par l'utilisateur par des valeurs constantes, ou par des valeurs aléatoires (mais comprises dans l'intervalle correct).

    Il faut supprimer le ReadLn dans la ligne suivante (ça ne peut pas fonctionner, si besoin il faut plutôt utiliser ReadKey) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rectangle(0,0,10,10); //readln;
    Autrement, en entrant des valeurs vraiment au hasard, j'ai bien une fenêtre qui s'ouvre correctement et une espèce de graphique. Je n'ai pas d'erreur.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  18. #18
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Ah, c'est embêtant car il me renvoie "erreur graphique".

    Donc le problème se situerait-il dans les différences de configuration de mon ordinateur (Windows XP, carte graphique : mobile intel(R) 945 Express Chipset Family) ou la version de Free Pascal (2.4.6) ?

  19. #19
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    C'est curieux. De mon côté, c'est Windows 8 et Free Pascal 2.6.4, mais je ne pense pas que ça change grand chose. Est-ce que l'exemple que j'avais posté s'exécute correctement ?

    Là, je suis un peu perdu.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  20. #20
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    "Erreur lors du passage au mode graphique". Je vais tester sur d'autres appareils.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Turbo Pascal] Unité USB : Support de la norme USB 1.1 pour Turbo Pascal 7
    Par forum dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 08/04/2014, 08h21
  2. [Turbo Pascal] Un plugin Eclipse pour Turbo Pascal
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 0
    Dernier message: 07/02/2011, 07h57
  3. [Turbo Pascal] K-Tools - Bibliothèque d'unités d'objets Turbo Pascal 6 et 7
    Par Alcatîz dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 06/11/2010, 14h58
  4. [Turbo Pascal] Cours, tutoriels, sources, utilitaires, téléchargements pour Turbo Pascal
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 0
    Dernier message: 27/01/2009, 20h53
  5. Ligne de commande pour Turbo Pascal?
    Par GeffD dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 24/02/2004, 12h25

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