2016-08-13 17 views
1

n個の数値のすべての置換をリストしたいと思います。今まではすべて正常だったようですが、私は非常に奇妙な動作に遭遇しました。このコードでは:C forループがprintfなしで正常に動作しない

int **liste_permutations(int n){ 
    int i, fact = factorielle(n); 
    int **tab=malloc(sizeof(int*)*fact); 
    for(i=0; i<fact; ++i) 
    { 
      tab[i] = malloc(sizeof(int)*n); 
    } 
    for(i=0;i<n;++i) 
    { 
      tab[0][i] = n-i; 
    } 

    for(i=1;i<fact;++i) 
    { 
      tab[i] = next_permutation(tab[i-1], n); 
    printf(" "); 
    } 
    return tab;} 

このメイン()

int **tab; 
    tab = liste_permutations(3); 
    for(i=0; i<factorielle(3); ++i) 
    { 

      for(j=0; j<3; ++j) 
      { 
        printf("%d", tab[i][j]); 
      } 
      printf("\n"); 
    } 

の出力は、私が

int **liste_permutations(int n){ 
    int i, fact = factorielle(n); 
    int **tab=malloc(sizeof(int*)*fact); 
    for(i=0; i<fact; ++i) 
    { 
      tab[i] = malloc(sizeof(int)*n); 
    } 
    for(i=0;i<n;++i) 
    { 
      tab[0][i] = n-i; 
    } 

    for(i=1;i<fact;++i) 
    { 
      tab[i] = next_permutation(tab[i-1], n); 
    } 
    return tab;} 

の出力にそれを変更した場合

  321 
    231 
    213 
    312 
    132 
    123 

ですが、メインは:

321 
231 
321 
231 
321 
231 

そして私がこれを行うにしようとした場合、ここ

はnext_permutationコードである(それは出力125 "「にしようとしているため、おそらく)のn = exemple 5、出力は空白です:

int *next_permutation(int *t, int n){ 
    //printf("n = %d\n", n); 
    int i, max, count; 
    for(i=0;(i<n) && (max !=i); ++i) 
    { 
      if(t[i] == n) 
      { 
        max = i; 

      } 
      if(t[i] == (t[i-1]+1)) 
      { 
        ++count; 
        if(count == (n-1)) 
        { 
          return NULL; 
        } 
      } 

    } 
    //printf("max = %d\n", max); 
    if(n==1) 
    { 
      //printf("n=1\n"); 
      return NULL; 
    } 
    int *next = malloc(n); 
    if(max == n-1) 
    { 
      //printf("max == n-1\n"); 
      int *s; 
      s = malloc(sizeof(int)); 
      for(i=0; i<(n-1);++i) 
      { 
        s[i]=t[i]; 
      } 
      for(i=0; i<n-1; ++i) 
      { 
        //printf("%d", s[i]); 
      } 
      //printf("\n"); 
      s = next_permutation(s, n-1); 
      if(s == NULL) 
      { 
        //printf("NUUUUUUl"); 
      //  next = NULL; 
        return NULL; 
      } 
      //printf("reprise en n = %d\n", n); 
      for(i=1;i<n;++i) 
      { 
        next[i] = s[i-1]; 
      } 
      //printf("\n"); 
      free(s); 
      next[0]=n; 
      return next; 
    } 
    else 
    { 
      //printf("max != n-1\n"); 

      for(i=0; i<n; ++i) 
      { 
        next[i] = t[i]; 
      } 
      int tmp = next[max]; 
      next[max] = next[max+1]; 
      next[max+1] = tmp; 
      for(i=0;i<n;++i) 
      { 
        //printf("%d", next[i]); 
      } 
      //printf("\n"); 
      return next; 
    }} 

EDIT:2つの最初のコメントが修正されましたが、私はまだサムの問題があります。

EDIT2:私を助けたすべての人にありがとう!私に正しい経路を示したmweerdenにはっきりと(それはカウントが初期化されなかったためであった)!

+1

はあなた 'next_permutation'コードは、メモリ権利をリークし、liste_permutations''内のすべての初期割り当てを言及しないように、残っている:彼らはまた、再割り当て後になくなっています。むしろ新しい配列を毎回割り振るよりも、あなたはあなたが学ぶために、デバッガを使用してコードをトレースしたい ' – dasblinkenlight

+0

すなわち' next_permutation(タブ[i]は、タブの[I-1]、n)は、結果のための既存の配列を渡す必要があります本当に何が起こっているのか。 – alk

+1

あなたがここにいるように、私はあなたに少しヒントを与えました。回答の1つが問題を解決した場合は、その答えを正しい答えとして受け入れる必要があります。回答を受け入れるには、投票ボタンの下にある小さなチェックマークをクリックします。それはあなたの評判とあなたを助けた人の評判を高めます。 – Asthor

答えて

2
tab[i] = malloc(sizeof(int*)*n); 

tab[i]int S(ないint*の配列)の配列を望んでいる

tab[i] = malloc(sizeof(int)*n); 

また

int *s; 
for(i=0; i<(n-1);++i) 
{ 
    s[i]=t[i]; 
} 

変更するには、のためのスペースを確保していませんs(初期化されていない)

+1

は、私はちょうどあなたのために、より良いノートを獲得した、ありがとうとにかく...私はそれを変えたが、それでも同じ動作を持っている、 をありがとう! –

1

ここではさまざまなことがあります。

for(i=0; i<fact; ++i) 
{ 
    tab[i] = malloc(sizeof(int*)*n); 
} 

はそれがあるべき:次に

tab[i] = malloc(sizeof(int)*n); // int, not int * 

、あなたのnext_permutationループ:あなたがきた

for(i=1;i<fact;++i) 
{ 
    tab[i] = next_permutation(tab[i-1], n); 
    printf(" "); 
} 

あなたも開始:

int **tab=malloc(sizeof(int*)*fact); 

しかし、これは間違っていますに既に割り当てられています上の- ここでもう一度やりますか? - インデックスt[-1]は、あなたが何をしたいかではありません

if(t[i] == (t[i-1]+1)) 

問題はi0にできることである。

また、自身next_permutationで、次の行を持っています!あなたはそれを初期化していない場合は

int i, max, count; 
for(i=0;(i<n) && (max !=i); ++i) 

、その値はそこに何を残したことになります。あなたが初期化されていない変数maxを使用しているため

2

printf文はこのような効果を持っている理由は、そのメモリが最後に使用されたときに他のコードによってあなたがprintf文を持っていない場合は、値がnext_permutationへの最後の呼び出しが残っ何だろう。 printfがある場合は、値がprintfへの呼び出しによって残されているいくつかの値になります。 next_permutationへの最初の呼び出しを除いて、値はmallocからの残りがあります。

関連する問題