モジュール結合について教えて下さい (質問意図がわかったので再び修正)

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

モジュール結合について教えて下さい (質問意図がわかったので再び修正)

#1

投稿記事 by ぷー » 14年前

基本的なことだとは思うのですが
どうしてもできません。
//??のとこだけ作るのですが
お願いします。

コード:

//スタンプ結合
static int const in_data[] = {2, 3, 6, 8, 4, 10, 5, 7, 9, 1, -1};

#include <stdio.h>
#define SIZE 20

typedef struct { 
  int in_data[SIZE];//??
  int data[SIZE];//??
} param_t;

int input(param_t*);//?? 
void sort(param_t*);//?? 
void output(param_t*);//?? 

//---------------------------------------------
int main() {
  int cc;
  param_t param[SIZE];//?? 

  cc = input(param);//?? 
    if (cc != 0) {
      printf("Input error!\n");
      return -1;
    }
  sort(param);//?? 
  output(param);//?? 

  return 0;
}
//---------------------------------------------
// 関数inputの定義
 int input(param_t* st)/*??*/ {

  for( int i = 0; ; i++) {
    if( in_data[i] < 0 ) {
      return 0; 
    }
    if( i>=SIZE ) return -1; 
	st->data[i] = st->in_data[i];//?? 
  }
} // end of input
//---------------------------------------------
// 関数sortの定義
void sort(int param[], int x)/*??*/ {
 
  for( int i = 0; i < x/*??*/; i = i+1) {
    int j = i;
    int x = param[i]/*??*/;

    while((param/*??*/[j-1] > x) && (j > 0)) {
      param/*??*/[j] = param/*??*/[j-1];
      j = j-1;
    }
    param/*??*/[j]=x;
  } // end_for

} // end of sort
//---------------------------------------------
// 関数outputの定義
void output(int param[], int x)/*??*/ {
  for( int i = 0; i < param[i]/*??*/; i++) {
    printf("%d ", in_data[i]/*??*/);
  }
  printf("\n");
}// end of ouput
構造体が理解できてないと思うのですが
いろいろ調べてみまして手詰まりになってしまいました。
よろしくお願いします。

もう一つあるのですが

コード:

// データ結合
static int const in_data[] = {2, 3, 6, 8, 4, 10, 5, 7, 9, 1, -1};

#include <stdio.h>
#define SIZE 20

int input(int data[], int *dsize);//?? 
void sort(int data[], int dsize);//?? 
void output(int data[], int dsize);//?? 

//---------------------------------------------
int main() {
  int cc;
  int data[SIZE];
  int dsize;

  cc = input(data, &dsize);//?? 
    if (cc != 0) {
      printf("Input error!\n");
      return -1;
    }
  sort(data, dsize);//?? 
  output(data, dsize);//?? 

  return 0;
}
//---------------------------------------------
// 関数inputの定義
int input(int data[], int *dsize)/*??*/ {

  for( int i = 0; ; i++) {
    if( in_data[i] < 0 ) {
      dsize++;//?? 
      return 0;
    }
    if( i>=SIZE ) return -1; 
    data[i] = in_data[i];
  }
} // end of input
//---------------------------------------------
// 関数sortの定義
void sort(int data[], int dsize)/*??*/ {
  for( int i = 0; i < dsize; i = i+1) {
    int j = i;
    int x = data[i];

    while((data[j-1] > x) && (j > 0)) {
      data[j] = data[j-1];
      j = j-1;
    }
    data[j]=x;	
  } // end_for

} // end of sort
//---------------------------------------------
// 関数outputの定義
void output(int data[], int dsize)/*??*/ {
  for( int i = 0; i < dsize; i++) {
    printf("%d ", data[i]);
  }
  printf("\n");
}// end of ouput
#endif
#ifndefとexternをプロトタイプの前に入れてみたのですが
うまく動きません。
#endifがある場合、
どのようにすればいいのでしょうか?

よろしくお願いいたします。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 教えて下さい

#2

投稿記事 by beatle » 14年前

ぷー さんが書きました:基本的なことだとは思うのですが
どうしてもできません。
//??のとこだけ作るのですが
お願いします。
作るってどういうことでしょうか。例えば
ぷー さんが書きました:

コード:

typedef struct { 
  int in_data[SIZE];//??
  int data[SIZE];//??
} param_t;
の//??のところを「作る」とは具体的にどんなことを望んでおられますか?
関数呼び出しや関数プロトタイプの右側に//??と書いてあれば関数を実装すればいいんだなと推測できるのですが、示した部分に//??が書いてあっても何をして欲しいのかさっぱりです。

ぷー

書き直しました

#3

投稿記事 by ぷー » 14年前

すいません。
書き直しました。

コード:

static int const in_data[] = {2, 3, 6, 8, 4, 10, 5, 7, 9, 1, -1};

#include <stdio.h>
#define SIZE 20

typedef struct { // 引き継ぎデータ領域のデータ構造の宣言
  int in_data[SIZE];//??
  int data[SIZE];//??
} param_t;

int input(param_t*);//?? 関数inputのプロトタイプ宣言
void sort(param_t*);//?? 関数sortのプロトタイプ宣言
void output(param_t*);//?? 関数outputのプロトタイプ宣言

//---------------------------------------------
int main() {
  int cc;
  param_t param[SIZE];//?? 引き継ぎデータ領域の定義

  cc = input(param);//?? 関数inputの呼び出し
    if (cc != 0) {
      printf("Input error!\n");
      return -1;
    }
  sort(param);//?? 関数sortの呼び出し
  output(param);//?? 関数outputの呼び出し

  return 0;
}
//---------------------------------------------
// 関数inputの定義
 int input(param_t* st)/*??*/ {

  for( int i = 0; ; i++) {
    if( in_data[i] < 0 ) {
      // データ個数の設定
      return 0;  // 正常終了
    }
    if( i>=SIZE ) return -1; // 異常終了,入力データの個数が多すぎる.
	st->data[i] = st->in_data[i];//?? データの設定 in_data[i]からdata[i]へのコピー
  }
} // end of input
//---------------------------------------------
// 関数sortの定義
void sort(int param[], int x)/*??*/ {
 
  for( int i = 0; i < x/*??*/; i = i+1) {
    int j = i;
    int x = param[i]/*??*/;

    while((param/*??*/[j-1] > x) && (j > 0)) {
      param/*??*/[j] = param/*??*/[j-1];
      j = j-1;
    }
    param/*??*/[j]=x;
  } // end_for

} // end of sort
//---------------------------------------------
// 関数outputの定義
void output(int param[], int x)/*??*/ {
  for( int i = 0; i < param[i]/*??*/; i++) {
    printf("%d ", in_data[i]/*??*/);
  }
  printf("\n");
}// end of ouput
どうなってるのかわからず
手詰まりになりました。
よろしくお願いします。



こちらも書き直しました。

コード:

// データ結合
static int const in_data[] = {2, 3, 6, 8, 4, 10, 5, 7, 9, 1, -1};

#include <stdio.h>
#define SIZE 20

int input(int data[], int *dsize);//?? 関数inputのプロトタイプ宣言
extern void sort(int data[], int dsize);//?? 関数sortのプロトタイプ宣言
extern void output(int data[], int dsize);//?? 関数outputのプロトタイプ宣言

//---------------------------------------------
int main() {
  int cc;
  int data[SIZE];
  int dsize;

  cc = input(data, &dsize);//?? 関数inputの呼び出し
    if (cc != 0) {
      printf("Input error!\n");
      return -1;
    }
  sort(data, dsize);//?? 関数sortの呼び出し
  output(data, dsize);//?? 関数outputの呼び出し

  return 0;
}
//---------------------------------------------
// 関数inputの定義
int input(int data[], int *dsize)/*??*/ {

  for( int i = 0; ; i++) {
    if( in_data[i] < 0 ) {
      dsize++;//?? データ個数の設定
      return 0;  // 正常終了
    }
    if( i>=SIZE ) return -1; // 異常終了,入力データの個数が多すぎる.
    data[i] = in_data[i];
  }
} // end of input
//---------------------------------------------
// 関数sortの定義
void sort(int data[], int dsize)/*??*/ {
  for( int i = 0; i < dsize; i = i+1) {
    int j = i;
    int x = data[i];

    while((data[j-1] > x) && (j > 0)) {
      data[j] = data[j-1];
      j = j-1;
    }
    data[j]=x;	
  } // end_for

} // end of sort
//---------------------------------------------
// 関数outputの定義
void output(int data[], int dsize)/*??*/ {
  for( int i = 0; i < dsize; i++) {
    printf("%d ", data[i]);
  }
  printf("\n");
}// end of ouput
#endif
#endifがある場合、
どのようにすればいいのでしょうか?

お手数おかけします。
よろしくお願いいたします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 教えて下さい

#4

投稿記事 by softya(ソフト屋) » 14年前

codeタグはプレビューして確認をお願いします。直しておきました。
やはり、私も良く分かりません。

[補足]
構造体がよく分からないと言うのであれば、配列だけを使って書くとどうなりますか。
あと、この2つプログラムのそれぞれの要件定義・仕様・入出力を明確にして下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ぷー

Re: 構造体について教えて下さい (タイトルが分かりづらいので修正)

#5

投稿記事 by ぷー » 14年前

beatleさん、softyaさん、
ありがとうございます。

何を伝えたらよいのかもわからないのが現状でしてすいません。
ソフトウェア工学の初歩の段階で
モジュール化するための課題なのですが。

共有結合はできたのですが
スタンプ結合とデータ結合の意味がさっぱりです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 構造体について教えて下さい (タイトルが分かりづらいので修正)

#6

投稿記事 by softya(ソフト屋) » 14年前

共通結合はグローバル変数を全部の関数から操作することですね。
スタンプ結合は関数で操作する時に構造体の形で引数で受け取って内容を読み取り・操作することです。
データ結合は必要最低限の情報だけを引数で受け渡して関数で処理することです。

と言う形にすれば良いと思うのですが、このプログラムでスタンプ結合にするって無理矢理っぽいんですが元の問題の状態から変えてはいけない所がまったく分かりません。
最初の状態を教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ぷー

Re: 構造体について教えて下さい (タイトルが分かりづらいので修正)

#7

投稿記事 by ぷー » 14年前

softyaさん
ありがとうございます。

これが共有結合です。

コード:

static int const in_data[] = {2, 3, 6, 8, 4, 10, 5, 7, 9, 1, -1};

#include <stdio.h>
#define SIZE 20
int data[SIZE];
int dsize;

int input();//?? 関数inputのプロトタイプ宣言
void sort();//?? 関数sortのプロトタイプ宣言
void output();//?? 関数outputのプロトタイプ宣言

//---------------------------------------------
int main() {
  int cc;

  cc = input();//?? 関数inputの呼び出し
    if (cc != 0) {
      printf("Input error!\n");
      return -1;
    }
  sort();//?? 関数sortの呼び出し
  output();//?? 関数outputの呼び出し

  return 0;
}
//---------------------------------------------
// 関数inputの定義
int input()/*??*/ {

  for( int i = 0; ; i++) {
    if( in_data[i] < 0 ) {
      dsize = i;//?? データ個数の設定
      return 0;  // 正常終了
    }
    if( i>=SIZE ) return -1; // 異常終了,入力データの個数が多すぎる.
	data[i] = in_data[i];//?? データの設定 in_data[i]からdata[i]へのコピー
  }
} // end of input
//---------------------------------------------
// 関数sortの定義
void sort()/*??*/ {
  for( int i = 0; i < dsize; i = i+1) {
    int j = i;
    int x = data[i];

    while((data[j-1] > x) && (j > 0)) {
      data[j] = data[j-1];
      j = j-1;
    }
    data[j]=x;
  } // end_for

} // end of sort
//---------------------------------------------
// 関数outputの定義
void output()/*??*/ {
  for( int i = 0; i < dsize; i++) {
    printf("%d ", data[i]);
  }
  printf("\n");
}// end of ouput

回答書式になります。

コード:

//共有結合
static int const in_data[] = {2, 3, 6, 8, 4, 10, 5, 7, 9, 1, -1};

#include <stdio.h>
#define SIZE 20
int data[SIZE];
int dsize;

//?? 関数inputのプロトタイプ宣言
//?? 関数sortのプロトタイプ宣言
//?? 関数outputのプロトタイプ宣言

//---------------------------------------------
int main() {
  int cc;

  cc = //?? 関数inputの呼び出し
    if (cc != 0) {
      printf("Input error!\n");
      return -1;
    }
  //?? 関数sortの呼び出し
  //?? 関数outputの呼び出し

  return 0;
}
//---------------------------------------------
// 関数inputの定義
/*??*/ {

  for( int i = 0; ; i++) {
    if( in_data[i] < 0 ) {
      //?? データ個数の設定
      return 0;  // 正常終了
    }
    if( i>=SIZE ) return -1; // 異常終了,入力データの個数が多すぎる.
    //?? データの設定 in_data[i]からdata[i]へのコピー
  }
} // end of input
//---------------------------------------------
// 関数sortの定義
/*??*/ {
  for( int i = 0; i < dsize; i = i+1) {
    int j = i;
    int x = data[i];

    while((data[j-1] > x) && (j > 0)) {
      data[j] = data[j-1];
      j = j-1;
    }
    data[j]=x;	
  } // end_for

} // end of sort
//---------------------------------------------
// 関数outputの定義
/*??*/ {
  for( int i = 0; i < dsize; i++) {
    printf("%d ", data[i]);
  }
  printf("\n");
}// end of ouput


//スタンプ結合
static int const in_data[] = {2, 3, 6, 8, 4, 10, 5, 7, 9, 1, -1};

#include <stdio.h>
#define SIZE 20

typedef struct { // 引き継ぎデータ領域のデータ構造の宣言
  //??
  //??
} param_t;

//?? 関数inputのプロトタイプ宣言
//?? 関数sortのプロトタイプ宣言
//?? 関数outputのプロトタイプ宣言

//---------------------------------------------
int main() {
  int cc;
  //?? 引き継ぎデータ領域の定義

  cc = //?? 関数inputの呼び出し
    if (cc != 0) {
      printf("Input error!\n");
      return -1;
    }
  //?? 関数sortの呼び出し
  //?? 関数outputの呼び出し

  return 0;
}
//---------------------------------------------
// 関数inputの定義
 /*??*/ {

  for( int i = 0; ; i++) {
    if( in_data[i] < 0 ) {
      // データ個数の設定
      return 0;  // 正常終了
    }
    if( i>=SIZE ) return -1; // 異常終了,入力データの個数が多すぎる.
    //?? データの設定 in_data[i]からdata[i]へのコピー
  }
} // end of input
//---------------------------------------------
// 関数sortの定義
/*??*/ {
 
  for( int i = 0; i < /*??*/; i = i+1) {
    int j = i;
    int x = /*??*/;

    while((/*??*/[j-1] > x) && (j > 0)) {
      /*??*/[j] = /*??*/[j-1];
      j = j-1;
    }
    /*??*/[j]=x;	
  } // end_for

} // end of sort
//---------------------------------------------
// 関数outputの定義
/*??*/ {
  for( int i = 0; i < /*??*/; i++) {
    printf("%d ", /*??*/);
  }
  printf("\n");
}// end of ouput



// データ結合
static int const in_data[] = {2, 3, 6, 8, 4, 10, 5, 7, 9, 1, -1};

#include <stdio.h>
#define SIZE 20

int input(int data[], int *dsize);//?? 関数inputのプロトタイプ宣言
void sort(int data[], int dsize);//?? 関数sortのプロトタイプ宣言
void output(int data[], int dsize);//?? 関数outputのプロトタイプ宣言

//---------------------------------------------
int main() {
  int cc;
  int data[SIZE];
  int dsize;

  cc = //?? 関数inputの呼び出し
    if (cc != 0) {
      printf("Input error!\n");
      return -1;
    }
  //?? 関数sortの呼び出し
  //?? 関数outputの呼び出し

  return 0;
}
//---------------------------------------------
// 関数inputの定義
 /*??*/ {

  for( int i = 0; ; i++) {
    if( in_data[i] < 0 ) {
      //?? データ個数の設定
      return 0;  // 正常終了
    }
    if( i>=SIZE ) return -1; // 異常終了,入力データの個数が多すぎる.
    data[i] = in_data[i];
  }
} // end of input
//---------------------------------------------
// 関数sortの定義
/*??*/ {
  for( int i = 0; i < dsize; i = i+1) {
    int j = i;
    int x = data[i];

    while((data[j-1] > x) && (j > 0)) {
      data[j] = data[j-1];
      j = j-1;
    }
    data[j]=x;	
  } // end_for

} // end of sort
//---------------------------------------------
// 関数outputの定義
/*??*/ {
  for( int i = 0; i < dsize; i++) {
    printf("%d ", data[i]);
  }
  printf("\n");
}// end of ouput
#endif
長くなってしまいましたが、
よろしくお願いいたします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 構造体について教えて下さい (タイトルが分かりづらいので修正)

#8

投稿記事 by softya(ソフト屋) » 14年前

大体分かりました。
まず、スタンプ結合ですがこのヒントから考えてみてください。
(1)in_dataを構造体に入れてはいけません。代わりに違うものが入ります。
(2)inputは戻り値が必要ありません。

まず、これを終わらせましょう。

[追記]
(3)構造体は配列ではありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ぷー

Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)

#9

投稿記事 by ぷー » 14年前

softyaさん

いろいろ変えてみたのですが
このあたりが限界です。

コード:

static int const in_data[] = {2, 3, 6, 8, 4, 10, 5, 7, 9, 1, -1};

#include <stdio.h>
#define SIZE 20

typedef struct { // 引き継ぎデータ領域のデータ構造の宣言
	int data[SIZE];//??
	int i;//??
} param_t;

int input();//?? 関数inputのプロトタイプ宣言
void sort(param_t*);//?? 関数sortのプロトタイプ宣言
void output(param_t*);//?? 関数outputのプロトタイプ宣言

//---------------------------------------------
int main() {
  int cc;
  param_t param[SIZE];//?? 引き継ぎデータ領域の定義

  cc = input();//?? 関数inputの呼び出し
    if (cc != 0) {
      printf("Input error!\n");
      return -1;
    }
  sort(param);//?? 関数sortの呼び出し
  output(param);//?? 関数outputの呼び出し

  return 0;
}
//---------------------------------------------
// 関数inputの定義
 int input(int data[])/*??*/ {

  for( int i = 0; ; i++) {
    if( in_data[i] < 0 ) {
      // データ個数の設定
      return 0;  // 正常終了
    }
    if( i>=SIZE ) return -1; // 異常終了,入力データの個数が多すぎる.
	data[i] = in_data[i];//?? データの設定 in_data[i]からdata[i]へのコピー
  }
} // end of input
//---------------------------------------------
// 関数sortの定義
void sort(int param[], int x)/*??*/ {
 
  for( int i = 0; i < x/*??*/; i = i+1) {
    int j = i;
    int x = param[i]/*??*/;

    while((param/*??*/[j-1] > x) && (j > 0)) {
      param/*??*/[j] = param/*??*/[j-1];
      j = j-1;
    }
    param/*??*/[j]=x;
  } // end_for

} // end of sort
//---------------------------------------------
// 関数outputの定義
void output(int param[], int x)/*??*/ {
  for( int i = 0; i < param[i]/*??*/; i++) {
    printf("%d ", in_data[i]/*??*/);
  }
  printf("\n");
}// end of ouput
個数の設定でiなのかなと
思ったんですが、うまくいきません。

もう少しヒントを頂けると助かります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)

#10

投稿記事 by softya(ソフト屋) » 14年前

ヒントが十分生かされていないところがあります。
まず前のヒントですが
(1) iではなくdsizeが行方不明になっていませんか?共有結合で参照していたものと同等の物を渡さないとダメですよ。
(2) これに関しては私の勘違いでした。申し訳ないです。忘れて下さい。
(3) param_t param[SIZE]; ← 構造体が配列のままです。構造体内のメンバ変数に配列があるので構造体まで配列にする必要はありません。

では、追加のヒントです。[すこし修正]
(4) すべての関数で構造体はアドレス渡しを使って下さい。
最初の頃に書かれていたparam_t *の形式が正しいです。
(5) 関数内では構造体ポインタのメンバ参照を使います。
メンバ参照は、「構造体ポインタ変数名->メンバ変数名」です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ぷー

Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)

#11

投稿記事 by ぷー » 14年前

なんとか
ここまできました。

コード:

static int const in_data[] = {2, 3, 6, 8, 4, 10, 5, 7, 9, 1, -1};

#include <stdio.h>
#define SIZE 20

typedef struct { // 引き継ぎデータ領域のデータ構造の宣言
	int data[SIZE];//??
	int in_data;//??
} param_t;

int input(param_t*);//?? 関数inputのプロトタイプ宣言
void sort(param_t*);//?? 関数sortのプロトタイプ宣言
void output(param_t*);//?? 関数outputのプロトタイプ宣言

//---------------------------------------------
int main() {
  int cc;
  param_t param;//?? 引き継ぎデータ領域の定義

  cc = input(&param);//?? 関数inputの呼び出し
    if (cc != 0) {
      printf("Input error!\n");
      return -1;
    }
  sort(&param);//?? 関数sortの呼び出し
  output(&param);//?? 関数outputの呼び出し

  return 0;
}
//---------------------------------------------
// 関数inputの定義
 int input(param_t* st)/*??*/ {

  for( int i = 0; ; i++) {
    if( in_data[i] < 0 ) {
      // データ個数の設定
      return 0;  // 正常終了
    }
    if( i>=SIZE ) return -1; // 異常終了,入力データの個数が多すぎる.
	st->data[i] = in_data[i];//?? データの設定 in_data[i]からdata[i]へのコピー
  }
} // end of input
//---------------------------------------------
// 関数sortの定義
void sort(param_t* st,int x)/*??*/ {
 
  for( int i = 0; i < x/*??*/; i = i+1) {
    int j = i;
    int x = st->data[i]/*??*/;

    while((st->data/*??*/[j-1] > x) && (j > 0)) {
      st->data/*??*/[j] = st->data/*??*/[j-1];
      j = j-1;
    }
    st->data/*??*/[j]=x;
  } // end_for

} // end of sort
//---------------------------------------------
// 関数outputの定義
void output(param_t* st)/*??*/ {
  for( int i = 0; i < st->data[i]/*??*/; i++) {
    printf("%d ", in_data[i]/*??*/);
  }
  printf("\n");
}// end of ouput
sortのところで未解決エラーがありまして
ほかは大丈夫な気がするのですが
あとどの辺でしょうか?
よろしくお願いいたします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)

#12

投稿記事 by softya(ソフト屋) » 14年前

取り急ぎヒントを見逃している問題点だけ。
(1) 構造体メンバにin_dataは出現しません。dsizeは必要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ぷー

Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)

#13

投稿記事 by ぷー » 14年前

これ以上進めなくなりました。

コード:

static int const in_data[] = {2, 3, 6, 8, 4, 10, 5, 7, 9, 1, -1};

#include <stdio.h>
#define SIZE 20

typedef struct { // 引き継ぎデータ領域のデータ構造の宣言
	int data[SIZE];//??
	int dsize[SIZE];//??
} param_t;

int input(param_t*);//?? 関数inputのプロトタイプ宣言
void sort(param_t*);//?? 関数sortのプロトタイプ宣言
void output(param_t*);//?? 関数outputのプロトタイプ宣言

//---------------------------------------------
int main() {
  int cc;
  param_t param;//?? 引き継ぎデータ領域の定義

  cc = input(&param);//?? 関数inputの呼び出し
    if (cc != 0) {
      printf("Input error!\n");
      return -1;
    }
  sort(&param);//?? 関数sortの呼び出し
  output(&param);//?? 関数outputの呼び出し

  return 0;
}
//---------------------------------------------
// 関数inputの定義
 int input(param_t* st)/*??*/ {

  for( int i = 0; ; i++) {
    if( in_data[i] < 0 ) {
      // データ個数の設定
      return 0;  // 正常終了
    }
    if( i>=SIZE ) return -1; // 異常終了,入力データの個数が多すぎる.
	st->data[i] = in_data[i];//?? データの設定 in_data[i]からdata[i]へのコピー
  }
} // end of input
//---------------------------------------------
// 関数sortの定義
void sort(param_t* st,int dsize)/*??*/ {
 
  for( int i = 0; i < dsize/*??*/; i = i+1) {
    int j = i;
    int x = st->dsize[i]/*??*/;

    while((st->data/*??*/[j-1] > x) && (j > 0)) {
      st->data/*??*/[j] = st->data/*??*/[j-1];
      j = j-1;
    }
    st->data/*??*/[j]=x;
  } // end_for

} // end of sort
//---------------------------------------------
// 関数outputの定義
void output(param_t* st)/*??*/ {
  for( int i = 0; i < st->data[i]/*??*/; i++) {
    printf("%d ", in_data[i]/*??*/);
  }
  printf("\n");
}// end of ouput
ギブアップです。

二つ目のデータ結合なのですが
#endifを取ると、一応エラーは出ないのですが
空白の画面しか出ません。
こちらもヒントをもらえないでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)

#14

投稿記事 by softya(ソフト屋) » 14年前

根本的に変なことをしています。

コード:

typedef struct { // 引き継ぎデータ領域のデータ構造の宣言
    int data[SIZE];//??
    int dsize[SIZE];//??
} param_t;
dsizeはdata配列の有効な個数を表すのではないですか?
共有結合の時はプログラムでちゃんとその様に書けています。
そうするとdsizeの配列は一体何に使うのでしょうか?

共有結合とスタンプ結合の違いは、グローバル変数を参照するのか構造体のメンバ変数を参照するのかの違いだけす。
つまり、自分でややこしい方向にしてしまっているだけで共有結合との違いはさほど多くはないのです。

それとデータ結合ですが、元の問題に#endifがある理由は良く分かりません。
必要もありませんし、#if系も書いていないので問題自体の間違いでは?と思うのですが。

【補足】
書き忘れましたがデータ結合が動かない理由はdsizeだと思います。
便宜上、
int input(int data[], int *dsize)

int input(int data[], int *dsize_ptr)
に変えて説明しますが、
これをdsize_ptr++;としていているのが間違いです。
++でポインタのインクリメントであることも問題ですが、共有結合と処理を変えてしまっています。
これはポインタとポインタの先の変数を混同している思われます。この場合はポインタ先の変数を更新するのが正しい解です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ぷー

Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)

#15

投稿記事 by ぷー » 14年前

softyaさん
ありがとうございます。

できました。

コード:

static int const in_data[] = {2, 3, 6, 8, 4, 10, 5, 7, 9, 1, -1};

#include <stdio.h>
#define SIZE 20

typedef struct { // 引き継ぎデータ領域のデータ構造の宣言
	int data[SIZE];//??
	int dsize;//??
} param_t;

int input(param_t*);//?? 関数inputのプロトタイプ宣言
void sort(param_t*);//?? 関数sortのプロトタイプ宣言
void output(param_t*);//?? 関数outputのプロトタイプ宣言

//---------------------------------------------
int main() {
  int cc;
  param_t param;//?? 引き継ぎデータ領域の定義

  cc = input(&param);//?? 関数inputの呼び出し
    if (cc != 0) {
      printf("Input error!\n");
      return -1;
    }
  sort(&param);//?? 関数sortの呼び出し
  output(&param);//?? 関数outputの呼び出し

  return 0;
}
//---------------------------------------------
// 関数inputの定義
 int input(param_t* st)/*??*/ {

  for( int i = 0; ; i++) {
    if( in_data[i] < 0 ) {
      st->dsize = i;// データ個数の設定
      return 0;  // 正常終了
    }
    if( i>=SIZE ) return -1; // 異常終了,入力データの個数が多すぎる.
	st->data[i] = in_data[i];//?? データの設定 in_data[i]からdata[i]へのコピー
  }
} // end of input
//---------------------------------------------
// 関数sortの定義
void sort(param_t* st)/*??*/ {
 
  for( int i = 0; i < st->dsize/*??*/; i = i+1) {
    int j = i;
    int x = st->data[i]/*??*/;

    while((st->data/*??*/[j-1] > x) && (j > 0)) {
      st->data/*??*/[j] = st->data/*??*/[j-1];
      j = j-1;
    }
    st->data/*??*/[j]=x;
  } // end_for

} // end of sort
//---------------------------------------------
// 関数outputの定義
void output(param_t* st)/*??*/ {
  for( int i = 0; i < st->dsize/*??*/; i++) {
    printf("%d ", st->data[i]/*??*/);
  }
  printf("\n");
}// end of ouput
データ個数の設定のところで
??がなかったのでいじってはいけないのかと思ってました。

共有結合も書式気にせず見てみます。

助かりました。

またよろしくお願いします。

閉鎖

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