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

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

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

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

Q&A

解決済

3回答

798閲覧

C 自作ヘッダ エラー 未定義

syogak

総合スコア2

C

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

0グッド

0クリップ

投稿2022/01/20 14:53

編集2022/01/20 16:43

複素行列を読み込めるようなプログラムを作っているのですが、コンパイルすると未定義とエラーが出てしまいます。
以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

makeとした時のエラー

make: *** [matrix.o] Error 1

今したいこと

matrixmain内の、%lf + %lfiの部分を、
それぞれ実部虚部に入れたいのですが、
&mat[i][j].re, &mat[i][j].im
ではできませんでした。教えていただけるとありがたいです。
complexについては、
typedef struct complex {
double re;
double im;
} complex ;
となっております

該当のソースコード

matrixmain.c

C

1#include <stdio.h> 2#include <stdlib.h> 3#include "complex.h" 4#include "matrix.h" 5 6int main(int argc, char * argv[]){ 7 int n, m; 8 complex ** matA; 9 FILE * fp; 10 11 if(argc < 2){ 12 printf("Not enough arguments!\n"); 13 return -1; 14 } 15 16 fp = fopen(argv[1], "r"); 17 fscanf(fp,"%d %d\n",&n, &m); 18 matA = init_mat(fp, n, m); 19 fclose(fp); 20 print_mat(matA, n, m); 21 free_mat(matA, n, m); 22 23 return 0; 24}

matrix.c

#include "complex.h" #include "matrix.h" #include <math.h> #include <stdio.h> #include <stdlib.h> complex** init_mat( FILE* fp, int n, int m){ complex ** mat; mat = (complex **)malloc(sizeof(complex *) * n); for(int i = 0;i < n;i++) mat[i] = (complex *)malloc(sizeof(complex) * m); for(int i = 0;i < n;i++){ for(int j = 0;j < m;j++) fscanf(fp, "%lf + %lfi", &mat[i][j].re, &mat[i][j].im); } return mat; } void free_mat( complex** mat, int n, int m){ for(int i = 0;i < n;i++) free(mat[i]); free(mat); } void print_mat( complex** mat, int n, int m){ for(int i = 0;i < n;i++){ for(int j = 0;j < m;j++) printf("\tlf + %lfi", &mat[i][j].re, &mat[i][j].im); printf("\n"); } }

matrix.h

#ifndef _MATRIX #define _MATRIX typedef struct matrix { int row; ///< row number int col; ///< column number double re; double im; } matrix ; complex ** init_main( FILE *, int , int ); void free_mat( complex** , int , int ); void print_mat( complex** , int , int ); #endif

Makefile

CC= gcc RM=rm CFLAGS= -I. -Wall -Wextra -pedantic LFLAGS= -lm HEADERS= complex.h matrix.h OBJS= matrixmain.o matrix.o .SUFFIXES: .c .o .PHONY: clean %.o: %.c $(HEADERS) $(CC) -c $(CFLAGS) -o $@ $< all: matrixmain complexmain: $(OBJS) $(CC) -o $@ $(CFLAGS) $^ $(LFLAGS) clean: $(RM) -rf *.o matrixmain

complex.hは、複素数のヘッダです。

初学者で、質問するにあたりどんなコードが必要なのかも良くわかっていません。何か他に必要な情報があればおしゃってください。エラーの原因を自分でも考えたのですが、力及ばずでした。よろしくお願いいたします。

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

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

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

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

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

syogak

2022/01/20 15:21

matrix.h内のinit_mat()がinit_main()になっていたので、修正いたしました。makeをしたところ、上記と同様のエラーが出てしまったので、このエラー自体には関係なさそうです。
jimbe

2022/01/20 17:25

> %lf + %lfiの部分を、それぞれ実部虚部に入れたい fscanf に ( 後のprintf() )そのままのフォーマットを書かれていますが、本当にファイルに(間の"+"も含めて)そのように書かれているのでしょうか、
syogak

2022/01/20 18:56

書いてあります、というかまだファイルを読み込む段階に辿り着けていないので... エラーコードは error: member reference base type '_Complex double' is not a structure or union です
thkana

2022/01/20 23:07

complex.hも「自作ヘッダ」のひとつですか? _Complex という文字列が見えるあたりそうなっていないような気がしますが。 標準のcomplex.hを使うのであれば、complexの使い方がそもそも違うのではないか...という気が。 (これまでCでcomplex扱う機会がなかったのでよく知りませんが)
syogak

2022/01/23 13:23

自作ヘッダの一つです。他の方にも解答をいただいたのですが、自作ヘッダの方のcomplex.hを別のフォルダに入れてしまっていたため、標準の方が使用されエラーが出ていたようです。ありがとうございます......!
guest

回答3

0

Makefileの問題は他の回答者各位にお任せして:

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <complex.h> 4 5_Dcomplex** create_mat(int row, int col) { 6 char* area = (char*)malloc(sizeof(_Dcomplex*)*row + sizeof(_Dcomplex)*row*col); 7 if ( area != NULL ) { 8 _Dcomplex* prow = (_Dcomplex*)(area + sizeof(_Dcomplex*)*row); 9 for ( int i = 0; i < row; ++i ) { 10 ((_Dcomplex**)area)[i] = prow; 11 prow += col; 12 } 13 } 14 return (_Dcomplex**)area; 15} 16 17int main() { 18 int R = 3, C = 4; 19 _Dcomplex** matrix = create_mat(R,C); 20 for ( int row = 0; row < R; ++row ) { 21 for ( int col = 0; col < C; ++col ) { 22 matrix[row][col] = _Cbuild((double)row,(double)col); 23 } 24 } 25 // できたかな? 26 for ( int row = 0; row < R; ++row ) { 27 for ( int col = 0; col < C; ++col ) { 28 printf("matrix[%d][%d] = %lf + %lfi\n", row, col, 29 creal(matrix[row][col]), cimag(matrix[row][col])); 30 } 31 printf("\n"); 32 } 33 34 free(matrix); 35 return 0; 36}

投稿2022/01/20 23:48

episteme

総合スコア16614

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

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

0

Makefileの

makefile

1complexmain: $(OBJS)

は、

makefile

1matrixmain: $(OBJS)

にする意図だったんじゃないでしょうか。

投稿2022/01/20 15:36

int32_t

総合スコア20832

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

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

syogak

2022/01/20 16:24

ありがとうございます。一歩進みました。
guest

0

ベストアンサー

Makefileの

complexmain: $(OBJS)

は、
matrixmain: $(OBJS)の間違いでは?

また、#includeが足りません。
matrix.hに、#include <stdio.h>#include <stdlib.h>を入れるとか。

それでコンパイルは出来ると思いますが、警告がいろいろ出るので、いろいろ間違っているのでしょうね。

投稿2022/01/20 15:34

otn

総合スコア84499

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

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

syogak

2022/01/20 16:30

ありがとうございます。その通りです。追加で質問なのですが、complexにはreとim(実部と虚部)があり、mat[i][j]もその二つに分けようと思ったのですが、うまくいきません。 &mat[i][j].re, &mat[i][j].im としたところ、エラーが出てしまいました。どのようにすれば良いのでしょうか?
syogak

2022/01/20 16:32

もし必要な情報があればおっしゃってください
otn

2022/01/21 00:13

標準のcomplex.hを使わず、独自のcomplex.hを使うようですが、complex.hファイルはそこに有りますか? 無いと、標準のcomplex.hがincludeされます。
syogak

2022/01/23 13:21

ああ!!!ありがとうございます!!失念しておりました、無事解決いたしました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問