2011-10-30 44 views
0

我有一个C程序,我正在从一个文件中读取数据,然后尝试打印它以便在此刻进行测试。我遇到的问题是,我的常量在MAX = 40,并且它的打印次数。我试过在函数中传递jobcount的引用,但是当我在int之后添加*时,在jobcount传递之前添加&时出现错误。我感谢他们的帮助,对所有问题始终保持高质量的投入!在C中传递变量

#include <stdio.h> 

struct record{ 
    char name[1]; 
    int arrival_time; 
    int job_length; 
    int job_priority; 
}; 

const int MAX = 40; 

void fileinput(struct record jobs[MAX], int jobcount); 
void output(struct record jobs[MAX], int jobcount); 
int main(void) 
{ 
    struct record jobs[MAX]; 
    int jobcount; 
    fileinput(jobs,jobcount); 
    output(jobs,jobcount); 
    return(0); 
} 

void fileinput(struct record jobs[MAX], int jobcount){ 
    jobcount = 0; 
    FILE *f = fopen("data.dat","r"); 
    while(fscanf(f, "%s %d %d %d", jobs[jobcount].name, &jobs[jobcount].arrival_time, &jobs[jobcount].job_length, &jobs[jobcount].job_priority) != EOF) 
    { 
     jobcount++; 
     printf("READ IN TEST \n"); 
    } 
} 

void output(struct record jobs[MAX], int jobcount){ 

    int j = 0; 
    for(j = 0;j < jobcount; j++) 
    { 
     printf("%s %d %d %d\n", jobs[j].name, jobs[j].arrival_time, jobs[j].job_length, jobs[j].job_priority); 
     printf("FOR LOOP TEST \n"); 
    } 
} 

data.dat文件看起来像这样

A1 3 3 3 
B1 4 4 4 
C1 5 5 5 

回答

1

你不应该得到一个错误。大概你可能已经改变了前进宣言,忘了改变定义。

void fileinput(struct record jobs[MAX], int* jobcount); 

fileinput(jobs,&jobcount); 

和定义 -

void fileinput(struct record jobs[MAX], int* jobcount) { 
    // .... 
} 

由于jobcount是一个指针,你需要提领先修改/访问它正指向值。您需要发布确切的错误消息,以获得进一步的帮助。

+0

这是我得到的错误。 gcc projectv2.c -o project projectv2.c:在函数'fileinput'中: projectv2.c:26:38:error:数组下标不是整数 projectv2.c:26:60:error:数组下标不是整数 projectv2.c:26:90:错误:数组下标不是整数 projectv2.c:26:118:错误:数组下标不是整数 – Intelwalk

+0

@Intelwalk - 正如我之前提到的,您需要解除引用指针。数组索引必须是一个整数,但是您提供的是一个指针。所以,你需要在访问''(* jobcount)'之前取消引用'jobcount',而不管你使用什么。 – Mahesh

+0

我现在得到了分段错误。这里是我的代码:#include struct record { char name [1]; int arrival_time; int job_length; int job_priority; }; const int MAX = 40; void fileinput(struct record jobs [MAX],int * jobcount); void output(结构记录作业[MAX],int jobcount); int main(void) { struct record jobs [MAX]; int jobcount; fileinput(jobs,&jobcount); 输出(jobs,jobcount); return(0); } – Intelwalk

1

你可能会做最好的修订fileinput()返回作业计数:

int fileinput(struct record jobs[MAX]) 
{ 
    int jobcount = 0; 
    ... 
    return jobcount; 
} 

,然后在main()

int main(void) 
{ 
    struct record jobs[MAX]; 
    int jobcount = fileinput(jobs); 
    ... 
    return 0; 
} 

主要的选择是一个指针传递给jobcountfileinput()功能。如果你还返回了一个状态(所有OK,数据中的条目太多,伪造的数据等),这可能会更好。你的函数仍然会返回一个值,但这将是错误指示,并且作业计数将通过指针返回。

第三个(可怕的和不推荐的)替代方案是使用全局变量(或文件静态变量)作为jobcount

对于通用输入功能,你应该明确地传递数组的大小,而不是假设它是MAX:

int fileinput(struct record jobs[], size_t maxjobs); 

int jobcount = fileinput(jobs, MAX); 

你会写代码,以确保您不会超过规定的数量的工作记录。

1

如果需要,您可以使用“return”从fileinput()获取“jobcount”。你只需要“&”,传递一个指向“jobcount”的指针:

... 
const int MAX = 40; 

void fileinput(struct record jobs[MAX], int * jobcount); 
... 
int main(void) 
{ 
    struct record jobs[MAX]; 
    int jobcount=-1; 
    fileinput(jobs,&jobcount); 
    output(jobs,jobcount); 
    return(0); 
} 

void fileinput(struct record jobs[MAX], int * jobcount){ 
    *jobcount = 0; 
    FILE *f = fopen("data.dat","r"); 
    while(
    (fscanf(f, "%s %d %d %d", jobs[jobcount].name, &jobs[jobcount].arrival_time, 
     &jobs[jobcount].job_length, &jobs[jobcount].job_priority) != EOF) && 
    (*jobcount < MAX)) 
    { 
     *jobcount++; 
     printf("READ IN TEST \n"); 
    } 
    ...