プログラムの分割と構造化(C言語です)

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

プログラムの分割と構造化(C言語です)

#1

投稿記事 by メロンパン » 13年前

ご無沙汰しております。
以下は8王妃問題と呼ばれているもので、自分の縦横斜めに自分しかいない正方行列を
求める問題のプログラムです(ガウスが作ったものとして知られています)
これをコンパイルすると、
Main.obj : error LNK2019: 見解決の外部シンボル _countが関数_mainで参照されました。
他に、set,flag_a,flag_b,flag_cも同様のエラー内容が発生します。
※開発環境はVisualStuidoを入れたコンソールタイプのテキストエディタです。

実行のためにご指摘いただけないでしょうか。宜しくお願いします。

<Ouhi8.c>

コード:


#include "Matchings.h"
#include <stdio.h>

int flag_a[N];
int flag_b[N*2-1];
int flag_c[N*2-1];
int pos[N];
int count = 0;

void print(void) {

	int i;
	
	for (i = 0; i < N; i++)
	    printf("%2d", pos[i]);
    printf("\n");
	count++;
}

void set(int i)
{
	int j;
	
	for (j = 0; j < N; j++) {
		if (!flag_a[j] && !flag_b[i + j] && !flag_c[i - j + N-1]) {
			pos[i] = j;
			if (i == N-1)
			    print();
				
			else {
				flag_a[j] = flag_b[i + j] = flag_c[i - j + N-1] = 1;
				set(i + 1);
				flag_a[j] = flag_b[i + j] = flag_c[i - j + N-1] = 0;
			}
		}
	}
}
<Main.c>

コード:


#include "Matchings.h"
#include <stdio.h>


void set(int i);

int main(void)
{
    extern int flag_a[N];
	extern int flag_b[N*2-1];
	extern int flag_c[N*2-1];
	extern int count;

	int i;	
	
	for (i = 0; i < N-1; i++)
	    flag_a[i] = 0;
	for (i = 0; i < 2*N-1; i++)
	    flag_b[i] = flag_c[i] = 0;
		
	
	set(0);
	
	printf("count=%d", count);
	
	return (0);
}
<Matchings.h>

コード:

#define N 6 /*人数の基本単位*/
#define M 8 /*行列のためにN+2をMとする*/


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

Re: プログラムの分割と構造化(C言語です)

#2

投稿記事 by beatle » 13年前

Ouhi8.c をコンパイルしてできたオブジェクトファイル Ouhi8.o (VCだとOuhi8.objかも)

Main.c をコンパイルしてできたオブジェクトファイル Main.o (VCだとMain.objかも)
を一緒にリンクすれば解決します。
Main.o だけから実行ファイルを作ろうとすると、 Ouhi8.o に含まれている変数や関数が見つからないという現象になります。

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

Re: プログラムの分割と構造化(C言語です)

#3

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

すいません。この質問とは関係ないのですが前回の最後の回答は読んで頂けましたか?
「C言語のプログラムをC++に直すメリットとは何でしょうか? • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=11183#p90219

私の懸念していることですが、これまでの質問内容全てで実務的なプログラムが一つも見当たりません。
このリンクエラーの件もですがプログラミングをやっていれば知っているであろう事の経験があまりにも少ないと思います。
※ 今回の件で言えばリンクはC言語の基礎の部分です。
なのである程度の規模の複数ファイルで構成された一般アプリを組むことはメロンパンさんに取って重要必須事項だと思います。
【追記】
何か実用的なアプリとして組まれたものはありますか? ソースファイルでは無くても良いので実行ファイルの形でも良いので見せていただければアドバイス出来ると思います。

【補足】
AOJ(会津オンラインジャッジ)の問題もそうなのですが、プログラミングはすべてパズル的な問題や競技プログラミングが全てだと思っていませんでしょうか?
アルゴリズムの理解や知的パズルとしての意味はありますが現実的なプログラムは、そうじゃない部分が多数を占めます。
ああいった物をどれだけ解けても現実的なアプリを作れないので本末転倒と言って良いでしょう。
実用的なアプリを組むためにああいう勉強をするのですから。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

メロンパン

Re: プログラムの分割と構造化(C言語です)

#4

投稿記事 by メロンパン » 13年前

メロンパンです。こんばんは。
お二方のご回答誠にありがとうございます。
やっぱりVisualStudioで組んで実行するほうがよさそうですね。
EMEditorのプラグインだとかなり面倒そうです。でも軽いんですけどね^^;

softyaさん、度々お世話になっております。
ログが長々と続くのを恐れてました。すいませんです。
今スクールに通っていて今帰ってきたところなのですが、
ちょうど実務的なことを少しずつ始めています。
例えば、社員管理のプログラムとか(まだポインタにつまづていますが)

学生時代にマッチング理論にはまっていてアルゴリズムチックなことに
かっこ良さを求めていたのですが、PHPの会社に入って、なにこれ!?
と言わんばかりの常識はずれの実務を任されたため、別の仕事をしていました。
本当はCも好きですが、PHPも好きなんですが、実務で役に立たないと、
私クラスの人間がプログラムを作って対価をもらうにはまだまだですね。

AOJは知りませんでしたが、見ても多分解けません。
実務的なことを覚えて早く世の中の役に立ちたいです。
コメントどうもありがとうございました。

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

Re: プログラムの分割と構造化(C言語です)

#5

投稿記事 by beatle » 13年前

コンパイル・リンクの仕組みの理解は基礎的な知識だと思います。
せっかくの機会なのでこのままコマンドラインからの開発を学んでみてはいかがでしょうか。

1つのcファイルを(狭義の意味での)コンパイルすると1つのobjファイルになり、複数のobjファイルをリンクして1つにくっつけるとexeファイルになる、という一連の流れを学ぶには、コマンドラインで手動でコンパイルとリンクをするのが良いです。

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

Re: プログラムの分割と構造化(C言語です)

#6

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

なるほど、実務に向けて勉強中ということですね。

ちなみにcl Main.c Ouhi8.cとコマンドライン実行すればちゃんとコンパイル・リンクされます。
あるいは、
cl /c Ouhi8.c
cl /c Main.c
link Main.obj Ouhi8.obj
と打ち込めばmain.exeが出来ます。※ オプションは省略してありますが本来は指定すべきです。
コマンドラインで使うなら最低限のコンパイルリンクの仕組みを理解してください。これは、昔からあるgcc等でも基本的なことは変わりません。

まぁ、毎回手作業で打つのは面倒なので普通はmakeを使います。
VC++だとnmakeと言うツールが付属します。これはMS-Cの大昔からの伝統ツールです。
今ならMSBuildかも知れませんが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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