2016-12-29 15 views
0

ちょっと配列の中で最長のシーケンスをチェックするプログラムがあり、シーケンスがどのポイントから始まるかを教えてくれるプログラムがあります。 function.theポインタがNULLを指している以外の値を更新していないようですが、最初は を指していましたが、それでも変更はありませんでした。acの関数でポインタの値を渡す際の問題

+0

あなたは値で 'begin'を渡しています。 'int longestSequence(int a、int n、int ** begin){' –

+0

あなたはポインタをポインタに渡すためのポインタを渡す必要があります。例](http://stackoverflow.com/help/mcve)ですが、 '#include <...>'はありません。また、不完全な '{' braces'} 'のタイプミスがあります。 (ひどいコードの書式設定)。コメントのようにコードにフラグを立て、3スターのプログラマのように '*** begin = &a[i]; ***'と混同しない方がよいでしょう。 –

+0

@JohnnyMopp iveがそれを試みたが、配列を入力した後にクラッシュした –

答えて

0

もチェックする必要があります...あなたは、ポインタについて少しより良いものを理解するのに役立つかもしれwhic

for(int i=0;i<n-1;i++) 
{ 
.. 
} 

ひとつのアイデアは、それが普通の変数とは異なるものではありませんである(それは、その値としてアドレスを保持します)。

ここで、その値(beginの値)を変更する必要があります。変更するには、その値を指す必要があります。

ので、あなたは、私はCでタイプしていた場合、私へのポインタのポインタ

func(..,&begin); 
func(...,int** begin) 
{ 
    .. 
} 

である始まるのアドレスを渡すには、それにcoderredoc *とポインタがそうでcoderredoc **可能となりますという名前になります。


開始の価値を変更したいのですが、どうすればよいですか?

あなたは、そのアドレスに何を割り当てる。..


int longestSequence(int a[], int n,int *elem){ 
     int length=1,i,maxvalue=0,lastseen=a[0],mpos=0; 
     for(i=1;i<n;i++) 
      { 
       if(a[i-1]==a[i]) 
       { 
        length++; 
       } 
       else 
       { 
        lastseen= a[i]; 
        if(length>maxvalue) 
        { 
         maxvalue=length; 
         mpos = pos; 
        } 
        pos=i; 
        length=1; 
       } 
      if(length>maxvalue) 
        { 
         maxvalue=length; 
         mpos = pos; 
        } 

      } 
      *elem=mpos; //mpos position of the starting of the longest sequence 
      return maxvalue; 
    } 

+---------+ 
| int |address:0x7777 
| begin | 
+---------+ 
    /\ 
     | 
     | 
     -----------+--------------------------- + 
       | pointer to begin (pbegin) | (int*) 
       | 0x7777     | 
       +----------------------------+ 


*begin=...リターンの最大の長さと、我々は最大の要素が含まれます整数変数へのポインタを渡します。

メインであなたは:int legth=longestSequence(a,n,&longestSequenceElement);

+0

あなたのコメントと上記のおかげで私は理解を助けましたこのトピックはより良い –

+0

助けてくれて嬉しいです...ここでポインタを使う必要はありません。関数から整数を返します。 – coderredoc

+0

@Pizzatags .:私の答えを確認してください – coderredoc

0

Cは値渡し(常に)を使用します。したがって、beginを渡すと、それはbeginの値になります。関数Aで関数を何回変更しても、関数Aを呼び出す関数の値は変更されません。

関数Aが関数Aと呼ばれる関数でbeginの値を変更するようにするには、値beginの代わりにbeginへのポインターを渡します。

同様:

int longestSequence(int a[], int n, int** begin);  
             ^^^ 

と値を変更する機能を使用

*begin = .... 

longestSequence(a, n, &begin); 

のようにそれを呼び出します。

の後に変更が表示され、が返されます。 forループ

+0

ありがとうが、私は私の機能で**を使用することはできないと思われ、別の方法でそれを書かなければならないでしょう、 –

関連する問題