2017-03-01 9 views
-2

配列を変更する関数を実装する必要があります。新しい配列は異なるサイズである可能性があります。 cout print 1.このコードで何が間違っているのか理解していますが、構文が何であるか把握できません。アレイを新しいアレイに設定するにはどうすればよいですか?

//tried this.. 
int reduce(int *array[]) 
{ 
    *array = new int[1]; 
    (*array)[0] = 6; 
    return 0; 
} 

//also tried this.. 
int reduce(int array[]) 
{ 
    array = new int [1]; 
    array[0] = 6; 
    return 0; 
}  

int main() 
{ 
    int a[1] = {1}; 
    int *p = a; 

    reduce(&p); 
    cout << a[0]; 

    return 0; 
} 
+0

ローカルアレイと動的に割り当てられたアレイの違いをご存知ですか? –

+0

@ Marcusw1関数呼び出しの中で新しい配列を割り当てています。以前の参照が削除され、新しい参照が追加されます。 – Ayush

+0

はい、私の機能のポイントは、配列を取って、データに基づいて変更することです。変更された新しい配列のサイズは小さくなります。 – Marcusw1

答えて

0

MODIFIED:あなたは、配列変更したい

を、これを試してみてください。

int reduce(int **array) 
{ 
    *array = new int[1]; 
    (*array)[0] = 6; 
    return 0; 
} 


int main() 
{ 
    int *a = new int[1]; 
    reduce(&a); 
    cout << a[0]; 

    return 0; 
} 
+0

データを変更するだけではありません。関数の後に新しい配列がより大きいか、より小さくなるかもしれません – Marcusw1

+0

@ Marcusw1Codeが修正されました。あなたはポイントを変更したいので、ヒープ上に作成してください。 – everettjf

+0

ボーナスとして、この方法でも素早く熟練してメモリをリークすることができます。 – WhozCraig

0

が正しくあなたの質問を理解していないが、これはあなたがかもしれないものである。

void reduce(int *a, int size) 
{ 
    for (int i =0; i < size; ++i) { 
     *(a+i) = 6; // or whatever value to want to 
    } 
} 

この方法で電話する:

何をしようとする10
int main(){ 
    int a[5] = {1, 1, 1, 1, 1}; 
    int *p = a; 

    reduce(p, 5); 
    for (int i =0; i < 5; ++i) { cout << a[i]<<endl; } 
    return 0; 
} 

EDIT

は漠然とこの方法を行うことができます。

int * reduce (int **b, int size) { 
    *b = new int[size]; 
    for (int i =0; i < size; ++i) { 
     *(*b + i) = 6; 
    } 
    return *b; 
} 


int main(){ 
    int a[5] = {1, 1, 1, 1, 1}; 
    int *p = a; 

    p = reduce(&p, 5); 
    cout << p[0]; 
    cout << p[1]; 
    cout << p[2]; 
    cout << p[3]; 
    cout << p[4]; 

    delete [] p; 

    return 0; 
} 

しかしaを指している場合、それはまだ変化が文句を言いません。

+0

reduce(array [])、私は配列[]新しい配列を指すようにします。 – Marcusw1

+0

@ Marcusw1しかし、関数呼び出しの後、新しい配列はグローバル変数ではなく関数変数であるため、破棄されます。したがって、参照を削除すると、メイン関数では更新されません。 – Ayush

+0

大丈夫ですか?新しい配列を返すことしか唯一の方法だと思いますか? 戻り値の代入は明確ではありません。 – Marcusw1

0

静的に定義された配列では、実行しようとしていることはできません。あなたは、実行時に配列のサイズを変更することはできません

int a[1] = {1}; 

のような配列を使用する場合

、あなたはそれがメモリを動的に割り当てられるためにポイントすることはできません。配列の要素にのみアクセスして変更することができます。それでおしまい。

reduceは、pが指しているが、aの要素は変更されません。

aの内容を変更する場合は、単にaを引数として使用して値を設定します。

0

まず、仮パラメータint* array[]は実際にはint** arrayと同じです(2次元配列と考えることができます)。これはおそらくあなたが望むものではありません。

@everettjfの回答は、でない場合にのみ有効です。は、配列のサイズを変更します。可能な解決策は、(完全配列を置換すること)reduce関数で

#include <iostream> 
void print_array(int[],int); 

int* reduce(int array[]) { 
    // get rid of the old array 
    delete[] array; 

    // create a new one 
    array = new int[7]{8,4,6,19,3,56,23}; 

    // need to return the new address, so that 
    // the main function is informed on the new 
    // address 
    return array; 
} 

int main() { 
    // initialize array 
    int *a = new int[1]{4}; 

    print_array(a,1); 

    // "change" array by completely replacing it 
    a=reduce(a); 

    print_array(a,7); 

    return 0; 
} 

// simply prints out the array; no error checking! 
void print_array(int array[], int length) { 
    std::cout << "["; 
    for (int i = 0; i < length ; ++i) { 
     std::cout << array[i] << " "; 
    } 
    std::cout << "]" << std::endl; 
} 

なり、初期配列が完全に削除されます。その後、新しいものを作成することができます(私は7つの乱数を使用することを選択しました)。そのポインタを呼び出し元に戻すことが重要です(mainメソッド)。それ以外の場合は、mainメソッド内aポインタが

を無効に指すことになりますが、配列を使用する(例えば、運動しのいくつかの種類によって)強制されていない場合、あなたはhttp://en.cppreference.com/w/cpp/container/vector

0

になりますあなたの質問の前提があります無効。標準的なC++でのANY手段による自動ストレージ持続時間(a in main())の配列のサイズを変更した後、そのサイズを変更することはできません。

reduce()関数のいずれかの動的メモリ割り当てでは、main()aのサイズが変更されません。

reduce(&p)意志はその後(それが動的に割り当てられたメモリを指して)が、aに影響を及ぼさないp変わるreduce()の最初のバージョンを呼び出します。

main()た場合の通話reduce(a)またはreduce(p)は(2が初期化int *p = a与えられ、等価です)apどちらを変更するが、代わりにメモリリークが発生します。

根本的な問題は、間違ってポインタと配列が同じものだと信じているということです。それらは実際には異なるものですが、さまざまな状況で同じ方法で使用できます。また、コードは互換性のないコンテキストでもあります。

リサイズ可能な配列を使用する場合は、スタティックコンテナ(std::vector<int>など)を使用します。関数のサイズを変更する場合は、参照渡しします。独自のメモリを動的に管理するため、動的にサイズを変更することができます。

+0

も十分に割り当てられています。私はそれが可能だとは思っていませんでしたが、それは私がCに堪能ではない+ +したがって、私はここで尋ねるべきだと思った。 – Marcusw1

関連する問題