Erreurs, bugs, questions - page 2870

 
A100:

Quelle est la différence entre (1) et (2) ? Chers développeurs - peut-être que Roman a raison et que maintenant typename renvoie le type ?

Je pense que c'est plus proche d'une macro

 
A100:

Les développeurs ont mis une description du typename avec un exemple dans cette section. Lisez jusqu'au bout et vous trouverez ce paragraphe et cet exemple

Vous voyez, cette section de la documentation concerne les modèles.
Les modèles n'ont rien à voir avec ces exemples.
typename est identique à obtenir sizeof

#define   A '+'

void OnStart()
{
   Print(sizeof(A));
   Print(typename(A));
   Print(sizeof("string"));
   Print(typename("string"));
}
2020.10.09 02:20:21.917 TestScript (MNQZ20,M1)  2
2020.10.09 02:20:21.917 TestScript (MNQZ20,M1)  ushort
2020.10.09 02:20:21.917 TestScript (MNQZ20,M1)  12
2020.10.09 02:20:21.917 TestScript (MNQZ20,M1)  string
 
Roman:

Comprenez que cette section de la documentation concerne les modèles.
Les templates n'ont rien à voir avec ces exemples.
typename revient à obtenir sizeof

La documentation indique :Pour créer des moyens génériques de gérer différents types de données, le mot-clétypename doitêtre utilisépour obtenir le type de l'argument sous forme de chaîne.

Où se trouve le mot typename dans cette phrase ? Je ne le vois pas ? Oui... L'exemple de modèle. Attendez-vous des développeurs qu'ils vous donnent des exemples pour toutes les occasions ?

 
A100:

La documentation indique :Pour créer des moyens universels de travailler avec différents types de données, vous devez utiliser le mot-clé typenamepour obtenir le type de l'argument sous forme de chaîne.

Où se trouve le mot typename dans cette phrase ? Je ne le vois pas ? Oui... L'exemple de modèle. Vous attendez-vous à ce que les développeurs vous donnent des exemples pour toutes les occasions ?

Nous ne créons rien dans ce cas, nous obtenons simplement leurs noms à partir des types.
Éloignez-vous des modèles. Et la documentation pour le modèle.
Voyez-vous le résultat de l'impression ? De quoi d'autre avez-vous besoin ?
Honnêtement, je ne comprends pas votre malentendu.

 
Roman:

Dans ce cas, nous ne créons rien, nous obtenons leurs noms à partir des types.
Éloignez-vous des modèles. Et la documentation pour le modèle.
Voyez-vous le résultat de l'impression ? De quoi d'autre avez-vous besoin ?

Voyez-vous le résultat de cette impression ?

void OnStart()
{
    Print("ushort");
}

Résultat : ushort

Alors, "ushort" est-il un type ? Et cette entrée est normale selon vous ?

void OnStart()
{
    "ushort" ch = '+';
}
Non, ce n'est pas un type, c'est une chaîne de caractères. Print ne permet pas d'imprimer les types - PrintFormat ne dispose pas d'un tel format. Il imprime les chaînes de caractères, les chiffres, les symboles, mais pas les types.
 
A100:

Pouvez-vous voir le résultat de cette impression ?

Résultat : ushort

Alors maintenant : "ushort" est-il un type ? Et une telle entrée est normale selon vous ?

))) Vous me surprenez.

Vous avez passé une chaîne littérale à l'imprimante et vous l'avez obtenue.
Pour obtenir un nom de type, vous utilisez le mot clé typename("ushort")
pour obtenir le nom du type string

Vous passez le type lui-même typename(string), vous obtenez la même chose.

En fait, il s'agit d'un bogue dans la documentation qui ne décrit pas comment gérer le mot-clétypename.
Il existe une description pour sizeof ettypename uniquement pour les motifs.
Bien que j'ai donné un exemple ci-dessus quetypename obtient le nom du type, tout commesizeof obtient la taille .

 
Roman:

)))) vous me surprenez.

Vous avez passé une chaîne littérale à l'imprimante, vous l'avez eue.

Donc, vous passez également une chaîne littérale à imprimer

void OnStart()
{
    Print(typename('+'));
}

Résultat : ushort

Si vous pensez le contraire après toutes les explications et l'étude de la documentation, c'est votre problème :

void OnStart()
{
    Print(short); //Error - потому что принт типы не печатает
}
 
A100:

Donc, vous avez passé un littéral de chaîne de caractères à l'impression

Résultat : ushort

Si vous pensez le contraire après avoir lu toutes les explications et la documentation, c'est votre problème.

Ai-je prétendu qu'il retournait une chaîne de caractères ?
C'est vous qui êtes devenu accro à string et Print()
Et la sortie ne sera pas une chaîne de caractères littérale, mais le type de caractère entier ushort.
De toute façon aussi, pas mon problème dans votre cognition.

 
Roman:

La sortie ne sera pas une chaîne littérale, mais le caractère entier de type ushort.

La sortie sera exactement une chaîne littérale. Ici - j'ai trouvé une preuve directe - il n'y a pas d'empreinte du tout :

int f()
{
    return typename('+'); //warning: implicit conversion from 'string' to 'number'
}
Essayez maintenant de prouver le contraire - également sans empreinte ! Naturellement, prouvez-le par un exemple, pas par des fantaisies du genre "ce n'est pas ce qui est dit dans la documentation - je le sais mieux que quiconque".
 
A100:

La sortie sera exactement une chaîne littérale. Voici la preuve qu'il n'y a pas d'empreinte du tout :

Je ne crois pas à l'avertissement du compilateur !

Le '+' n'est pas une chaîne de caractères ! C'est un type de caractère, en mql ushort 2 octets

point.

Il s'agit plus probablement d'une erreur dans la description de l'avertissement.