Hatalar, hatalar, sorular - sayfa 2703

 
template < typename T>
int CMapManager::IncreaseArraySize( T &array[] )
{

}

Bu kodun, işlevin bir değer döndürmesi gereken bir hatayla derlenmesi gerekmez mi?

 
Alexey Kozitsyn :

Bu kodun, işlevin bir değer döndürmesi gereken bir hatayla derlenmesi gerekmez mi?

meli

büyük olasılıkla bu yönteme başvurmadınız ve derleyici bu kod parçasını yürütülebilir dosyaya dahil etmedi

 
Igor Makanu :

meli

büyük olasılıkla bu yönteme başvurmadınız ve derleyici bu kod parçasını yürütülebilir dosyaya dahil etmedi

Ancak Test() işlevini aynı sınıfta tanımlar ve şöyle uygularsam:

 int CMapManager::Test()
{
        
}

Bu işleve hiçbir yerde başvurmamış olmama rağmen bir hata oluşacaktır.

 
Alexey Kozitsyn :

Ancak Test() işlevini aynı sınıfta tanımlar ve şöyle uygularsam:

Bu işleve hiçbir yerde başvurmamış olmama rağmen bir hata oluşacaktır.

çünkü bu yöntem bir şablon değil - şablon yok

bir şablon, aslında, derleyicinin işlev çağrılarını algıladığında gerekli türleri değiştireceği bir makro ikamesidir ( sınıf yöntemi )

böyle bir "ikame" ile belirli veri türlerine sahip işlevler "oluşturulacaktır"

bu nasıl çalışır

 
Igor Makanu :

çünkü bu yöntem bir şablon değil - şablon yok

bir şablon, aslında, derleyicinin işlev çağrılarını algıladığında gerekli türleri değiştireceği bir makro ikamesidir ( sınıf yöntemi )

böyle bir "ikame" ile belirli veri türlerine sahip işlevler "oluşturulacaktır"

bu nasıl çalışır

Aynen bende öyle hayal ediyorum teşekkürler. Ancak soru farklı, neden "üretim öncesi" aşamasında int değerinin döndürülmesi gerektiği bildirilmiyor?

Sonuçta, oluşturulan işlevlerden bağımsız olarak hepsi bir int değeri döndürür.

 
Alexey Kozitsyn :

Aynen bende öyle hayal ediyorum teşekkürler. Ancak soru farklı, neden "üretim öncesi" aşamasında int değerinin döndürülmesi gerektiği bildirilmiyor?

Sonuçta, oluşturulan işlevlerden bağımsız olarak hepsi bir int değeri döndürür.

ikinci koşuya gittik - aynı soruyu aynı cevaplarla cevaplayacağız)))

arama yok - şablon uygulaması yok, işte bu - bu şekilde çalışır - bu kadar

)))

betiği yaz ve kontrol et

bunun gibi:

 template < typename T>
T add(T a, T b)
{
   // return(a+b);
}
//+------------------------------------------------------------------+
void OnStart ()
{
   Print ( "start" );
   // Print(add(1.0 , 2.0));

}

bu şekilde derler, ardından yorumları açın - hatalar olacak

 

Bir yerde bir şeyi kaçırdım, genel olarak bu kodda bir yakalama arıyorum:

 struct SMatrix
{
   SMatrix(){}
   SMatrix( int rows, int cols){ ArrayResize ( this .ROW,rows); for ( int i= 0 ;i<rows; i++) ArrayResize ( this .ROW[i].COL,cols); }
   struct SRow{ float COL[];};
   SRow ROW[];
};

//+------------------------------------------------------------------+
void OnStart ()
{
   SMatrix matrixA( 10 , 2 );
   int count = 0 ;
   for ( int i = 0 ;i< 10 ;i++)
   {
       for ( int j= 0 ;j< 2 ;j++) matrixA.ROW[i].COL[j] = ( float )count++; 
   }
   
   SMatrix matrixB = matrixA;
   for ( int i= 0 ;i< 10 ;i++)
   {
       ArrayPrint (matrixB.ROW[i].COL);
   }
}

2020.04.12 01:40:16.652 tst (EURUSD,H1) 0.00000 1.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 2.00000 3.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 4.00000 5.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 6.00000 7.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 8.00000 9.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 10.00000 11.000000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 120000 13.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 14.000000 15.000000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 16.00000 17.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 18.0000 19.00000


iki boyutlu bir dizi oluşturmanın bu kadar kolay olması ve bir kopya oluşturucu açıklaması olmadan atamanın kutudan çıktığı gibi çalışması utanç verici

kodumda ne yanlış çalışabilir?

 

AYRILMAK YASAKTIR!

 

Her ihtimale karşı, soracağım, StringToCharArray işlevinin baytları dönüştürmeden kopyalamasını sağlamanın bir yolu var mı? Tüm CP_XXX denendi, hiçbiri genel olarak "1'e 1" kopya sağlamaz. İşte bir örnek:

 void OnStart ()
{
   uchar buffer[];
   string data = " test" ;
   StringSetCharacter (data, 0 , 0x81 ); // just an example, can be obtained in other ways
   StringToCharArray (data, buffer);
   // buffer[0] = (uchar)data[0];     // correct/direct copy
   ArrayPrint (buffer);
}

0x81 baytı almanın yolu farklı olabilir, burada basitlik için "alnına" ayarlanmıştır. El ile bayt bayt kopyalama kullanmazsanız (yorumlanan satırda olduğu gibi), StringToCharArray işlevi bayt 129'u (0x81) 63'e dönüştürür.

Şimdiye kadar StringToCharArray'i bir döngü ile değiştirmek zorunda kaldım, ama belki gizli bir CP_XXX var?

 
Stanislav Korotky :

Her ihtimale karşı, soracağım, StringToCharArray işlevinin baytları dönüştürmeden kopyalamasını sağlamanın bir yolu var mı? Tüm CP_XXX denendi, hiçbiri genel olarak "1'e 1" kopya sağlamaz. İşte bir örnek:

0x81 baytı almanın yolu farklı olabilir, burada basitlik için "alnına" ayarlanmıştır. El ile bayt bayt kopyalama kullanmazsanız (yorumlanan satırda olduğu gibi), StringToCharArray işlevi bayt 129'u (0x81) 63'e dönüştürür.

Şimdiye kadar StringToCharArray'i bir döngü ile değiştirmek zorunda kaldım, ama belki de gizli bir CP_XXX var mı?

 void OnStart ()
{
   uchar buffer[];
   string data = CharToString ( 0x81 ) + " test" ;
   StringToCharArray (data, buffer, 0 , StringLen (data));
   ArrayPrint (buffer);
}

2020.04.12 15:57:37.812 tst1 (EURUSD,H1) 129 32 116 101 115 116