Я пытаюсь скомпилировать программу на языке C, которая получает данные из файла .data. К сожалению, я всегда получаю следующее сообщение: input.dat.2:1:error: expected identifier or "(" before numeric constant Я использую версию Ubuntu Linux 2014. На самом деле, это моя первая программа в среде Linux. Это домашнее задание для моего университета. Та же программа работала для Windows dev-C++! Вот программа:
#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);
}
Программа, вероятно, работает, так как нам ее предоставили учителя. Input.dat состоит только из цифр. Я предполагаю, что в этом как-то виновата система Ubuntu. Почему процесс компиляции терпит неудачу? Я был бы признателен, если бы кто-нибудь мог мне помочь!
решение1
Удалите вторую строку из вашей программы:
#include "input.dat"
Эта строка заставит входной файл быть прочитанным компилятором. Как вы объяснили, входной файл не является кодом C, и поэтому не будет компилироваться.
Однако входной файл не должен быть включен в вашу программу, а должен быть прочитан из файловой системы во время выполнения.
Если вы говорите, что та же программа работала на Windows, вы имеете в виду, что тот же самый код работал на Windows? Это бы меня очень удивило, так как только цифры — это не C, независимо от того, на какой платформе вы находитесь.