C言語、構造体について

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

C言語、構造体について

#1

投稿記事 by けろりん » 2年前

このソース、どこが何を表しているのかわかりません。
どういうことなのでしょうか、説明していただきたいです。よろしくお願いします。

コード:

#include <stdio.h>

typedef struct point {
	double cx;
	double cy;
}point;

point set_point(double x, double y) {
	point pt;
	pt.cx = x;
	pt.cy = y;
	return pt;
}

int main(void) {
	point pt;
	pt = set_point(10.0, 20.0);
	printf("座標:(%4.1f,%4.1f)\n", pt.cx, pt.cy);
	return 0;
}

inemaru
記事: 108
登録日時: 2年前

Re: C言語、構造体について

#2

投稿記事 by inemaru » 2年前

ソースが何をやっているのか?という質問であれば、こんな感じでどうでしょうか?
(用語の意味が不明瞭な場合は、検索してください)

コード:

#include <stdio.h> // (関数printfの定義が入っているファイルを読み込む)

// 座標X,Yを持った構造体 point の定義
typedef struct point {
	double cx;	// 座標X
	double cy;	// 座標Y
} point;

// 構造体を引数で初期化してインスタンスを返却する関数
point set_point(double x, double y)
{
	point pt;
	pt.cx = x;
	pt.cy = y;
	return pt;
}

// エントリーポイント
int main(void)
{
	// 構造体 point の インスタンス pt を作成
	point pt;
	
	// 構造体のインスタンスを返却する関数 から受け取ったインスタンスを pt にコピー
	pt = set_point(10.0, 20.0);
	
	// インスタンス pt を 画面(コンソール)に 書式 を使って表示
	// 書式について:
	//  %4.1f は、以下の組み合わせ
	//  %4  -> 4の部分は表示されるときの全体桁数
	//  %.1 -> 1の部分は小数点以下の桁数
	//  %f  -> float型で(実数を)表示
	printf("座標:(%4.1f,%4.1f)\n", pt.cx, pt.cy);
	
	// エントリーポイントの戻り値を返却(正常終了 = 0)
	return 0;
}

box
記事: 1729
登録日時: 8年前

Re: C言語、構造体について

#3

投稿記事 by box » 2年前

インスタンスという用語をそのソースで使うのがふさわしいのかどうか、
いささか疑問に思います。
単に「変数を定義する」くらいでいいような気がしなくもありません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

けろりん

Re: C言語、構造体について

#4

投稿記事 by けろりん » 2年前

pt.cx=xなどとしているのは何のためでしょうか?
inemaru さんが書きました:ソースが何をやっているのか?という質問であれば、こんな感じでどうでしょうか?
(用語の意味が不明瞭な場合は、検索してください)

コード:

#include <stdio.h> // (関数printfの定義が入っているファイルを読み込む)

// 座標X,Yを持った構造体 point の定義
typedef struct point {
	double cx;	// 座標X
	double cy;	// 座標Y
} point;

// 構造体を引数で初期化してインスタンスを返却する関数
point set_point(double x, double y)
{
	point pt;
	pt.cx = x;
	pt.cy = y;
	return pt;
}

// エントリーポイント
int main(void)
{
	// 構造体 point の インスタンス pt を作成
	point pt;
	
	// 構造体のインスタンスを返却する関数 から受け取ったインスタンスを pt にコピー
	pt = set_point(10.0, 20.0);
	
	// インスタンス pt を 画面(コンソール)に 書式 を使って表示
	// 書式について:
	//  %4.1f は、以下の組み合わせ
	//  %4  -> 4の部分は表示されるときの全体桁数
	//  %.1 -> 1の部分は小数点以下の桁数
	//  %f  -> float型で(実数を)表示
	printf("座標:(%4.1f,%4.1f)\n", pt.cx, pt.cy);
	
	// エントリーポイントの戻り値を返却(正常終了 = 0)
	return 0;
}

inemaru
記事: 108
登録日時: 2年前

Re: C言語、構造体について

#5

投稿記事 by inemaru » 2年前

box さんが書きました:インスタンスという用語をそのソースで使うのがふさわしいのかどうか、
いささか疑問に思います。
単に「変数を定義する」くらいでいいような気がしなくもありません。
意味的には、間違っていないつもりですが、
C言語は、C++と違ってオブジェクト指向を導入していないので、
用語としては、スタンダードではないかもしれません。
(C++の構造体はクラスと同等なので、明確に区別していない限りインスタンスと呼んでも問題ない)

解説サイトで調べたところ、聞きなれないですが、
構造体のインスタンス = オブジェクト
と呼ぶらしいです。

詳細は、ロベールさんの解説に丸投げします。

・メモリ上にある変数を実体(インスタンス)と、構造体変数のことをオブジェクトと呼ぶ。
http://www7b.biglobe.ne.jp/~robe/cpphtm ... 01058.html

呼び方が混在すると分かりにくい為、今回は「構造体のインスタンス」で通しますが、
必要に応じて、置き換えて解釈してください。

ただ、box様のコメントにあるように、
型と変数の関係だけ見れば、
「変数を定義」とした方がわかりやすいですね。

[hr]
けろりん さんが書きました:pt.cx=xなどとしているのは何のためでしょうか?
構造体のインスタンスを初期化するのためです。
変数は、作成しただけだと内容が不定です。

コード:

// int 型の value を作成
int value;		// ← この段階だと、valueの値は不定
value = 100;	// ← ここで初めて、値が確定する(つまり、初期化している)
コメントが誤解を招きそうだったので、少し変更しました。

コード:

// 構造体のインスタンスを引数で初期化して返却する関数
point set_point(double x, double y)
{
	// 構造体 point のインスタンス pt を作成
    point pt;
	
	// 引数で受け取った変数 x, y の値を使用して、
	// 構造体のメンバ変数 cx, cy を初期化
    pt.cx = x;	// cxにxをコピー
    pt.cy = y;	// cyにyをコピー
	
	// 初期化された pt を返却
    return pt;
}

かずま

Re: C言語、構造体について

#6

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

けろりん さんが書きました:このソース、どこが何を表しているのかわかりません。
どういうことなのでしょうか、説明していただきたいです。よろしくお願いします。

コード:

#include <stdio.h>  // 関数 printf の宣言を取り込む (定義は入っていない)
 
typedef struct point { // タグ名が point である構造体の型の宣言の開始
    double cx; // cx は、point構造体のメンバ
    double cy; // cy は、point構造体のメンバ
}point; // 構造体を struct point ではなく、point だけで参照できるように typedef した
 
point set_point(double x, double y) {
    point pt;  // point型の変数 pt を用意した (関数 set_point内だけに存在)
    pt.cx = x;  // pt のメンバ cx に x の値を代入
    pt.cy = y;  // pt のメンバ cy に y の値を代入
    return pt;  // pt の値を、関数 set_point の呼び出し元に返す
}
 
int main(void) {
    point pt; // point型の変数 pt を用意した (関数 main内だけに存在)
    pt = set_point(10.0, 20.0);  // 関数 set_point を呼び出し、返却値を pt に代入
    printf("座標:(%4.1f,%4.1f)\n", pt.cx, pt.cy); // pt の 2つのメンバの値を表示
    return 0;
}

inemaru
記事: 108
登録日時: 2年前

Re: C言語、構造体について

#7

投稿記事 by inemaru » 2年前

かずま さんが書きました:

コード:

#include <stdio.h>  // 関数 printf の宣言を取り込む (定義は入っていない)
inemaru さんが書きました:

コード:

#include <stdio.h> // (関数printfの定義が入っているファイルを読み込む)
かずま様の説明と自分の説明に差があったので補足です。

確かにヘッダーには、宣言しか入っていませんが、
最終的に、定義(実装)の入っているファイルが読み込まれるようになるので
<stdio.h>には、定義が入っていないという意味です。
(printfの実装は組み込まれていることが多いですが・・・)

閉鎖

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