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

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

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

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

Q&A

0回答

1166閲覧

c言語がコンパイルできない

K.M.PEANUTS

総合スコア40

C

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

0グッド

1クリップ

投稿2021/11/21 01:59

編集2021/11/21 03:03

c

1#ifndef ADJ_LIST 2#define ADJ_LIST 3 4/* 隣接リスト (adjacency list) */ 5typedef struct edge { 6 int destination; 7 struct edge* next; 8} edge; 9 10typedef struct { 11 int n; // ノード数 12 edge **edge_lists; // 辺リスト 13} adj_list; 14 15/* 頂点数nの隣接リストを作成する */ 16adj_list* adj_list_create(int n); 17 18/* 頂点aと頂点bとを結ぶ無向辺を追加する */ 19void adj_list_add_undirected_edge(adj_list* list, int a, int b); 20 21/* 隣接リストを解放する */ 22void adj_list_free(adj_list* list); 23 24/* 隣接リストを表示する */ 25void adj_list_print(adj_list* list); 26 27#endif

c

1#include <stdlib.h> 2#include <stdio.h> 3#include "adj_list.h" 4 5/* 頂点数nの隣接リストを作成する */ 6adj_list* adj_list_create(int n) { 7 int i; 8 9 adj_list* list = (adj_list*)malloc(sizeof(adj_list)); 10 list->n = n; 11 list->edge_lists = (edge**)malloc(sizeof(edge*)*n); 12 for(i=0; i<n; i++) { 13 list->edge_lists[i] = NULL; 14 } 15 return list; 16} 17 18/* 頂点aと頂点bとを結ぶ無向辺を追加する */ 19void adj_list_add_undirected_edge(adj_list* list, int a, int b) { 20 // TODO この関数を実装する 21 edge* p; 22 p->next = list->edge_list[a]; 23 list -> edge_lists[a] = p; 24 p->destination = b; 25 26 27} 28 29/* 隣接リストを解放する */ 30void adj_list_free(adj_list* list) { 31 int i; 32 33 for(i=0; i<list->n; i++) { 34 edge* p = list->edge_lists[i]; 35 while(p != NULL) { 36 edge* next = p->next; 37 free(p); 38 p = next; 39 } 40 } 41 free(list->edge_lists); 42 free(list); 43} 44 45/* 隣接リストを表示する */ 46void adj_list_print(adj_list* list) { 47 int i; 48 for(i=0; i<list->n; i++) { 49 edge* p = list->edge_lists[i]; 50 printf("%2d:", i); 51 while(p != NULL) { 52 edge* next = p->next; 53 printf(" %d", p->destination); 54 p = next; 55 } 56 printf("\n"); 57 } 58}

こちらのプログラムを実行すると下記のようなエラーが出てきます。調べてみるとこのエラーには原因になりうる理由がいくつか存在し、はっきりした原因がわからなかったので教えてください。

txt

1Undefined symbols for architecture x86_64: 2 "_adj_list_add_undirected_edge", referenced from: 3 _main in print_list-cd19c2.o 4 "_adj_list_create", referenced from: 5 _main in print_list-cd19c2.o 6 "_adj_list_print", referenced from: 7 _main in print_list-cd19c2.o 8ld: symbol(s) not found for architecture x86_64 9clang: error: linker command failed with exit code 1 (use -v to see invocation)

開発環境は、macでVScodeを使用しています。
実行を行っているディレクトリにはadj_list.h、adj_list.c、adj_list.oがあります。

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

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

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

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

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

pepperleaf

2021/11/21 02:11

どういう環境で、コンパイルはどうしたのでしょうか? main()を含むファイルの提示がありませんが、どうなっているのでしょう? エラーとしては、単に、該当する関数(の実体)が無いといってるので、単なるリンク時のエラーみたいですが。(リンクファイルの指定ミス)
dodox86

2021/11/21 02:21

言葉の使い方が色々間違っているので誤解があるようですが、 ・「clang: error: linker command failed」→と出ているのでコンパイルはできています。リンクのエラーです。 ・「こちらのプログラムを実行すると」→リンクのエラーでプログラム、実行ファイルは出来上がっていないので、プログラムは実行できていません。コンパイル~リンクまでのビルド(の実行)がエラーで終わっているということです。 どのような開発環境、手順で作業をされているのか、詳細を質問文中に示しましょう。
kazuma-s

2021/11/21 07:37

p->next = list->edge_list[a]; edge_list は edge_lists の間違いなので、コンパイルエラーになります。 エラーメッセージに対応したソースを提示してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問