0

多くのエラーが発生しています。これをまったく実行できませんでした。コードは私のものではありません (コードはオンラインで提供されています)。

問題は私のヘッダーですか?私は質問が非常に広いことを知っていますが、私はCに不慣れで、これらのエラーは私にいくつかの本当の問題を引き起こしています. あまり期待していませんが、誰かが私を正しい方向に向けることができれば、それは素晴らしいことです...

node0.c

   #include <stdio.h>
#include "prog3.h"
extern struct rtpkt {
  int sourceid;       /* id of sending router sending this pkt */
  int destid;         /* id of router to which pkt being sent 
                         (must be an immediate neighbor) */
  int mincost[4];    /* min cost to node 0 ... 3 */
  };

extern int TRACE;
extern int YES;
extern int NO;

struct distance_table 
{
  int costs[4][4];
} dt0;


/* students to write the following two routines, and maybe some others */

void rtinit0() 
{

}


void rtupdate0(rcvdpkt)
  struct rtpkt *rcvdpkt;
{

}


printdt0(dtptr)
  struct distance_table *dtptr;

{
  printf("                via     \n");
  printf("   D0 |    1     2    3 \n");
  printf("  ----|-----------------\n");
  printf("     1|  %3d   %3d   %3d\n",dtptr->costs[1][1],
     dtptr->costs[1][2],dtptr->costs[1][3]);
  printf("dest 2|  %3d   %3d   %3d\n",dtptr->costs[2][1],
     dtptr->costs[2][2],dtptr->costs[2][3]);
  printf("     3|  %3d   %3d   %3d\n",dtptr->costs[3][1],
     dtptr->costs[3][2],dtptr->costs[3][3]);
}

linkhandler0(linkid, newcost)   
  int linkid, newcost;

/* called when cost from 0 to linkid changes from current value to newcost*/
/* You can leave this routine empty if you're an undergrad. If you want */
/* to use this routine, you'll need to change the value of the LINKCHANGE */
/* constant definition in prog3.c from 0 to 1 */

{
}

ノード1

#include <stdio.h>
#include "prog3.h"
extern struct rtpkt {
  int sourceid;       /* id of sending router sending this pkt */
  int destid;         /* id of router to which pkt being sent 
                         (must be an immediate neighbor) */
  int mincost[4];    /* min cost to node 0 ... 3 */
  };


extern int TRACE;
extern int YES;
extern int NO;

int connectcosts1[4] = { 1,  0,  1, 999 };

struct distance_table 
{
  int costs[4][4];
} dt1;


/* students to write the following two routines, and maybe some others */


rtinit1() 
{

}


rtupdate1(rcvdpkt)
  struct rtpkt *rcvdpkt;

{

}


printdt1(dtptr)
  struct distance_table *dtptr;

{
  printf("             via   \n");
  printf("   D1 |    0     2 \n");
  printf("  ----|-----------\n");
  printf("     0|  %3d   %3d\n",dtptr->costs[0][0], dtptr->costs[0][2]);
  printf("dest 2|  %3d   %3d\n",dtptr->costs[2][0], dtptr->costs[2][2]);
  printf("     3|  %3d   %3d\n",dtptr->costs[3][0], dtptr->costs[3][2]);

}



linkhandler1(linkid, newcost)   
int linkid, newcost;   
/* called when cost from 1 to linkid changes from current value to newcost*/
/* You can leave this routine empty if you're an undergrad. If you want */
/* to use this routine, you'll need to change the value of the LINKCHANGE */
/* constant definition in prog3.c from 0 to 1 */

{
}

ノード2

#include <stdio.h>
#include "prog3.h"
extern struct rtpkt {
  int sourceid;       /* id of sending router sending this pkt */
  int destid;         /* id of router to which pkt being sent 
                         (must be an immediate neighbor) */
  int mincost[4];    /* min cost to node 0 ... 3 */
  };

extern int TRACE;
extern int YES;
extern int NO;

struct distance_table 
{
  int costs[4][4];
} dt2;


/* students to write the following two routines, and maybe some others */

void rtinit2() 
{
}


void rtupdate2(rcvdpkt)
  struct rtpkt *rcvdpkt;

{

}


printdt2(dtptr)
  struct distance_table *dtptr;

{
  printf("                via     \n");
  printf("   D2 |    0     1    3 \n");
  printf("  ----|-----------------\n");
  printf("     0|  %3d   %3d   %3d\n",dtptr->costs[0][0],
     dtptr->costs[0][1],dtptr->costs[0][3]);
  printf("dest 1|  %3d   %3d   %3d\n",dtptr->costs[1][0],
     dtptr->costs[1][1],dtptr->costs[1][3]);
  printf("     3|  %3d   %3d   %3d\n",dtptr->costs[3][0],
     dtptr->costs[3][1],dtptr->costs[3][3]);
}

ノード3

#include <stdio.h>
#include "prog3.h"
extern struct rtpkt {
  int sourceid;       /* id of sending router sending this pkt */
  int destid;         /* id of router to which pkt being sent 
                         (must be an immediate neighbor) */
  int mincost[4];    /* min cost to node 0 ... 3 */
  };

extern int TRACE;
extern int YES;
extern int NO;

struct distance_table 
{
  int costs[4][4];
} dt3;

/* students to write the following two routines, and maybe some others */

void rtinit3() 
{
}


void rtupdate3(rcvdpkt)
  struct rtpkt *rcvdpkt;

{

}


printdt3(dtptr)
  struct distance_table *dtptr;

{
  printf("             via     \n");
  printf("   D3 |    0     2 \n");
  printf("  ----|-----------\n");
  printf("     0|  %3d   %3d\n",dtptr->costs[0][0], dtptr->costs[0][2]);
  printf("dest 1|  %3d   %3d\n",dtptr->costs[1][0], dtptr->costs[1][2]);
  printf("     2|  %3d   %3d\n",dtptr->costs[2][0], dtptr->costs[2][2]);

}

ヘッダファイル

/* libraries */
#include <stdlib.h>

/* definitions */

#define INF 999

#ifndef FALSE
#define FALSE (0)
#endif
#ifndef TRUE
#define TRUE (!FALSE)
#endif

struct rtpkt {
    int sourceid;       /* id of sending router sending this pkt */
    int destid;         /* id of router to which pkt being sent 
                                                 (must be an immediate neighbor) */
    int mincost[4];    /* min cost to node 0 ... 3 */
};

struct event {
   float evtime;           /* event time */
   int evtype;             /* event type code */
   int eventity;           /* entity where event occurs */
   struct rtpkt *rtpktptr; /* ptr to packet (if any) assoc w/ this event */
   struct event *prev;
   struct event *next;
};

struct distance_table 
{
    int costs[4][4];
    int link[4];
};

/* forward declarations */
void init();
void tolayer2(struct rtpkt packet);
void insertevent(struct event *p);
void rtupdate0(struct rtpkt *rcvdpkt);
void rtupdate1(struct rtpkt *rcvdpkt);
void rtupdate2(struct rtpkt *rcvdpkt);
void rtupdate3(struct rtpkt *rcvdpkt);
void linkhandler0(int linkid, int newcost);
void linkhandler1(int linkid, int newcost);
void rtinit0();
void rtinit1();
void rtinit2();
void rtinit3();
void sendpkt0();
void sendpkt1();
void sendpkt2();
void sendpkt3();
void printdt0(struct distance_table *dtptr);
void printdt1(struct distance_table *dtptr);
void printdt2(struct distance_table *dtptr);
void printdt3(struct distance_table *dtptr);

メイン: http://gaia.cs.umass.edu/kurose/network/prog3.c

上部に次を追加しました。

#include "stdafx.h"
#include "prog3.h"
4

1 に答える 1

1

それがあなたの唯一の問題であるかどうかを十分に調べていませんが、再定義エラーは、ヘッダーのシンボルが既に宣言されているかどうかを判断するためのプリコンパイラチェックを行わずに、各 c ファイルの先頭にヘッダーを含めることから間違いなく発生しています。

ヘッダーの上部に次のようなものを配置します。

#ifndef _PROG3_H
#define _PROG3_H

そしてヘッダーファイルの一番下に:

#endif

これにより、各ファイルがコンパイラによって個別に検査される場合、コンパイラは、必要なシンボルが宣言されていることを認識します。ただし、すべてのファイルが一緒にリンクされている場合は、リンクしようとするオブジェクト ファイルごとに 1 回定義されたヘッダー ファイル内のすべてのシンボルを取得することはできません。

編集:今、私はそのコードのいくつかを調べました.私が言及したヘッダーファイルの問題は間違いなく対処する必要がありますが、あなたが物事を再定義している唯一の場所ではありません. ヘッダー ファイルからの定義もインクルードしているにもかかわらず、何度も何度も C ファイルでrtpktasを宣言します。externヘッダーにある場合は、C ファイルにも入れたくありません。あなたもdistance_table何度も定義したことがわかります。繰り返しますが、それがヘッダーにあり、そのように含まれている場合は、C ファイルで再定義しないでください。

于 2013-04-10T03:31:56.780 に答える