2011-12-16 15 views
0

私はC++には新しく、すべてのポインタのものに慣れていく上でいくつか問題があります。基本的には、関数へのポインタを渡して、そのポインタで配列を作成しています。メインの関数に戻り、私はこの配列にアクセスできません。ここでC++シンプルなポインタの受け渡し

は私のコードです:

#include <iostream> 

using namespace std; 

void createArray(char** dict, int* arraysize) 
{ 
    *arraysize = 26*26*26*26; 

    delete dict; 
    dict = 0; 

    //Initialisiere character array of character 
    //char **wortliste = 0; 
    dict = new char*[*arraysize]; 
    for(int i = 0; i < *arraysize; i++) 
     dict[i] = new char[5]; 

    int ctr = 0; 

    //Erstelle Einträge (sortiert) 
    for (char i = 'A'; i <= 'Z'; i++) 
    { 
     for (char j = 'A'; j <= 'Z'; j++) 
     { 
      for (char k = 'A'; k <= 'Z'; k++) 
      { 
       for (char l = 'A'; l <= 'Z'; l++) 
       { 
        dict[ctr][0] = i; 
        dict[ctr][1] = j; 
        dict[ctr][2] = k; 
        dict[ctr][3] = l; 
        dict[ctr][4] = '\0'; 
        ctr++; 
       } 
      } 
     } 
    } 
} 

int main(void) 
{ 
    char** dict = 0; 
    int arraysize; 

    createArray(dict, &arraysize); 

    cout << dict[0] << endl << dict[arraysize-1] << endl; 

    return 0; 
} 

私は私の誤りを把握することはできません事前にどうもありがとうございました。

+1

あなたは配列を作成していません。それは単なるダブルポインタです。 – iammilind

+0

初めて 'createArray'を呼び出すと、初期化されていないポインタに対して' delete'を実行します。それは未定義の動作です。 – jrok

+0

エラーは、C++でそのようなことを試みたことです。 –

答えて

0

私はあなたがそのようなデータで何をするのか想像することはできませんが、少なくとも現代的な技術を使うことはできます。

#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 

vector<string> create() { 
    vector<string> result; 
    for (char i = 'A'; i <= 'Z'; ++i) { 
     for (char j = 'A'; j <= 'Z'; ++j) { 
      for (char k = 'A'; k <= 'Z'; ++k) { 
       for (char l = 'A'; l <= 'Z'; ++l) { 
        result.push_back(string() + i + j + k + l); 
       } 
      } 
     } 
    } 
    return result; 
} 

int main() { 
    vector<string> data = create(); 
    cout << data.front() << endl << data.back() << endl; 
} 
+0

私はいくつかの割り当てのためにこれを行う必要があります。私はC#の世界から来ていますが、残念ながら現代のC++技術に精通する時間はありません。すべての文献で「古典的な」C++アプローチを使用しているからです。また、あなたのコードは、私にMSVC 10のリンカエラーを与えます。 – metacircle

+0

C言語でプログラミングする方法をすでに知っているなら、C++を学ぶための実際のクラスを取ることはあなたにとって非常に有用ではありません。あなたのエラーについては、私は詳細なしでそれをデバッグすることはできません。 –

+0

DEBUGプロファイルと関係があるようですが、リリースプロファイルが機能します。 http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/5e126c79-77f3-4d50-a47f-a9ce35cff0a4 – metacircle

1

いくつかの間違いがあります。

  1. 配列を削除するには:あなたがnot- newを反復処理しないようにするために、

    char **array = new char *[array_size]; 
    for (i = 0; i < array_size; ++i) 
        array[i] = new char[array_size_2]; 
    
  2. delete ING:新しい配列へ

    char **array = /* new with whatever */; 
    /* do your work */ 
    for (i = 0; i < array_size; ++i) 
        delete[] array[i]; 
    delete[] array; 
    
  3. をそれをチェックしてNULL

    for (i = 0; i < array_size; ++i) 
    { 
        if (array[i] != NULL) /* Or simply if (array[i]) */ 
         delete[] array[i]; 
        array[i] = NULL; 
    } 
    if (array != NULL) 
        delete[] array; 
    array = NULL; 
    

    deleteはとにかくNULLのチェックを行うので、その代わりに、あなたはこれを簡素化することができます。

    if (array != NULL) 
        for (i = 0; i < array_size; ++i) 
         delete[] array[i]; /* no need to set to NULL after if going to delete the array */ 
    delete[] array; 
    array = NULL; 
    

注:deletedelete[]は、アレイを削除しながら、単一のオブジェクトを削除します。 C++のパラメータで

+1

array [i]がNULLかどうかを確認する必要はありません。 NULLポインタを問題なく削除できます。 –

+0

@AndersK、あなたはそのコメントの前に自分の答えを完全に読みましたか? – Shahbaz

2

(明示的に参照パラメータとしてマークされていない限り)値渡しされているので、あなたはdictを渡し、createArrayへ(charへのポインタ)のポインタ、あなたの関数内dictが異なるオブジェクトである、とはいえ同一の初期値で、がmainにあります。 dictへの変更をmainに表示する場合は、参照渡しするか、またはそのアドレスをchar ***という関数に渡す必要があります。

など。

void createArray(char**& dict, int* arraysize) 

または

void createArray(char*** pdict, int* arraysize) 
{ // use (*pdict) instead of dict ... 

// ... 
createArray(&dict, &arraysize); 

あなたが望むものを達成するために、より "C++" の方法は、持っているだろう:

void createArray(std::vector<std::string>& dict); 

と単に持っていますcreateArrayのサイズを変更するを必要なサイズに設定します。 vectorstringのような標準的なコンテナを使用すると、あなたのコードから現在割り当てられていないメモリを割り振り解除する義務がなくなります。

+0

正確に。 'dict'引数は' arraysize'引数と同じように扱われなければなりません。どちらの場合も、各変数の 'createArray()'から値を返す必要があります。それは*両方の*変数の**アドレス**が渡されることを必要とします。 –

+1

私は人々が彼がそれらをやりたいと思う方法をするのを手助けしようとしていると信じられません。 –

+0

@KarlKnechtel:私たちは皆、どこかから始めなければなりません。はい、同じことを達成するためのよりよい方法について学ぶことは良いことですが、私たちが作業しようとしているコードで何が間違っているのかを知ることができ、解決しようとすることも価値があります。 'vector'と' string'を使っても、言語がどのように動作し、値渡しであるかを理解する必要があります。そうでなければ、異なったオブジェクトだけで同じ解説エラーに終わるでしょう。 –

関連する問題