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

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

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

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

解決済

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

syogak
syogak

総合スコア2

C

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

3回答

0評価

0クリップ

430閲覧

投稿2022/01/20 14:53

編集2022/01/23 22:23

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

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

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

#include <stdio.h> #include <stdlib.h> #include "complex.h" #include "matrix.h" int main(int argc, char * argv[]){ int n, m; complex ** matA; FILE * fp; if(argc < 2){ printf("Not enough arguments!\n"); return -1; } fp = fopen(argv[1], "r"); fscanf(fp,"%d %d\n",&n, &m); matA = init_mat(fp, n, m); fclose(fp); print_mat(matA, n, m); free_mat(matA, n, m); return 0; }

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は、複素数のヘッダです。

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

syogak

2022/01/20 15:21

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

2022/01/20 16:37

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 ; となっております
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を別のフォルダに入れてしまっていたため、標準の方が使用されエラーが出ていたようです。ありがとうございます......!

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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