Question de block imbriqué | |
Rockyboa | 23-Nov-2007/4:37:18+1:00 |
Bonjour, Je crois que je suis un peu perdu lorsqu'il sagit d'imbriquer des block Soit le code a: [ a1 none a2 none ] b: [ b1 none b2 [ ] ] bs: [ ] a/a1: "rouge" a/a2: "large" append/only b/b2 copy a b/b1: "stylo" append/only bs copy b a/a1: "bleu" a/a2: "fin" append/only b/b2 copy a b/b1: "crayon" append/only bs copy b Je n'esperais pas trouver dans bs/1 et dans bs/2 les deux même block de type a. Est-ce ma declaration du block b qui ne convient pas? Martin | |
guest2 | 23-Nov-2007/18:53:19+1:00 |
je ne suis pas certain de comprendre le problème. essaye avec 2 (copy/deep b) | |
guest2 | 23-Nov-2007/19:23:32+1:00 |
Si ça ne résoud pas ton problème, donne nous plutôt la structure complète que tu veux obtenir dans ton exemple. | |
Rockyboa | 26-Nov-2007/2:13:21+1:00 |
Ca résoud partiellement le probleme si je fait un copy/deep sur mes block b dans bs. Pour essayer de donner un exemple plus concret, disons que le block b represente un client avec des factures, et le block est le detail facure, donc bs est le block qui contient des clients et leurs factures. facture: [ no_facture none montant_facture none ] client: [ no_client none factures_client [ ] ] clients: [ ] Mon probleme c'est quand j'atoute des factures elles s'ajoutent dans tous les clients. facture/no_facture: "A000012" facture/montant_facure: $3.30 append/only client/factures_client copy facture client/no_client: 1234 append/only clients copy/deep client facture/no_facture: "A000013" facture/montant_facure: $43.40 append/only client/factures_client copy facture client/no_client: 1235 append/only clients copy/deep client Je me retrouve avec deux factures pour le client 1235, Je m'attendais a avoir seulement la facture "A000013"!! On dirait bien que c'est déclaration de block ressemble a des pointeurs implicites, j'essaie juste de comprendre la méchanique en dessous de tous ca! Une fois un copy/deep fait sur un client, est-il possible d'y ajouter des clients? Merci Martin | |
shadwolf | 1-Dec-2007/3:46:56+1:00 |
normalement tu devrais trouver les réponses a tes problèmes ici http://www.rebol.com/docs/core-fr/fr-rebolcore-10.html (make est ton ami ^^) | |
shadwolf | 1-Dec-2007/4:27:28+1:00 |
et la tu me dis je comprends rien A l'aide!!! bon alors c tres simple en fait les données de ta liste prenne toute la forme de ta derniere modification car tu insert dans ta liste non pas un clone de l'objet! mais un pointeur vers l'object! initial .... donc toutes modificiation du contenu initial influence tout le monde donc on a 2 object! la premiere fase consiste simplement a déclarer les "modeles" des ces objects FAse 1: Déclaratiion des modèle des object facture_obj: make object! [ num: none! montant: none! ] client_obj: make object! [num: none! factures: []] La fase 2 consite a crée tes variables clonant la structure de tes 2 object! Fase 2: Clonage des structure d'object! facture: make facture_obj [] ; le [] ici c pour dire que tu fourni pas d'infos dans le contenant c la structure telquelle à été crée evidement si tu met [ "F0001" "3140.00"] tu vas remplir les champs automatiquement avec les données passées. client: make client_obj [] Fase 3 --- REmplissage des conteneur facture/num: "F0001" facture/montant: "12.22" client/num: "C0001" pour la liste des facture c'est assez simple insert client/factures facture on veux inserer une 2eme facture on reprend notre variable facture on la réinitialise on la rempli avec les nouvelle valeure et on la stock dans client/factures facture: make facture_obj [] facture/num: "F0002" facture/montant: "134.40" insert client/factures facture pour vérifier le contenu de client/factures on fait: probe client/factures si tu veux que la nouvelle enttrée arrive en fin de la liste des factures tu fait insert tail client/factures facture la preuve que ca marche : >> facture_obj: make object! [ num: none! montant: none! ] >> client_obj: make object! [num: none! factures: []] >> client: make client_obj [] >> facture: make facture_obj [] >> facture: make facture_obj [] >> facture/num: "F0001" == "F0001" >> facture/montant: "12.22" == "12.22" >> client/num: "C0001" == "C0001" >> insert client/factures facture == [] >> facture: make facture_obj [] >> facture/num: "F0002" == "F0002" >> facture/montant: "134.40" == "134.40" >> insert client/factures facture == [make object! [ num: "F0001" montant: "12.22" ]] >> probe client/factures [make object! [ num: "F0002" montant: "134.40" ] make object! [ num: "F0001" montant: "12.22" ]] == [make object! [ num: "F0002" montant: "134.40" ] make object! [ num: "F0001" montant: "12.22... >> Fase 5 - la consultation des données: foreach fact client/factures [ print fact/num print fact/montant print "^M" ] Pour chaque object! de type fact_obj dans la liste client/factures on ecrit a l'écran de la console rebol le contenu du champ num et du champs montant ce qui donne : >> foreach fact client/factures [ print fact/num print fact/montant print "^M" ] F0002 134.40 F0001 12.22 Voila pour stocker les clients c pareil tu initialise ton client tu le rempli tu le stock dans la liste clients et ainsi de suite. En oubliant pas de repasser a chaque fois par initialisation de ta variable(var: make var_obj [])... sinon tu retombe dans le problème que tu rencontre actuellement. ne pas repasser par la réinitalisation de la variable revient à travailler sur le même secteur mémoire. quand tu fais "var: make var_obj []" tu demandes a la VM rebol de t'allouer un nouveau secteur mémoire avec var comme pointeur. quand tu fais "insert ma_liste var" tu stock dans ta liste le secteur mémoire qui a été attribuée a ce momment là au pointeur "var". Donc si tu repasse pas par l'etape initialisation tu vas tjrs modifier le meme secteur de mémoire et ne faire qu'ajouter encore et encore des pointeurs vers ce même segment de mémoire du coup toutes les données figurant dans ta liste contiendrons les données issues de la derniere modificiation. Si tu as voulu faire 20 entrées tu obtient donc 20 fois la dernieres entrées de données dans ta liste ... | |
shadwolf | 1-Dec-2007/4:27:40+1:00 |
et la tu me dis je comprends rien A l'aide!!! bon alors c tres simple en fait les données de ta liste prenne toute la forme de ta derniere modification car tu insert dans ta liste non pas un clone de l'objet! mais un pointeur vers l'object! initial .... donc toutes modificiation du contenu initial influence tout le monde donc on a 2 object! la premiere fase consiste simplement a déclarer les "modeles" des ces objects FAse 1: Déclaratiion des modèle des object facture_obj: make object! [ num: none! montant: none! ] client_obj: make object! [num: none! factures: []] La fase 2 consite a crée tes variables clonant la structure de tes 2 object! Fase 2: Clonage des structure d'object! facture: make facture_obj [] ; le [] ici c pour dire que tu fourni pas d'infos dans le contenant c la structure telquelle à été crée evidement si tu met [ "F0001" "3140.00"] tu vas remplir les champs automatiquement avec les données passées. client: make client_obj [] Fase 3 --- REmplissage des conteneur facture/num: "F0001" facture/montant: "12.22" client/num: "C0001" pour la liste des facture c'est assez simple insert client/factures facture on veux inserer une 2eme facture on reprend notre variable facture on la réinitialise on la rempli avec les nouvelle valeure et on la stock dans client/factures facture: make facture_obj [] facture/num: "F0002" facture/montant: "134.40" insert client/factures facture pour vérifier le contenu de client/factures on fait: probe client/factures si tu veux que la nouvelle enttrée arrive en fin de la liste des factures tu fait insert tail client/factures facture la preuve que ca marche : >> facture_obj: make object! [ num: none! montant: none! ] >> client_obj: make object! [num: none! factures: []] >> client: make client_obj [] >> facture: make facture_obj [] >> facture: make facture_obj [] >> facture/num: "F0001" == "F0001" >> facture/montant: "12.22" == "12.22" >> client/num: "C0001" == "C0001" >> insert client/factures facture == [] >> facture: make facture_obj [] >> facture/num: "F0002" == "F0002" >> facture/montant: "134.40" == "134.40" >> insert client/factures facture == [make object! [ num: "F0001" montant: "12.22" ]] >> probe client/factures [make object! [ num: "F0002" montant: "134.40" ] make object! [ num: "F0001" montant: "12.22" ]] == [make object! [ num: "F0002" montant: "134.40" ] make object! [ num: "F0001" montant: "12.22... >> Fase 5 - la consultation des données: foreach fact client/factures [ print fact/num print fact/montant print "^M" ] Pour chaque object! de type fact_obj dans la liste client/factures on ecrit a l'écran de la console rebol le contenu du champ num et du champs montant ce qui donne : >> foreach fact client/factures [ print fact/num print fact/montant print "^M" ] F0002 134.40 F0001 12.22 Voila pour stocker les clients c pareil tu initialise ton client tu le rempli tu le stock dans la liste clients et ainsi de suite. En oubliant pas de repasser a chaque fois par initialisation de ta variable(var: make var_obj [])... sinon tu retombe dans le problème que tu rencontre actuellement. ne pas repasser par la réinitalisation de la variable revient à travailler sur le même secteur mémoire. quand tu fais "var: make var_obj []" tu demandes a la VM rebol de t'allouer un nouveau secteur mémoire avec var comme pointeur. quand tu fais "insert ma_liste var" tu stock dans ta liste le secteur mémoire qui a été attribuée a ce momment là au pointeur "var". Donc si tu repasse pas par l'etape initialisation tu vas tjrs modifier le meme secteur de mémoire et ne faire qu'ajouter encore et encore des pointeurs vers ce même segment de mémoire du coup toutes les données figurant dans ta liste contiendrons les données issues de la derniere modificiation. Si tu as voulu faire 20 entrées tu obtient donc 20 fois la dernieres entrées de données dans ta liste ... | |
shadwolf | 1-Dec-2007/4:29:19+1:00 |
doube post pardon j'ai eu un message d'erreur .... | |
shadwolf | 1-Dec-2007/10:22:34+1:00 |
soit dit en passant :facture: make facture_obj [] facture/num: "F0002" facture/montant: "134.40 peut s'optimiser par une seule ligne facture: make facture_obj [ "F0002" "134.40" ] si tu veux rendre ca dynamique: facture: make facture_obj compose [ var_exter1 var_exter2] ou var_exter1 et var_exter2 peuvent par example etre les champs texte d'une fenetre de saisie vid. Bonne méditation ^^ | |
Login required to Post. |