Erreurs, bugs, questions - page 2690

 
Nikolai Semko:

Je n'y vois aucune logique.
Pour les types simples, tout d'abord, vous pouvez le faire :

Deuxièmement, ça l'est :

et il n'y a pas que des béquilles.

résultat dans les deux cas :

17*256+92=4444

La logique est que si vous pouvez écrire des données dans un tableau pour des structures dans une fonction, il devrait en être de même pour des types simples.

Ok, la situation ici est assez simple.

 
Aliaksandr Hryshyn:

La logique est que si les données peuvent être écrites dans un tableau pour les structures dans une fonction, il devrait en être de même pour les types simples.

J'aimerais confirmer cette logique par autre chose que votre opinion.

Google "C# struct to byte array" si vous êtes intéressé.

Notez que le C# est une invention de Microsoft pour tous les non-programmeurs, et ce qui dans MQL est fait en quelques lignes, dans C#, en fait, n'est tout simplement pas prévu - dans les exemples googlés, tout est fait via Marshal, et c'est un travail avec du code non géré, c'est-à-dire en dehors de .Net - en termes de MQL - "c'est un appel .dll".


c'est comme ça que c'est logique...

 
Igor Makanu:

J'aimerais confirmer cette logique par autre chose que votre opinion.

Google "C# struct to byte array" si vous êtes intéressé.

Notez que C# est une invention de Microsoft pour tous les non-programmeurs, et ce qui en MQL est fait en quelques lignes, en C#, en fait, n'est tout simplement pas prévu - dans les exemples googlés tout est fait via Marshal, et c'est le travail avec du code non géré, c'est-à-dire, c'est en dehors de .Net - en termes MQL - "c'est un appel d'un .dll".


C'est aussi logique que ça...

Il y a beaucoup de ça là-dedans :

BinaryWriter.Write Method

Beaucoup de méthodes surchargées :

Write(UInt64)   
Write(UInt32)   
Write(UInt16)
.....
 
Aliaksandr Hryshyn:

Ça existe :

Beaucoup de méthodes surchargées :

https://metanit.com/sharp/tutorial/5.6.php

C'est analogue au travail avec des fichiers dans MQL avec l'indicateur FILE_BIN.

Si je ne me trompe pas, vous ne voulez pas travailler avec des fichiers, mais simplement sérialiser un type de données simple dans un tableau d'octets.

 
Igor Makanu:

https://metanit.com/sharp/tutorial/5.6.php

C'est analogue au travail avec des fichiers dans MQL avec l'indicateur FILE_BIN.

Si je ne me trompe pas, vous souhaitez sérialiser un type de données simple dans un tableau d'octets.

FileStream

MemoryStream

Tant les fichiers que la mémoire.

Pourquoi avez-vous une telle aversion pour le C# :) ?
 
Aliaksandr Hryshyn:

FileStream

MemoryStream

Tant les fichiers que la mémoire.

Pourquoi avez-vous une telle aversion pour le C# :) ?

À propos de l'hostilité que vous avez inventée, j'ai juste écrit que le langage est destiné aux non-programmeurs, ce qui correspond à un langage très convivial pour l'utilisateur, pour être précis

sur les flux de fichiers, vous avez rendu une tâche simple assez compliquée.

L'essence de ma question est que MQL est un langage très avancé en termes de traitement de "données brutes", un exemple de plus - MQL n'a pas d'alignement de structure par défaut, c'est pratique pour les utilisateurs.

 
Igor Makanu:

À propos de l'hostilité que vous avez inventée, j'ai juste écrit que le langage est destiné aux non-programmeurs, ce qui correspond à un langage très convivial, pour être précis...

sur les flux de fichiers, vous avez rendu une tâche simple assez compliquée.

L'essence de ma question est que MQL est un langage très avancé en termes de traitement des "données brutes", un autre exemple - MQL n'a pas d'alignement de structure par défaut, c'est pratique pour les utilisateurs.

Il y a un analogue d'un flux de fichiers uniquement dans la RAM.
 
Aliaksandr Hryshyn:
Il existe un analogue du flux de fichiers uniquement en RAM.

La plupart des types simples peuvent être convertis en octets de cette manière :

void OnStart()
{
   int i_value = 123456;
   uchar arr_byte[4];
   arr_byte[0] = (uchar)(i_value & 0x000000FF);
   arr_byte[1] = (uchar)((i_value & 0x0000FF00) >> 8);
   arr_byte[2] = (uchar)((i_value & 0x00FF0000) >> 16);
   arr_byte[3] = (uchar)((i_value & 0xFF000000) >> 32);
   ArrayPrint(arr_byte);

// проверим собрав обратно из байт int

   union _int
   {
      int i;
      uchar c[sizeof(int)];
   } ui;
   ArrayCopy(ui.c, arr_byte);
   Print(ui.i);
}

ce code (première partie) devrait fonctionner en C# également, en tout cas je n'ai jamais eu de problèmes avec les types entiers, il semble que la variante #3 soit déjà en place

vous pouvez envelopper mon code dans une boucle pour le rendre un peu plus compact

UPD :

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int i_value = 123456;
            uint mask = 0x000000FF;
            byte[] arr_byte = new byte[4];
            for(int i=0; i<4; i++)
            {
                arr_byte[i] = (byte)((i_value & mask) >> i*8);
                mask <<= 8;
                Console.WriteLine(arr_byte[i]);
            }
            Console.ReadLine();
        }
    }
}
 
Igor Makanu:

Notez que le C# est l'invention de Microsoft pour tous les non-programmeurs, et ce qui dans MQL est fait en quelques lignes en C#, en fait, n'est tout simplement pas prévu pour

En effet ! Et les "non-programmeurs" ne savent pas, pour une raison quelconque, que c'est "non prévu".
Dossiers :
 
Igor Makanu:

La plupart des types simples peuvent être convertis en octets de cette manière :

ce code (première partie) devrait fonctionner en C# aussi, en tout cas je n'ai jamais eu de problèmes avec les types entiers, il semble que la variante #3 soit déjà en place

vous pouvez envelopper mon code dans une boucle pour le rendre un peu plus compact

UPD :

Je peux utiliser le syndicat aussi.

void OnStart()
  {
   uchar a[];
   UByte<int> b=0xA2F38114;
   if (b.GetArray(a))
      for (int i=0;i<sizeof(int);PrintFormat("%#x",a[i++]));
   }

template<typename T>
union UByte{
   T  val;
   uchar arr[sizeof(T)];
   T operator =(T x) {return val=x;}
   bool GetArray(uchar &mArr[]) {return ArrayCopy(mArr,arr)==sizeof(T);}
};
Raison: