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

4D Discussion :

type V2004 tableau 2D


Sujet :

4D

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 25
    Points : 14
    Points
    14
    Par défaut type V2004 tableau 2D
    bonjour,

    un tableau 2D, sous 4D, est un tableau de tableau.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    tableau entier($MonTableau2D;1;3)
     
    alors : 
    taille($MonTableau2D)=1   `normal`
    taille($MonTableau2D{1})=3   `normal`
    type($MonTableau2D)=13   `(est un tableau 2D) : normal`
    type($MonTableau2D{1})=13   `(est un tableau 2D) : pas normal, devrait valoir 15!`
    mon soucis est que pour une fonction générique, je n'arrive pas à distinguer les pointeurs sur une ligne d'un tableau 2D d'un pointeur sur un tableau 2D

    je vous mets la fonction que j'ai faite, elle sert a supprimer tout ce qui est "en aval" d'un variable :
    le seul probleme intervient avec le 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
    26
    27
    28
     
     `detruire variable(Ptr)`
    Si (Type($1)=Est un pointeur )
      Si (Non(Nil($1)))
        Si (Non(Indefinie($1->)))
          Au cas ou 
            : (Type($1->)=Est un pointeur )
              Detruire Variable ($1->)
            : (Type($1->)=Est un tableau pointeur )
              Boucle ($indice;0;Taille tableau($1->))
                Detruire Variable ($1->{$indice})
              Fin de boucle 
            : (Type($1->)=Est un tableau 2D )
              Boucle ($indice1;0;Taille tableau($1->))
                Boucle ($indice2;0;Taille tableau($1->{$indice1}))
                  $El:=$1->{$indice1}{$indice2}
                  Si (Type($El)=Est un pointeur )
                    Si (Non(Nil($El)))
                      Detruire Variable ($1->{$indice1}{$indice2})
                    Fin de si 
                  Fin de si 
                Fin de boucle 
              Fin de boucle 
            Fin de cas 
            EFFACER VARIABLE($1->)
          Fin de si 
        Fin de si 
    Fin de si

    il y a 3 problemes à cette fonction :
    1 : ne marche pas avec les variables locales (mais ce n'est pas le but de la fonction)
    2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tableau pointeur(Tab;2)
    Tab{1}:=->Tab
    Entier:=3
    Tab{2}:=->Entier
    detruire variable(->Tab)
    supprime tab puis veut acceder a tab 2 : erreur (possible à éviter sans trop de complication)
    n'aura de toute maniere pas accés a Entier : ne pourra pas le supprimer
    solution : simplement effacer les pointeurs sur lui même (si vous voyez ce que je veux dire), cependant on peut passer par plusieurs tableaux qui reviennent sur le premier... mais bon, à mettre dans la "notice" d'utilisation de la fonction

    3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pointeur(Ptr)
    tableau pointeur(Tab;2;2)
    Ptr:=->Tab{1}
    ne marche pas car prend Ptr-> comme un tableau 2D : passe par Ptr->{0}{0} qui genere une erreur

    quelqu'un pourrait-il me dépanner pour ce dernier probleme (le 3eme)?

    _____
    edit : je crois pouvoir trouver une solution du coté de résoudre pointeur... je continue de chercher...

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    probleme resolu (le 3, mais aussi le 2)

    la solution était bien du coté de resoudre pointeur, je met le code, au cas ou ca interresse des gens :
    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
     
      `même fonctionnalité que effacer variable, mais agit aussi sur ce qui est pointé, de maniere récursive.`
      `attention, cette fonction n'effacera pas de variables locales; ni leurs contenu. (pour des raisons évidentes)`
      `$1 (pointeur) : pointeur sur variable a supprimer.`
     
    TABLEAU ALPHA(40;$TabDestruction;0)
    Si (Nombre de parametres>=2)
    	COPIER TABLEAU($2->;$TabDestruction)
    Fin de si 
     
     
     
     
    Si (Type($1)=Est un pointeur )
      Si (Non(Nil($1)))
        Si (Non(Indefinie($1->)))
          RESOUDRE POINTEUR($1;$nomVar;$numEl;$obligatoire)
            Si (Chercher dans tableau($TabDestruction;$nomVar)=-1)
              AJOUTER A TABLEAU($TabDestruction;$nomVar)
              Au cas ou 
                : (Type($1->)=Est un pointeur )
                  Detruire Variable ($1->;->$TabDestruction)
                : (Type($1->)=Est un tableau pointeur )
                  Boucle ($indice;0;Taille tableau($1->))
                    Detruire Variable ($1->{$indice};->$TabDestruction)
                  Fin de boucle 
                : (Type($1->)=Est un tableau 2D )
                  Si ($numEl=-1)
                    Boucle ($indice1;0;Taille tableau($1->))
                      Boucle ($indice2;0;Taille tableau($1->{$indice1}))
                        $El:=$1->{$indice1}{$indice2}
                          Si (Type($El)=Est un pointeur )
                            Si (Non(Nil($El)))
                              Detruire Variable ($1->{$indice1}{$indice2};->$TabDestruction)
                            Fin de si 
                          Fin de si 
                        Fin de boucle 
                      Fin de boucle 
                    Sinon 
                      Boucle ($indice2;0;Taille tableau($1->{$indice1}))
                        $El:=$1->{$indice2}
                        Si (Type($El)=Est un pointeur )
                          Si (Non(Nil($El)))
                            Detruire Variable ($1->{$numEl}{$indice2};->$TabDestruction)
                          Fin de si 
                        Fin de si 
                      Fin de boucle 
                    Fin de si 
            Fin de cas 
            Si ($numEl=-1)
              EFFACER VARIABLE($1->)
            Fin de si 
          Fin de si 
        Fin de si 
      Fin de si 
    Fin de si
    probleme restant (volontaire):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TABLEAU POINTEUR(Tab;2)
    Tab{1}:=->Tab
    Entier:=3
    Tab{2}:=->Entier
    Detruire Variable (->Tab{1};"Tab2")
    j'ai décidé de “réserver“ le tableau quand on utilise une de ces lignes, ainsi le code précedent ne supprime aucune variable.

    on pourrait dire qu'il faudrait supprimer tous les elements du tableau, mais non car ceci entrainerait une boucle infinie (j'y ai réfléchi avant)

    mais le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TABLEAU POINTEUR(Tab;2)
    Tab{1}:=->Tab
    Entier:=3
    Tab{2}:=->Entier
    Detruire Variable (->Tab;"Tab2")
    fonctionne parfaitement ainsi que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TABLEAU POINTEUR(Tab;2)
    TABLEAU POINTEUR(Tab3;1)
    Tab{1}:=->Tab3
    Entier:=3
    Tab{2}:=->Entier
    Tab3{1}:=->Tab
    Detruire Variable (->Tab;"Tab2")
    : plus besoin de notice de fonction pour cela

    si quelqu'un voit comment résoudre le "probleme volontaire", je suis preneur.
    ____
    ceci étant dit je trouve moyen normal le coup du type = 13 pour un ligne du tableau

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Incompatibilité de type sur tableau croisé
    Par yoyo3d dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/09/2012, 15h26
  2. Comment avoir ce type de tableau ?
    Par Bruno13 dans le forum Langage
    Réponses: 10
    Dernier message: 15/01/2008, 11h00
  3. Réponses: 0
    Dernier message: 05/12/2007, 14h13
  4. Problème avec type et tableau
    Par semaj_james dans le forum Ada
    Réponses: 2
    Dernier message: 21/02/2007, 15h31
  5. Réponses: 7
    Dernier message: 14/02/2005, 10h40

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