原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
#include <stdio.h>
#include <math.h>
#define DIST(x,y) (sqrt(x*x+y*y))
// DIST(x,y)のマクロ定義をここに追加
void swap(int d,int d[j]);
// 関数swapのプロトタイプ宣言をここに追加
main(){
int i, j;
int d[5][2] = {{1,8}, {2,6}, {5,3}, {4,2}, {8,9}};
fprintf(stderr, "Before sorting:\n");
for (i = 0; i < 5; i++)
printf("(%d,%d) dist=%f\n", d[0], d[1], DIST(d[0], d[1]));
for (i = 0; i < 4; i++)
for (j = i + 1; j < 5; j++){
if (DIST(d[0], d[1]) > DIST(d[j][0], d[j][1]))
swap(d, d[j]);
}
printf("\n");
fprintf(stderr, "After sorting:\n");
for (i = 0; i < 5; i++)
printf("(%d,%d) dist=%f\n", d[0], d[1], DIST(d[i][0], d[i][1]));
}
// 関数swapの定義をここへ追加
void swap(int d[i],int d[i]){
int temp,i,j;
temp=i;
i=j;
j=temp;
}
#include <math.h>
#define DIST(x,y) (sqrt(x*x+y*y))
// DIST(x,y)のマクロ定義をここに追加
void swap(int d,int d[j]);
// 関数swapのプロトタイプ宣言をここに追加
main(){
int i, j;
int d[5][2] = {{1,8}, {2,6}, {5,3}, {4,2}, {8,9}};
fprintf(stderr, "Before sorting:\n");
for (i = 0; i < 5; i++)
printf("(%d,%d) dist=%f\n", d[0], d[1], DIST(d[0], d[1]));
for (i = 0; i < 4; i++)
for (j = i + 1; j < 5; j++){
if (DIST(d[0], d[1]) > DIST(d[j][0], d[j][1]))
swap(d, d[j]);
}
printf("\n");
fprintf(stderr, "After sorting:\n");
for (i = 0; i < 5; i++)
printf("(%d,%d) dist=%f\n", d[0], d[1], DIST(d[i][0], d[i][1]));
}
// 関数swapの定義をここへ追加
void swap(int d[i],int d[i]){
int temp,i,j;
temp=i;
i=j;
j=temp;
}
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
宣言や定義開始の時点で、引数に使われているiやjが定義されていないからですね。ああいい さんが書きました:swapのところがうまくいかずエラーになります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
フォーラムルールより
エラーが出ることはわかりました。
何か質問はありますか?
この投稿には(他にもない情報はありますが、特に重要と考えられる)「4. 自分は何が解らないのか、知りたいのか」の情報が見当たりません。「うまくいきません」という質問は大抵回答に困ります。
1. 自分は今何がしたくて
2. どう取り組んで(作ったプログラムはどれで
3. どのようなエラーやトラブルで困っていて
4. 自分は何が解らないのか、知りたいのか
5. 今のCの知識はどの程度なのか
この5点をしっかりと明記して下さい。
環境に依存する場合やライブラリを使っているときは
使っているOS名・コンパイラ名・ライブラリ名も明記しましょう。
コンパイルエラーの質問時は必ず最低限のエラーメッセージも書きましょう。
エラーが出ることはわかりました。
何か質問はありますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
説明が足りなくてすみません。UbuntuのVirtual Boxを使用しています。先ほどのプログラムは課題として出されたものであり、コメントアウトされている指示の部分を自分で埋める形です。正直プログラミングは苦手で理解に苦しんでいます。
自分で書き加えた部分は、
#define DIST(x,y) (sqrt(x*x+y*y))と
void swap(int d,int d[j]);と
void swap(int d,int d[j]){
int i,j;
int temp;
temp=i;
i=j;
j=temp;
}
です。
今回はswapする変数が配列なので理解に苦しんでいます。エラーについてはi,j,dなどに関する「undeclared here」などが出ます。うまく説明できずにすみません。
自分で書き加えた部分は、
#define DIST(x,y) (sqrt(x*x+y*y))と
void swap(int d,int d[j]);と
void swap(int d,int d[j]){
int i,j;
int temp;
temp=i;
i=j;
j=temp;
}
です。
今回はswapする変数が配列なので理解に苦しんでいます。エラーについてはi,j,dなどに関する「undeclared here」などが出ます。うまく説明できずにすみません。
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
交換を行いたいdやd[j]の型はint[2]なので、swapのプロトタイプ宣言は
のようになるはずです。
swap()関数内での交換のための要素のコピーは、memcpy()関数を使うか、1要素ずつコピーするといいでしょう。
swap()関数内での交換のための要素のコピーは、memcpy()関数を使うか、1要素ずつコピーするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
正確には、dやd[j]の型はint[2]ですが、関数の引数などの式中では(sizeof演算子などの例外を除いて)先頭要素へのポインタに変換されます。
関数の引数として宣言された配列もポインタに変換されるので、 と書いておくと人間に意図がわかりやすいですが、
プログラム的には と書いても同じ意味です。
関数の引数として宣言された配列もポインタに変換されるので、 と書いておくと人間に意図がわかりやすいですが、
プログラム的には と書いても同じ意味です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
ローカル変数や仮引数に(不定の値を含む)適当な値を代入しているだけで、
引数として渡されたポインタが指すデータの操作を全く行っていないからですね。
また、iやjは初期化されていない自動変数なので、その値は不定であり、それをdやd[j]という式で計算に使用しているので未定義動作になります。
範囲外にアクセス(未定義動作)してアクセス違反になるかもしれませんし、どうせ代入した結果を使っていないので最適化で消されて何も起こらないかもしれません。
【訂正】
でたらめなポインタの計算だけでそれが指す場所の読み取りは行われないので、アクセス違反になる可能性は低いでしょう。
ただし、範囲外の添字の使用は未定義動作です。
引数として渡されたポインタが指すデータの操作を全く行っていないからですね。
また、iやjは初期化されていない自動変数なので、その値は不定であり、それをdやd[j]という式で計算に使用しているので未定義動作になります。
範囲外にアクセス(未定義動作)してアクセス違反になるかもしれませんし、どうせ代入した結果を使っていないので最適化で消されて何も起こらないかもしれません。
【訂正】
でたらめなポインタの計算だけでそれが指す場所の読み取りは行われないので、アクセス違反になる可能性は低いでしょう。
ただし、範囲外の添字の使用は未定義動作です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
ありがとうございます。
swap関数内ではこれ以上変数を追加する必要はありますか?
またどのようにデータの操作を行えばいいですか?
swap関数内ではこれ以上変数を追加する必要はありますか?
またどのようにデータの操作を行えばいいですか?
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
いいえ、追加する必要はありません。ああいい さんが書きました:swap関数内ではこれ以上変数を追加する必要はありますか?
1要素ずつ交換する場合、tempだけ残して後は消しても構いません。(iも残すとよりよいプログラムが書けるでしょう)
とりあえず、swap関数を使わないで(データの交換もmain関数内で直接行って)並べ替えを行うプログラムを書いてみてください。ああいい さんが書きました:またどのようにデータの操作を行えばいいですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
すみません。自分の知識が乏しすぎて、どうすればよいかわからないです。
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
では、2次元配列ではなくint型を要素とする1次元配列の並べ替えを行うプログラムは書けますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
No.5をつかって
としてはどうでしょうか。
#include <stdio.h>
#include <math.h>
#define DIST(x,y) (sqrt(x*x+y*y))
// DIST(x,y)のマクロ定義をここに追加
void swap(int a[2], int b[2]);
// 関数swapのプロトタイプ宣言をここに追加
int main(void) {
int i, j;
int d[5][2] = { { 1,8 },{ 2,6 },{ 5,3 },{ 4,2 },{ 8,9 } };
fprintf(stderr, "Before sorting:\n");
for (i = 0; i < 5; i++)
printf("(%d,%d) dist=%f\n", d[i][0], d[i][1], DIST(d[i][0], d[i][1]));
//////////////////////////////////////////////////////////////////////////////
for (i = 0; i < 4; i++)
for (j = i + 1; j < 5; j++) {
if (DIST(d[i][0], d[i][1]) > DIST(d[j][0], d[j][1]))
swap(d[i], d[j]);
}
printf("\n");
//////////////////////////////////////////////////////////////////////////////
fprintf(stderr, "After sorting:\n");
for (i = 0; i < 5; i++)
printf("(%d,%d) dist=%f\n", d[i][0], d[i][1], DIST(d[i][0], d[i][1]));
}
// 関数swapの定義をここへ追加
void swap(int a[2], int b[2]) {
int temp[2];
temp[0] = a[0]; temp[1] = a[1];
a[0] = b[0]; a[1] = b[1];
b[0] = temp[0]; b[1] = temp[1];
}
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
>へにっくす on 2017年2月27日(月) 04:53
>以下の投稿
>viewtopic.php?f=3&t=18897
>質問者は分かっていない気がする
>No.7のswapの引数の置き換えだって
>引数を使ってないしね・・・
どうかここで 詳しく説明をしてあげてくだいね。もちろん質問者さんから質問があれば答えますよ!^^;
(ちょっと忙しいので若干ラグがあるかもしれません)
>以下の投稿
>viewtopic.php?f=3&t=18897
>質問者は分かっていない気がする
>No.7のswapの引数の置き換えだって
>引数を使ってないしね・・・
どうかここで 詳しく説明をしてあげてくだいね。もちろん質問者さんから質問があれば答えますよ!^^;
(ちょっと忙しいので若干ラグがあるかもしれません)
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
>沖 滉均 on 2017年2月27日(月) 16:44
>ついに日記からコピペ転載まで始めたようですよ。
>There is no royal
だって折角いい意見なのに埋もれさすのは勿体無いでしょう。.沖 さんをお手本にと思い探したのですが...。でひ見本を示して下さい。よろしくお願い致します。m(__)m。
>ついに日記からコピペ転載まで始めたようですよ。
>There is no royal
だって折角いい意見なのに埋もれさすのは勿体無いでしょう。.沖 さんをお手本にと思い探したのですが...。でひ見本を示して下さい。よろしくお願い致します。m(__)m。
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
正直なところ私も”配列とポインター”はC言語で一番難しいところでNo.5.No.6を説明されているかたとは”配列とポインターが読み替えるときは微妙だね”と話したことがあるので質問があれば答えたかったのです。でも夜の1時ですものね!。
もし今日質問者さんが余裕があれば聞いてください。
恐らく完璧に理解してる人はNo.5.No.6を説明されているかたしか私は知らないですよ。
もし今日質問者さんが余裕があれば聞いてください。
恐らく完璧に理解してる人はNo.5.No.6を説明されているかたしか私は知らないですよ。
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
フローチャートを載せておきます。

配列とポインターに関して詳しくご説明頂ければ良いかなと思いますけど。

配列とポインターに関して詳しくご説明頂ければ良いかなと思いますけど。
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
いつまでたっても説明がないのでやはり無理なのでしょうね。
配列とポインターはC言語の難所なので分かる範囲で説明してみます。
まず
が不思議にうつるはずです。(配列は勝手にポインタに化けてしまうので、値渡しは出来ないのです。現実的にも、配列型はサイズが大きくなりがちなので、 値渡しにすると関数を呼び出す度に巨大なデータのコピーが発生してしまい、著しく実行性能が落ちてしまいます)
またC言語には2次元配列も本来存在しないので”暗黙の型変換”がおこなわれます。
[/size]
配列とポインターはC言語の難所なので分かる範囲で説明してみます。
まず
void swap(int a[2], int b[2]) {
int temp[2];
temp[0] = a[0]; temp[1] = a[1];
a[0] = b[0]; a[1] = b[1];
b[0] = temp[0]; b[1] = temp[1];
}
またC言語には2次元配列も本来存在しないので”暗黙の型変換”がおこなわれます。
[/size]
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
他の方も言われているようにこのように変えても動きます。(というかコンパイラーはこの様にしか理解出来ずキャストしてしまいます)
a,bの先頭アドレスさえわかれば他の情報は定義から得られるからです。(自動的にアドレス渡しとなる。基本的に配列を”値渡し”にしてコピーを作ることは出来ません。)(不可能ではないが面倒です)
[/size]
a,bの先頭アドレスさえわかれば他の情報は定義から得られるからです。(自動的にアドレス渡しとなる。基本的に配列を”値渡し”にしてコピーを作ることは出来ません。)(不可能ではないが面倒です)
#include <stdio.h>
#include <math.h>
#define DIST(x,y) (sqrt(x*x+y*y))
// DIST(x,y)のマクロ定義をここに追加
void swap(int a[2], int b[2]);
// 関数swapのプロトタイプ宣言をここに追加
int main(void) {
int i, j;
int d[5][2] = { { 1,8 },{ 2,6 },{ 5,3 },{ 4,2 },{ 8,9 } };
fprintf(stderr, "Before sorting:\n");
for (i = 0; i < 5; i++)
printf("(%d,%d) dist=%f\n", d[i][0], d[i][1], DIST(d[i][0], d[i][1]));
//////////////////////////////////////////////////////////////////////////////
for (i = 0; i < 4; i++)
for (j = i + 1; j < 5; j++) {
if (DIST(d[i][0], d[i][1]) > DIST(d[j][0], d[j][1]))
swap(d[i], d[j]);
}
printf("\n");
//////////////////////////////////////////////////////////////////////////////
fprintf(stderr, "After sorting:\n");
for (i = 0; i < 5; i++)
printf("(%d,%d) dist=%f\n", d[i][0], d[i][1], DIST(d[i][0], d[i][1]));
}
// 関数swapの定義をここへ追加
void swap(int* a, int* b) {
int temp[2];
temp[0] = a[0]; temp[1] = a[1];
a[0] = b[0]; a[1] = b[1];
b[0] = temp[0]; b[1] = temp[1];
}
Re: 原点からその座標までの距離が短い順に並べ替えます。swapのところがうまくいかずエラーになります。
これでも動くから”C"はなにも”考慮”してはいないようです。”配列はポインタ―であればそれで十分”ということでしょう。
[/size]
#include <stdio.h>
#include <math.h>
#define DIST(x,y) (sqrt(x*x+y*y))
// DIST(x,y)のマクロ定義をここに追加
void swap(int* a, int* b);
// 関数swapのプロトタイプ宣言をここに追加
int main(void) {
int i, j;
int d[5][2] = { { 1,8 },{ 2,6 },{ 5,3 },{ 4,2 },{ 8,9 } };
fprintf(stderr, "Before sorting:\n");
for (i = 0; i < 5; i++)
printf("(%d,%d) dist=%f\n", d[i][0], d[i][1], DIST(d[i][0], d[i][1]));
//////////////////////////////////////////////////////////////////////////////
for (i = 0; i < 4; i++)
for (j = i + 1; j < 5; j++) {
if (DIST(d[i][0], d[i][1]) > DIST(d[j][0], d[j][1]))
swap(d[i], d[j]);
}
printf("\n");
//////////////////////////////////////////////////////////////////////////////
fprintf(stderr, "After sorting:\n");
for (i = 0; i < 5; i++)
printf("(%d,%d) dist=%f\n", d[i][0], d[i][1], DIST(d[i][0], d[i][1]));
}
// 関数swapの定義をここへ追加
void swap(int* a, int* b) {
int temp[2];
temp[0] = *a; temp[1] = *(a+1);
*a= *b; *(a+1) = *(b+1);
*b= temp[0]; *(b+1) = temp[1];
}
[/size]