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

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

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

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

3回答

14954閲覧

エラー 定義されていない参照

muromonn

総合スコア3

C

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2021/06/07 19:12

前提・実現したいこと

与えられたヘッダファイルjikken.hとmain.cを使って、2次元配列を2つ動的に取得して積とその計算時間を求める。

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

エラーが出てコンパイルすることができない

main.c : `omp_get_threads`に対する定義されていない参照です main.c : `make_matrix`に対する定義されていない参照です main.c : `omp_get_wtime`に対する定義されていない参照です main.c : `omp_get_wtime`に対する定義されていない参照です main.c : `check_matrix`に対する定義されていない参照です

該当のソースコード

c

1//main.c 2#include <stdio.h> 3#include <stdlib.h> 4#include <omp.h> 5 6#include "jikken.h" 7 8int main(int argc, char *argv[]) 9{ 10/* ここに変数を定義 */ 11 unsigned int size; //配列大きさ 12 int i, j, k; 13 double t1=0, t2=0; //時間 14 15 16 17 if ((argc != 2) || (size=atoi(argv[1]))<=0) { //ここは与えられていた 18 fprintf(stderr,"Invalid Argument\n"); 19 exit(1); 20 } 21 22/* ここまで実行すると、size に行列サイズが代入される。*/ 23 24 printf("matrix : %d * %d\n", size, size); 25 printf("thread : %d\n", omp_get_max_threads()); 26 27 double **a, **b, **c; 28 29 a = (double **)malloc(sizeof(double *) * size); //行列a 30 if(a == NULL) 31 return -1; 32 for(i = 0; i < size; i++){ 33 a[i] = (double *)malloc(sizeof(double) * size); 34 if(a[i] == NULL) 35 return -1; 36 } 37 38 b = (double **)malloc(sizeof(double *) * size); //行列b 39 if(b == NULL) 40 return -1; 41 for(i = 0; i < size; i++){ 42 b[i] = (double *)malloc(sizeof(double) * size); 43 if(b[i] == NULL) 44 return -1; 45 } 46 47 c = (double **)malloc(sizeof(double *) * size); //行列c 48 if(c == NULL) 49 return -1; 50 for(i = 0; i < size; i++){ 51 c[i] = (double *)malloc(sizeof(double) * size); 52 if(c[i] == NULL) 53 return -1; 54 } 55 56 make_matrix(size, 1, a, b, 206122); 57 58 t1 = omp_get_wtime(); 59 60 #pragma omp parallel for private(j,k) 61 for(i=0; i<size; i++){ //行列の計算 62 for(j=0; j<size; j++){ 63 for(k=0; k<size; k++) 64 c[i][j] += a[i][k] * b[k][j]; 65 } 66 } 67 68 t2 = omp_get_wtime(); 69 70 check_matrix(size, c, 206122); 71 72 printf("処理時間 : %lf\n", t2-t1); 73 74 for(i=0; i<size; i++){ //メモリ開放a 75 free(a[i]); 76 } 77 free(a); 78 79 for(i=0; i<size; i++){ //メモリ開放b 80 free(b[i]); 81 } 82 free(b); 83 84 for(i=0; i<size; i++){ //メモリ開放c 85 free(c[i]); 86 } 87 free(c); 88 89 90 return 0; 91} 92------------------------------------------------------------------------------- 93//jikken.h 94extern void make_matrix(unsigned int size, double **c, unsigned int number); 95extern void check_matrix(unsigned int size, double **c, unsigned int number);

補足情報(FW/ツールのバージョンなど)

gccでコンパイルします。

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

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

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

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

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

guest

回答3

0

そのコードだとリンクに至る以前にmain.cのコンパイルがエラーとなってできないはず。
なぜならmake_matrixへの引数の数が違うから。
まずはgcc -c main.cがエラーなしでできることを確認してください。

投稿2021/06/08 00:06

itagagaki

総合スコア8402

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

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

0

その関数の実体がどこにもないやんけ!とコンパイラ/リンカさんがおっしゃってます
それらの関数の本体はどこに書いてあるんでしょうか

投稿2021/06/07 21:56

y_waiwai

総合スコア87872

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

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

0

ベストアンサー

おそらく main.c だけをコンパイルしたのではなかろうか。

gcc main.c jikken.c

投稿2021/06/07 19:38

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問