2012-03-05 3 views
0

Я постоянно получаю эту ошибку всякий раз, когда пытаюсь передать массив Strucs в функцию.Создание массива Structs

10: ошибка: ожидаются спецификаторы декларации или '...' до 'RECORD' 113: ошибка: конфликтующие типов для редактирования '' 10: ошибка: предыдущие деклараций 'редактировать' было здесь

I также получите много предупреждений о том, как я использую strlen и strcmp о аргументах и ​​как я делаю указатель из int без приведения. Что-то не так с этим?

Может кто-нибудь объяснить мне, что не так с кодом, который у меня есть до сих пор?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAXLENGTH 51 //longest length of a single record + 1 =51 bytes 
#define SIZEOFDB 1000 
#define ENCRYPT 5 

void add(int argc, char *argv[]); 
void del (char *username); 
void edit(char *nName, char *nPw, char *nType, char *tName, char *tPw, RECORD *arr); 
int verify (char *username, char *password); 
void parse (char *record, char *delim, char); 

typedef struct rec 
{ 
char name[22]; 
char pw[22]; 
char type[6]; 
}RECORD; 

int main(int argc, char *argv[]){ 
int j; 
char tempName[22]; 
char tempPw[22]; 
char tempType[6]; 
char newName[22]; 
char newPw[22]; 
char newType[6]; 
static const char filename[] = "password.csv"; 
FILE *file; 
file = fopen(filename, "r+"); 

if (file == NULL){ 
    //create csv file password.csv 
    printf("Just created password.csv"); 
    file = fopen(filename, "w+"); 
} 
size_t i =0, count, size = 1000; 
RECORD *arr = malloc(size * sizeof *arr); 
if (arr){ 
    char line[51]; 
    while(i<size && fgets(line, sizeof(line), file)){ 
     sscanf(line, "%[^','],%[^','],%s", &arr[i].name, &arr[i].pw, &arr[i].type); 
     ++i; 
    } 

    fclose(file); 

    if (strcmp(argv[1], "-menu") == 0){ 
     //menu function 
     printf("MENU\n"); 
    } else if(strcmp(argv[1], "-add") == 0){ 
     //add function 

     strncpy(newName,argv[2],strlen(argv[2])); 
     strncpy(newPw,argv[3],strlen(argv[3])); 
     strncpy(newType,argv[4], strlen(argv[4])); 

     printf("ADD\n"); 
    } else if(strcmp(argv[1], "-del") == 0){ 
     //del function 

     strncpy(tempName,argv[2], strlen(argv[2])); 

     printf("DEL\n"); 
    } else if(strcmp(argv[1], "-edit") == 0){ 
     //edit funciton 

     strncpy(tempName,argv[2],strlen(argv[2])); 
     strncpy(tempPw,argv[3],strlen(argv[3])); 
     strncpy(tempType,argv[4],strlen(argv[4])); 
     strncpy(newName,argv[5], strlen(argv[5])); 
     strncpy(newPw,argv[6], strlen(argv[6])); 
     strncpy(newType, argv[7], strlen(argv[7])); 

     printf("EDIT\n"); 
    } else if(strcmp(argv[1], "-verify") == 0){ 
     //verify function 

     strncpy(tempName,argv[2],strlen(argv[2])); 
     strncpy(tempPw,argv[3],strlen(argv[3])); 

     printf("VERIFY\n"); 
    } else { 
     printf("SYNTAX ERROR\n"); 
     return 0; 
    } 
    for (j = 0; j < i; j++){ 
     printf("%s,%s,%s\n", arr[j].name,arr[j].pw,arr[j].type); 
    } 
} 
free (arr); 



return 0; 

} 

/*void add(char nName[],char nPw[], char nType[], record *arr,FILE *file;){ 
int i,j; 
if (arr){ 
char line[51]; 
while(i<size && fgets(line, sizeof(line), file)){ 
sscanf(line, "%[^','],%[^','],%s", &arr[i].name, &arr[i].pw, &arr[i].type); 
++i 
} 

}*/ 

void edit(char *nName,char *nPw, char *nType, char *tName, char *tPw, RECORD *arr){ 
int i,j; 
int size = (sizeof *arr)/(sizeof arr[0]); 
for (i=0; i< size; i++){ 

if ((strcmp(arr[i].name, *tName) == 0 && strcmp (arr[i].pw, *tPw) == 0)){ 
for (j=0; j<size; j++){ 
if (strcmp(*nName, arr[j].name) == 0){ 
printf("ERROR USERNAME ALREADY EXISTS"); 
break; 
} 
} 
strncpy(arr[i].name, *nName, strlen(*nName)); 
strncpy(arr[i].pw, *nPw, strlen(*nPw)); 
strncpy(arr[i].type, *nType, strlen(*nType)); 
} 
} 

} 

Благодаря

+3

Это какие-то ужасающие отступы , – bernie

+0

Извините. Я копировал это из vim, и это не получается слишком хорошо. –

ответ

2

Вы должны объявить RECORD структуру, прежде чем использовать его в списке параметров. То есть, вы должны перенести его перед передними объявлениями своих функций.

+0

Где я объявляю это? Когда я создаю массив? 'RECORD * arr = malloc (size * sizeof * arr);' –

+0

Просто переместите бит, который начинается с 'typedef' и заканчивается' RECORD; 'над прототипами функций. –

+0

@YamatoC: компилятор C обрабатывает файлы сверху вниз, поэтому 'typedef ... RECORD' должен появляться перед любым другим вхождением« RECORD »в исходный файл. В этом случае компилятор увидел 'RECORD' в прототипе' edit' и сказал: «Вы еще не сказали мне, что такое« ЗАПИСЬ », поэтому я не могу обработать это заявление». –

0

Try, как это:

typedef struct rec 
{ 
char name[22]; 
char pw[22]; 
char type[6]; 
}RECORD; 

void add(int argc, char *argv[]); 
void del (char *username); 
void edit(char *nName, char *nPw, char *nType, char *tName, char *tPw, RECORD *arr); 
int verify (char *username, char *password); 
void parse (char *record, char *delim, char); 

вместо:

void add(int argc, char *argv[]); 
void del (char *username); 
void edit(char *nName, char *nPw, char *nType, char *tName, char *tPw, RECORD *arr); 
int verify (char *username, char *password); 
void parse (char *record, char *delim, char); 

typedef struct rec 
{ 
char name[22]; 
char pw[22]; 
char type[6]; 
}RECORD; 
0

Попробуйте поместить определение структуры для "RECORD" перед объявлением функции для "редактирования"

Смежные вопросы