0

char **適切な内部オブジェクトを解析して構築するために、引数としてaを受け取るメソッドがあります。

  void  build (const char*  values[], const int amount=3) 
  {
       //..parse values and create instance of an inner field..
  }

これらの値を使用したいだけで、変更する必要がないため、一定です。これはかなりうまく機能します。

const char **ここで、以前に宣言されたメソッドでこの戻り値を使用できるように、自分に戻るメソッドをコーディングできるようにしたいと思います。最初は、クラスのインスタンスから必要な値を取得し、それらを文字列に変換して配列に入れて返しましたが、ローカル変数へのポインターを返していると不平を言っていました。そこで、このポインタを保持するために別のフィールドを使用することを考え、を作成しましchar ** valuesた。それから、それが指す値にメモリを割り当てる必要があることに気づいたので、私はそれを使いました。現在、私が説明しているメソッドは次のようになります。

 const char** getValues()
 {
   string var;

   var = toString(point.zone);
   values[0]= new  char[var.length()+1](); 
   strcpy(values[0], var.c_str());       

   var = toString(point.easting);
   values[1]= new char[var.length()+1]();
   strcpy(values[1],var.c_str());

   var = toString(point.northing);
   values[2]= new char[var.length()+1]();
   strcpy(values[2],var.c_str());

   return values;

 }

しかし、現時点でchar ** valuesは、一定ではないため、これは文句を言うでしょう。しかし、私がそれを一定にするstrcpyと、反対のことについて不平を言うでしょう。定数を返さない場合は、他の関数で使用できません。この問題を解決するのに助けが必要です。どんな助けでも深く感謝します、ありがとう。

4

3 に答える 3

2

主なポイントの1つは、なぜあなたは自分の人生をchar**、使用する代わりに、std::stringまたはstd::vector<std::vector<char>>適切な場所で複雑にするのですか?

つまり、タグが示すようにC ++を使用している場合は、CではなくC++を使用しないのはなぜですか。

これはあなたの人生をはるかに楽にします。

別物:

Aconst char**は、constであるcharへのポインターへのポインターです。つまり、を変更することはできませんchar。用途を変更したい場合char**

割り当てはコードのもう1つのポイントですが、どのようにメモリを割り当てていますchar**か?

これらは、上記で述べたことを使用するだけの場合、C++では必要のない複雑さを追加したものです。

于 2012-09-28T15:47:56.500 に答える
1

あなたはおそらくconst char* const* const、指しているデータだけでなく、ポインタ自体も一定であるを探しています。

char**からへの暗黙の変換がありconst char* const*ます。ただし、aは書き込み可能であり(新しいポインターを格納できます)、コレクションに書き込む操作は共分散に対して安全ではないため、共分散の規則ではからchar**への変換は禁止されています。見てください:const char**const char**

const char* a = "a literal"; // ok, literal is read-only, so const char* is good.
char* b;
char* c[] = { &b };
const char** d = c; // this step is illegal under the current rules
*d = &a;
*b = 'A'; // this would write to a string literal, causing an access violation

変換が許可されていれば、const型の安全性を損なうことなくオブジェクトに書き込むことができることに注意してください。これはまったく安全ではありません。

const char* const* d = c場合、次のステップ(*d = &a)はすでに違法であるため、型システムに穴はありません。

于 2012-09-28T15:51:59.777 に答える
1

char const*直接strcpyしようとしたため、コンパイルエラーが発生しました。代わりに、strcpyをachar *に割り当て、このポインタをvalues[]に戻す必要があります。

簡単な解決策については、以下の変更されたコードを参照してください。

 const char** getValues()
 {
   string var;
   char* p;

   var = toString(point.zone);
   p = new  char[var.length()+1](); 
   strcpy(p, var.c_str());       
   value[0] = p; // now you can assign char* to char const* without compilation error

   var = toString(point.easting);
   p = new char[var.length()+1]();
   strcpy(p, var.c_str());
   value[1] = p;

   var = toString(point.northing);
   p = new char[var.length()+1]();
   strcpy(p,var.c_str());
   value[2] = p;

   return values;

 }
于 2012-09-28T15:57:30.670 に答える