C dili hakkında sorular - sayfa 11

 
TheXpert :

4 veya 8 baytlık bir veri parçasına işaretçi.

boyut, hizalama nedeniyle platforma bağlıdır. pragma paketi 1 gibi bir şey kullanırsanız, boyut aynı olacaktır (muhtemelen 1 bayt)

Hala bazen VS C ++ 'a bakıyorum, asm'de listeleme modunda derliyorum ve sonra bakıyorum, çok şey netleşiyor. Evet, kulağa korkutucu geliyor ama asm mutlak gerçektir. Ve dili anlamak zor değil. doğru yazmak zor

 
Это рекурсия просто. Быстрая сортировка как раз таки и применяет рекурсивный вызов функции. О принципах, преимуществах и недостатках ее использования можете почитать в интернете. И да, это применительно к любому ЯП. В кратце скажу, что главное требование рекурсии - это то, что бы последующий вызов рекурсии приближал алгоритм к завершению. Ну и главный недостаток это требование к оперативной памяти при большое обработке данных, так как каждый вызов такой рекурсии будет блокировать память.... Простой пример с рекурсией на том же си и нахождению факториала в 2 вариациях. 
1) Рекурсия внутри 1 функции:

long long Factorial(int n){
        if(n == 1) return 1;
        return n * Factorial(n-1); // Здесь выполнил требование приближение рекурсии к завершению(то есть n стремится к 1(где исполнится условие выше))
}

2) Рекурсия между несколькими функциями:

int Fun2(int); // Прототип.
int Fun1(int i){
        if(i == -5){return i;}
        return i + Fun2(i-1);
}

int Fun2(int i){
        if(i == -5){return i;}
        return i + Fun1(i-1);
}
 
Gleb Krel :

evet teşekkür ederim .. dedikleri gibi biliyordum ama unuttum çünkü Ben bir programcı değilim ve nadiren yaparım :)

 

zamanı ve bilgisi olan varsa yardım almak isterim, bu kaynağı MQL'ye taşımak istiyorum ama std::deque ile başa çıkabileceğimden emin değilim

 #include <deque>

class net
{   std::deque< float *> w;     // весовые коэффициенты (== это образцам)
     const unsigned      n;     // количество входов сети
    
     float activation( float v) const
    {   return v>n?n:v< 0 ? 0 :v;
    }
public :
    net( unsigned numInputs):n(numInputs){}
    ~net( void )
    {   for ( unsigned i( 0 ); i<w.size();) delete [] w[i++];
    }
     unsigned learnImage( const float * const image)
    {   w.push_back( ( float *)memcpy( new float [n],image, sizeof ( float )*n) );
         return w.size();
    }
     unsigned recognizeImage( const float * const image) const
    {   float *  axons( ( float *)memset( new float [w.size()], 0 , sizeof ( float )*w.size()) );
         float    sum1(. 0 ), sum2(. 0 ), e( 0.95 f/w.size());
         unsigned i,j;

         for (i= 0 ; i < w.size(); ++i)     // цикл инициализации сети
        {   for (j= 0 ; j < n; ++j)
                axons[i] += image[j]*w[i][j];
            sum1 += axons[i] = activation( 0.5 f*(axons[i]+ float (n) ) );
        }
                
         while ( sum2 != sum1 )         // цикл пока выходы сети изменяются
        {   sum1 = 0.0 f * ( sum2 = sum1 );
             for (i= 0 ; i < w.size(); ++i)
                sum1 += axons[i] = activation( axons[i]-e*(sum2-axons[i]) );
        }
         for (i=w.size(); i!=- 1 u && !axons[i--];);     // поиск активного аксона сети 
         delete [] axons;
         return i;
    }


};



int _tmain( int argc, _TCHAR* argv[])
{   // входы можно сделать и целочисленными, роли играть не будет
     float a1[ 4 ][ 15 ] = {{ 1 ., 1 ., 1 .,   1 .,- 1 .,- 1 .,   1 .,- 1 .,- 1 .,   1 .,- 1 .,- 1 .,   1 ., 1 ., 1 .}, // символ С
                        { 1 ., 1 ., 1 .,   1 .,- 1 .,- 1 .,   1 ., 1 .,- 1 .,   1 .,- 1 .,- 1 .,   1 ., 1 ., 1 .}, // Символ E
                        { 1 ., 1 ., 1 .,   1 .,- 1 ., 1 .,   1 .,- 1 ., 1 .,   1 .,- 1 ., 1 .,   1 ., 1 ., 1 .}, // Символ О
                        { 1 ., 1 ., 1 .,   1 .,- 1 ., 1 .,   1 .,- 1 ., 1 .,   1 .,- 1 ., 1 .,   1 ., 1 ., 1 .}   // искаженный
                      };

    net n( 15 );
    n.learnImage( a1[ 0 ] );
    n.learnImage( a1[ 1 ] );    
    n.learnImage( a1[ 2 ] );
     return n.recognizeImage( a1[ 3 ] );
}


buradan alınmıştır: https://habr.com/ru/sandbox/43916/

Not: Hamming ağının diğer kaynaklarını hemen bulamadığımı googledim, diğer kaynaklara bağlantılar da memnuniyetle karşılanıyor (bunlar Hopfield ağları değil !!! - Google onları sürekli bir araya getiriyor)

 
Igor Makanu :

zamanı ve bilgisi olan varsa yardım almak isterim, bu kaynağı MQL'ye taşımak istiyorum ama std::deque ile başa çıkabileceğimden emin değilim

çift bağlantılı bir listedir. yukarıdaki kodda yalnızca push_back vardır, bu nedenle bir vektörle değiştirilme şansı vardır.

değilse, baştan ve sondan bir kenar boşluğu olan bir dizi aracılığıyla basit bir deque uygulaması yapabilirsiniz. STL'de bir şekilde uygulanmış gibi görünüyor.

 
Andrei Trukhanovich :

çift bağlantılı bir listedir. yukarıdaki kodda yalnızca push_back vardır, bu nedenle bir vektörle değiştirilme şansı vardır.

değilse, baştan ve sondan bir kenar boşluğu olan bir dizi aracılığıyla basit bir deque uygulaması yapabilirsiniz. STL'de bir şekilde uygulanmış gibi görünüyor.

std::deque hakkında googledim, yazdığınız gibi, ama ... nasıl kullanacağımı bilmiyorum, ama sadece bir vektörle değiştirin ... genel olarak, örnek eğitici, istemezdim batırmak ve her şeyin çarpık çalışması için olması gerektiğinden emin olmak)))

Not: F#'da başka bir örnek daha var - ama bence bu zaten çok fazla;)

 
Igor Makanu :

zamanı ve bilgisi olan varsa yardım almak isterim, bu kaynağı MQL'ye taşımak istiyorum, ancak std::Alert( n.recognizeImage( a1_3 ) );

buradan alınmıştır: https://habr.com/ru/sandbox/43916/

Not: Hamming ağının diğer kaynaklarını hemen bulamadığımı googledim, diğer kaynaklara bağlantılar da memnuniyetle karşılanıyor (bunlar Hopfield ağları değil !!! - Google onları sürekli bir araya getiriyor)

Igor, bence deque yazmak uygun değil, vektör vakaların büyük çoğunluğunda yeterli. stl konusundaki vektörü kullanarak örneğinizi yeniden yazın:

 #include <myincl/ 1 _mystd.mqh>

template < typename T>
void fill_vector_from_array(vector_fund<T> &dest, const T &src[]) {
   dest.clear();
   for ( int i = 0 ;  i < ArraySize (src);  ++ i)
      dest.push_back(src[i]);
}
template < typename T>
void fill_vector(vector_fund<T> &dest, T val) {
   for ( uint i = 0 ;  i < dest.size();  ++ i)
      dest.a[i] = val;
}

class net
{   vector_ref<vector_fund< float >> w;     // весовые коэффициенты (== это образцам)
     const uint n;                         // количество входов сети
    
     float activation( float v) const {
         return v>n?n:v< 0 ? 0 :v;
    }
public :
    net( unsigned numInputs):n(numInputs){}
     unsigned learnImage( const float &image[]) {
        vector_fund< float > tmp;
        fill_vector_from_array(tmp, image);
        w.push_back(tmp);
         return w.size();
    }
     unsigned recognizeImage( const float &image[]) const {   
        vector_fund< float > axons( this .w.size());
        fill_vector< float >(axons, 0 );
    
         float    sum1=. 0 , sum2=. 0 , e= 0.95 f/w.size();
         unsigned i,j;
        vector_fund< float > image_vec;
        fill_vector_from_array(image_vec, image);
        
         for (i= 0 ; i < w.size(); ++i) {   // цикл инициализации сети
             for (j= 0 ; j < n; ++j)
                axons.a[i] += image_vec.a[j]*w.a[i].a[j];
            sum1 += axons.a[i] = activation( 0.5 f*(axons.a[i]+ float (n) ) );
        }
                
         while ( sum2 != sum1 ) {       // цикл пока выходы сети изменяются
            sum1 = 0.0 f * ( sum2 = sum1 );
             for (i= 0 ; i < w.size(); ++i)
                sum1 += axons.a[i] = activation( axons.a[i]-e*(sum2-axons.a[i]) );
        }
        for (i=w.size()- 1 ; i!=( uint )- 1 && !axons.a[i--];);     // поиск активного аксона сети 
         return i;
    }


};

unsigned fn() {
   // создал несколько массивов, отказывается мкл передавать многомерные массивы.
   float a1_0[ 15 ] = { 1 ., 1 ., 1 .,   1 .,- 1 .,- 1 .,   1 .,- 1 .,- 1 .,   1 .,- 1 .,- 1 .,   1 ., 1 ., 1 .}; // символ С
   float a1_1[ 15 ] = { 1 ., 1 ., 1 .,   1 .,- 1 .,- 1 .,   1 ., 1 .,- 1 .,   1 .,- 1 .,- 1 .,   1 ., 1 ., 1 .}; // Символ E
   float a1_2[ 15 ] = { 1 ., 1 ., 1 .,   1 .,- 1 ., 1 .,   1 .,- 1 ., 1 .,   1 .,- 1 ., 1 .,   1 ., 1 ., 1 .}; // Символ О
   float a1_3[ 15 ] = { 1 ., 1 ., 1 .,   1 .,- 1 ., 1 .,   1 .,- 1 ., 1 .,   1 .,- 1 ., 1 .,   1 ., 1 ., 1 .}; // искаженный

    net n( 15 );
    n.learnImage( a1_0 );
    n.learnImage( a1_1 );    
    n.learnImage( a1_2 );

     return n.recognizeImage( a1_3 );
}

void OnStart ()
{
   Alert ( fn() );
}

Dağıtmak ve her şeyin çarpık çalışması gerektiğinden emin olmak istemem)))

Kontrol etmek için, kaynak kodunu artılara ve formun kodunu çalıştırdım.

     Alert ( n.recognizeImage( a1_0 ) );
     Alert ( n.recognizeImage( a1_1 ) );
     Alert ( n.recognizeImage( a1_2 ) );
     Alert ( n.recognizeImage( a1_3 ) );

her iki durumda da alınan: 1 1 0 4294967295

Not: bu arada, kaynakta bir hata oluştu - dizinin sınırlarının ötesine geçiyor (yoldaş -1'i eklemeyi unuttu)

 for (i=w.size() -1 ; i!=- 1 u && !axons[i--];);     // поиск активного аксона сети 
 
Vict :

Igor, bence deque yazmak uygun değil, vektör vakaların büyük çoğunluğunda yeterli. stl konusundaki vektörü kullanarak örneğinizi yeniden yazın:

Kontrol etmek için, kaynak kodunu artılara ve formun kodunu çalıştırdım.

her iki durumda da alınan: 1 1 0 4294967295

Not: bu arada, kaynakta bir hata oluştu - dizinin sınırlarının ötesine geçiyor (yoldaş -1'i eklemeyi unuttu)

Ö! Çok hızlı! Teşekkürler İNSAN!!!