2017-11-13 11 views
0

このコードに私の解決策を教えてもらえますか?ポインタを使って配列のインデックスを別のものと交換する必要があります。これは私がcreated`ソリューションでしたC言語のポインターを使用して、配列の別の配列とスワップインデックス

double *swap_double_array_ptr(double *pi, int pos1, int pos2) { 
     double *p = &pos1; 
     double *q = &pos2; 
     double aux=0;  
     aux = *(pi + p);  
     *(p + pi) = *(q+ pi);  
     *(q + pi) = aux; 

}

コンパイラが無効なオペランドを言います。誰か助けてくれますか?私は他の解決策を知らない。穏やかにしてください、私は指針を新しくしています。 ありがとうございます。あなたは、インデックス変数のアドレスを使用して、それがすべて間違ってやっていた

答えて

0
void swap_double_array_ptr(double *pi, int pos1, int pos2) { 
     double aux; 
     aux = *(pi + pos1);  
     *(pos1 + pi) = *(pi+ pos2);  
     *(pos2 + pi) = aux; 
} 

あなたはC言語でを定義されていない二つのポインタを追加しようとました。


pi+p-> Not allowed

aux = *(pi + p);を要約し、いくつかのポイントを提供する: - 許可されていない2つのポインタ変数の

  • 追加。

  • 2つのポインタ変数の減算が可能です。 (オフセット計算)

戻り値は何も返されないため、関数の戻り値の型をvoidにする必要があります。

+0

ああ、ありがとう。 – CTA

0

最初のものは、pointer additionはCでは使用できません。cではポインタの減算のみが許可されています。 pi + pを無効にしようとしています。

0
void swap_double_array_ptr(double *pi, int pos1, int pos2) { 
     double aux= *(pi + pos1); 
     *(pos1 + pi) = *(pos2 + pi); 
     *(pos2 + pi) = aux; 
} 

あるいは

void swap_double_array_ptr(double *pi, int pos1, int pos2) { 
     *(pos1 + pi) += *(pos2 + pi); 
     *(pos2 + pi) = *(pos1 + pi)-*(pos2 + pi); 
     *(pos1 + pi) -= *(pos2 + pi); 
} 
+0

浮動小数点数の演算が正確でないため、2番目の関数定義が間違っています。 –

+0

@VladfromMoscowあなたは正しいですが、浮動小数点上のすべての演算子が正確ではない近似値であることを考慮に入れると、これは場合によっては有用かもしれません。 – alinsoar

+0

@ VladfromMoscow加算の代わりに、逆数を持つ任意の演算子を使用することができますが、偏差は場合によっては大きくなります。 – alinsoar

2

この式文のように2つのポインタを追加する操作は

aux = *(pi + p); 
     ^^^^^^ 

C.

で定義されていません。また関数は何も返しません戻り値の型は無効にする必要があります。

次の

void swap_double_array_ptr(double *pi, int pos1, int pos2) 
{ 
     double aux = *(pi + pos1);  
     *(pi + pos1) = *(pi + pos2);  
     *(pi + pos2) = aux; 
} 

は、一般的にタイプintではないので、タイプsize_tを使用することがはるかに優れている代わりに、2番目と3番目のパラメータの型intのことを考慮しているあなたは何を意味するかと思われます配列のすべての可能なインデックスを格納するのに十分です。

+0

私は '未定義の動作 'のリストをチェックしました。私は標準が' pointer + floating_nr'を追加するためのforbitをしていないと思います。 ISO9899のどこにこれが未定義とマークされているのかを指摘できますか?私はそれがデフォルトで整数に変換されると思う。 – alinsoar

+0

@alinsoar - なぜここでポインタと浮動小数点数を追加するのかは正確にはわかりませんが、これは制約違反です:[さらに、両方のオペランドが算術型を持つか、または1つのオペランドがポインタ完全なオブジェクト型に、もう1つは整数型になります。](http://port70.net/~nsz/c/c11/n1570.html#6.5.6p2) –

+0

@alinsoar標準6.5.6の節を参照してください。加算演算子 –

関連する問題