構造体の使用方法について

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

構造体の使用方法について

#1

投稿記事 by こんばんは » 13年前

先ほど解決した構造体についてソースを張っておりませんでしたので 確認の程、お願いいたします

コード:

-------------struct.h----------------
typdef struct 
{
    int x;
    int y;
};ABC
---------------
---------spot.c-------------
#include "struct.h"

ABC abc [] = {{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{1,1}};

void Spot(int xx, int yy, int num)
{
    int x = abc[num].x;
    int y = abc[num].y;
---------------
---------nip.c-------------
#include "struct.h"

static ABC abc [] = {{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{1,1}};

void nip(int xx, int yy, int num)
{
    int x = abc[num].x;
    int y = abc[num].y;
---------------

sq

Re: 構造体の使用方法について

#2

投稿記事 by sq » 13年前

自分のコードをコンパイルしてみましたか?
それに本当にやりたいことと一致しているのでしょうか?

コード:

/* struct.h */
typedef struct ABC {
  int x;
  int y;
} ABC;

extern ABC abc[];

コード:

/* spot.c */
#include "struct.h"
#include <stdio.h>

void spot(int xx, int yy, int num)
{
  int x = abc[num].x;
  int y = abc[num].y;
  
  printf("%d %d\n", x, y);
}

コード:

/* nip.c */
#include "struct.h"
#include <stdio.h>

ABC abc [] = {{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{1,1}};

void nip(int xx, int yy, int num)
{
  int x = abc[num].x;
  int y = abc[num].y;
  
  printf("%d %d\n", x, y);
}

コード:

/* main.c */
int main()
{
  extern void spot(int,int,int);
  extern void nip(int,int,int);
  
  spot(0,0,0);
  nip(0,0,0);
  
  return 0;
}

こんばんは

Re: 構造体の使用方法について

#3

投稿記事 by こんばんは » 13年前

by sq 様 返信遅れまして申し訳ございませんでした。

自分のコードをコンパイルしてみましたか?
<<コンパイルしてもエラーはありませんでした。
それに本当にやりたいことと一致しているのでしょうか?
<<本当は龍神録5章のようなファイル分割を目指していました。

下記にまねたものを記述しました。ですが#define GLOBAL extern が灰色に表示されます。
機能していないのでしょうか。

---main.c---

コード:

#define GLOBAL_INSTANCE
#include "GV.h"

int main()
{
	for(int i = 0; i < 4; i++){
		nip(0,0,i);//x,y座標指定
		spot(0,0,i);
	}
 return 0;
}
---nip.c---

コード:

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

ABC abc [] = {{0,1},{0,-1},{1,0},{0,1}};//上下左右
 
void nip(int xx, int yy, int num)//main内で指定したx,y座標とi「abc[]の方向」
{
	int nx = abc[num].x;
	int ny = abc[num].y;

	int x = xx + nx;
	int y = yy + ny;

	for(int i = 0; i < 4; i++){//	「num」で指定した方向に4進む  
		printf("nip_num: %d  X:%d  Y:%d\n", num, x, y);

		x += nx;
		y += ny;
	}
}
---spot.c---

コード:

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

void spot(int xx, int yy, int num)
{
	int nx = abc[num].x;
	int ny = abc[num].y;

	int x = xx + nx;
	int y = yy + ny;

	for(int i = 0; i < 4; i++){	  
		printf("spot_num: %d  X:%d  Y:%d\n", num, x, y);

		x += nx;
		y += ny;
	}

	printf("\n");
}
---struct.h---

コード:

typedef struct{
  int x;
  int y;
} ABC;
---GV.h---

コード:

#include "define.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern //ここが初めは色がついていたのですが、分割していくうちに灰色になりました 
#endif

#include "function.h"

GLOBAL ABC abc[];
---function.h---

コード:

GLOBAL void spot(int,int,int);
GLOBAL void nip(int,int,int);
---define.h---

コード:

#include struct.h

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 構造体の使用方法について

#4

投稿記事 by へにっくす » 13年前

こんばんは さんが書きました:下記にまねたものを記述しました。ですが#define GLOBAL extern が灰色に表示されます。
機能していないのでしょうか。
#defineを安易に使わないでください。
C言語を習得するなら、予約語を別名で定義することはやめた方がよいと思います。

そもそも関数内でプロトタイプ宣言する(sqさんの示されたコードはmain関数の中で宣言してましたよね?)のでなければ、externの必要はありません。※変数は要りますよ。関数のプロトタイプ宣言のことです。
したがってGLOBAL_INSTANCE、GLOBALの定義も要らないように思えるのですが。
GV.hにあるABCの変数も、GLOBALにしちゃうと、混乱のもとだよ。(ヘッダーに実体を載せる可能性があることはしないこと!)
written by へにっくす

こんばんは

Re: 構造体の使用方法について

#5

投稿記事 by こんばんは » 13年前

へにっくす様 度々感謝いたします。
sq様が記述しましたソースを参考にし整理しました。

main.c

コード:

#include "function.h"

int main()
{
	for(int i = 0; i < 4; i++){
		nip(0,0,i);//x,y座標指定
		spot(0,0,i);
	}
  
  return 0;
}
nip.c

コード:

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

ABC abc [] = {{0,1},{0,-1},{1,0},{0,1}};//上下左右
 
void nip(int xx, int yy, int num)//main内で指定したx,y座標とi「abc[]の方向」
{
	int nx = abc[num].x;
	int ny = abc[num].y;

	int x = xx + nx;
	int y = yy + ny;

	for(int i = 0; i < 4; i++){//	「num」で指定した方向に4進む  
		printf("nip_num: %d  X:%d  Y:%d\n", num, x, y);

		x += nx;
		y += ny;
	}
}
spot.c

コード:

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

void spot(int xx, int yy, int num)
{
	int nx = abc[num].x;
	int ny = abc[num].y;

	int x = xx + nx;
	int y = yy + ny;

	for(int i = 0; i < 4; i++){	  
		printf("spot_num: %d  X:%d  Y:%d\n", num, x, y);

		x += nx;
		y += ny;
	}

	printf("\n");
}
struct.h

コード:

typedef struct{
  int x;
  int y;
} ABC;

extern ABC abc[];
function.h

コード:

void spot(int,int,int);
void nip(int,int,int);
「nip.c」と「spot.c」は引数や変数は同じまま、処理内容に違いを持たせ、一つのソースに纏めようと思っております。

何かありましたら返信お願いいたします。

閉鎖

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