pointerつけ忘れ?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
学生S

pointerつけ忘れ?

#1

投稿記事 by 学生S » 8年前

#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つけ忘れと出ます
どのようにすれば良いですか?

学生S

Re: pointerつけ忘れ?

#2

投稿記事 by 学生S » 8年前

ちゃんとフォーラム読まずの投稿、申し訳ありません

コード:

#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
となります

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: pointerつけ忘れ?

#3

投稿記事 by みけCAT » 8年前

ソースコードを提示する際は、BBCodeが有効な(無効にしていない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
【追記】入れ違いでした。
学生S さんが書きました:とある課題なのですが、 if(x ==md +1) { M = D[y]; y += 1; }の部分でpointerつけ忘れと出ます
どのようにすれば良いですか?

merge関数の定義で引数の型が書かれていないので、適切な型を書き加えるといいでしょう。
また、使われている関数margesortおよびmargeの宣言も定義も無いようなので、定義または宣言を加えるか、それぞれmergesortとmergeに変えるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

学生S

Re: pointerつけ忘れ?

#4

投稿記事 by 学生S » 8年前

みけCAT さんが書きました:ソースコードを提示する際は、BBCodeが有効な(無効にしていない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
【追記】入れ違いでした。
学生S さんが書きました:とある課題なのですが、 if(x ==md +1) { M = D[y]; y += 1; }の部分でpointerつけ忘れと出ます
どのようにすれば良いですか?

merge関数の定義で引数の型が書かれていないので、適切な型を書き加えるといいでしょう。
また、使われている関数margesortおよびmargeの宣言も定義も無いようなので、定義または宣言を加えるか、それぞれmergesortとmergeに変えるといいでしょう。


アドバイスありがとうございます
度々申し訳ありませんが、/*??*/の右のみ変更可能な場合、どのようにすればよいですか? 課題でして・・・

C6b14

Re: pointerつけ忘れ?

#5

投稿記事 by C6b14 » 8年前

とりあえず関数名を直して配列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) {

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: pointerつけ忘れ?

#6

投稿記事 by みけCAT » 8年前

学生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
このコードはmergeに渡す引数が多すぎてコンパイルが通らないので、そこも修正する必要があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: pointerつけ忘れ?

#7

投稿記事 by C6b14 » 8年前

直してもここはあやしいです。

コード:

	/*??*/merge(D[], lw, md, D, md + 1, up); // 関数mergeの呼び出し

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: pointerつけ忘れ?

#8

投稿記事 by みけCAT » 8年前

C6b14 さんが書きました:直してもここはあやしいです。

コード:

	/*??*/merge(D[], lw, md, D, md + 1, up); // 関数mergeの呼び出し
「あやしい」ではなく、明らかに引数の数が間違っているので完全にクロでしょう。
オフトピック
ここは変えていい部分のようなので、ここをこのままコンパイルが通るように芸術的なマクロを定義するのもおかしな話でしょうし…。

間違えました。
詳細は下の投稿で。
最後に編集したユーザー みけCAT on 2016年12月08日(木) 00:30 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: pointerつけ忘れ?

#9

投稿記事 by C6b14 » 8年前

こう直す。(それでも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) {

C6b14

Re: pointerつけ忘れ?

#10

投稿記事 by C6b14 » 8年前

あ、いわれるように引数の数が違う。

コード:

	/*??*/merge(D, lw,  md + 1, up); // 関数mergeの呼び出し
こうかな?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: pointerつけ忘れ?

#11

投稿記事 by みけCAT » 8年前

オフトピック
16進数の下位2桁を取り出す処理についてに続き、またC6b14さんが素人目には提示された条件を無視しているように見える修正をしている…。
そもそも課題がクソという考え方も無くはないが、個人的にはいい気しないなあ…。

それとも、もしかしてモニタを45度反時計回りに回転させることで、margesortやmargeもmerge関数の定義も「/*??*/の右」に持ってくるライフハックかな?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: pointerつけ忘れ?

#12

投稿記事 by みけCAT » 8年前

みけCAT さんが書きました:
C6b14 さんが書きました:直してもここはあやしいです。

コード:

	/*??*/merge(D[], lw, md, D, md + 1, up); // 関数mergeの呼び出し
「あやしい」ではなく、明らかに引数の数が間違っているので完全にクロでしょう。
オフトピック
ここは変えていい部分のようなので、ここをこのままコンパイルが通るように芸術的なマクロを定義するのもおかしな話でしょうし…。
申し訳ありません。自分のこの発言は間違いです。
「merge(D[], lw, md, D, md + 1, up);」という部分は引数のDの後ろに[]がついているので(マクロ定義がなければ)コンパイルエラーになりますが、
該当するコードはここにある学生Sさんや自分のコードには含まれていません。
従って、この部分コードはここで話題になっているコードとは関係ないため、自分にはあやしいかどうかはわかりません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: pointerつけ忘れ?

#13

投稿記事 by C6b14 » 8年前

いま全く別の件でマシンがしばらく使えないのでごめんなさい。

C6b14

Re: pointerつけ忘れ?

#14

投稿記事 by C6b14 » 8年前

そこは 10 で直してるはず。私の間違いです。

C6b14

Re: pointerつけ忘れ?

#15

投稿記事 by C6b14 » 8年前

ここがエラーのようです。

コード:

  // マージソート
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':
すべてのコントロールのパス、関数を回帰すると
ランタイム スタック オーバーフローが発生します。

C6b14

Re: pointerつけ忘れ?

#16

投稿記事 by C6b14 » 8年前

これで一応ビルドは正常終了しています。

コード:

#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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: pointerつけ忘れ?

#17

投稿記事 by みけCAT » 8年前

C6b14 さんが書きました: warning C4717: 'mergesort':
すべてのコントロールのパス、関数を回帰すると
ランタイム スタック オーバーフローが発生します。
mergesort関数の中で無条件でmergesort関数を呼び出しているので、無限再帰になります。
何らかの条件で再帰呼び出しを止めなければいけません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

学生S

Re: pointerつけ忘れ?

#18

投稿記事 by 学生S » 8年前

みなさん、ありがとうございました。
なんだか難解なものを質問してしまい、申し訳ありません

C6b14

Re: pointerつけ忘れ?

#19

投稿記事 by C6b14 » 8年前

そうですね。これはアルゴリズムがわからないから...質問者にきかないとわかりません。

C6b14

Re: pointerつけ忘れ?

#20

投稿記事 by C6b14 » 8年前

あ、了解しました。

かずま

Re: pointerつけ忘れ?

#21

投稿記事 by かずま » 8年前

学生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

C6b14

Re: pointerつけ忘れ?

#22

投稿記事 by C6b14 » 8年前

[追記]表題「 pointerつけ忘れ?」について

コード:

 //------------------------------------------------------//
  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
としても支障なく動きます。D[]は*Dと同値なので[]を付けわすれるとコンパイラは「 pointerつけ忘れ?」と理解するようです。人間は03 1234 5678というポインターをみて電話帳テーブルで名前に変換し102 3456というポインターをみて郵便番号テーブルで住所に変換できます。変数のポインターは*DをみてD[]の先頭アドレスと理解するのでしょう。ポインターは64ビットであればどんなものでも8バイト[(__int64)とおなじくレジスタ1個分]でいいので高速に動作できるのでしょう。「変数名変換テーブル」「関数名変換テーブル」があって関数ポインター(C#ではデリゲート)は関数のアドレスを保持している感じです。

C6b14

Re: pointerつけ忘れ?

#23

投稿記事 by C6b14 » 8年前

上の方が解かれているマージソートのソートアルゴリズムhttp://www.ics.kagoshima-u.ac.jp/~fuchi ... -sort.htmlはいろんな言語バージョンのサイトがあります。アルゴリズムの勉強に向いてるのでしょうか。慣れてないのですぐには理解出来ませんね。

C6b14

Re: pointerつけ忘れ?

#24

投稿記事 by C6b14 » 8年前

>なんだか難解なものを質問してしまい、申し訳ありません
べつに”難解”とは思わないけど”質問者さんのケアレスミス...”が想像したより多かったので迷った...

閉鎖

“C言語何でも質問掲示板” へ戻る