C 언어에 대한 질문 - 페이지 11

 
TheXpert :

크기가 4 또는 8바이트인 데이터 조각에 대한 포인터입니다.

크기는 정렬로 인해 플랫폼에 따라 다릅니다. pragma pack 1과 같은 것을 사용하는 경우 크기는 동일합니다(1바이트).

나는 여전히 가끔 VS C++를 보고, asm에서 목록 모드로 컴파일한 다음 그것을 보면 많은 것이 분명해집니다. 예, 무섭게 들리지만 asm은 절대적인 진리입니다. 그리고 그 언어는 이해하기 어렵지 않습니다. 제대로 쓰기 어렵다.

 
Это рекурсия просто. Быстрая сортировка как раз таки и применяет рекурсивный вызов функции. О принципах, преимуществах и недостатках ее использования можете почитать в интернете. И да, это применительно к любому ЯП. В кратце скажу, что главное требование рекурсии - это то, что бы последующий вызов рекурсии приближал алгоритм к завершению. Ну и главный недостаток это требование к оперативной памяти при большое обработке данных, так как каждый вызов такой рекурсии будет блокировать память.... Простой пример с рекурсией на том же си и нахождению факториала в 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 :

예, 감사합니다 .. 그들이 말하는 것처럼 나는 알고 있었지만 잊어 버렸습니다. 왜냐하면 저는 프로그래머가 아니며 거의 하지 않습니다. :)

 

누구든지 시간과 지식이 있다면 도움을 받고 싶습니다. 이 소스를 MQL로 이식하고 싶지만 std::deque를 처리할 수 있을지 확신이 서지 않습니다.

 #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 ] );
}


여기에서 가져옴: https://habr.com/ru/sandbox/43916/

추신 : 나는 Hamming 네트워크의 다른 소스를 즉시 찾지 못했다고 구글링했습니다. 다른 소스에 대한 링크도 환영합니다 (이것은 Hopfield 네트워크가 아닙니다 !!! - Google은 지속적으로 함께 제공합니다)

 
Igor Makanu :

누구든지 시간과 지식이 있다면 도움을 받고 싶습니다. 이 소스를 MQL로 이식하고 싶지만 std::deque를 처리할 수 있을지 확신이 서지 않습니다.

이중 연결 목록입니다. 위의 코드에는 push_back만 있으므로 벡터로 대체될 가능성이 있습니다.

그렇지 않은 경우 시작과 끝에서 여백이 있는 배열을 통해 deque를 간단하게 구현할 수 있습니다. STL에서는 어떻게 든 구현 된 것 같습니다.

 
Andrei Trukhanovich :

이중 연결 목록입니다. 위의 코드에는 push_back만 있으므로 벡터로 대체될 가능성이 있습니다.

그렇지 않은 경우 시작과 끝에서 여백이 있는 배열을 통해 deque를 간단하게 구현할 수 있습니다. STL에서는 어떻게 든 구현 된 것 같습니다.

나는 std::deque 에 대해 구글링했는데, 그것은 당신이 쓰는 것과 같지만 ... 나는 그것을 사용하는 방법을 모르지만 그냥 벡터로 바꾸십시오 ... 일반적으로 예제는 교육적이며 원하지 않습니다. 엉망으로 만들고 모든 것이 비뚤어지게 작동해야 함을 확인하십시오)))

추신: F #에는 또 다른 예가 있습니다. 하지만 제 생각에는 이것은 이미 너무 많습니다.)

 
Igor Makanu :

누구든지 시간과 지식이 있다면 도움을 받고 싶습니다. 이 소스를 MQL로 이식하고 싶지만 std::Alert( n.recognizeImage( a1_3 ) );

여기에서 가져옴: https://habr.com/ru/sandbox/43916/

추신 : 나는 Hamming 네트워크의 다른 소스를 즉시 찾지 못했다고 구글링했습니다. 다른 소스에 대한 링크도 환영합니다 (이것은 Hopfield 네트워크가 아닙니다 !!! - Google은 지속적으로 함께 제공합니다)

Igor, 나는 deque를 쓰는 것이 부적절하다고 생각합니다. 대부분의 경우 벡터로 충분합니다. stl 주제의 벡터를 사용하여 예제를 다시 작성하십시오.

 #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() );
}

나는 엉망이되고 싶지 않고 모든 것이 비뚤어지게 작동해야합니다)))

확인하기 위해 플러스에서 소스 코드와 폼의 코드를 실행했습니다.

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

두 경우 모두 수신: 1 1 0 4294967295

추신 : 그건 그렇고, 소스에 오류가 있습니다 - 어레이의 경계를 넘어서는 것입니다 (동지는 -1을 추가하는 것을 잊었습니다)

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

Igor, 나는 deque를 쓰는 것이 부적절하다고 생각합니다. 대부분의 경우 벡터로 충분합니다. stl 주제의 벡터를 사용하여 예제를 다시 작성하십시오.

확인하기 위해 플러스에서 소스 코드와 폼의 코드를 실행했습니다.

두 경우 모두 수신: 1 1 0 4294967295

추신 : 그건 그렇고, 소스에 오류가 있습니다 - 어레이의 경계를 넘어서는 것입니다 (동지는 -1을 추가하는 것을 잊었습니다)

영형! 너무 빨리! 고마워요 HUMAN!!!