pointerつけ忘れ?
pointerつけ忘れ?
#define ID "??"
#define NAME "ryaku"
#include <stdio.h>
#define DSIZE 10
int input_data[DSIZE] = {17, 39, 1, 9, 5, 24, 2, 11, 23, 6};
int M[DSIZE];
static void mergesort(int D[], int lw, int up);
static void merge(int D[], int lw, int md, int up);
static void print_data(int D[], int n);
static void print_data_m(int D[], int n, int lw, int up, char[]);
static void init_data(int D[], int data[], int n);
//------------------------------------------------------//
int main() {
int D[DSIZE];
printf("\nAD_2015_09_HW: %s %s\n\n", ID, NAME);
init_data(D, input_data, DSIZE); // 入力データの設定
print_data(D, DSIZE);
mergesort(D, 0, DSIZE-1);
print_data(D, DSIZE);
printf("\nAD_2016_09_HW: %s %s\n", ID, NAME);
return 0;
} // end of main
//------------------------------------------------------//
// ソート対象の配列の表示
static void print_data(int D[], int n){
int i;
for(i=0; i<n; i++) printf("%3d", D);
printf("\n");
} // end of print_data
//------------------------------------------------------//
// ソート対象の配列の表示
static void print_data_m(int D[], int n, int lw, int up, char s[]){
int md=(lw+up)/2;
int i;
printf("[%d %d] %s: ", lw, up, s);
for(i=0; i<n; i++) {
if (i==lw) printf(" <%d", D);
else if (i==md+1) printf(" <%d", D);
else printf("%3d", D);
if (i==md) printf(">");
if (i==up) printf(">");
}
printf("\n");
} // end of print_data
//------------------------------------------------------//
// ソート対象の配列の初期化 inpu_dataの内容をDにコピーする
static void init_data(int D[], int input_data[], int n){
int i;
for(i=0; i<n; i++) D = input_data;
} // end of init_data
//------------------------------------------------------//
// マージソート
static void mergesort( int D[],int lw, int up ) {
// ソート対象範囲を表す引数名はlw, upとする(lw < up)
/*??*/int md;
//!! print_data_m(D, DSIZE, lw, up, "B");
/*??*/ md =(lw +up)/2;
/*??*/margesort(D,lw,md);
/*??*/margesort(D,md+1,up);
//!! print_data_m(D, DSIZE, lw, up, "E");
/*??*/marge(D,lw,md,D,md+1,up); // 関数mergeの呼び出し
} // end of mergesort
//------------------------------------------------------//
static void merge(D,lw,md,up) {
int M[DSIZE];
/*??*/int x,y,i;
/*??*/x = lw; y = md +1;
/*??*/for(i = 0;i <= up - lw;i += 1){
/*??*/ if(x ==md +1) { M = D[y]; y += 1; }
/*??*/ else if(y ==up + 1) {M = D[x]; x += 1;}
/*??*/ else if(D[x] <= D[y]){M = D[x] ;x = x+1;}
/*??*/ else {M = D[y];y = y+1;}
/*??*/}for (i =lw; i <=up; i +=1) { D[i] = M[i -lw];}
} // end of merge
とある課題なのですが、 if(x ==md +1) { M[i] = D[y]; y += 1; }の部分でpointerつけ忘れと出ます
どのようにすれば良いですか?
#define NAME "ryaku"
#include <stdio.h>
#define DSIZE 10
int input_data[DSIZE] = {17, 39, 1, 9, 5, 24, 2, 11, 23, 6};
int M[DSIZE];
static void mergesort(int D[], int lw, int up);
static void merge(int D[], int lw, int md, int up);
static void print_data(int D[], int n);
static void print_data_m(int D[], int n, int lw, int up, char[]);
static void init_data(int D[], int data[], int n);
//------------------------------------------------------//
int main() {
int D[DSIZE];
printf("\nAD_2015_09_HW: %s %s\n\n", ID, NAME);
init_data(D, input_data, DSIZE); // 入力データの設定
print_data(D, DSIZE);
mergesort(D, 0, DSIZE-1);
print_data(D, DSIZE);
printf("\nAD_2016_09_HW: %s %s\n", ID, NAME);
return 0;
} // end of main
//------------------------------------------------------//
// ソート対象の配列の表示
static void print_data(int D[], int n){
int i;
for(i=0; i<n; i++) printf("%3d", D);
printf("\n");
} // end of print_data
//------------------------------------------------------//
// ソート対象の配列の表示
static void print_data_m(int D[], int n, int lw, int up, char s[]){
int md=(lw+up)/2;
int i;
printf("[%d %d] %s: ", lw, up, s);
for(i=0; i<n; i++) {
if (i==lw) printf(" <%d", D);
else if (i==md+1) printf(" <%d", D);
else printf("%3d", D);
if (i==md) printf(">");
if (i==up) printf(">");
}
printf("\n");
} // end of print_data
//------------------------------------------------------//
// ソート対象の配列の初期化 inpu_dataの内容をDにコピーする
static void init_data(int D[], int input_data[], int n){
int i;
for(i=0; i<n; i++) D = input_data;
} // end of init_data
//------------------------------------------------------//
// マージソート
static void mergesort( int D[],int lw, int up ) {
// ソート対象範囲を表す引数名はlw, upとする(lw < up)
/*??*/int md;
//!! print_data_m(D, DSIZE, lw, up, "B");
/*??*/ md =(lw +up)/2;
/*??*/margesort(D,lw,md);
/*??*/margesort(D,md+1,up);
//!! print_data_m(D, DSIZE, lw, up, "E");
/*??*/marge(D,lw,md,D,md+1,up); // 関数mergeの呼び出し
} // end of mergesort
//------------------------------------------------------//
static void merge(D,lw,md,up) {
int M[DSIZE];
/*??*/int x,y,i;
/*??*/x = lw; y = md +1;
/*??*/for(i = 0;i <= up - lw;i += 1){
/*??*/ if(x ==md +1) { M = D[y]; y += 1; }
/*??*/ else if(y ==up + 1) {M = D[x]; x += 1;}
/*??*/ else if(D[x] <= D[y]){M = D[x] ;x = x+1;}
/*??*/ else {M = D[y];y = y+1;}
/*??*/}for (i =lw; i <=up; i +=1) { D[i] = M[i -lw];}
} // end of merge
とある課題なのですが、 if(x ==md +1) { M[i] = D[y]; y += 1; }の部分でpointerつけ忘れと出ます
どのようにすれば良いですか?
Re: pointerつけ忘れ?
ちゃんとフォーラム読まずの投稿、申し訳ありません
となります
#define ID "??"
#define NAME "ryaku"
#include <stdio.h>
#define DSIZE 10
int input_data[DSIZE] = {17, 39, 1, 9, 5, 24, 2, 11, 23, 6};
int M[DSIZE];
static void mergesort(int D[], int lw, int up);
static void merge(int D[], int lw, int md, int up);
static void print_data(int D[], int n);
static void print_data_m(int D[], int n, int lw, int up, char[]);
static void init_data(int D[], int data[], int n);
//------------------------------------------------------//
int main() {
int D[DSIZE];
printf("\nAD_2015_09_HW: %s %s\n\n", ID, NAME);
init_data(D, input_data, DSIZE); // 入力データの設定
print_data(D, DSIZE);
mergesort(D, 0, DSIZE-1);
print_data(D, DSIZE);
printf("\nAD_2016_09_HW: %s %s\n", ID, NAME);
return 0;
} // end of main
//------------------------------------------------------//
// ソート対象の配列の表示
static void print_data(int D[], int n){
int i;
for(i=0; i<n; i++) printf("%3d", D[i]);
printf("\n");
} // end of print_data
//------------------------------------------------------//
// ソート対象の配列の表示
static void print_data_m(int D[], int n, int lw, int up, char s[]){
int md=(lw+up)/2;
int i;
printf("[%d %d] %s: ", lw, up, s);
for(i=0; i<n; i++) {
if (i==lw) printf(" <%d", D[i]);
else if (i==md+1) printf(" <%d", D[i]);
else printf("%3d", D[i]);
if (i==md) printf(">");
if (i==up) printf(">");
}
printf("\n");
} // end of print_data
//------------------------------------------------------//
// ソート対象の配列の初期化 inpu_dataの内容をDにコピーする
static void init_data(int D[], int input_data[], int n){
int i;
for(i=0; i<n; i++) D[i] = input_data[i];
} // end of init_data
//------------------------------------------------------//
// マージソート
static void mergesort( int D[],int lw, int up ) {
// ソート対象範囲を表す引数名はlw, upとする(lw < up)
/*??*/int md;
//!! print_data_m(D, DSIZE, lw, up, "B");
/*??*/ md =(lw +up)/2;
/*??*/margesort(D,lw,md);
/*??*/margesort(D,md+1,up);
//!! print_data_m(D, DSIZE, lw, up, "E");
/*??*/marge(D,lw,md,D,md+1,up); // 関数mergeの呼び出し
} // end of mergesort
//------------------------------------------------------//
static void merge(D,lw,md,up) {
int M[DSIZE];
/*??*/int x,y,i;
/*??*/x = lw; y = md +1;
/*??*/for(i = 0;i <= up - lw;i += 1){
/*??*/ if(x ==md +1) { M[i] = D[y]; y += 1; }
/*??*/ else if(y ==up + 1) {M[i] = D[x]; x += 1;}
/*??*/ else if(D[x] <= D[y]){M[i] = D[x] ;x = x+1;}
/*??*/ else {M[i] = D[y];y = y+1;}
/*??*/}for (i =lw; i <=up; i +=1) { D[i] = M[i -lw];}
} // end of merge
Re: pointerつけ忘れ?
ソースコードを提示する際は、BBCodeが有効な(無効にしていない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
【追記】入れ違いでした。
merge関数の定義で引数の型が書かれていないので、適切な型を書き加えるといいでしょう。
また、使われている関数margesortおよびmargeの宣言も定義も無いようなので、定義または宣言を加えるか、それぞれmergesortとmergeに変えるといいでしょう。
【追記】入れ違いでした。
学生S さんが書きました:とある課題なのですが、 if(x ==md +1) { M = D[y]; y += 1; }の部分でpointerつけ忘れと出ます
どのようにすれば良いですか?
merge関数の定義で引数の型が書かれていないので、適切な型を書き加えるといいでしょう。
また、使われている関数margesortおよびmargeの宣言も定義も無いようなので、定義または宣言を加えるか、それぞれmergesortとmergeに変えるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: pointerつけ忘れ?
みけCAT さんが書きました:ソースコードを提示する際は、BBCodeが有効な(無効にしていない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
【追記】入れ違いでした。学生S さんが書きました:とある課題なのですが、 if(x ==md +1) { M = D[y]; y += 1; }の部分でpointerつけ忘れと出ます
どのようにすれば良いですか?
merge関数の定義で引数の型が書かれていないので、適切な型を書き加えるといいでしょう。
また、使われている関数margesortおよびmargeの宣言も定義も無いようなので、定義または宣言を加えるか、それぞれmergesortとmergeに変えるといいでしょう。
アドバイスありがとうございます
度々申し訳ありませんが、/*??*/の右のみ変更可能な場合、どのようにすればよいですか? 課題でして・・・
Re: pointerつけ忘れ?
とりあえず関数名を直して配列Dに[]をつけましょう。margesort?、marge?
この部分。
この部分。
//------------------------------------------------------//
// マージソート
static void mergesort( int D[],int lw, int up ) {
// ソート対象範囲を表す引数名はlw, upとする(lw < up)
/*??*/int md;
//!! print_data_m(D, DSIZE, lw, up, "B");
/*??*/ md =(lw +up)/2;
/*??*/margesort(D,lw,md);
/*??*/margesort(D,md+1,up);
//!! print_data_m(D, DSIZE, lw, up, "E");
/*??*/marge(D,lw,md,D,md+1,up); // 関数mergeの呼び出し
} // end of mergesort
//------------------------------------------------------//
static void merge(D,lw,md,up) {
Re: pointerつけ忘れ?
問題がある部分をプリプロセッサ命令で消すようにするといいでしょう。学生S さんが書きました:度々申し訳ありませんが、/*??*/の右のみ変更可能な場合、どのようにすればよいですか? 課題でして・・・
// マージソート
static void mergesort( int D[],int lw, int up ) {
// ソート対象範囲を表す引数名はlw, upとする(lw < up)
/*??*/int md;
//!! print_data_m(D, DSIZE, lw, up, "B");
/*??*/ md =(lw +up)/2;
/*??*/mergesort(D,lw,md);
/*??*/mergesort(D,md+1,up);
//!! print_data_m(D, DSIZE, lw, up, "E");
/*??*/#if 0 //marge(D,lw,md,D,md+1,up); // 関数mergeの呼び出し
} // end of mergesort
//------------------------------------------------------//
static void merge(D,lw,md,up) {
int M[DSIZE];
/*??*/#endif //int x,y,i;
/*??*/merge(D,lw,md,D,md+1,up);} static void merge(int D[], int lw, int md, int up){int M[DSIZE],x,y,i; x = lw; y = md +1;
/*??*/for(i = 0;i <= up - lw;i += 1){
/*??*/ if(x ==md +1) { M[i] = D[y]; y += 1; }
/*??*/ else if(y ==up + 1) {M[i] = D[x]; x += 1;}
/*??*/ else if(D[x] <= D[y]){M[i] = D[x] ;x = x+1;}
/*??*/ else {M[i] = D[y];y = y+1;}
/*??*/}for (i =lw; i <=up; i +=1) { D[i] = M[i -lw];}
} // end of merge
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: pointerつけ忘れ?
「あやしい」ではなく、明らかに引数の数が間違っているので完全にクロでしょう。
オフトピック
ここは変えていい部分のようなので、ここをこのままコンパイルが通るように芸術的なマクロを定義するのもおかしな話でしょうし…。
間違えました。
詳細は下の投稿で。
最後に編集したユーザー みけCAT on 2016年12月08日(木) 00:30 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: pointerつけ忘れ?
こう直す。(それでも1か所おかしい)
//------------------------------------------------------//
// マージソート
static void mergesort(int D[], int lw, int up) {
// ソート対象範囲を表す引数名はlw, upとする(lw < up)
/*??*/int md;
//!! print_data_m(D, DSIZE, lw, up, "B");
/*??*/ md = (lw + up) / 2;
/*??*/mergesort(D, lw, md);
/*??*/mergesort(D, md + 1, up);
//!! print_data_m(D, DSIZE, lw, up, "E");
/*??*/merge(D, lw, md, md + 1, up); // 関数mergeの呼び出し
} // end of mergesort
//------------------------------------------------------//
static void merge(int D[], int lw, int md, int up) {
Re: pointerつけ忘れ?
オフトピック
16進数の下位2桁を取り出す処理についてに続き、またC6b14さんが素人目には提示された条件を無視しているように見える修正をしている…。
そもそも課題がクソという考え方も無くはないが、個人的にはいい気しないなあ…。
それとも、もしかしてモニタを45度反時計回りに回転させることで、margesortやmargeもmerge関数の定義も「/*??*/の右」に持ってくるライフハックかな?
そもそも課題がクソという考え方も無くはないが、個人的にはいい気しないなあ…。
それとも、もしかしてモニタを45度反時計回りに回転させることで、margesortやmargeもmerge関数の定義も「/*??*/の右」に持ってくるライフハックかな?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: pointerつけ忘れ?
申し訳ありません。自分のこの発言は間違いです。
「merge(D[], lw, md, D, md + 1, up);」という部分は引数のDの後ろに[]がついているので(マクロ定義がなければ)コンパイルエラーになりますが、
該当するコードはここにある学生Sさんや自分のコードには含まれていません。
従って、この部分コードはここで話題になっているコードとは関係ないため、自分にはあやしいかどうかはわかりません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: pointerつけ忘れ?
ここがエラーのようです。
ここを確認お願いします。:
warning C4717: 'mergesort':
すべてのコントロールのパス、関数を回帰すると
ランタイム スタック オーバーフローが発生します。
// マージソート
static void mergesort(int D[], int lw, int up) {
// ソート対象範囲を表す引数名はlw, upとする(lw < up)
/*??*/int md;
//!! print_data_m(D, DSIZE, lw, up, "B");
/*??*/ md = (lw + up) / 2;
/*??*/mergesort(D, lw, md);
/*??*/mergesort(D, md + 1, up);
//!! print_data_m(D, DSIZE, lw, up, "E");
/*??*/merge(D, lw, md + 1, up); // 関数mergeの呼び出し
} // end of mergesort
//------------------------------------------------------//
warning C4717: 'mergesort':
すべてのコントロールのパス、関数を回帰すると
ランタイム スタック オーバーフローが発生します。
Re: pointerつけ忘れ?
これで一応ビルドは正常終了しています。
#define ID "??"
#define NAME "ryaku"
#include <stdio.h>
#define DSIZE 10
int input_data[DSIZE] = { 17, 39, 1, 9, 5, 24, 2, 11, 23, 6 };
int M[DSIZE];
static void mergesort(int D[], int lw, int up);
static void merge(int D[], int lw, int md, int up);
static void print_data(int D[], int n);
static void print_data_m(int D[], int n, int lw, int up, char[]);
static void init_data(int D[], int data[], int n);
//------------------------------------------------------//
int main() {
int D[DSIZE];
printf("\nAD_2015_09_HW: %s %s\n\n", ID, NAME);
init_data(D, input_data, DSIZE); // 入力データの設定
print_data(D, DSIZE);
mergesort(D, 0, DSIZE - 1);
print_data(D, DSIZE);
printf("\nAD_2016_09_HW: %s %s\n", ID, NAME);
return 0;
} // end of main
//------------------------------------------------------//
// ソート対象の配列の表示
static void print_data(int D[], int n) {
int i;
for (i = 0; i<n; i++) printf("%3d", D[i]);
printf("\n");
} // end of print_data
//------------------------------------------------------//
// ソート対象の配列の表示
static void print_data_m(int D[], int n, int lw, int up, char s[]) {
int md = (lw + up) / 2;
int i;
printf("[%d %d] %s: ", lw, up, s);
for (i = 0; i<n; i++) {
if (i == lw) printf(" <%d", D[i]);
else if (i == md + 1) printf(" <%d", D[i]);
else printf("%3d", D[i]);
if (i == md) printf(">");
if (i == up) printf(">");
}
printf("\n");
} // end of print_data
//------------------------------------------------------//
// ソート対象の配列の初期化 inpu_dataの内容をDにコピーする
static void init_data(int D[], int input_data[], int n) {
int i;
for (i = 0; i<n; i++) D[i] = input_data[i];
} // end of init_data
//------------------------------------------------------//
// マージソート
static void mergesort(int D[], int lw, int up) {
// ソート対象範囲を表す引数名はlw, upとする(lw < up)
/*??*/int md;
//!! print_data_m(D, DSIZE, lw, up, "B");
/*??*/ md = (lw + up) / 2;
/*??*/mergesort(D, lw, md);
/*??*/mergesort(D, md + 1, up);
//!! print_data_m(D, DSIZE, lw, up, "E");
/*??*/merge(D, lw, md + 1, up); // 関数mergeの呼び出し
} // end of mergesort
//------------------------------------------------------//
static void merge(int D[], int lw, int md, int up) {
int M[DSIZE];
/*??*/int x, y, i;
/*??*/x = lw; y = md + 1;
/*??*/for (i = 0; i <= up - lw; i += 1) {
/*??*/ if (x == md + 1) { M[i] = D[y]; y += 1; }
/*??*/ else if (y == up + 1) { M[i] = D[x]; x += 1; }
/*??*/ else if (D[x] <= D[y]) { M[i] = D[x]; x = x + 1; }
/*??*/ else { M[i] = D[y]; y = y + 1; }
/*??*/
}for (i = lw; i <= up; i += 1) { D[i] = M[i - lw]; }
} // end of merge
Re: pointerつけ忘れ?
mergesort関数の中で無条件でmergesort関数を呼び出しているので、無限再帰になります。C6b14 さんが書きました: warning C4717: 'mergesort':
すべてのコントロールのパス、関数を回帰すると
ランタイム スタック オーバーフローが発生します。
何らかの条件で再帰呼び出しを止めなければいけません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: pointerつけ忘れ?
無理やり、/??/の右のみを変更してみました。学生S さんが書きました:度々申し訳ありませんが、/*??*/の右のみ変更可能な場合、どのようにすればよいですか? 課題でして・・・
どの行を変更したかわかりますか? その行番号を書いてください。
なぜそのように変更したらうまくいくのかを理解できますか?
#define ID "??"
#define NAME "ryaku"
#include <stdio.h>
#define DSIZE 10
int input_data[DSIZE] = {17, 39, 1, 9, 5, 24, 2, 11, 23, 6};
int M[DSIZE];
static void mergesort(int D[], int lw, int up);
static void merge(int D[], int lw, int md, int up);
static void print_data(int D[], int n);
static void print_data_m(int D[], int n, int lw, int up, char[]);
static void init_data(int D[], int data[], int n);
//------------------------------------------------------//
int main() {
int D[DSIZE];
printf("\nAD_2015_09_HW: %s %s\n\n", ID, NAME);
init_data(D, input_data, DSIZE); // 入力データの設定
print_data(D, DSIZE);
mergesort(D, 0, DSIZE-1);
print_data(D, DSIZE);
printf("\nAD_2016_09_HW: %s %s\n", ID, NAME);
return 0;
} // end of main
//------------------------------------------------------//
// ソート対象の配列の表示
static void print_data(int D[], int n){
int i;
for(i=0; i<n; i++) printf("%3d", D[i]);
printf("\n");
} // end of print_data
//------------------------------------------------------//
// ソート対象の配列の表示
static void print_data_m(int D[], int n, int lw, int up, char s[]){
int md=(lw+up)/2;
int i;
printf("[%d %d] %s: ", lw, up, s);
for(i=0; i<n; i++) {
if (i==lw) printf(" <%d", D[i]);
else if (i==md+1) printf(" <%d", D[i]);
else printf("%3d", D[i]);
if (i==md) printf(">");
if (i==up) printf(">");
}
printf("\n");
} // end of print_data
//------------------------------------------------------//
// ソート対象の配列の初期化 inpu_dataの内容をDにコピーする
static void init_data(int D[], int input_data[], int n){
int i;
for(i=0; i<n; i++) D[i] = input_data[i];
} // end of init_data
//------------------------------------------------------//
// マージソート
static void mergesort( int D[],int lw, int up ) {
// ソート対象範囲を表す引数名はlw, upとする(lw < up)
/*??*/int md; if (lw >= up) return;
//!! print_data_m(D, DSIZE, lw, up, "B");
/*??*/ md =(lw +up)/2;
/*??*/mergesort(D,lw,md);
/*??*/mergesort(D,md+1,up);
//!! print_data_m(D, DSIZE, lw, up, "E");
/*??*/merge(D,lw,md,up); } /* // 関数mergeの呼び出し
} // end of mergesort
//------------------------------------------------------//
static void merge(D,lw,md,up) {
int M[DSIZE];
/*??*/ static void merge(int D[], int lw, int md, int up) { int M[DSIZE],x,y,i;
/*??*/x = lw; y = md +1;
/*??*/for(i = 0;i <= up - lw;i += 1){
/*??*/ if(x ==md +1) { M[i] = D[y]; y += 1; }
/*??*/ else if(y ==up + 1) {M[i] = D[x]; x += 1;}
/*??*/ else if(D[x] <= D[y]){M[i] = D[x] ;x = x+1;}
/*??*/ else {M[i] = D[y];y = y+1;}
/*??*/}for (i =lw; i <=up; i +=1) { D[i] = M[i -lw];}
} // end of merge
Re: pointerつけ忘れ?
[追記]表題「 pointerつけ忘れ?」について
としても支障なく動きます。D[]は*Dと同値なので[]を付けわすれるとコンパイラは「 pointerつけ忘れ?」と理解するようです。人間は03 1234 5678というポインターをみて電話帳テーブルで名前に変換し102 3456というポインターをみて郵便番号テーブルで住所に変換できます。変数のポインターは*DをみてD[]の先頭アドレスと理解するのでしょう。ポインターは64ビットであればどんなものでも8バイト[(__int64)とおなじくレジスタ1個分]でいいので高速に動作できるのでしょう。「変数名変換テーブル」「関数名変換テーブル」があって関数ポインター(C#ではデリゲート)は関数のアドレスを保持している感じです。
//------------------------------------------------------//
static void merge(D,lw,md,up) {
int M[DSIZE];
/*??*/ static void merge(int *D, int lw, int md, int up) {
int M[DSIZE], x, y, i;
/*??*/x = lw; y = md + 1;
/*??*/for (i = 0; i <= up - lw; i += 1) {
/*??*/ if (x == md + 1) { M[i] = D[y]; y += 1; }
/*??*/ else if (y == up + 1) { M[i] = D[x]; x += 1; }
/*??*/ else if (D[x] <= D[y]) { M[i] = D[x]; x = x + 1; }
/*??*/ else { M[i] = D[y]; y = y + 1; }
/*??*/
}for (i = lw; i <= up; i += 1) { D[i] = M[i - lw]; }
} // end of merge
Re: pointerつけ忘れ?
上の方が解かれているマージソートのソートアルゴリズムhttp://www.ics.kagoshima-u.ac.jp/~fuchi ... -sort.htmlはいろんな言語バージョンのサイトがあります。アルゴリズムの勉強に向いてるのでしょうか。慣れてないのですぐには理解出来ませんね。
Re: pointerつけ忘れ?
>なんだか難解なものを質問してしまい、申し訳ありません
べつに”難解”とは思わないけど”質問者さんのケアレスミス...”が想像したより多かったので迷った...
べつに”難解”とは思わないけど”質問者さんのケアレスミス...”が想像したより多かったので迷った...