Hatalar, hatalar, sorular - sayfa 3011

 
A100 :

4. parametre olduğu için

İlk 3 karakteri kopyalamam gerekiyor. Tüm dizeyi kopyalamam gerekirse (sondaki 0 dahil 7 karakter), o zaman -1 belirtirdim. Ve kopyalamak kısmen imkansızsa, bu parametreye neden ihtiyaç duyulur?

Bu seçenek, alt dize olarak kaç karakter kopyalamak istediğinizi belirtmek için değildir.
ve diziye hangi boyutta karakterlerin aktarılacağını belirtmek için.
onlar. bu, iletilen verilerin boyutu için sıkı bir güvenlik denetimidir.
Bu boyuta göre dinamik dizi belleği otomatik olarak ayrılacaktır.

Bir dizeden üç öğe kopyalamanız gerekiyorsa, önce bunları dizeden almanız gerekir,
ve daha sonra ne kadar aktardığınızın boyutunu belirtirken zaten aktarın.

 
Roman :

Bu seçenek, alt dize olarak kaç karakter kopyalamak istediğinizi belirtmek için değildir.
ve diziye hangi boyutta karakterlerin aktarılacağını belirtmek için.
onlar. bu, iletilen verilerin boyutu için sıkı bir güvenlik denetimidir.
Bu boyuta göre dinamik dizi belleği otomatik olarak ayrılacaktır.

Bir dizeden üç öğe kopyalamanız gerekiyorsa, önce bunları dizeden almanız gerekir,
ve daha sonra ne kadar aktardığınızın boyutunu belirtirken zaten aktarın.

Bu doğru?

 StringToCharArray (InputText,scr, 0 , StringLen (InputText));
 
Vitaly Muzichenko :

Bu doğru?

Artı bir, sonlanan sıfırın boyutu olarak.
StringLen , sıfır hariç boyutu döndürür.

 char ch[];
string InputText = "ABCDEF" ;
int     size      =   StringLen (InputText) + 1 ;
    
StringToCharArray ( InputText, ch, 0 , size);
Print ( GetLastError ()); //0
 
Roman :

Artı bir, sonlanan sıfırın boyutu olarak.
StringLen , sıfır hariç boyutu döndürür.

Geliştiricilerden bir örnek verdim ve işe yarıyor

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Kütüphaneler: Hash fonksiyonlarının kütüphanesi ve diğer sayı sistemlerine dönüşümler

İlyas , 2021.03.04 15:12

Dizenin uzunluğunu (geçmişte) belirtmezseniz, StringToArray işlevi sonlandırıcı null değerini yakalar.

Bu nedenle, CryptDecodeA işlevinde kullanmanız gerekir.

 StringToCharArray (InputText,scr, 0 , StringLen (InputText));

yerine

 StringToCharArray (InputText,scr);

 
Vitaly Muzichenko :

Geliştiricilerden bir örnek verdim ve işe yarıyor


Bu soruda kitaplıkların kullanılması amaçlanmamıştır))
Bunlar kütüphanelerin nüanslarıdır.

 
Roman :

Artı bir, sonlanan sıfırın boyutu olarak.
StringLen , sıfır hariç boyutu döndürür.

Ve neden StringToCharArray, bir dizenin uzunluğunu dize türünden çıkaramıyor (özellikle MQL'de hesaplanması gerekmediğinden), ek bir parametre biçiminde harici yardım gerekli mi? O halde neden diğer MQL işlevlerinde bu kadar katı olduğu iddia edilen bir " sish check" kontrolü yok?

 
A100 :

Ve neden StringToCharArray, bir dizenin uzunluğunu dize türünden çıkaramıyor (özellikle MQL'de hesaplanması gerekmediğinden), ek bir parametre biçiminde harici yardım gerekli mi? Ve o halde neden diğer MQL işlevlerinde böyle bir sözde katı kontrol yoktur?

Bu soru muhtemelen artık benim için değil, geliştiriciler için.
Ancak bu parametreye göre dinamik dizi için bellek boyutu tahsis edilir.
Yani, sizin için kolaylık, dizinin hafızasını kendiniz tahsis etmemenizdir.
Artı ve doğruluğunu kontrol edin.
Ek bir boyut parametresi olan bu, sya'da güçlü güvenlik için standart bir uygulamadır.
Boyutun gerekli olmadığı diğer işlevlerde bu parametre mevcut değildir.
Genellikle bu parametre dizilerle çalışırken bellek ayırmak için kullanılır.
Bu durumda ne olur.

 
Roman :

Bu soru muhtemelen artık benim için değil, geliştiriciler için.
Ancak bu parametreye göre dinamik dizi için bellek boyutu tahsis edilir.
Yani, sizin için kolaylık, dizinin hafızasını kendiniz tahsis etmemenizdir.
Artı ve doğruluğunu kontrol edin.

Doğruluk kontrolü nedir? - burada, diyelim ki 0 belirledim - açıkçası yanlış değer

 void OnStart ()
{
     uchar ch[];
     const string text = "ABCDEF" ;
     Print ( StringToCharArray ( text, ch, 0 , 0 ));
}

Ve her şey normal şekilde kopyalandı, Sonuç: 7 - hata yok

 
A100 :

Doğruluk kontrolü nedir? - burada, diyelim ki 0 belirledim - açıkçası yanlış değer

Ve her şey normal şekilde kopyalandı, Sonuç: 7 - hata yok

İşte işlevin açıklamasındaki püf noktası))

count=- 1

[in]  Количество элементов массива для копирования. Определяет длину результатной строки. 
По умолчанию - 1 , что означает копирование до конца массива, либо до встречи терминального 0 . 
Терминальный 0 также будет скопирован в массив-приемник, при этом размер динамического массива может быть увеличен при необходимости под размер строки . 
Если размер динамического массива больше длины строки, то размер массива уменьшен не будет. 

otomatik ilerleme
ki bu kullanıcı için daha kafa karıştırıcıdır.

 
Roman :

Bu seçenek, alt dize olarak kaç karakter kopyalamak istediğinizi belirtmek için değildir.
ve diziye hangi boyutta karakterlerin aktarılacağını belirtmek için.

referans bu yorumla aynı fikirde değil.

Kopyalanacak dizi öğelerinin sayısı. Sonuç dizesinin uzunluğunu belirtir. Varsayılan -1'dir, bu, dizinin sonuna veya terminal 0 ile karşılaşılıncaya kadar kopyalama anlamına gelir.Terminal 0, hedef diziye de kopyalanır, gerekirse dinamik dizinin boyutu sığdırmak için artırılabilir. dizenin boyutu. Dinamik dizinin boyutu, dizenin uzunluğundan büyükse, dizinin boyutu küçülmez.

ders tanımı atas - diziye dizi, diziye dizi, karışıklık ve karışıklık denir

Kopyalanacak dizi öğelerinin (dizeler) sayısı. Sonuç dizesinin (dizinin) uzunluğunu belirtir. Varsayılan -1'dir; bu, dizinin (dize) sonuna veya 0 terminaliyle karşılaşılıncaya kadar kopyalama anlamına gelir.

Neden: