そのため、リストを作成してさまざまなことを行うコードを少し作成する必要がありました。具体的には、それを印刷して並べ替え、値が含まれているかどうかを確認します。やった、うまくいった。次に、これらの関数を取得して個別のファイルに分割し、gcc -c (正しく使用しているかどうかはよくわかりません) を使用して .o ファイルと、テスト プログラム用の .o を取得する必要があります。 . 次に、gcc を使用して .o ファイルを実行可能ファイルにリンクする必要があります。プロンプトは、.o を認識し、それらをリンクする方法を認識します。
ここに私の質問があります: 以下のコードがエラーを返すのはなぜですか (以下で定義される方法で)? そして、これらの人をリンクするために、コマンドラインに正確に何を書き込めばよいのでしょうか?
コードは次のようになります: (最初に .h ファイル、次にメインの .c ファイル)
node.h
typedef struct Node{
int data;
struct Node *next;
struct Node *prev;
}node;
print.h
#include<stdio.h>
#include"node.h"
void print(node *pointer){
if (pointer == NULL){
return;
}
printf("%d ",pointer->data);
print(pointer->next);
}
init.h
#include<stdio.h>
#include"node.h"
int init(node *pointer,int find){
pointer = pointer->next;
while (pointer != NULL){
if (pointer->data == find)//found find
{
printf("The data is in the list.");
return 1;
}
pointer = pointer->next;// Search in the next node.
}
//find is not found
printf("The data is not in the list.");
return 0;
}
sort.h
#include<stdio.h>
#include"node.h"
void swap (node *x, node *y){
int temp = x->data;
x->data = y->data;
y->data = temp;
}
void sort(node*pointer){
int i;
while (pointer->next != NULL){
if (pointer->data>pointer->next->data){
swap(pointer,pointer->next);
}
pointer = pointer->next;
sort(pointer);
}
}
list.c
#include<stdio.h>
#include<stdlib.h>
#include"node.h"
#lnclude"print.h"
#include"sort.h"
#include"init.h"
int i;
node *p;
node *n;
void insert(node *pointer, int data){
//go through list till ya find the last node
while (pointer->next != NULL){
pointer = pointer->next;
}
//allocate memory for new node and put data in it
pointer->next = (node *)malloc(sizeof(node));
(pointer->next)->prev = pointer;
pointer = pointer->next;
pointer->data = data;
pointer->next = NULL;
}
int main(){
//start is used to point to the first node
//temp is for the last node
node *start, *temp;
int z;
start = (node *)malloc(sizeof(node));
temp = new;
temp->next = NULL;
temp->prev = NULL;
for (z = 0; z < 10; z++){
insert(start,(3*10) - z);
}
init(start,12);
init(start,3);
init(start,27);
init(start,7);
print(start);
sort(start);
print(start);
}
これで、node.h (常に別のファイル) を除いて、すべてが一緒になったときにコードはすべて完全に正常に実行されました。.h ファイルは完全にコンパイルされますが、.c ファイルをコンパイルしようとすると、各 .h ファイルでノードを再定義しようとしているというエラーが返されます。これは、各 .h ファイルに含めているためでしょうか?
また、不適切な引数を init 関数に渡そうとしているというエラーが表示されますが、これは当てはまらないようです。しかし、私は物事を見過ぎているだけかもしれません。
よろしくお願いします。
編集: main の変数を new から start に変更 「gcc list.c」と入力するとエラーが発生する
In file included from init.h:2:0,
from list.c:4:
node.h:1:16 error: redefinition of'struct Node'
node.h:1:16 note: originally defined here
node.h:5:2 error: conflicting types for 'node'
node.h:5:2 note: previous declaration of 'node' was here
In file included from sort.h:2:0;
from list.c:5:
node.h:1:16 error: redefinition of'struct Node'
node.h:1:16 note: originally defined here
node.h:5:2 error: conflicting types for 'node'
node.h:5:2 note: previous declaration of 'node' was here
list.c: In function 'main':
list.c:41:1: warning: passing argument 1 of 'init' from incompatible pointer type[enabled by default]
init.h:4:5: note: expected 'struct node *' but argument is of type 'struct node *'
(そして、メインの個別の init 呼び出しごとにエラーがあります)
list.c:45:1: warning:passing argument 1 of 'print' from incompatible pointer type [enabled by default]
print.h:3:6: note expected 'struct node *' but argument is of type 'struct node *'
(そして、2番目の印刷機能用に別のものがあります)