Fehler mit .data-Datei, C

Fehler mit .data-Datei, C

Ich habe versucht, ein C-Programm zu kompilieren, das Daten aus einer .data-Datei empfängt. Leider erhalte ich immer die folgende Meldung: input.dat.2:1:error: expected identifier or "(" before numeric constant Ich verwende die 2014er-Version von Ubuntu Linux. Tatsächlich ist dies mein erstes Programm in einer Linux-Umgebung. Es ist eine Hausaufgabe für die Uni. Das gleiche Programm funktionierte für Windows Dev-C++! Dies ist das Programm:

#include <stdio.h>
#include "input.dat"
#define NUM_NODES                          100
#define NONE                               9999
#include<csdl_queue.h>
#include<cdsl_deque.h>
#include<cdsl_dyn_array.h>

struct _NODE
{
  int iDist;
  int iPrev;
};
typedef struct _NODE NODE;

struct _QITEM
{
  int iNode;
  int iDist;
  int iPrev;
  struct _QITEM *qNext;
};
typedef struct _QITEM QITEM;

QITEM *qHead = NULL;

int AdjMatrix[NUM_NODES][NUM_NODES];

int g_qCount = 0;
NODE rgnNodes[NUM_NODES];
int ch;
int iPrev, iNode;
int i, iCost, iDist;


void print_path (NODE *rgnNodes, int chNode)
{
  if (rgnNodes[chNode].iPrev != NONE)
    {
      print_path(rgnNodes, rgnNodes[chNode].iPrev);
    }
  printf (" %d", chNode);
  fflush(stdout);
}


void enqueue (int iNode, int iDist, int iPrev)
{
  QITEM *qNew = (QITEM *) malloc(sizeof(QITEM));
  QITEM *qLast = qHead;

  if (!qNew) 
    {
      fprintf(stderr, "Out of memory.\n");
      exit(1);
    }
  qNew->iNode = iNode;
  qNew->iDist = iDist;
  qNew->iPrev = iPrev;
  qNew->qNext = NULL;

  if (!qLast) 
    {
      qHead = qNew;
    }
  else
    {
      while (qLast->qNext) qLast = qLast->qNext;
      qLast->qNext = qNew;
    }
  g_qCount++;

}


void dequeue (int *piNode, int *piDist, int *piPrev)
{
  QITEM *qKill = qHead;

  if (qHead)
    {

      *piNode = qHead->iNode;
      *piDist = qHead->iDist;
      *piPrev = qHead->iPrev;
      qHead = qHead->qNext;
      free(qKill);
      g_qCount--;
    }
}


int qcount (void)
{
  return(g_qCount);
}

int dijkstra(int chStart, int chEnd) 
{



  for (ch = 0; ch < NUM_NODES; ch++)
    {
      rgnNodes[ch].iDist = NONE;
      rgnNodes[ch].iPrev = NONE;
    }

  if (chStart == chEnd) 
    {
      printf("Shortest path is 0 in cost. Just stay where you are.\n");
    }
  else
    {
      rgnNodes[chStart].iDist = 0;
      rgnNodes[chStart].iPrev = NONE;

      enqueue (chStart, 0, NONE);

     while (qcount() > 0)
    {
      dequeue (&iNode, &iDist, &iPrev);
      for (i = 0; i < NUM_NODES; i++)
        {
          if ((iCost = AdjMatrix[iNode][i]) != NONE)
        {
          if ((NONE == rgnNodes[i].iDist) || 
              (rgnNodes[i].iDist > (iCost + iDist)))
            {
              rgnNodes[i].iDist = iDist + iCost;
              rgnNodes[i].iPrev = iNode;
              enqueue (i, iDist + iCost, iNode);
            }
        }
        }
    }

      printf("Shortest path is %d in cost. ", rgnNodes[chEnd].iDist);
      printf("Path is: ");
      print_path(rgnNodes, chEnd);
      printf("\n");
    }
}

int main() {
  int i,j,k;
  FILE *fp;

  fp=fopen("input.dat","r");
  /* open the adjacency matrix file */
  /* make a fully connected matrix */
  for (i=0;i<NUM_NODES;i++) {
    for (j=0;j<NUM_NODES;j++) {
      /* make it more sparce */
      fscanf(fp,"%d",&k);
    AdjMatrix[i][j]= k;
    }
  }

  /* finds 10 shortest paths between nodes */
  for (i=0,j=NUM_NODES/2;i<20;i++,j++) {
            j=j%NUM_NODES;
      dijkstra(i,j);
  }
  fclose(fp);
  exit(0);


}

Das Programm funktioniert wahrscheinlich, da es uns von den Lehrern zur Verfügung gestellt wurde. Die Datei input.dat besteht nur aus Zahlen. Ich vermute, dass das Ubuntu-System irgendwie dafür verantwortlich ist. Warum schlägt der Kompilierungsprozess fehl? Ich wäre dankbar, wenn mir jemand helfen könnte!

Antwort1

Entfernen Sie die zweite Zeile aus Ihrem Programm:

#include "input.dat"

Diese Zeile bewirkt, dass die Eingabedatei vom Compiler gelesen wird. So wie Sie es erklärt haben, ist die Eingabedatei kein C-Code und wird daher nicht kompiliert.

Die Eingabedatei soll allerdings nicht in Ihr Programm eingebunden, sondern zur Laufzeit aus dem Dateisystem gelesen werden.


Wenn Sie sagen, dass dasselbe Programm unter Windows funktioniert hat, meinen Sie dann, dass genau derselbe Code unter Windows funktioniert hat? Das würde mich wirklich überraschen, denn „Nur Zahlen“ ist nicht C, egal auf welcher Plattform Sie sich befinden.

verwandte Informationen