我一直在做一个作业,其中我们得到了一个 .ssv 文件,该文件在第一列中包含银行账户,在第二列中包含交易(20 表示增加 20 美元,-20 正在带走 20 美元(,并被要求使用多个 c 文件创建帐户的链接列表。
有问题有三个:main.c(打开ssv并逐行(,ssv.c(包含用于从fgets((字符串中解析数据的函数(和linked.c(创建链表并通过匹配帐号和添加交易来更新帐户余额(。它们必须保持独立,不能制作成.h文件。
我已经组装了一个 makefile 以将它们全部放入一个可执行文件中,但是当我运行 make 时,它会返回并出错。我做了一些调试,发现它似乎编译了ssv.c和main.c的对象文件,而不是linked.c,导致我在main.c中使用linked.c函数时出现一些问题。我在下面包含了每个文件的代码,以及我尝试"制作"时出现的错误消息。任何帮助找到问题将不胜感激。
错误输出:
ctonne2, ~/Projects/COMP206/Assignments/ass6: make
gcc -c linked.c
gcc -c ssv.c
gcc -c main.c
main.c: In function ‘main’:
main.c:21:3: warning: implicit declaration of function ‘parse’; did you mean ‘strsep’? [-Wimplicit-function-declaration]
parse(line,&acct, &amnt);
^~~~~
strsep
main.c:22:3: warning: implicit declaration of function ‘findUpdate’; did you mean ‘initstate’? [-Wimplicit-function-declaration]
findUpdate(acct, amnt);
^~~~~~~~~~
initstate
main.c:24:2: warning: implicit declaration of function ‘prettyPrint’ [-Wimplicit-function-declaration]
prettyPrint();
^~~~~~~~~~~
gcc -o linked.o ssv.o main.o
main.o: In function `main':
main.c:(.text+0x92): undefined reference to `findUpdate'
main.c:(.text+0xb6): undefined reference to `prettyPrint'
collect2: error: ld returned 1 exit status
makefile:2: recipe for target 'bank' failed
make: *** [bank] Error 1
ctonne2, ~/Projects/COMP206/Assignments/ass6:
制作文件:
bank: linked.o ssv.o main.o
gcc -o linked.o ssv.o main.o
linked.o: linked.c
gcc -c linked.c
ssv.o: ssv.c
gcc -c ssv.c
main.o: main.c
gcc -c main.c
主.c:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void main() {
FILE* ssv = fopen("students.ssv", "rt");
if (ssv == NULL) {
printf("n File opening failed");
exit(1);
}
int acct = 0;
float amnt = 0;
char line [100], bankAcc[10], balChange[10];
while (fgets(line, sizeof(line), ssv)) {
parse(line,&acct, &amnt);
findUpdate(acct, amnt);
}
prettyPrint();
}
linked.c:
#include <stdio.h>
#include <stdlib.h>
struct ACCOUNT {
int accountNumber;
float balance;
struct ACCOUNT* next;
};
struct ACCOUNT* head = NULL;
void findUpdate(int account, float amount) {
head = (struct ACCOUNT*)malloc(sizeof(struct ACCOUNT));
if (head == NULL) exit (1);
struct ACCOUNT* current = head;
int changed = 0;
while(current->next != NULL) {
if (current->accountNumber == account) {
current->balance = current->balance + amount;
changed++;
}
current = current->next;
}
if ((changed==0)&&(current->next==NULL)) {
struct ACCOUNT* newAccount=(struct ACCOUNT*)malloc(sizeof(struct ACCOUNT));
if (newAccount == NULL) exit(1);
current->next=newAccount;
newAccount->accountNumber = account;
newAccount->balance = amount;
newAccount->next = NULL;
}
}
void prettyPrint() {
struct ACCOUNT *current = head;
while (current!=NULL) {
printf("ACCOUNT ID: %4d BALANCE: $ %7.2f n",current->accountNumber, current->balance);
current = current->next;
}
}
SSV.c
#include<stdio.h>
#include<stdlib.h>
void parse(char record[], int *acct, float *amnt) {
char *end;
char acctarr[10], amntarr[10];
sscanf (record, "%d %f", acct, amnt);
return;
}
示例 .ssv 文件
10 100.0
20 -50.5
10 -20.0
您在制作可执行文件的规则中省略了输出文件。
bank: linked.o ssv.o main.o
gcc -o bank linked.o ssv.o main.o
您的命令说仅链接ssv.o
和main.o
,并将结果放在linked.o
中。