2 reamte Reamte 于 2016.03.07 17:14 提问

c语言 指针数组作为函数参数问题
 #include<stdio.h>
#include<stdlib.h>



void init_rec(day_record *arr[],FILE *file)
{
    char temp[80];
    int index=0;
    while((fscanf(file,"%s",temp))!=EOF)
    {
        arr[index]=NULL;
        arr[index]=(day_record * )malloc(sizeof(day_record));
        if(arr[index]==NULL)
        {
            printf("结构地址分配错误\n");
            exit(1);
        }
        replace(',',' ',temp);
        inputrc(arr[index],temp);
        index++;
    }

}

在gcc中编译 总是提示错误发生在void init_rec(day_record arr[],FILE *file)这一行

*
错误内容是 pay.c:6: 错误:expected ‘)’ before ‘*’ token **

结构体是这么写的

 //每日记录临时存储结构
typedef struct day_record
{
    int worker_nu;
    char date[DATE_LEN];
    char * loca;
    int work_nu;
    char * worker[WORK_LEN];
} day_record;

调用是这样的

#include<stdio.h>
#include<stdlib.h>
#include"pay.h"
#include"pay.c"


int main()
{
    FILE * fp;
    day_record * record[31];
    fp = fopen("pay","r");
    if(fp==NULL)
    {
        printf("open failed\n");
        exit(1);
    }

    init_rec(record,fp);
    putdr(record[0]);
    fclose(fp);
    return 0;
} 

想不明白是怎么回事 求指教 谢谢大家

6个回答

dujie4752041
dujie4752041   2016.03.07 17:57
已采纳

我刚用 VC 编译一下是可以过的,并且能够运行。重新 REBUILID 一下吧

Reamte
Reamte 谢谢啊
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.03.07 17:21

day_record怎么定义的,是不是有多余的分号

Reamte
Reamte typedef struct day_record { int worker_nu; char date[DATE_LEN]; char * loca; int work_nu; char * worker[WORK_LEN]; } day_record; 结构体是着样
接近 2 年之前 回复
Reamte
Reamte typedef struct day_record { int worker_nu; char date[DATE_LEN]; char * loca; int work_nu; char * worker[WORK_LEN]; } day_record; 结构体是着样
接近 2 年之前 回复
guole19900628
guole19900628   2016.03.07 17:24

这个应该是语法的问题,自己检查下。

Reamte
Reamte 好的 我再仔细检查检查 谢谢
接近 2 年之前 回复
WinsenJiansbomber
WinsenJiansbomber   2016.03.07 17:27

试试:


void init_rec(day_record (*arr)[],FILE *file)
WinsenJiansbomber
WinsenJiansbomber 定义指向 day_record[] 的指针
接近 2 年之前 回复
Reamte
Reamte 这样类型就不对了,报错是类型不配陪 这样定义是什么意思?
接近 2 年之前 回复
WinsenJiansbomber
WinsenJiansbomber   2016.03.07 23:11

我给写了一份完整的:

/*
    Record test data:
    11,2006/1/27,M.,90001,Bobert
    4,2012/3/4,S.,90301,White M.
    2,2011/3/7,C.,3401,John Fanck
    6,2003/4/17,W.,21401,Lyn W.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DATE_LEN    12
#define LOCA_LEN    256
#define WORKER_LEN  512
#define MAX_LOOP    1024
#define MAX_LINE    MAX_LOOP

typedef struct day_record
{
    int  worker_nu;
    char date[DATE_LEN];
    char loca[LOCA_LEN];
    int  work_nu;
    char worker[WORKER_LEN];
} day_record;

void putdr(day_record *rcd[], int c){
    int i;
    printf("No.\t Work No.\t Date\t Loca\t Worker\n");
    for(i=0; i<c; i++){
        day_record &r = *rcd[i];
        printf("%d\t %d\t %s\t %s\t %s\n", r.worker_nu, r.work_nu, r.date, r.loca, r.worker);
    }
}

void replace(char s, char d, char c[]){
    int i=0;
    while(1){
        if( c[i]==0 ) break;
        c[i++]==s? c[i-1]=d:0;
        if( i>MAX_LOOP ) break;
    }
}

void inputrc(day_record *rcd, char c[], char delima){
    int i=0,j=0,k[5],ld,ll,lw;
    while(1){
        if( c[i]=='\0' ||  c[i]=='\n' || i>MAX_LOOP ){ 
            // NULL terminate with gets()/fscanf, \n with fgets()
            c[i] = 0;
            k[j] = i;
            break;
        }else{
            c[i++]==delima? k[j++]=i,c[i-1]=0:0;
        }
    }
    day_record &r = *rcd;
    i = sscanf(c,"%d", &r.worker_nu);
    i+= sscanf(    (char*)&c[k[2]], "%d", &r.work_nu);
    ld = k[1]-k[0];
    ll = k[2]-k[1];
    lw = k[4]-k[3];

    if( !(i==2 && ld<DATE_LEN && ll<LOCA_LEN && lw<WORKER_LEN) ){
        printf("Data error! line #%d. %s\n", __LINE__, c);
        exit(__LINE__);
    }
    strncpy( r.date,   (char*)&c[k[0]], ld+1);
    strncpy( r.loca,   (char*)&c[k[1]], ll+1);
    strncpy( r.worker, (char*)&c[k[3]], lw+1); //plus NULL terminator
    //printf("%d\t %d\t %s\t %s\t %s\n", r.worker_nu, r.work_nu, r.date, r.loca, r.worker);
    //sscanf(c, "%d %s %s %d %s", &r.worker_nu, r.date, r.loca, &r.work_nu, r.worker);
}

int init_rec(day_record *rcd[],FILE *file)
{
    char temp[MAX_LINE];
    int index=0;
    while( fgets(temp,MAX_LINE,file)!=NULL) // don't fscanf(file,"%s",temp)!=EOF
    {
        rcd[index]=NULL;
        rcd[index]=(day_record * )malloc(sizeof(day_record));
        if(rcd[index]==NULL)
        {
            printf("failure of memory allocation. line #%d\n", __LINE__);
            exit(1);
        }
        //replace(',',' ',temp);
        inputrc(rcd[index],temp, ',');
        index++;
    }
    return index;
}


int main()
{
    FILE * fp;
    day_record * record[31];
    fp = fopen("pay.txt","r");
    if(fp==NULL)
    {
        printf("file pay.txt open failed\n");
        exit(1);
    }

    int c = init_rec(record,fp);
    putdr(record, c);
    fclose(fp);
    return 0;
} 

输出:

a.exe
No. Work No. Date Loca Worker
11 90001 2006/1/27 M. Bobert B.
4 90301 2012/3/4 S. White M.
2 3401 2011/3/7 C. John Fanck
6 21401 2003/4/17 W. Lyn W.

Reamte
Reamte 谢谢啊
接近 2 年之前 回复
John_ToStr
John_ToStr   Rxr 2016.03.08 16:37

这问题一般就是语法问题,主要是代码逻辑没问题就不是大问题

Reamte
Reamte 非常感谢
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!