ページ 1 / 1
モジュール結合について教えて下さい (質問意図がわかったので再び修正)
Posted: 2012年5月15日(火) 12:38
by ぷー
基本的なことだとは思うのですが
どうしてもできません。
//??のとこだけ作るのですが
お願いします。
コード:
//スタンプ結合
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がある場合、
どのようにすればいいのでしょうか?
よろしくお願いいたします。
Re: 教えて下さい
Posted: 2012年5月15日(火) 12:44
by beatle
ぷー さんが書きました:基本的なことだとは思うのですが
どうしてもできません。
//??のとこだけ作るのですが
お願いします。
作るってどういうことでしょうか。例えば
ぷー さんが書きました:
コード:
typedef struct {
int in_data[SIZE];//??
int data[SIZE];//??
} param_t;
の//??のところを「作る」とは具体的にどんなことを望んでおられますか?
関数呼び出しや関数プロトタイプの右側に//??と書いてあれば関数を実装すればいいんだなと推測できるのですが、示した部分に//??が書いてあっても何をして欲しいのかさっぱりです。
書き直しました
Posted: 2012年5月15日(火) 13:43
by ぷー
すいません。
書き直しました。
コード:
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がある場合、
どのようにすればいいのでしょうか?
お手数おかけします。
よろしくお願いいたします。
Re: 教えて下さい
Posted: 2012年5月15日(火) 13:48
by softya(ソフト屋)
codeタグはプレビューして確認をお願いします。直しておきました。
やはり、私も良く分かりません。
[補足]
構造体がよく分からないと言うのであれば、配列だけを使って書くとどうなりますか。
あと、この2つプログラムのそれぞれの要件定義・仕様・入出力を明確にして下さい。
Re: 構造体について教えて下さい (タイトルが分かりづらいので修正)
Posted: 2012年5月15日(火) 15:34
by ぷー
beatleさん、softyaさん、
ありがとうございます。
何を伝えたらよいのかもわからないのが現状でしてすいません。
ソフトウェア工学の初歩の段階で
モジュール化するための課題なのですが。
共有結合はできたのですが
スタンプ結合とデータ結合の意味がさっぱりです。
Re: 構造体について教えて下さい (タイトルが分かりづらいので修正)
Posted: 2012年5月15日(火) 15:54
by softya(ソフト屋)
共通結合はグローバル変数を全部の関数から操作することですね。
スタンプ結合は関数で操作する時に構造体の形で引数で受け取って内容を読み取り・操作することです。
データ結合は必要最低限の情報だけを引数で受け渡して関数で処理することです。
と言う形にすれば良いと思うのですが、このプログラムでスタンプ結合にするって無理矢理っぽいんですが元の問題の状態から変えてはいけない所がまったく分かりません。
最初の状態を教えて下さい。
Re: 構造体について教えて下さい (タイトルが分かりづらいので修正)
Posted: 2012年5月15日(火) 16:24
by ぷー
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
長くなってしまいましたが、
よろしくお願いいたします。
Re: 構造体について教えて下さい (タイトルが分かりづらいので修正)
Posted: 2012年5月15日(火) 16:31
by softya(ソフト屋)
大体分かりました。
まず、スタンプ結合ですがこのヒントから考えてみてください。
(1)in_dataを構造体に入れてはいけません。代わりに違うものが入ります。
(2)inputは戻り値が必要ありません。
まず、これを終わらせましょう。
[追記]
(3)構造体は配列ではありません。
Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)
Posted: 2012年5月15日(火) 18:20
by ぷー
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なのかなと
思ったんですが、うまくいきません。
もう少しヒントを頂けると助かります。
Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)
Posted: 2012年5月15日(火) 18:43
by softya(ソフト屋)
ヒントが十分生かされていないところがあります。
まず前のヒントですが
(1) iではなくdsizeが行方不明になっていませんか?共有結合で参照していたものと同等の物を渡さないとダメですよ。
(2) これに関しては私の勘違いでした。申し訳ないです。忘れて下さい。
(3) param_t param[SIZE]; ← 構造体が配列のままです。構造体内のメンバ変数に配列があるので構造体まで配列にする必要はありません。
では、追加のヒントです。[すこし修正]
(4) すべての関数で構造体はアドレス渡しを使って下さい。
最初の頃に書かれていたparam_t *の形式が正しいです。
(5) 関数内では構造体ポインタのメンバ参照を使います。
メンバ参照は、「構造体ポインタ変数名->メンバ変数名」です。
Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)
Posted: 2012年5月15日(火) 19:31
by ぷー
なんとか
ここまできました。
コード:
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(¶m);//?? 関数inputの呼び出し
if (cc != 0) {
printf("Input error!\n");
return -1;
}
sort(¶m);//?? 関数sortの呼び出し
output(¶m);//?? 関数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のところで未解決エラーがありまして
ほかは大丈夫な気がするのですが
あとどの辺でしょうか?
よろしくお願いいたします。
Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)
Posted: 2012年5月15日(火) 19:38
by softya(ソフト屋)
取り急ぎヒントを見逃している問題点だけ。
(1) 構造体メンバにin_dataは出現しません。dsizeは必要です。
Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)
Posted: 2012年5月15日(火) 20:27
by ぷー
これ以上進めなくなりました。
コード:
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(¶m);//?? 関数inputの呼び出し
if (cc != 0) {
printf("Input error!\n");
return -1;
}
sort(¶m);//?? 関数sortの呼び出し
output(¶m);//?? 関数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を取ると、一応エラーは出ないのですが
空白の画面しか出ません。
こちらもヒントをもらえないでしょうか?
Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)
Posted: 2012年5月15日(火) 20:41
by softya(ソフト屋)
根本的に変なことをしています。
コード:
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++;としていているのが間違いです。
++でポインタのインクリメントであることも問題ですが、共有結合と処理を変えてしまっています。
これはポインタとポインタの先の変数を混同している思われます。この場合はポインタ先の変数を更新するのが正しい解です。
Re: モジュール結合について教えて下さい (質問意図がわかったので再び修正)
Posted: 2012年5月15日(火) 20:59
by ぷー
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(¶m);//?? 関数inputの呼び出し
if (cc != 0) {
printf("Input error!\n");
return -1;
}
sort(¶m);//?? 関数sortの呼び出し
output(¶m);//?? 関数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
データ個数の設定のところで
??がなかったのでいじってはいけないのかと思ってました。
共有結合も書式気にせず見てみます。
助かりました。
またよろしくお願いします。