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 :

pointeur nul et tableau de pointeurs de tableau de pointeurs


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 pointeur nul et tableau de pointeurs de tableau de pointeurs
    bonjour,

    j'ai commencé le 4D il y a quelques semaines. aussi j'ai recours à vous pour certaines questions que je n'arrivent a résoudre.

    question bete... mais je ne n'arrive pas à trouver de réponse, meme sur la doc officiel :

    comment peut-on passer un pointeur à la valeur nul? (lorsqu'on l'initialise, mais j'ai besoin de repassé un pointeur a null)

    autre chose : il n'y a pas d'objet en 4D, mais il y a-t-il des types utilisateurs autre que les tableaux?(notamment des structure pour ce qui m'intéresse)? en effet j'utilise des tableau de pointeur qui sont agencé les uns avec les autres, mais ceci alourdi le code.

    en rapport à cela, je voulais être sur que je ne réinventait pas la roue, et aussi il y a-t-il une limite de tab1{x}->{y}->{z}->{w}... a partir de laquelle 4D n'arrive plus à interpreter ce que l'on tappe sur une même ligne : en effet j'ai l'impression que tab1{x1}{y1}->{x2} passe mais pas tab1{x1}{y1}->{x2}-> (erreur #56)... j'ai lu sur la doc qu'il fallait mettre des parenthèses, aussi ai-je essayé (tab1{x1}{y1}->){x2}->, mais ca marche encore moins...

    [edit]je ne me trouve pas assez clair : tab1{x1}{y1}->{x2}->est sensé etre un tableau de pointeurs d'ou, normalement tab1{x1}{y1}->{x2}->{0} devrait valoir "nil", cependant, il vaut...erreur#56... avec les parentheses : ((tab1{x1}{y1}->){x2}->){0} vaut erreur#56 et (tab1{x1}{y1}->){x2}->{0} vaut 0 et (tab1{x1}{y1}->{x2}->){0}

    en résumé :

    Tab1{x1}{y1}->{x2}:=Pointeur vers("tab2")
    `Tab1{x1}{y1}->{x2} => ->tab2
    TABLEAU POINTEUR(Tab1{x1}{y1}->{$x2}->;3)
    `Tab1{x1}{y1}->{x2}-> => erreur#56
    `(Tab1{x1}{y1}->){x2}-> => 0

    `tab1{x1}{y1}->{x2}->{0} valeur attendue : nil
    `tab1{x1}{y1}->{x2}->{0} => erreur#56
    `((tab1{x1}{y1}->){x2}->){0} => erreur#56
    `(tab1{x1}{y1}->){x2}->{0} => 0
    `(tab1{x1}{y1}->{x2}->){0} =>erreur#56

    autre détail qui a son importance, peut etre : pour des raisons obscures je suis amené a travailler en non compilé

    merci de votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Février 2006
    Messages : 74
    Points : 84
    Points
    84
    Par défaut
    Pourrais-tu décrire un peu mieux les raisons qui t'ont poussé à utiliser des pointeurs d'une façon aussi complexe ?
    Il y a surement une solution plus simple dans 4D.
    Que dois-tu faire exactement ?

  3. #3
    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
    en fait, l'idée est de se rapprocher d'un type "structure" avec des tableaux, puisque c'est la seule possibilité que laisse 4D (j'ai l'impression).

    ce que je dois faire : c'est trop compliqué a expliqué en quelque mots, aussi je vais répondre ....hum... on va dire que j'ai des chantiers, sur lesquels j'ai des taches, qui sont regroupées entre elles en plusieurs groupes (les groupes sont toujours sur un même chantier et chaque groupe a une date de travaux : en gros j'avoue avoir peut-etre une approche objet, au début je voulais stocker ca dans une BDD, ce que je vais faire, mais pas pendant la manipulation : client-serveur=> 2 secondes entre chaque clic a cause de requete complexe, autant stocker les infos dans la mémoire et les y traiter puis les enregistrer a la fin

    l'idée c'est de faire une allocation dynamique, j't'envoie un topic ou le gars exxplique assez bien l'interet : ici

    sinon pour la premiere question sur les pointeurs nuls, tu n'a pas d'idée ?(on résoud celle la en premier si tu veux : un peu moins prise de tete
    ___________________________
    [edit] ok c'est bon en fait les valeurs sont bien assignées, mais c'est le debugueur qui déconne : il indique erreur#56 alors qu'en fait les variables sont bien accessibles... donc la bonne version : c'est celle SANS PARENTHESE ...(pour s'en rendre compte, il suffit de rajouter un pointeur qui a pour adresse Tab1{x1}{y1}->{x2}, qui pointe donc tab2 pour voir que modifier Tab1{x1}{y1}->{x2}->{0}prend effet sur tab2).

    sinon pour les pointeur nuls?
    ___________________________
    [edit2]au fait, autre question bete : EFFACER VARIABLE (variable) ou variable est un tableau de pointeur entrainera-t-il des fuites de mémoire ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Février 2006
    Messages : 74
    Points : 84
    Points
    84
    Par défaut
    Les pointeurs de 4D ne sont pas du tout les même qu'en C ou dans d'autres langages.
    Tu ne peux pas "vider" un pointeur en 4D, c'est juste une indirection vers un objet Champ ou variable, ce n'est pas une réserve mémoire.

    D'autre part, comme tu as du le lire, il ne faut pas essayer de plier 4D à tes habitudes d'autres langages.

    Ce que tu décris, les tâches, chantiers etc. peut très bien être traité en clair dans 4D, avec des tables, des champs et éventuellement des liens entre chaque. Il ne faut pas trop se préoccuper de la mémoire avec 4D, il fait ça très bien tout seul...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Février 2006
    Messages : 74
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par lolingman Voir le message
    on va dire que j'ai des chantiers, sur lesquels j'ai des taches, qui sont regroupées entre elles en plusieurs groupes (les groupes sont toujours sur un même chantier et chaque groupe a une date de travaux : en gros j'avoue avoir peut-etre une approche objet, au début je voulais stocker ca dans une BDD, ce que je vais faire, mais pas pendant la manipulation : client-serveur=> 2 secondes entre chaque clic a cause de requete complexe, autant stocker les infos dans la mémoire et les y traiter puis les enregistrer a la fin
    Non justement, 4D met à ta disposition tout ce qu'il faut pour gérer la rapidité, les transactions, les requêtes complexes etc.
    Je te suggère de penser BDD et de voir les performances, tu seras surpris.

  6. #6
    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
    Citation Envoyé par Antoine Galmiche Voir le message
    Les pointeurs de 4D ne sont pas du tout les même qu'en C ou dans d'autres langages.
    Tu ne peux pas "vider" un pointeur en 4D, c'est juste une indirection vers un objet Champ ou variable, ce n'est pas une réserve mémoire.
    l'idée n'est pas de "vider" un pointeur, mais juste de lui assigné une adresse nulle (je sais que ce n'est pas du C, mais un pointeur reste un pointeur : c'est gérer par le processeur, donc peu importe le language, en théorie, si quelque chose s'appelle un pointeur c'est qu'il s'agit juste d'un adresse memoire pour un adressage indirecte).

    je pensais que cela était possible car a l'initialisation, un pointeur est (ce que recherche à reproduire) nul (cad Nil($pointeur)->vrai).

    au pire la solution "rustine" est de choisir une variable qui s'appelle $nul et lorsque $pointeur pointe vers $nul, je considere qu'il ne pointe rien ... mais ca alourdi un peu (encore une fois (je ne peste pas contre 4D))

    Non justement, 4D met à ta disposition tout ce qu'il faut pour gérer la rapidité, les transactions, les requêtes complexes etc.
    Je te suggère de penser BDD et de voir les performances, tu seras surpris.
    j'avais déja commencé a faire le formulaire dont il est question en accés directe sur la base de donnée, les soucis étaient :
    • temps de réaction un pas assez rapide (moins d'une seconde à une secondes et demi, mais trop souvent : ça en était gênant)
    • je ne souhaitais pas enregistrer les modifications "en live" sur la BDD car l'utilisateur peut faire une erreur et je n'ai pas implémenté de pomme+Z


    merci de ton aide et de ta patience

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Février 2006
    Messages : 74
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par lolingman Voir le message
    [*]temps de réaction un pas assez rapide (moins d'une seconde à une secondes et demi, mais trop souvent : ça en était gênant)[/LIST]
    Ça dépend beaucoup du code, de l'organisation des données et des réglages mémoire.
    Faut voir.

    Citation Envoyé par lolingman Voir le message
    [*]je ne souhaitais pas enregistrer les modifications "en live" sur la BDD car l'utilisateur peut faire une erreur et je n'ai pas implémenté de pomme+Z[/LIST]
    Pour ça, regarde du coté des transactions, c'est fait pour.

  8. #8
    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
    merci : j'ai bien fait de garder l'ancienne version

  9. #9
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Juin 2006
    Messages : 72
    Points : 95
    Points
    95
    Par défaut
    Bonsoir,

    En complément des réponses qui t'ont été faites (à mon avis à juste titre) sur les capacités de 4D à répondre à la majeure partie de tes problèmes, ce que tu demandes ci-dessous est tout à fait réalisable (voir le code exemple juste après)

    Citation Envoyé par lolingman Voir le message
    je pensais que cela était possible car a l'initialisation, un pointeur est (ce que recherche à reproduire) nul (cad Nil($pointeur)->vrai).
    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
     
    C_POINTEUR(P_Null)`pointeur qui ne sera jamais valorisé
    C_ENTIER LONG(L_Valeur1;L_Valeur2)`une valeur
    TABLEAU POINTEUR(AP_pointeurs;2)`un tableau de pointeurs
     
    `2 valeurs quelconques
    L_Valeur1:=12
    L_Valeur2:=15
     
    `Affectation au tableau des pointeurs vers les 2 variables
    AP_pointeurs{1}:=->L_Valeur1
    AP_pointeurs{2}:=->L_Valeur2
     
    `A ce stade les 2 lignes du tableau de pointeur pointent vers quelque chose
     
    AP_pointeurs{1}:=P_Null
     
    `La première ligne du tableau ne pointe plus vers rien ... donc Null
    $PointeurNull:=Nil(AP_pointeurs{1})
    `Ici, on a bien $PointeurNull qui est égal à vrai.
    Même si finalement tu ne t'en sers plus, ça t'aura rassuré sur la capacité de 4D à résoudre ce problème :=))

    bon courage

    Denis

  10. #10
    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
    merci a vous : j'ai eu ma solution ^^

    bon je repasserai si j'ai un soucis
    (note que en fait il faut mettre des parentheses, mais juste avant les ->, sauf pour le premier)
    _______________
    Citation Envoyé par dans la doc
    Pendant une transaction, toutes les modifications effectuées sur les données de la base dans le process sont stockées localement dans un buffer temporaire.
    c'est exactement ce que je cherchais... j'étais en train de réinventer la roue...

    _______________
    en fait non... car j'avais oublié de préciser que j'étais en client-serveur depuis le début

Discussions similaires

  1. decouper tableau de char en 2 pars pointeur
    Par kosumo dans le forum Débuter
    Réponses: 4
    Dernier message: 12/10/2009, 11h03
  2. tableau de chaine de caractere avec pointeur
    Par Oussama1 dans le forum C++
    Réponses: 7
    Dernier message: 15/12/2008, 13h12
  3. Réponses: 6
    Dernier message: 12/09/2007, 15h58
  4. Forme du pointeur de souris sur une cellule de tableau
    Par Delphi-ne dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 30/05/2007, 11h15
  5. Réponses: 6
    Dernier message: 12/10/2003, 14h57

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