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

Turbo Pascal Discussion :

[TPW] Petit problème pour réaliser un pendule double [Non suivi]


Sujet :

Turbo Pascal

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Points : 1
    Points
    1
    Par défaut [TPW] Petit problème pour réaliser un pendule double
    Bonjour voila je dois réaliser un pendule double sous pascal, j ai donc rencontré plusieurs problemes que je commence a resoudre au fur et a mesure que j avance mais je ne les comprends pas tous...

    Pour commencer les equations de mouvement du pendule double comportent des derivés secondes premieres,...

    vous pouvez trouver les equations de mouvement sur des sites tels que

    http://fr.wikipedia.org/wiki/Pendule_double
    http://www.u-cergy.fr/etud/ufr/compo.../th%E9orie.htm

    donc j ai commencé pour la moment a etudier le probleme..
    mais a chaque fois j arrive a une erreur 202 d execution du tout petit programme que je viens de faire...
    je ne comprend pas trop a quoi c est du donc si vous pouviez m aider ca serait COOL mais vraiment....

    je code sur turbo pascal que j ai commencé est le suivant :


    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
    ##########################################
     
    program mouvement_pendule_double;
    uses wincrt,wingraph;
     
    const g=9.8;
          N=1000;
          deltaT=1e-2;
     
    type  tableau = array [0..N] of real;
     
    type pendule2 = record
                  l1:real;
                  l2:real;
                  m1:real;
                  m2:real;
                  alpha:real;
                  beta:real;
                  end;
     
    var penduledble : pendule2;
        fichierpenduledble : file of pendule2;
        PD1,PD2: tableau;
        i,j:integer;
     
     
    procedure creertab( var tab3,tab4:tableau;pas,long1,long2,masse1,masse2,a1,a2:real);
     
    var i:integer;
        tab1,tab2:tableau;
        U1,U2,U3,U4:real;
        V1,V2,V3,V4:real;
     
     
    begin
     
    tab1[0]:=0; {angle1 derivee premiere}
    tab2[0]:=0; {angle2 derivee premiere}
    tab3[0]:=0; {angle1}
    tab4[0]:=0; {angle2}
     
    U1:=0;
    U2:=0;
    U3:=0;
    U4:=0;
     
    V1:=0;
    V2:=0;
    V3:=0;
    V4:=0;
     
     
    for i:=1 to N do
    begin
     
     
    U1:=(masse2*sin(a1-a2)*tab1[i-1]*tab1[i-1])/(masse1+masse2*sin(a1-a2)*sin(a1-a2));
    U2:=(masse2*g*sin(a2)*cos(a1-a2))/(long1*(masse1+masse2*sin(a1-a2)));
    U3:=-(masse2*long2*sin(a1-a2)*tab2[i-1]*tab2[i-1])/(long1*(masse1+masse2*sin(a1-a2)*sin(a1-a2)));
    U4:=-((masse1+masse2)*g*sin(a1))/(long1*(masse1+masse2*sin(a1-a2)*sin(a1-a2)));
    writeln('chuis la');
     
     
    tab1[i]:=pas*(U1+U2+U3+U4)-tab1[i-1];
    writeln(tab1[i]);
     
     
    V1:=(masse2*cos(a1-a2)*sin(a1-a2)*tab2[i-1]*tab2[i-1])/(masse1+masse2*sin(a1-a2)*sin(a1-a2));
    V2:=((masse1+masse2)*g*sin(a1))/(long2*(masse1+masse2*sin(a1-a2)*sin(a1-2)));
    V3:=(-(masse1+masse2)*long1*sin(a1-a2)*tab1[i-1]*tab1[i-1])/(long2*(masse1+masse2*sin(a1-a2)*sin(a1-a2)));
    V4:=(-(masse1+masse2)*g*sin(a2))/(long1*(masse1+masse2*sin(a1-a2)*sin(a1-a2)));
    writeln('ch uis la');
     
     
    tab2[i]:=pas*(V1+V2+V3+V4)-tab2[i-1];
     
     
    end;
    end;
     
    begin
     
    creertab(PD1,PD2,deltaT,1,1,1,1,1,0.2);
    end.
     
     
    #############################################
    Il n est pas tres long et je vous remercie d avance!!

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Turbo Pascal ou Borland Pascal for Windows ? C'est pas la même chose... Sous TP, wincrt et wingraph n'existe pas déjà. Ensuite, si tu es vraiment sous TP, remplaces wincrt et wingraph par crt et graph.

    L'erreur 202 est une erreur de Stack Overflow (merci de regarde l'aide de ton compilateur). Il est possible que la taille des variables que tu utilises lors de ta procédure creertab soient trop grosses. Essaye en diminuant leur taille.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    euh concernant la presence des unites wincrt et wingraph ba j utilise TP pour windows version 7 si je ne me trompe pas...et sinon non je dois pas remplacé wincrt et wingraph par crt ou graph sinon l unité n existe pas purisque elle est sous la denomination win...
    pour ce qui est du reste que veux tu dire par reduire la taille des variables je ne voies pas trop comment le faire... l aide du compilateur se resume a dire la meme chose que toi... donc je n avance pas plus

  4. #4
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    type tableau = array [0..N] of real;

    commence p-e par N=100 pour tester
    ★ Pascal/Java/C/xhtml,css/SQL/Mips
    ★ Linux/unix

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    en utilisant N = 100 ca marche bien, donc ca c est cool.
    mais le probleme si je me limite a 100 je n aurait jamais assez de point pour tracé mon graph, apres 1000 c est deja pas beaucoup pour realisé le mouvement du pendule... i l n y aurait pas un moyen autre que de diminuer le nombre N ??

  6. #6
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    TP pour windows 7 n'existe pas, on va admettre que c'est BP7 que tu utilises, et là c'est bon... xD
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  7. #7
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    En plus tu déclares des variables que tu utilises pas, c'est vraiment... bizarre...

    Pour passer les valeurs tab3 et tab4 en paramètre de la procédure, si tu les utilises pas ? Ca te fera gagner de la place déjà. Sinon utiliser des variables gloables, tu gagneras encore quelques octets sur la pile...
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  8. #8
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    divise en 2 talbeaux ou 3 ou 4 ^^
    ★ Pascal/Java/C/xhtml,css/SQL/Mips
    ★ Linux/unix

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    les variables tab3 et tab4 servent dans la suite du programme et plus particulierement pour tracé les graph j evite au maximum les variables qui sont pas utilisé ^^ y en a tellement que si je faisais pas ca je pense que je perdrais

  10. #10
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Je n'ai pas regardé le code. Mais en substituant WinCrt -> Crt et WinGraph-> Graph, avec FreePascal le programme se compile et s'execute ( sans avoir regardé ce qu'il calcul! )
    Il serait un petit peu + lisible avec un minimum d'indentation!

  11. #11
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Bonjour,

    Il est grand temps de passer à l'allocation dynamique. Un Real fait 6 octets. Vous déclarez deux tableaux de 1001 élements soit 12012 octets en variable locale.

    Même si les compilateurs actuels autorisent sans problème ce genre de chose, ce n'est pas fait pour ça à la base. Il faut se renseigner sur GetMem et ses amis

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    re bonjour je voudrais savoir s il y aurait qq1 d assez sympa pour prendre un peu de son temps pour m aider a mettre les equations sous forme de code car jai beau essayer,ca ne marche pas du tout... et je ne comprend pas pourquoi...
    je mets ci dessous une partie du code que jai commencé... en attendant vos reponses je repars tenté de trouver mon erreur...

    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
     
    program mouvement_pendule_double;
    uses wincrt,wingraph;
     
    const g=9.8;
          N=600; { erreur 202 runtime, je dois limite la taille des variables... donc limitation du N}
          deltaT=1e-2;
     
    type  tableau = array [0..N] of real;
     
    type pendule2 = record
                  l1:real;
                  l2:real;
                  m1:real;
                  m2:real;
                  alpha:real;
                  beta:real;
                  end;
     
    var penduledble : pendule2;
        fichierpenduledble : file of pendule2;
        P1,P2,p3,p4: tableau;
        i,j,k,b:integer;
     
     
    procedure ct( var tab3,tab4,tab5,tab6:tableau;pas,long1,long2,masse1,masse2,a1,a2:real);
     
    var i:integer;
        tab1,tab2:tableau;
        U1,U2,U3,U4:real;
        V1,V2,V3,V4:real;
     
     
    begin
     
    tab1[0]:=0; {angle1 derivee premiere}
    tab2[0]:=0; {angle2 derivee premiere}
    tab3[0]:=0; {angle1}
    tab4[0]:=0; {angle2}
     
    U1:=0;
    U2:=0;
    U3:=0;
    U4:=0;
     
    V1:=0;
    V2:=0;
    V3:=0;
    V4:=0;
     
     
    for i:=1 to N do
    begin
     
     
    U1:=(masse2*sin(a1-a2)*tab1[i-1]*tab1[i-1])/(masse1+masse2*sin(a1-a2)*sin(a1-a2));
    U2:=(masse2*g*sin(a2)*cos(a1-a2))/(long1*(masse1+masse2*sin(a1-a2)));
    U3:=-(masse2*long2*sin(a1-a2)*tab2[i-1]*tab2[i-1])/(long1*(masse1+masse2*sin(a1-a2)*sin(a1-a2)));
    U4:=-((masse1+masse2)*g*sin(a1))/(long1*(masse1+masse2*sin(a1-a2)*sin(a1-a2)));
     
     
     
    tab1[i]:=pas*(U1+U2+U3+U4)-tab1[i-1];
     
     
     
     
    V1:=(masse2*cos(a1-a2)*sin(a1-a2)*tab2[i-1]*tab2[i-1])/(masse1+masse2*sin(a1-a2)*sin(a1-a2));
    V2:=((masse1+masse2)*g*sin(a1))/(long2*(masse1+masse2*sin(a1-a2)*sin(a1-2)));
    V3:=(-(masse1+masse2)*long1*sin(a1-a2)*tab1[i-1]*tab1[i-1])/(long2*(masse1+masse2*sin(a1-a2)*sin(a1-a2)));
    V4:=(-(masse1+masse2)*g*sin(a2))/(long1*(masse1+masse2*sin(a1-a2)*sin(a1-a2)));
     
    tab2[i]:=pas*(V1+V2+V3+V4)-tab2[i-1];
     
     
    tab3[i]:=long1*sin(tab1[i]);
    tab4[i]:=-long1*cos(tab1[i]);
     
    tab5[i]:=long2*sin(tab2[i]);
    tab6[i]:=-long2*cos(tab2[i]);
     
     
    end;
    end;
     
    begin
     
     
     
    with penduledble do
                       begin
                       m1:=1;
                       m2:=5;
                       l1:=5;
                       l2:=1;
                       alpha:=pi/4;
                       beta:=pi/6;
                       end; 
     
    ct(P1,P2,P3,P4,deltaT,penduledble.l1,penduledble.l2,penduledble.m1,penduledble.m2,penduledble.alpha,penduledble.beta);
     
     
    {for i:=1 to N do writeln(PD2[i]); 
    writeln(PD2[N]);}
     
     
    debutgraphe;
     
    begin
     
    echelle(-7,7,-7,7);
    axes_gradues;
     
    for i:=1 to N do
    begin
     
    for j:=1 to 10000 do
    for k:=1 to 1000 do b:=b+1;
    efface_fenetre;
    echelle(-7,7,-7,7);
    segment(0,0,P1[i],P2[i]);
    segment(P1[i],P2[i],P3[i],P4[i]);
     
    end;
    end;
     
    fingraphe; 
     
    end.

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    Hooouuuppppppiiiee j ai trouvé mon erratum
    bon pour ce que ca interesse je mets une petite ebauche de la chose il reste encore du travail mais au moins l erreur est rectifié

    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
     
    program mouvement_pendule_double;
    uses wincrt,wingraph;
     
    const g=9.8;
          N=200; 
          deltaT=1e-2;
     
    type  tableau = array [0..N] of real;
     
    type pendule2 = record
                  l1:real;
                  l2:real;
                  m1:real;
                  m2:real;
                  alpha:real;
                  beta:real;
                  end;
     
    var penduledble : pendule2;
        fichierpenduledble : file of pendule2;
        P1,P2,P3,P4: tableau;
        i,j,k,b:integer;
     
     
     
     
    {procedure}
    procedure ct( var tab5,tab6,tab7,tab8:tableau;pas,long1,long2,masse1,masse2,a1,a2:real);
     
    var i:integer;
        tab1,tab2,tab3,tab4:tableau;
        U0,U1,U2,U3,U4:real;
        V0,V1,V2,V3,V4:real;
     
     
    begin
     
    tab1[0]:=0;
    tab2[0]:=0;
    tab3[0]:=a1;
    tab4[0]:=a2;
     
    U0:=0;
    U1:=0;
    U2:=0;
    U3:=0;
    U4:=0;
     
    V0:=0;
    V1:=0;
    V2:=0;
    V3:=0;
    V4:=0;
     
    for i:=1 to N do
    begin
     
    U0:=(1/(1-masse2*cos(tab3[i-1]-tab4[i-1])*cos(tab3[i-1]-tab4[i-1])/(masse1+masse2)));
    U1:=U0*(-masse2*cos(tab3[i-1]-tab4[i-1])*sin(tab3[i-1]-tab4[i-1])*tab1[i-1]*tab1[i-1]);
    U2:=U0*(g*masse2*cos(tab3[i-1]-tab4[i-1])*sin(tab4[i-1])/(long1*(masse1+masse2)));
    U3:=U0*(-masse2*long2*sin(tab3[i-1]-tab4[i-1])*tab2[i-1]*tab2[i-1])/(long1*(masse1+masse2));
    U4:=U0*(-g*sin(tab3[i-1])/long1);
     
    V0:=(1/(1-masse2*cos(tab3[i-1]-tab4[i-1])*cos(tab3[i-1]-tab4[i-1])/(masse1+masse2)));
    V1:=V0*(masse2/(masse1+masse2)*cos(tab3[i-1]-tab4[i-1])*sin(tab3[i-1]-tab4[i-1])*tab2[i-1]*tab2[i-1]);
    V2:=V0*g/long2*cos(tab3[i-1]-tab4[i-1])*sin(tab3[i-1]);
    V3:=V0*(long1/long2)*sin(tab3[i-1]-tab4[i-1])*tab1[i-1]*tab1[i-1];
    V4:=V0*(-g/long2)*sin(tab4[i-1]);
     
     
     
    tab1[i]:=pas*(U1+U2+U3+U4)+tab1[i-1];
    tab2[i]:=pas*(V1+V2+V3+V4)+tab2[i-1];
     
     
    tab3[i]:=pas*tab1[i-1]+tab3[i-1];
    tab4[i]:=pas*tab2[i-1]+tab4[i-1];
     
    tab5[i]:=long1*sin(tab3[i-1]);
    tab6[i]:=-long1*cos(tab3[i-1]);
     
    tab7[i]:=tab5[i]+long2*sin(tab4[i-1]);
    tab8[i]:=tab6[i]-long2*cos(tab4[i-1]);
     
    end;
    end;
     
     
     
    begin
    merci a ce qui m ont aidé ou essayé de m aidé

    Par contre j aimerais savoir si il y a une solution au fait que j utilise des tableau de reel et que ca bouffe enormement de memoire...
    car vu que je dois calculé la position du pendule je ne peux pas prendre d'entier...
    donc si quelqu'un pouvait me dire comment je dois faire pour augmenté le nombre de saisie de point sans etre emmerder par l erreur 202... ca serait sympa!

  14. #14
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    La réponse à ton problème se situe dans mon précédent message...
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    Oui merci mais j ai un petit probleme concernant l utilisation de getmem... je ne comprends pas trop comment l utiliser, j'ai fait trois programmes sur le pendule double (le mouvement du pendule et les 2 types d'oscillations du pendule) je voulais savoir si si je te montrais une partie de mon programme tu pouvais l appliqué pour voir un peu comment on l utilise...

    le getmem doit etre appliqué au tab5,6,7,8...


    je met le code la ... merci de repondre!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    program mouvement_pendule_double;
    ...

  16. #16
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Exemple d'utilisation de GETMEM
    voici un code avec des variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    const N = 2500;
    type  tableau = array [0..N] of real;
    procedure x1;
    var tab1,tab2,tab3,tab4:tableau;
        begin
        tab1[0]:=0;
        tab2[0]:=1;
        tab3[0]:=2;
        tab4[0]:=3;
        end;
    Voici une écriture avec des pointeurs
    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
    const N = 2500; np = 4;
    type  tableau = array [0..N] of real;
     
    procedure x2;
    var i      :  integer;   { index pour boucles }
        tab   :  array[1..np] of pointer; { les pointeurs de zone mémoire }
       begin
       i:=0;
          repeat
          inc(i);
          tab[i]:=nil;
          if maxavail >= sizeof(tableau) then  { si il y a assez de place continue }
             getmem(tab[i],sizeof(Tableau))    { allouer et garder l'adresse dans tab[i]}
          else
             begin { plus assez de place }
             writeln('pas assez de mémoire continue pour allouer tab[',i,']');
             i:=np+1; { sortir de la boucle avec i <> np }
             end
          until i >=np; { repeter les allocations jusqu'à  i>=np }
       if i = np then  { tout est alloué => on peut executer }
          begin
          (* proposition A *)
          Tableau(Tab[1]^)[0] := 0;{ par exemple ici on "map" les zones mémoires }
          Tableau(Tab[2]^)[0] := 1;{ pointées par tab[] avec le masque Tableau }
          Tableau(Tab[3]^)[0] := 2;{(mais cela aurrait aussi pu être des record,...)}
          Tableau(Tab[4]^)[0] := 3;{ pour acceder aux elements. }
     
     
     
          (* proposition  B :    autre moyen d'accŠs : *)
          { définir une variable P de type  pointeur }
          { l'element n d'un tableau i peut alors s'acceder comme suit }
          P:=tab[i];
          inc(longint(P),n);  { car dans cet exemple l'indexation commence à 0 }
          Tableau(p^):=...
          { ou }
          move(p^,Variable réelle locale, sizeof(real));
          end;
    { finalement ne pas oublier de restituer la mémoire }
       for i:= 1 to np do if tab[i] <> nil then
          freemem(tab[i],sizeof(Tableau));
       end;

  17. #17
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    Merci!

    je viens d utiliser getmem avec succés, ca fait plaisir de voir mon pendule faire plus qu une oscillation ^^
    par contre la j ai de nouveau un autre petit probleme...
    ca peut paraitre simple enfin je sais pas trop vous allez me le dire
    je ne sais pas comment fermer la fenetre wingraph sans la faire planter : /
    de meme pour fermer la fenetre de calcul de turbo pascal

    j ai bien utilisé des trucs du genre

    destroywindow(getactivewindow);
    closewindow(getactivewindow);

    ca n a pas trop l effet que je desire qui est de fermer completement la fenetre...
    en attendant votre reponse merci!

  18. #18
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    j-p mignot : merci je ne connaissais pas ces fonctions non plus on en apprend un peu plus tous les jours
    ★ Pascal/Java/C/xhtml,css/SQL/Mips
    ★ Linux/unix

  19. #19
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    A mon avis l'intérêt de cette notation est d'allouer par exemple FFFF en mémoire et, suivant les besoins au long du soft on la map depuis l'origine ( ou depuis un offset donné) avec les tableaux, structures, variables, ... dont on a besoin a un instant donné.
    Cela réduit drastiquement le nombre de variables ( pointeur sur la zone allouée + quelques word pour les offsets).
    Comme on fait de l'accès mémoire direct, il faut être prudent pour ne pas écraser des données dont on a besoin ultérieurement ou faire des dépassement de zone allouée!
    Sous turbo pascal et DOS j’ai utilisé cette méthodologie plus de 10 ans. Sous delphi et Window, j’utilise plutôt les tableaux dynamiques.

  20. #20
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Ou alors, on faiut encore plus proprement et on utilise des objets... Puis c'est compatible Windows sans trop d'effort....
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

Discussions similaires

  1. [Syntaxe] PETIT probl avec un Jlabel
    Par blackcrow1981 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 14/09/2006, 19h53
  2. Petit problème avec GCC pour l'Unicode...
    Par Nico*3-3 dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 29/01/2006, 17h12
  3. petit scripte a faire pour un l'ecole
    Par sircam61 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/12/2005, 14h44
  4. Réponses: 4
    Dernier message: 20/05/2004, 01h08
  5. [TPW][cours]Demande d'aide pour finir un programme
    Par jf dans le forum Turbo Pascal
    Réponses: 21
    Dernier message: 16/06/2003, 18h10

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