2016-04-14 4 views
1

一時的にFIFループ(関数ループ)と呼ばれるループのアイデアが出たとき、私は多くの異なる愚かなループで遊んでいました。C - 複数の再帰的な書き込みを1つのポインタに書き込んだ後のメモリアクセスエラー

正確には174665回繰り返されるまでは正常に機能します(通常のループよりも10倍遅くなりますが、現在はnvmです)。 174665回目の繰り返しでは、が* kポインタの行につきます。 void fif(bool (*f)(int *x),int i,int *k){です。同じ点で常にクラッシュします(同じ繰り返し)。なぜどんなアイデア? Ubuntu 15.10、gcc version 5.2.1 20151010でテストしています。私はCで新しくなっていますので、newbiに気をつけてください:)。あなたがcall stackを吹き消すためです

#include <stdio.h> 
#include <stdbool.h> 

#define REPEATS 1.8E5 

#ifdef WIN32 

#include <windows.h> 
double get_time() 
{ 
    LARGE_INTEGER t, f; 
    QueryPerformanceCounter(&t); 
    QueryPerformanceFrequency(&f); 
    return (double)t.QuadPart/(double)f.QuadPart; 
} 

#else 

#include <sys/time.h> 
#include <sys/resource.h> 

double get_time() 
{ 
    struct timeval t; 
    struct timezone tzp; 
    gettimeofday(&t, &tzp); 
    return t.tv_sec + t.tv_usec*1e-6; 
} 

#endif 

bool fifFunction(int *k); 
void fif(bool (*f)(int *x),int i,int *k); 

int main() 
{ 
     //FIF 

     printf("FIF loop\n"); 
     double t = get_time(); 
     int k = 0; 
     fif(fifFunction,REPEATS,&k); 
     printf("time: %f\n",get_time() - t);  
    return 0; 
} 

bool fifFunction(int *k) 
{ 
     return (*k = *k + 1); 
} 


void fif(bool (*f)(int *x),int i,int *k){ 
    if (i > 0){ 
     if ((*f)((k)) == false){ 
      return; 
     } 
     fif(f,(i-1),k); 
    } 
} 
+4

まあ、それは再帰的に興味深いものです。あなたはあなたのスタックbtwをあふれている。 – EOF

+0

大学の講師の一人は「IF LOOP」のようなものはないと言っています。私はちょっと、似たようなパフォーマンスを持っているifとgotoを使ってちょっと作ったことがあります(正直言ってコンパイラが同じようにコンパイルすると思います)。しかし、もう一歩進んでみたいと思っています:D – Luke

+1

あなたはおそらくあまりにも深く再帰し、あなたのスタックスペースを吹き飛ばした(すべて8 MiB)。 –

答えて

4

:任意の助けを事前に感謝

私のコード。行で

void fif(bool (*f)(int *x),int i,int *k){ 
    if (i > 0){ 
     if ((*f)((k)) == false){ 
      return; 
     } 
     fif(f,(i-1),k); // HERE 
    } 
} 

HEREをマークし、あなたは再帰、およびスタックに変数xi、およびkを押してください。十分な時間が経過すると、領域がなくなり、プログラムがクラッシュします。 -O3でコンパイルすると、gccはテール再帰呼び出しであるため、これを繰り返しに変換しますが、この動作に絶対に依存しないようにしてください。代わりにこれをループで記述する必要があります。

+3

スタックのオーバーフローがあったと言えるでしょう... – Schwern

関連する問題