Erreur d'execution tableau

Bonjour

Soit le code suivant :

<code 4D>
Si (Non(Indéfinie(ERRtPileSource)))
Si (Taille tableau(ERRtPileSource)>0)
$Test:=ERRtPileSource{1}
Si (Position($Test;$Mess)<1)
$Mess:="(Depuis “+$Test+”) "+$Mess
Fin de si
Fin de si
Fin de si

</code 4D>

Comment est il possible d’avoir une erreur d’exécution en compilé sur la 3ème ligne indiquant une erreur “Dépassement de capacité d’un tableau” ??? :expressionless:

Le code est déjà bien blindé suite à cette erreur qui n’est naturellement pas systématique

Help !

Salut Jacques. Es-tu certain que le typage du tableau est bien en texte ? Le message d’erreur est peut-être justifié mais pas le bon ?

Par exemple si en 3 tu insères tableau texte(ERRtPileSource ;1) juste pour voir si ça passe ?

Salut Jacques,
change ton code, Indéfinie + compilé + tableau = calamité, ça mène droit dans le mur.

avis perso : je n’utilise JAMAIS Indéfinie, elle devrait pas exister :mrgreen:

Bonjour,

Un tableau doit explicitement avoir été déclaré/initialisé avant de l’utiliser, y compris en compilé. La taille du tableau n’est pas cohérente auparavant.

Ce n’est pas comme une variable C_* avec laquelle on est pas forcée de passer dans du code qui la déclare en compilé.

Salut Olivier,

Quand je fouille dans mon code ce tableau est toujours déclaré en tableau texte.

Mais oui, je soupçonne aussi que ce soit le message qui n’est pas le bon…

C’est dans un appeler sur erreur, on est sans doute dans un contexte spécial pour 4D, mais je vais suivre ton conseil et ajouter un blindage de re-déclaration du tableau avec sa taille courante, pour voir…

Naturellement ça n’arrive qu’en déploiement, et pas systématiquement, donc pas de vérification rapide possible. :roll:

Je plussois.
J’utiliserais plûtot la commande “TYPE” de manière à savoir à quoi j’ai affaire.

est-ce que ta variable n’est pas retypée par hasard?

Bonjour,

Avec la notation objet, il me semble qu’elle redevient utile, pour s’assurer que monobjet.mapropriete sont bien défini.

Cordialement,

Arnaud,

Tout à fait d’accord.

C’est du blindage en recherchant le problème, l’indéfinie ne sert en fait qu’en interprété, toutes mes variables sont déclarées, ne t’inquiète pas !

Cette méthode étant appelée suite à une erreur il faut savoir que ce tableau est toujours initialisé (et vérifié) lors de la mise en place de la méthode d’erreur. Il est aussi initialisé dans les Compiler d’ouverture de process.

Et je n’efface pas les variables, d’autant moins en compilé, au pire il est avec 0 élément.

: Herve RICHON

Avec la notation objet, il me semble qu’elle redevient utile, pour
s’assurer que monobjet.mapropriete sont bien défini.

euh, non, pour cela tu as : “Type valeur” dont l’un des retour est “Est une variable indéfinie”

Bonjour,

Il m’arrive d’avoir des erreurs bizarres comme cela au bout d’un temps d’utilisation, pour moi je pense à des problème de mémoire. Cela touche les tableau, mais aussi les objet structurés comme le XML, la décompression de blobs etc…

Apres, l faut pas que le tableau soit mis à 0 dans un autre process (avec les communications de variables en process).

: Jacques FADEUILHE

il faut savoir que ce tableau est toujours initialisé (et vérifié)
lors de la mise en place de la méthode d’erreur. Il est aussi
initialisé dans les Compiler d’ouverture de process.
Je pense que tu as au moins un process où ça ne doit pas être le cas. Cette erreur est symptomatique de l’absence de déclaration en compilé.

Le test est très simple à réaliser.
Compiles une nouvelle base avec les 2 méthodes ci-dessous et exécutes la méthode test en compilé. Tu vas reproduire ton erreur

Compiler :
<code 4D>
TABLEAU TEXTE(tTexte;0)
</code 4D>

Test :
<code 4D>
ALERTE("Taille tableau : "+Chaîne(Taille tableau(tTexte)))
Si (Taille tableau(tTexte)>0)
ALERTE(tTexte{1})
Fin de si
</code 4D>

Petite précision pour mon Test, il faut exécuter la méthode Test dans un nouveau process pour avoir l’erreur.

Ton tableau est une variable process, ne faudrait-il pas copier ce tableau dans une variable locale que tu maitrises le temps de faire ton test car effectivement rien n’empêcherait que ce même tableau soit modifié ailleurs en même temps (chercher des ECRIRE VARIABLE PROCESS). C’est chaud mais c’est possible.

La question qui en découle c’est pourquoi la commande taille tableau retourne un résultat (qui plus est faux) alors que le tableau n’a pas été déclaré ?
Ou du moins en compilé le tableau devrait être par défaut vide ?

Si je rajoute ce bout de code en debut de ta méthode test:
<code 4D>
TABLEAU TEXTE($tTexte;0)
COPIER TABLEAU(tTexte;$tTexte)

</code 4D>

le tableau tTexte est comme par magie défini et sa taille retourne 0 :?: :roll:

Oui, le tableau doit avoir été initialisé, d’une manière ou d’une autre. Sinon il est inutilisable dans le process.

Tu ne comprends pas ce que je veux te dire;
La commande COPIER TABLEAU sait gérer (en compilé !) un tableau non défini correctement alors que la commande Taille tableau ne sait pas le faire…

Je ne définis PAS le tableau, regarde l’ordre de passage de mes paramètres à la commande :-?

Oui effectivement, j’avais lu trop vite et je pensais que tu faisais le COPIER TABLEAU dans l’autre sens.

Quoi qu’il en soit, la solution c’est de déclarer les tableaux process dans CHAQUE process. Ce n’est qu’à ce prix qu’on a un fonctionnement normal.

Tu décris ce qui ce passe, mais tu n’expliques rien au pourquoi de ce comportement différent en fonction des commandes de 4D; certaines savent gérer les variables indéfinies (en compilé), d’autre pas :frowning:

On peut tourner le problème dans l’autre sens. Pourquoi la commande COPIER TABLEAU ne donne pas un message d’erreur lorsque l’on passe une variable non définie en compilé ?