Toute question d'un PROFI à un SUPER PROFI - 1. - page 3

 
Sainte simplicité (c) Jan Hus
 
Sorento:
Sainte simplicité (c) Jan Hus

Qu'est-ce que tu veux dire ?
 
drknn:

Qu'est-ce que tu veux dire ?

Ce n'est pas si simple.

maintenant dans la fonction - travaillez avec la variable passée.

Comme les mathématiques nous l'enseignent - si vous avez passé une pseudo-variable par l'adresse - toutes les merveilles qu'elle contient ont disparu.

Mais si le pool d'adresses est aligné avec des constantes - tout sera différent.

0 devient 1 et vice versa.

;)

 
Pourquoi auriez-vous besoin de telles complications dans un EA/indicateur/script, comme le passage d'une variable par adresse ? Qu'entendez-vous par les termes : pseudo-variable, pool d'adresses et alignement constant ?
 
drknn:
Pourquoi avez-vous besoin de telles complexités dans un EA/indicateur/script, comme passer une variable par adresse ? Qu'entendez-vous par les termes : pseudo-variable, pool d'adresses et alignement constant ?

Les compilateurs et les interprètes sont similaires.

Alors, pensez-y.

Comment les paramètres (variables) sont-ils transmis à une fonction, et si une expression est transmise à une fonction...

;)

 
Sorento:

Je partage également mes doutes.

Je ne prétends pas être un super-professionnel, je n'atteins pas le niveau d'un pro - personne ne lit les messages... c'est clair comme de l'eau de roche.

Mais plus j'écris du code (pas beaucoup jusqu'à présent) - une question se pose :

Comment les paramètres sont-ils transmis dans les fonctions ?

(par nom ou par valeur ?)

J'ai l'impression que les variables de type chaîne deviennent instables lorsqu'on les passe...

;)


Bien que je ne me considère pas comme un pro ou un super pro, mais je vais essayer de répondre :).

MT est implémenté en C2C++ et les développeurs ont recommandé de consulter les normes de ce langage en cas d'incertitude.

Selon la norme C2C++, tous les paramètres, à l'exception des tableaux, sont transmis par valeur, y compris les expressions. C'est-à-dire que des copies de paramètres sont transmises : la modification d'un paramètre transmis par valeur dans une fonction appelée n'entraîne pas la modification du paramètre dans la fonction appelante externe. Si la modification est nécessaire, elle doit être transmise par référence (par adresse) - c'est-à-dire que l'on transmet l'adresse à laquelle se trouve la variable passée en paramètre. Alors la valeur située à cette adresse peut être modifiée, l'adresse ne peut pas être modifiée. Tous les tableaux sont transmis par référence, c'est-à-dire que les adresses sont transmises immédiatement : sinon, une énorme quantité de données devrait être copiée sur la pile.

Pour empêcher qu'un paramètre passé par référence soit modifié dans la fonction appelée, C/C++ utilise le modificateur const.

Dans C2C++, les chaînes de caractères sont des tableaux de caractères, à une différence près : un tel tableau doit se terminer par le terminateur de chaîne '\0'.

En MCL, une chaîne est une structure contenant la taille et le pointeur de la chaîne (c'est-à-dire le tableau de chaînes lui-même), si l'on en croit les exemples.

Cet exemple est pour C2C++ :

//----
struct MqlStr
  {
   int               len;
   char             *string;
  };

Ici, char * est un pointeur vers une variable de type caractère (type char). Le type de pointeur lui-même (char*, int*, double*.......) est toujours un entier - c'est une adresse de cellule. Cela signifie que la variable ne stocke pas une chaîne de caractères, mais une adresse de cellule. La valeur du caractère lui-même peut être récupérée comme suit : *chaîne ou chaîne[0]. Pour fonctionner, nous devons toujours allouer de la mémoire pour un tableau s'il n'est pas placé statiquement, c'est-à-dire si sa taille n'est pas spécifiée dans la description, par exemple, comme ceci

char string[1025] ;

est un tableau de caractères, de 1025 éléments.... Si le dernier caractère (string[1024]='\0'), le tableau peut être traité comme une chaîne de 1024 caractères.

Les éléments de la chaîne peuvent être reçus comme des éléments du tableau habituel string[i]. Lors d'un placement dynamique, une chaîne se voit attribuer + 1 élément et le dernier caractère de la fin de la chaîne est.......

Par conséquent, la chaîne est toujours transmise par référence. L'interdiction de la modifier dépend de l'implémentation de l'ICL et peut être vérifiée à l'aide d'un exemple : passer une chaîne de caractères à une fonction, y changer la valeur et la lire (cette valeur) après la fin de la fonction appelée.

Bonne chance.

 
VladislavVG:

Par conséquent, la chaîne est toujours transmise par référence. La possibilité de les modifier dépend de l'implémentation de la MCL et peut être vérifiée à l'aide d'un exemple : passer une chaîne de caractères à une fonction, modifier la valeur à cet endroit et la lire (cette valeur) une fois la fonction appelée terminée.

La modification n'est pas interdite. Vérifié.
 
drknn:

Oh, des conneries. Ce doit être une question pour les développeurs, ou bien tout ne va pas bien dans la DLL. Je ne suis pas un programmeur C++ - j'ai essayé de faire quelques programmes une fois, et j'ai découvert que tant que vous avez un shell C++ installé, tout fonctionne. Mais dès que vous transférez l'exécutable sur un autre ordinateur, dès que vous découvrez l'absence de certaines dll-cycle. Je n'aime pas non plus travailler avec des cordes. J'ai abandonné ce langage et me suis installé sur Delphi. Peut-être que vous pouvez essayer de faire votre dll dessus - de telles dll sont tout à fait normales avec le terminal...

P.S.

Donc, je ne comprends pas pourquoi tout le monde loue autant le C++, si même au niveau du choix d'un shell pour la programmation des problèmes se posent avec ce langage....

Le problème est que toutes les bibliothèques et tous les scripts utilisant ces bibliothèques fonctionnent bien si vous les chargez manuellement sur un graphique. Ils fonctionnent également si vous les chargez sur le graphique de manière programmatique à partir du processus en cours.

Le problème se pose lorsque vous les chargez à partir d'un processus distant.

=====================================

Concernant le transfert du code sur un autre ordinateur. Vous avez probablement migré une version du débogueur. Il tire les bibliothèques de débogage de Studio. Vous auriez dû compiler la version. Alors tout aurait fonctionné partout.

 
J'ai eu tort de l'appeler par analogie.
 
TheXpert:
J'ai eu tort de l'appeler par analogie.

Bien. J'ai même cligné des yeux aux termes du titre de ce fil de discussion - je n'avais pas remarqué que les noms étaient différents - mon attention était déjà portée sur un modèle particulier.