質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

5189閲覧

構造体もexternで定義する必要があるのでしょうか?

Masalu_Kudou

総合スコア91

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/05/01 17:35

編集2019/05/01 18:25

お世話になっております。

現在下記のエラーが出て、完全に思考が停止してしまいました。

【エラーメッセージ】

In file included from invider.c:6: inc/display_info.h:4: error: conflicting types for ‘myposition_t’ inc/display_info.h:4: note: previous declaration of ‘myposition_t’ was here invider.c: In function ‘main’: invider.c:51: 警告: passing argument 2 of ‘initialize_main’ from incompatible pointer type inc/extern.h:9: note: expected ‘struct myposition_t *’ but argument is of type ‘struct myposition_t *’ In file included from inc/extern.h:2, from initialize.c:4: inc/display_info.h:4: error: conflicting types for ‘myposition_t’ inc/display_info.h:4: note: previous declaration of ‘myposition_t’ was here

自分での調査した範囲だと

  1. 「conflicting types for...」のエラーが出るケース

 (1) 呼び出し元の関数より後に呼び出し先の関数を定義してしまっているケース
(2) 同じ名前の変数を定義しているケース

  1. 今回エラー対象となっているのは構造体のため、(1)には該当しない?(そもそもincludeするからmain関数より先に読み込まれるはず)
    myposition_tは他の変数名で使用していないため、(2)にも該当しない。

参考書等を見ても解決の糸口が見つかりませんでした。
解決法をご存知の方がいらっしゃれば、よろしくお願いいたします。

【display_info.h】

typedef struct{ char col ; char row ; } myposition_t;

【extern.h】

#include "macro.h" #include "display_info.h" extern void draw_pic(char display[DISPLAYROWMAX][DISPLAYCOLMAX]); /************************************/ /* initialize.c */ /************************************/ extern char initialize_main(char display[DISPLAYROWMAX][DISPLAYCOLMAX], myposition_t *position); // extern char initialize_top(char display[DISPLAYROWMAX][DISPLAYCOLMAX]); /************************************/ /* move.c */ /************************************/ // extern char move_right(mypositon_t *position); // extern char move_left(myposition_t *position);

【macro.h】

#define DISPLAYCOLMAX (71) #define DISPLAYROWMAX (200)

【invider.c】

#include <stdio.h> #include <termios.h> #include <unistd.h> #include <fcntl.h> #include "inc/extern.h" #include "inc/display_info.h" #include "inc/macro.h" /****************************************************************/ /* WindowsのkbhitはLinuxでは使えないため、termios機能を使用する */ /* kbhit関数はネットのを引用 */ /****************************************************************/ int kbhit(void){ struct termios oldt, newt; int ch; int oldf; tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); ch = getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &oldt); fcntl(STDIN_FILENO, F_SETFL, oldf); if (ch != EOF) { ungetc(ch, stdin); return 1; } return 0; } /*****************************************************************/ /* メイン関数 */ /*****************************************************************/ int main(void){ char inputkey; //入力キー // int position; //自分のキャラの位置 myposition_t position = {0} ; char result = 0; //下位関数戻り値 char display [DISPLAYROWMAX][DISPLAYCOLMAX] = {' '} ; // ゲーム画面 char *first_flg ; initialize_main(display, &position); while (1) { if (kbhit()) { inputkey = getchar(); switch(inputkey){ /* case 'l': result = move_right(&position); if(result == 1){ continue; }else{ break ; } case 'h': result = move_left(&position); if(result == 1){ continue; }else{ break; } */ case 'q': goto exit; default: ; } draw_pic(display) ; } } exit: return 0; } void draw_pic(char display[DISPLAYROWMAX][DISPLAYCOLMAX]){ char loopcnt_row ; char loopcnt_col ; for(loopcnt_row = 0; loopcnt_row < DISPLAYROWMAX; loopcnt_row++){ for(loopcnt_col = 0; loopcnt_col < DISPLAYCOLMAX; loopcnt_col++){ printf("%s",display[loopcnt_row][loopcnt_col]); } } }

【initialize.c】

#include <stdio.h> #include "inc/macro.h" #include "inc/display_info.h" #include "inc/extern.h" char initialize_main(char display[DISPLAYROWMAX][DISPLAYCOLMAX], myposition_t *position){ char loopcnt_row ; char loopcnt_col ; position->col = 34; position->row = DISPLAYCOLMAX - 1; for(loopcnt_row = 0; loopcnt_row < DISPLAYROWMAX; loopcnt_row++){ for(loopcnt_col = 0; loopcnt_col < DISPLAYCOLMAX; loopcnt_col++){ if(loopcnt_col == DISPLAYCOLMAX-1){ display[loopcnt_row][loopcnt_col] = '\n' ; }else if(loopcnt_row == position->row && loopcnt_col == position->col){ display[loopcnt_row][loopcnt_col] = '_' ; }else{ display[loopcnt_row][loopcnt_col] = ' '; } } } } /* char initialize_top(char display[DISPLAYROWMAX][DISPLAYCOLMAX]){ char loopcnt_col ; for(loopcnt_col = 0;loopcnt_col < DISPLAYCOLMAX-1; loopcnt_col++){ display[DISPLAYROWMAX-1][loopcnt_col] = '-' ; } display[DISPLAYROWMAX-1][DISPLAYCOLMAX-1] = '\n' ; return 1 ; }*/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/05/01 17:42

inc/extern.h と initialize.c はどのような内容でしょう.
Masalu_Kudou

2019/05/01 17:48

情報不足で申し訳ありません。 extern.hとinitialize.cを追加いたしました。
cateye

2019/05/01 17:57

これだけではコンパイルできません。上記ファイルがコンパイルできるだけのソースを上げて下さい。
Masalu_Kudou

2019/05/01 18:06

計5ファイルあります。 分かりづらくなってしまうかと思い、直接関係ないものは避けていました。 UPするソースを修正します。少々お待ちください。
Masalu_Kudou

2019/05/01 18:16

更新しました。 一応やろうとしていることは、cuiのゲームを作ろうとしています。 そのゲーム画面として、縦200、横70バッファ(?)分の初期設定をやろうとしています。
Masalu_Kudou

2019/05/01 18:18

すみません、更新が反映されなかったので少々お待ちください。
guest

回答2

0

問題の原因はjimbeさんの回答の通りなのですが、解決策としてはヘッダ宣言を消していくのではなく、インクルードガードを使って下さい。

PRE06-C. ヘッダファイルはインクルードガードで囲む

C標準では無くなりますが、pragma oneceを使うという方法もあります。メジャーなコンパイラはほぼ全て対応しています。

投稿2019/05/01 23:29

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Masalu_Kudou

2019/05/02 08:29

ありがとうございます! すぐに取り入れてみます!
guest

0

ベストアンサー

extern.h で display_info.h を読んでいるようです.

投稿2019/05/01 18:36

jimbe

総合スコア12625

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Masalu_Kudou

2019/05/01 18:48

ご回答ありがとうございます! extern.hの定義を消したらエラーが消えました。…しかし代わりに下記のエラーが出てしまいました。 =================== nc/extern.h:8: error: expected declaration specifiers or ‘...’ before ‘myposition_t’ nvider.c: In function ‘main’: nvider.c:51: error: too many arguments to function ‘initialize_main’ ================== これから調べてみますが、extern.hの定義(display_info.h)を消したことと関係あったりするでしょうか?
jimbe

2019/05/01 19:15 編集

extern.h の #include "display_info.h" は initialize_main の宣言に必要なのではありませんか? extern.h で macro.h も display_info.h も読んでいるのですから, invider.c での include を extern.h だけにすればよいのではないでしょうか.
Masalu_Kudou

2019/05/01 19:32

なるほど…。おっしゃるとおりなはずなのに全く気付けませんでした。 すべて解消できました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問