4

そのため、リストを作成してさまざまなことを行うコードを少し作成する必要がありました。具体的には、それを印刷して並べ替え、値が含まれているかどうかを確認します。やった、うまくいった。次に、これらの関数を取得して個別のファイルに分割し、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番目の印刷機能用に別のものがあります)

4

1 に答える 1

7

包含バリアを .h ファイルに入れます。たとえば、sort.h の場合

#ifndef INCLUDE_SORT_H
#define INCLUDE_SORT_H

// contents of file

#endif


編集

実際、私はあなたのコードをもっと詳しく調べました。.h ファイルで関数を定義しましたが、これはすべきことではありません。本当に、これを別々のファイルに分ける理由はまったくありません。

したがって、それらすべてを単一のファイルに結合し、次のようにコンパイルします。

gcc -o list -Wall list.c

本当に別のファイルが必要な場合は、関数を C ファイルに入れ、構造体とプロトタイプを .h ファイル (各 C ファイルに含めます) に入れます。次に、次のようなものを使用してコンパイルおよびリンクします。

gcc -o list -Wall list.c node.c main.c
于 2013-02-10T23:14:52.777 に答える