Hatalar, hatalar, sorular - sayfa 2461

 
fxsaber :

Bu fikri detaylandırabilir misiniz?

Benim subjektif görüşüm aşağıdadır, bir yerde yanılıyorsam seve seve yardımcı olurum.


StringLen, dizedeki ilk NULL karaktere (0x0000) kadar O(n) çalıştırırdı, şimdi O(1) çalıştırıyor.
Dizenin uzunluğu her zaman StringSetCharacter(str, pos, 0x00) aracılığıyla kesilebilir, ancak bir nedenden dolayı StringSetLength'i sunarlar.

Büyük olasılıkla, dizelerle çalışırken kodu hızlandırma sorununu çözdüler.
Hızlandırma görevi çözüldü, ancak işlevselliğin yarısının artık dizedeki NULL karakterlerle çalıştığı ve diğerinin çalışmadığı gerçeği - kimsenin umurunda değil.

 #define PRINT(x) Print ( #x, ":" , string (x))

void OnStart (){  
   string str = "123456789" ;
   PRINT(str);
   PRINT( StringLen (str));
   
   PRINT( StringSetCharacter (str, 7 , 0x00 ));
   PRINT( StringLen (str));
   
   str += "\x00" + str;
   PRINT( StringLen (str));
   
   str += str;
   PRINT(str);
   PRINT( StringLen (str));
   
   ushort array[];
   PRINT( StringToShortArray (str, array));
   ArrayPrint (array);
   
   PRINT( StringLen (str));
   PRINT( StringLen ( ShortArrayToString (array)));
   PRINT( StringLen ( ShortArrayToString (array, 0 , StringLen (str))));
} 

Sonuç:

 2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)      str: 123456789
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen (str): 9
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringSetCharacter (str, 7 , 0x00 ): true
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen (str): 7
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen (str): 15
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)      str: 1234567
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen (str): 30
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringToShortArray (str,array): 31
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       49 50 51 52 53 54 55    0 49 50 51 52 53 54 55 49 50 51 52 53 54 55    0 49 50 51 52 53 54 55    0
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen (str): 30
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen ( ShortArrayToString (array)): 7
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen ( ShortArrayToString (array, 0 , StringLen (str))): 7
 
Sergey Dzyublik :

Benim subjektif görüşüm aşağıdadır, bir yerde yanılıyorsam seve seve yardımcı olurum.


StringLen, dizedeki ilk NULL karaktere (0x0000) kadar O(n) çalıştırırdı, şimdi O(1) çalıştırıyor.
Dizenin uzunluğu her zaman StringSetCharacter(str, pos, 0x00) aracılığıyla kesilebilir, ancak bir nedenden dolayı StringSetLength'i sunarlar.

Büyük olasılıkla, dizelerle çalışırken kodu hızlandırma sorununu çözdüler.
Hızlandırma görevi çözüldü, ancak işlevselliğin yarısının artık dizedeki NULL karakterlerle çalıştığı ve diğerinin çalışmadığı gerçeği - kimsenin umurunda değil.


Sonuç:

Lütfen duygularınıza hakim olun.
Bir dahaki sefere küfür imalarını yasaklamanız gerekecek - burada bir meyhanede değiliz. Evet ve bir meyhanede - artık küfür etmek moda değil.
 
Sergey Dzyublik :

StringLen, dizedeki ilk NULL karaktere (0x0000) kadar O(n) çalıştırırdı, şimdi O(1) çalıştırıyor

Hataları kısmen düzelttik ... neden olmasın!? Hafızamda StringLen her zaman doğru çalıştı (en azından x32'de)
 
Sergey Dzyublik :
Geliştiriciler:
Lütfen varsayılan olarak atama operatörü (kopyalama oluşturucu) için zorunlu kod oluşturma özelliğini ekleyin:

Bir şey bir şekilde zor. Varsayılan kurucu ile benzer şekilde daha kolay:

1) herhangi bir atama operatörü, varsayılan atama operatörünü geçersiz kılar

2) herhangi bir kopya ifadesi, varsayılan kopya ifadesini geçersiz kılar

 
A100 :
Hataları kısmen düzelttik ... neden olmasın!?

MQL'nin NULL karakterli dizelerle çalışırken tutarlı bir fikri olmadığı için sorun budur.
Örneğin, StringToShortArray, bir dizedeki NULL karakterleri destekler ve onun ters işlevi ShortArrayToString artık mevcut değildir...

Sonuç olarak, belirli sorunları çözmekten çok, hataları yakalamak ve geçici çözümler aramak için daha fazla zaman harcanır.

 
A100 :

Bir şey bir şekilde zor. Varsayılan kurucu ile benzer şekilde daha kolay:

1) herhangi bir atama operatörü, varsayılan atama operatörünü geçersiz kılar

2) herhangi bir kopya ifadesi, varsayılan kopya ifadesini geçersiz kılar

Bir iptale ihtiyacım yok, tam tersine zorunlu bir nesile ihtiyacım var.
MQL'de karmaşık türlerin derin kopyalanması için herhangi bir işlevsellik yoktur ve bunlar varsayılan olarak atama operatöründe ve kopya oluşturucuda uygulanır.

 
Sergey Dzyublik :

MQL'nin NULL karakterli dizelerle çalışırken tutarlı bir fikri olmadığı için sorun budur.
Örneğin, StringToShortArray, bir dizedeki NULL karakterleri destekler ve onun ters işlevi ShortArrayToString artık mevcut değildir...

Bir yandan, evet, diğer yandan, bu, Belgelerde açıkça belirtilmiştir: "ya terminal 0 karşılanana kadar"

 
Sergey Dzyublik :
Olduğu gibi, başlangıçta boş dizelerin neden artılardan sürüklendiği açık değildi.
 
A100 :

Bir yandan, evet, diğer yandan bu, Belgelerde açıkça belirtilmiştir (ki değil)

Ve aynısı StringToShortArray içinde yazılmıştır:

 Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию - 1 , что означает копирование до конца массива, либо до встречи терминального 0 .

Ancak bu, bir dizedeki NULL karakterleri yeterince işlemesini engellemez.

 
Merhaba. MT5'in mobil versiyonu Alpari brokerine bağlanmıyor. Sorun ne? Bu ne zaman düzeltilecek?