C言語のプログラミング問題(難解)について教えてください!

C言語の勉強し始めましたが次の問題のプログラミングが分かりません
分かる方がいましたらよろしくお願いします。


以下の問題です。
次の作業を実現するためのプログラミングを描け。

機能名:リストファイルの分割処理

■概要:部門1、部門2の商品が混合して書かれたファイルがある。
部門毎に分けたファイルを新たに作成する。

■条件 (1)ファイルを1行ずつ読み込み、ポインタで受け取り関数で渡すこと。
(2)出力ファイルの最終行には各部門の品種数を入力すること
(3)出力ファイルは固定長とし、空きが出る場合は半角スペースでレコード長を合わせること。
(4)エラー発生時にはエラーメッセージを表示し、終了すること。

■ファイルレイアウト(入力ファイル)
レコード長:26(固定長)


長さ 項目名
1 |部門コード1
1 |(区切り文字カンマ)
6 |商品名1
1 |(区切り文字カンマ)
1 |部門コード2
1 |(区切り文字カンマ)
6 |商品名2
1 | (区切り文字カンマ)
1 |部門コード゛3
1 |(区切り文字カンマ)
6 | 商品名3

■ファイルレイアウト(出力ファイル)
レコード長:20(固定長)

長さ | 項目名
6 |商品名1
1 ||(区切り文字カンマ)
6 |商品名2
1 ||(区切り文字カンマ)
6 |商品名3

(1)入力ファイル(LIST_INPUT.txt)

1,菓子A,1,菓子B,1,菓子C
2,野菜A,2,野菜B,2,野菜C
1,菓子D,1,菓子E,2,野菜D
1,菓子F,1,菓子G,2,野菜E
1,菓子H,2,野菜F,1,菓子I
1,菓子J,1,菓子K,2,野菜G


(2)出力ファイル1(菓子)(LIST1.txt)
菓子A,菓子B,菓子C
菓子D,菓子E,菓子F,
菓子G,菓子H,菓子I
菓子J,菓子K
11

(3)出力ファイル2(LIST2,txt)
野菜A,野菜B,野菜C
野菜D,野菜E,野菜F
野菜G
7


*出力ファイルの最終行に品種数を追加すること。

よろしくお願い致しますm(__)m

このQ&Aに関連する最新のQ&A

A 回答 (5件)

いきなりこの問題を解くのが難しいのであれば、以下のように段階的に解いてはどうでしょうか。


どのようなステップを踏むのが良いかは、自分の考えてみてください。

1.入力ファイルをそのまま一つの出力ファイルにコピーする。
2.入力ファイルをそのまま二つの出力ファイルにコピーする。
3.出力データを固定長レコードに変換する処理を追加する。
4.部門毎に出力ファイルを切り替える処理を追加する。
5.計数処理を追加する。
    • good
    • 0

> C言語の基礎的な関数は独学で習得しましたがファイル処理やポインタのに関する知識は曖昧な理解になっています。



なら、まずはそこをしっかり理解することをお勧めします。
特にポインタはCを象徴する、と言える、最大の利点であり最大の弱点です。
曖昧のまま先に進めばもっとわからなくなりますよ。

また、質問するにしても、もう少し自分で考えた上で、わからないポイントをはっきりさせないと。
人のソースをただだらだら見ても、理解した気になるだけで、勉強にはなりませんよ。

この回答への補足

ご回答有難うございます。

これから自分で実際にプログラムを動かしながら学習していきたいと思います。

補足日時:2011/04/27 23:03
    • good
    • 0

>ファイル処理やポインタのに関する知識は曖昧な理解になっています。



だったら、そこをあいまいなままにしておかず、基礎を頭にたたき込んでから
今回のような応用問題に取り組んでみてはどうでしょうか。

この回答への補足

ご回答有難うございます。

指摘して頂いた通り、もう一度、基礎学習(特にポインタとアルゴリズムの知識)を行います。

補足日時:2011/04/27 23:00
    • good
    • 0

> 実は2週間ほど前から独学(問題集を用いて)でC言語の学習をしておりまして



独学ならなおさら、まずは自分で書いたコードを提示して「どうでしょう?」と質問しましょう。
今の段階で模範解答見ても仕方ないよ。
    • good
    • 0

難解・・・・なのかな


学校か何かの課題なのでしょうか。

1から全て教えろって事ですか?

・入力ファイルを開く
・出力ファイル2つ分を開く
・ファイルから一行単位に読み込む。
・1行分のデータを3つの商品に分割する
・各商品の部門文字よりA/Bの何れの出力ファイルに出力するかを判定する
・出力ファイル用のバッファへ蓄積(商品数のカウントアップ)
・出力バッファに3個分データが蓄積されたら、出力ファイルの書き出し
・入力ファイルが終端に達したら、それぞれの出力ファイルに商品数を書き出してファイルを閉じる

大雑把に処理の流れを羅列すると上記のようになる。

このときに、どの処理をサブ関数化するか?
どういった情報を引数にするか?
どういった場合にエラーが発生しうるか?
そういった点を更に詰めれば、処理のフローはほぼ完成する。

そしたら、フローに従って処理をコード化する。

確かに、チョチョイって感じではないね。

ファイルIOやポインタ等に関する知識は習得済みなんですよね?

この回答への補足

相互リンクは以下の通りでございます
http://dixq.net/forum/viewtopic.php?f=3&t=8338

補足日時:2011/04/28 17:47
    • good
    • 0
この回答へのお礼

有難うございます。感謝します。
実は2週間ほど前から独学(問題集を用いて)でC言語の学習をしておりまして

その演習問題(解答がない)のプログラミングの答えを教えて頂きたく質問させていただきました。

C言語の基礎的な関数は独学で習得しましたがファイル処理やポインタのに関する知識は曖昧な理解になっています。

大変申し分け御座いませんが、もし宜しければ、この演習問題の模範的なプログラミングの解答を教えて頂けないでしょうか?

無理難題を押し付けてしまい申し訳ございません。

お礼日時:2011/04/27 21:24

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVisual C++ 6.0とVisual C++ 2005 についてですが・・・

Visual C++ 6.0でワークスペースと呼ばれていた物がVisual C++ 2005になるとソリューションと言う名前になったと聞きました。
また、Visual C++ 6.0で製作したファイルはVisual C++ 2005でも開けるけどVisual C++ 2005製作したファイルはVisual C++ 6.0では開けないと聞いたのですがVisual C++ 2005製作したファイルをVisual C++ 6.0でも開ける様に互換性を持たせる方法はありませんか?
学校と家で使っている環境が違うので互換性がもてれば両方で使えてとても便利になります。
御存知の方がいましたら御伝授お願いします。

Aベストアンサー

ソースファイルやヘッダファイル(拡張子CPP/C/H/HPPなど)はVisual C++ 6.0と2005で共用できるので、6.0用のプロジェクトファイル&ワークスペースと、2005用のプロジェクトファイル&ソリューションファイルを用意すれば両方の環境で開発を進めることができるでしょう。

但し、以下の点にご注意下さい。
・ソースファイルの追加や削除は両方のプロジェクトに対して行うこと。
・Visual C++6.0ではManaged C++が使えないのでManaged C++は使わないこと。
・MFCの仕様がだいぶ違うので、MFCも避けること。MFCを知り尽くしているのでしたらチャレンジはご自由に。
・C++コンパイラとしても若干仕様が違うので(for文内で定義された変数のスコープなど)、常に両方の環境でコンパイルできるか考えながら開発する必要があること。

Qプログラミング言語Cとプログラミング言語C++

プログラミング言語Cとプログラミング言語C++の違いって何ですか?
あと、プログラミング言語C++についていくつか質問があります。
#include <iostream>
using namespace std;
void main(){
cout << "Hello world!" << endl;
}
このプログラムについて質問なんですが、iostreamってプログラミング言語Cで言うstdio.hのことですか?
using namespace stdって何ですか?
あと、 cout <<"Hello world!"って何ですか?

Aベストアンサー

> プログラミング言語Cとプログラミング言語C++の違いって何ですか?

C++は、Cのほぼ全ての仕様を含み、クラス、テンプレート、例外処理など大幅に機能拡張した言語です。
細部の違いが知りたければ、下記を参照してください。
http://www.kijineko.co.jp/tech/cpp2c

> このプログラムについて質問なんですが、iostreamってプログラミング言語Cで言うstdio.hのことですか?

違います。
C++にもstdio.hがありますし、cstdioというヘッダもあります。

iostreamヘッダは、cin, cout, cerr, clogとそれらのワイド文字版を宣言するためのものです。
ですので、iostreamヘッダで宣言・定義される関数やクラスを使うだけでは一般的なファイルの操作はできませんし、sprintfやsscanfに相当するものもありません。
また、removeやrenameなど、ストリームとは関係のない操作も含まれていません。

> using namespace stdって何ですか?

「using指令」によって、名前空間stdの中にある名前を大域的名前空間でも使えるようにするものです。
せっかく名前空間を分けているのに、それを無効にしてしまうような機能ですから、安易にusing指令を使うのはお勧めしません。

> あと、 cout <<"Hello world!"って何ですか?

標準出力に対して、文字列"Hello, world!"を出力します。
ちなみに、endlは、改行を出力したあと、バッファにたまった内容を実際に吐き出します(フラッシュします)。単なる改行の出力ではないので要注意です。

C++の仕様は結構大きい方なので、遭遇した記述をひとつひとつ質問していたのではキリがありません。
まずは入門書を一冊読み、わからない用語等については、処理系のリファレンスを読むか、ネットで検索するなどしてください。

> プログラミング言語Cとプログラミング言語C++の違いって何ですか?

C++は、Cのほぼ全ての仕様を含み、クラス、テンプレート、例外処理など大幅に機能拡張した言語です。
細部の違いが知りたければ、下記を参照してください。
http://www.kijineko.co.jp/tech/cpp2c

> このプログラムについて質問なんですが、iostreamってプログラミング言語Cで言うstdio.hのことですか?

違います。
C++にもstdio.hがありますし、cstdioというヘッダもあります。

iostreamヘッダは、cin, cout, cerr, clogとそれらのワイド...続きを読む

QCかC++どちらを覚えるべきですか?

初めまして。せいじと申します。よろしくお願いします。
プログラミング経験なしです。今30歳です。
遅すぎますが、これからC言語かC++言語をマスターしたいと思っています。
Windows 98 + Borland C++ Compiler 5.5
で勉強しようと思ってます。

Cの拡張されたものがC++だからC++を覚えようと思って、C++の本を買いました。
・新C++言語入門 ビギナー編 SOFTBANK Publishing 林 晴比古 著
・詳説C++             SOFTBANK Publishing 大城 正典 著
2冊ともまだ最初の方を読んで実践しただけです。

クラス、オブジェクト指向プログラミング等々が何なのか分かっていないのに、
C++をする意味があるのか、まずはCで十分ではないのか?
と思うようになってきました。

実際どうしたら良いのでしょう。
何も知らないならC++からでも良いのでしょうか。
違いが分からないならCで十分なのでしょうか。
みなさんの意見を聞かせてください。

よろしくお願いします。

初めまして。せいじと申します。よろしくお願いします。
プログラミング経験なしです。今30歳です。
遅すぎますが、これからC言語かC++言語をマスターしたいと思っています。
Windows 98 + Borland C++ Compiler 5.5
で勉強しようと思ってます。

Cの拡張されたものがC++だからC++を覚えようと思って、C++の本を買いました。
・新C++言語入門 ビギナー編 SOFTBANK Publishing 林 晴比古 著
・詳説C++             SOFTBANK Publishing 大城 正典 著
2冊ともまだ最初の方を読んで実...続きを読む

Aベストアンサー

seiji-h さん。こんにちわ。
プログラミングを今後主に何の目的で使いますか?

(1)仕事でC++が必要。
 頑張っておぼえましょう。

(2)文書データの加工など。。。
 今すぐPerl言語に切り替えましょう。

(3)趣味でWindowsアプリなどの作成を目指して。。
 そのままコツコツC++を続けていってください。

(4)歯ごたえのあるプログラミング言語を。。。
 そのままコツコツC++を続けていってください。

>実際どうしたら良いのでしょう。
>何も知らないならC++からでも良いのでしょうか。
どのようなことに興味をおぼえるかで、Cから始めるべきか、C++から始めるべきか
向き不向きがあります。

★簡潔な文法をもとに、ガリガリと自分の思うままに、プログラミングしたい。
とにかく自分で動くものを作りたいということなら、Cから始めるのが向いていると思われます。
★プログラミングすることよりも、プログラミング言語「自体」に興味があって、
一種の研究の対象と考えている場合は、C++の方が、おもしろおかしく学べると思います。

seiji-h さん。こんにちわ。
プログラミングを今後主に何の目的で使いますか?

(1)仕事でC++が必要。
 頑張っておぼえましょう。

(2)文書データの加工など。。。
 今すぐPerl言語に切り替えましょう。

(3)趣味でWindowsアプリなどの作成を目指して。。
 そのままコツコツC++を続けていってください。

(4)歯ごたえのあるプログラミング言語を。。。
 そのままコツコツC++を続けていってください。

>実際どうしたら良いのでしょう。
>何も知らないならC++からでも良いのでしょうか。
...続きを読む

QCプログラミングの問題です。ニュートン法を利用して3次方程式の解を求めるプログラミング作成。

C言語のプログラミング問題です。
ニュートン法を利用して、3次方程式の解を求めるプログラムを作成しなさい。
とのことです。プログラムが得意ではないので、よろしくお願いします。

C言語のプログラミング問題で、ニュートン法を利用して次の3次方程式の解を求めるプログラミングを作成。というものなのですが、プログラミングが苦手でうまくできません。

y=ax^3+bx^2+cx+d (ただし、a>0とする)
任意の係数a,b,c,dを与え、y=0のときの解(実根のみ)を求めるプログラミングを作成せよ。


という問題です。プログラミングの内容を説明しなくてはいけないので、内容のほうも若干詳しく説明していただけると助かります。
どなたか教えてください、よろしくお願いします。

Aベストアンサー

3次方程式は複雑なので2次方程式で示します.
なんとか頑張って応用してください

前提として実数解のみとし
虚数解の場合はエラー扱いとします。

方程式は a * x ^2 * b * x + c = 0とします

判別式を実装します
CalcDという名前にします。

double CalcD(double a, double b, double c)
{
return b * b - 4 * a * c;
}

特に難しい部分はないと思います
係数から判別式を計算し、それを関数の値として戻しています

次に、方程式本体を解く部分を作ります
Resolvという名前にします

ここで難しいのはエラー(判別式 < 0)をどう扱うか?です
今回の場合、エラーつまり異常事態として扱うので
C++であれば本来、例外で教えるべきなのですが、
例外を扱うと少々難しくなりますのでやめます。

今回は解の個数を戻すことで判定させることとします
解事体は配列に入れて戻すことにします。

int Resolv(double a, double b, double c, double buffer[])
{
// 解の個数を求めます
// 判別式を関数として実装してあるので、それを使います
  double d = CalcD(a, b, c)
if (d < 0)
return 0; // 実数解はありません

  if (d == 0)
{
buffer[0] = -b / (2 * a);
return 1; // 重解です
}
 else
{
buffer[0] = (-b + sqrt(d)) / (2 * a);
buffer[1] = (-b - sqrt(d)) / (2 * a);
return 2; // 相異なる2つの実数解です
}
}

あとはプログラム全体を制御する部分です
しかし、もう部品はありますのであとは簡単です

int main(int argc, char *argv[])
{
// エラーチェックは省略します
 // 本来はパラメータの妥当性を検証すべきです

 double a = atof(argv[0]);
 double b = atof(argv[1]);
 double c = atof(argv[2]);

// 実際に計算します
 double buffer[2];
int n = Resolv(a, b, c, buffer);

// 結果を表示します
 switch (n)
{
case 0:
printf("実数解はありません。");
break;

case 1:
printf("実数解は %f です.", buffer[0]);
break;

default:
printf("実数解は %f と %fです.", buffer[0], buffer[1]);
}

return 0;
}

如何でしょうか?
プログラムの作成の雰囲気のようなものがつかめたでしょうか?
とにかく、分かり易い単位に関数を作ることが大切です。
関数へのパラメータの渡し方
関数からの情報の戻し方(戻り値を使う方法、アドレス渡し(配列もアドレス渡しです)等のテクニックを伝えたつもりです
これを参考に3次方程式も頑張ってください

3次方程式は複雑なので2次方程式で示します.
なんとか頑張って応用してください

前提として実数解のみとし
虚数解の場合はエラー扱いとします。

方程式は a * x ^2 * b * x + c = 0とします

判別式を実装します
CalcDという名前にします。

double CalcD(double a, double b, double c)
{
return b * b - 4 * a * c;
}

特に難しい部分はないと思います
係数から判別式を計算し、それを関数の値として戻しています

次に、方程式本体を解く部分を作ります
Resolvという名前にします...続きを読む

QVisual C++を使用するには,C++の知識は必要?

Visual C++ を使用する必要が生じたのですが,C言語の知識しかなく,
VC++を使用するにあたり,新たにC++を勉強しなければならないか分かりません。
C++を勉強してから,VC++を勉強し始めるべきなのでしょうか?
また,もしC++の勉強をしなければならない場合,使用する参考書として「独習C++」を考えているのですが,この参考書で事足りるでしょうか?
回答よろしくお願いします。

Aベストアンサー

ANo.1の方に同感です。

私はMS-DOSでのC言語からVC++へジャンプしました。

VC++を理解するということは
 1.C++という言語
 2.windowsOS,API
 3.MFC
を理解するということです。

私のとっかかりの本は、3冊のシリーズで
 1.Windowsプログラミングについて
 2.C++について
 3.MFCについて(だった思う)
に分かれており、C言語の知識とwindowsのアプリを触った経験があれば順を追って素直に理解できるものでした。
#処分してしまったので正しい書籍名はわかりませんが、クリーム色のカバーでした。

ただ、これはあくまで入門書で、その後C++に関する本、MFCに関する本、WIN32APIに関する何冊か読まないと、やはり仕事はできません。

Q最近c言語を勉強し始めたのですが解決できない問題が出来たので質問です。

最近c言語を勉強し始めたのですが解決できない問題が出来たので質問です。 入力された整数nに対して Σ{i=0→n} 1/i! を計算するプログラムなんですがわかる方がいたらよろしくお願いします。

Aベストアンサー

プログラムというより、どちらかというと数学の問題ですね。

Σ{i=0→n} 1/i! の値はよく知られているように、nが無限大の時にネイピア数(自然対数の底)eになります。

nがある値以上の場合には有効桁数が溢れて演算が無効になりますからその時はeを返せばよいということです。
有効桁数が溢れて演算が無効になるnをn_MAXとおくと、

#include <math.h>

if (n > n_MAX) return(M_E);

となります。M_Eはコンパイラが提供するネイピア数です。n_MAXは処理系固定なので予めプリプロセッサで計算しておくか、定義しておきます。

つぎに計算量を小さくする工夫が必要です。上記のようにn_MAXを求めておいた場合には
nがn_MAXに近い場合には減算した方が速いので処理を分離します。

// n_MAX!は予め計算しておくこと
#define fact_MAX = 1.0/(double)(n_MAX!);

if (n > (n_MAX - n)) {
double s, fact;
int i;

// s = Σ{i=n+1 → n_MAX} 1/i! の計算
s = fact = fact_Max;
for (n += 1, i = n_MAX; i > n ; i--) {
fact *= (double)i;
s += fact;
}
return(M_E - s);
}

以下は他の回答者の方を参考にしてみてください。

プログラムというより、どちらかというと数学の問題ですね。

Σ{i=0→n} 1/i! の値はよく知られているように、nが無限大の時にネイピア数(自然対数の底)eになります。

nがある値以上の場合には有効桁数が溢れて演算が無効になりますからその時はeを返せばよいということです。
有効桁数が溢れて演算が無効になるnをn_MAXとおくと、

#include <math.h>

if (n > n_MAX) return(M_E);

となります。M_Eはコンパイラが提供するネイピア数です。n_MAXは処理系固定なので予めプリプロセッサで計算しておくか、定義...続きを読む

QC/C++でアプリ開発

C/C++でアプリ開発

いまどきC++でアプリ開発なんてしないのででしょうか。
C/C++を使うのは組み込み分野とかぐらいなんでしょうか?
もし新卒の大学生がC/C++でアプリ開発するならどういう会社に入ればよいでしょうか?

Aベストアンサー

ソフトウェアハウスとかなら今でもC言語が必要になる案件は多いです
Windows向けソフトウェアの受託とか、Linuxアプリケーションとか。

ただ、C言語でそれなりの結果を出している
というわけでは無いのでしたら、
無理してC言語にこだわらない方がいいかもしれません。
Cで開発するだけの自信があるのでしたら、
それ以外の言語の仕事も十分に出来ますし、
そっちの方が仕事が捕まえやすいというのもあります。
それにC言語の仕様の多さは他の言語には類を見ないくらいに大きいですから、
他の言語の仕様を覚えてからでも、十分に役立たせることが出来る。

Qc言語はどのくらい出来るようになれば良いのでしょうか? 他の言語を勉強する予定ですけど、まずはc言

c言語はどのくらい出来るようになれば良いのでしょうか?

他の言語を勉強する予定ですけど、まずはc言語を勉強しようと思い勉強してるのですが、どこまで出来るようになれば良いのでしょうか

Aベストアンサー

単にC言語の文法を勉強するだけなら難しい事ではありません。
但し、仕事として活用できるレベル、又は他の言語を理解するのに
役に立つレベルになるには、多くの知識と経験が必要になります。

C言語を使って、そこそこ難しいアルゴリズムでも簡単に作れる程度
(最低限)になれば、他の言語でも習得するのは容易ですが、勉強の
目的が他の言語を学ぶ足がかりにするだけなら、C言語を学ぶ効果は
低い物となります。

陸上競技で記録に関係無く100m・200m走るだけなら、誰でも簡単に
出来るが、競技大会において上位入賞できるレベル、又は短距離走
での能力を生かし、他の競技(例えば走り幅跳び)で好記録を出せる
レベルになる事は難しいのと同じ。

QC++を学習するにあたって

質問は以下の3つですよろしくお願いします

1.vc++ と c++の違いを教えてください。
 vc++は開発環境でc++の画面をプログラミングするときに使うもの
 という認識でいいでしょうか。
2.vc++とc++の開発環境を教えてください。
javaでいうeclipsの様なものまたその開発環境はcやc++やc#でも使えるか否か

3.vc++ や c++ は制御系システムで用い業務系システムでは
 利用しないのでしょうか
 
初歩的な質問で申し訳けありませんがよろしくお願いします。

Aベストアンサー

1.「VC++」とは、マイクロソフト社の「Visual C++」という製品を略したものです。「C++」だけの場合は製品名ではなく、プログラミング言語名です。別に画面特定ではないです。

2.Windows上で一番メジャーな開発環境はマイクロソフト社の「Visual Studio」ですかね。C、C++、C#すべて使えます。
「Visual C++」はVisual Studioの一部です。

3.もちろん業務系でも使われます。アプリケーションやゲームの製作にも一番使われているのではないでしょうか。

QVisual Stdioで、C言語のプログラミングを勉強してるのですが

Visual Stdioで、C言語のプログラミングを勉強してるのですが、
不明点があるため質問させて頂きます。

【前提条件】
----------------------------------------------------
< TestHeader.h >
typedef struct A {
int (*a)(struct B* x, char* y, struct C** z);
} A;
----------------------------------------------------
< TestSource.c >
static int func(struct B* x, char* y, struct C** z)
{
return 0;
}

struct A D = {
.a = func,
};
----------------------------------------------------

上記の条件で、< main.c >を作成し、
main関数からfunc関数へ遷移するようにしたいです。
書籍などで調べたのですが、main関数の作成方法が分かりません。

ご教授のほど、よろしくお願いします。

Visual Stdioで、C言語のプログラミングを勉強してるのですが、
不明点があるため質問させて頂きます。

【前提条件】
----------------------------------------------------
< TestHeader.h >
typedef struct A {
int (*a)(struct B* x, char* y, struct C** z);
} A;
----------------------------------------------------
< TestSource.c >
static int func(struct B* x, char* y, struct C** z)
{
return 0;
}

struct A D = {
.a = func,
};
-----------------------------------------------...続きを読む

Aベストアンサー

> struct A D = {
> .a = func,
> };

こういうフィールドを指定した初期化って、C99で追加されたもので、古い規格に準じたCだと対応していません。
すくなくともVisual Studio 2008以前では対応してないようです。
2010では一部対応した、という記述も見掛けましたが、確認はとれてません。

それ以前の規格だったら、
struct A D={ func } ;
とフィールド指定なしに書く(ただし、間を省略することができないので、初期化の必要のないフィールドの分も必要となるケースがある)か、
strcut A D ;
D.a=func ;
と、宣言と初期化を分けるか、です。


main.cを別ファイルに作るなら
・Dをmain.cから使えるようにするため、 TestHeader.h に
extern struct A D;
と宣言を入れておく。
・Dの初期化は 初期化子を使うか、初期化関数を用意する。
関数を用意する場合は、同じくTestHeaderにプロトタイプ宣言を書いておく。
・共通で使えるように、main.cに#include "TestHeader.h"を記述する


ところで、 typedefでstruct AをA型として使えるようにしていますが、それは使わないのですか?

> struct A D = {
> .a = func,
> };

こういうフィールドを指定した初期化って、C99で追加されたもので、古い規格に準じたCだと対応していません。
すくなくともVisual Studio 2008以前では対応してないようです。
2010では一部対応した、という記述も見掛けましたが、確認はとれてません。

それ以前の規格だったら、
struct A D={ func } ;
とフィールド指定なしに書く(ただし、間を省略することができないので、初期化の必要のないフィールドの分も必要となるケースがある)か、
strcut A D ;
D.a=func ;
と、...続きを読む


人気Q&Aランキング