1

配列へのポインターを配列への別のポインターに割り当てようとすると問題が発生します。次のコードのどこに問題があるか教えてください。

void sort_strlen(char (*pt)[81]){

  char (*temp)[81];
  int i, j;

  for(i = 0; i < 10 && *(pt + i) != NULL; i++)
    for(j = i + 1; j < 10 && *(pt + j) != NULL; j++)
     if(strlen(*(pt + i)) < strlen(*(pt + j))){
       temp = *(pt + i);
       *(pt + i) = *(pt + j);
       *(pt + j) = temp;
     }

  for(i = 0; i < 10 && *(pt + i) != NULL; i++)
    puts(*(pt + i)); 

}

この関数にコンパイルすると、GCC は「互換性のない型の割り当て」エラーを返します。問題は明らかなはずですが、私は初心者なので、自分で問題を見つけることができません。

4

2 に答える 2

1

これはエラーの原因となる行ですか?そのように見える。(あなたはあなたの質問に示したはずです。)

*(pt + j) = temp;

ptchar (*pt)[81]tempあり、同じ型です。しかしpt、あなたがそうするとき、あなたは逆参照します*(pt + j)。(*ポインターを逆参照し、代わりにポインターが指す変数を参照します。)

その結果、*(pt + j)タイプはchar[81]です。そのため、それに割り当てるのはエラーtempです。

自分が何をしているのかわかっている場合は、型キャストによってこれを回避できます。しかし、これはあなたが期待するものではないようですので、お勧めしません。

于 2013-01-09T04:34:39.670 に答える
0

の代わりに添字表記を使用して関数を書き直すと、問題が見やすくなる場合があります*(pt+i)

void sort_strlen(char (*pt)[81]){

  char (*temp)[81];
  int i, j;

  for(i = 0; i < 10 && pt[i] != NULL; i++)
    for(j = i + 1; j < 10 && pt[j] != NULL; j++)
     if(strlen(pt[i]) < strlen(pt[j])){
       temp = pt[i];
       pt[i] = pt[j];
       pt[j] = temp;
     }

  for(i = 0; i < 10 && pt[i] != NULL; i++)
    puts(pt[i]); 

}

pt[i]したがって、とを交換しようとするときは、最初に(ここで が自動的に変換される) を行の aにpt[j]割り当てようとします。char*char[81] pt[i]char(*)[81]temp = pt[i];

型の非互換性は、ここで明確にする必要があります。pt[i]しかし、通常、それは単なる警告であり、配列のアドレスでもあるその文字列の最初のバイトのアドレスに変換されるため、「意図したとおりに機能します」pt[i]&pt[i]またはを割り当てて右辺の型を調整すると、警告は消えますpt + i

エラーは次の行にあります。pt[i] = pt[j];行では、 achar*を aに割り当てようchar[81]とし、行pt[j] = temp;では achar(*)[81]を aに割り当てようとしますchar[81]

配列は代入できないため、書き込み

pt[i] = ...

常にエラーです。残念なことに、gcc は次のように報告しています。

sort_strlen.c:13:18: error: incompatible types when assigning to type ‘char[81]’ from type ‘char *’
sort_strlen.c:14:18: error: incompatible types when assigning to type ‘char[81]’ from type ‘char (*)[81]’

根本原因をすぐに指摘するのではなく、

sort_strlen.c:13:18: error: array type 'char [81]' is not assignable
       *(pt + i) = *(pt + j);
       ~~~~~~~~~ ^
sort_strlen.c:14:18: error: array type 'char [81]' is not assignable            
       *(pt + j) = temp;
       ~~~~~~~~~ ^

そのclangが発します。gcc が報告する「互換性のない型」は、割り当ての左側の配列型と互換性のある右側の型がないため、基本的に修正できません。

ポインターの配列を作成することで問題を解決しました。配列内のアドレスを変更して、文字列を直接ソートしたかったのです。可能かどうかは誰にもわかりませんか?それを行う最良の方法は何ですか?

それはあなたが何をしたいかによります。文字列自体を移動せずに文字列のアドレスを変更することはできません。たとえば、次のようにします。

char temp[81];
...
    strcpy(temp, pt[i]);
    strcpy(pt[i], pt[j]);
    strcpy(pt[j], temp);

文字列を移動したくない場合は、ポインターの配列を作成するのが最善です

char *strings[10];
for(int i = 0; i < 10; ++i) {
    strings[i] = pt[i];  // make it &pt[i][0] if you don't like the implicit conversion
}

strings配列を文字列の長さで並べ替えます。

char *temp;
...
    if (strlen(strings[i]) < strlen(strings[j])) {
        temp = strings[i];
        strings[i] = strings[j];
        strings[j] = temp;
    }
于 2013-01-09T16:23:39.177 に答える