2013-10-13 7 views
-4

моя программа принимает два ввода командной строки, stock.csv и coins.csv. В начале моей программы у меня есть load_check = load_data(&tm, argv[1], argv[2]);, который инициализирует файлы в связанных списках. Проблема в том, что какая-то эта строка кода меняет значение argv[1] на d, но argv[2] по-прежнему coins.csv. Я действительно смущен тем, что вызывает это, это действительно странно. Есть идеи?Почему меняется значение argv [1]? (C)

EDIT: Извините за медленный ответ, нашел еще одну проблему с кодом и исправил его. Код для load_data (сейчас меняется argv[1] для "")

BOOLEAN load_data(tm_type * tm, char * stockfile, char * coinsfile) 
{ 
stock_node *sstream = NULL; 
char* token; 
char line_no[LINE_LENGTH + 1], *ptr; 
FILE *sfile, *cfile; 
BOOLEAN check = TRUE; 
int denom = 0; 

if((sfile = fopen(stockfile, "r")) == NULL){ 

    fprintf(stderr, "Error in %s.\n", stockfile); 
    check = FALSE; 

} 

if((cfile = fopen(coinsfile, "r")) == NULL){ 

    fprintf(stderr, "Error in %s.\n", coinsfile); 
    check = FALSE; 

} 

sstream = tm -> stock -> head_stock; 

while(fgets(line_no, LINE_LENGTH + 1, sfile) != NULL){ 

    sstream = malloc(sizeof(tm -> stock)); 
    sstream -> data = malloc(sizeof(struct stock_data)); 
    token = strtok(line_no, ","); 
    strcpy(sstream -> data -> ticket_name, token); 
    token = strtok(NULL, ","); 
    sstream -> data -> ticket_type = token[0]; 
    token = strtok(NULL, ","); 
    strcpy(sstream -> data -> ticket_zone, token); 
    token = strtok(NULL, ","); 
    sstream -> data -> ticket_price = strtol(token, &ptr, 10); 
    token = strtok(NULL, ","); 
    sstream -> data -> stock_level = strtol(token, &ptr, 10); 
    sstream -> next_node = tm -> stock -> head_stock; 
    tm -> stock -> head_stock = sstream; 

} 

while(fgets(line_no, LINE_LENGTH + 1, cfile) != NULL){ 

    token = strtok(line_no, ","); 
    tm -> coins[denom].denomination = strtol(token, &ptr, 01); 
    token = strtok(NULL, ","); 
    tm -> coins[denom].count = strtol(token, &ptr, 10); 
    denom++; 

} 

return check; 
} 

Переменная изменение происходит в пятой итерации

while(fgets(line_no, LINE_LENGTH + 1, cfile) != NULL){ 

    token = strtok(line_no, ","); 
    tm -> coins[denom].denomination = strtol(token, &ptr, 01); 
    token = strtok(NULL, ","); 
    tm -> coins[denom].count = strtol(token, &ptr, 10); 
    denom++; 

} 

Кроме того, tm -> coins[denom].denomination = strtol(token, &ptr, 01); дает мне ошибку warning: Invalid parameter passed to C runtime function. но не кажется чтобы повлиять на код любым другим способом.

Определения: (Эти были предварительно предусмотрены коды запуска, это для класса)

typedef struct stock_list * stock_list_ptr; 
typedef struct coin * coin_list_ptr; 
typedef struct tm 
{ 
coin_list_ptr coins; 
stock_list_ptr stock; 
} tm_type; 

struct stock_data 
{ 
char ticket_name[TICKET_NAME_LEN+1]; 
char ticket_type; 
char ticket_zone[TICKET_ZONE_LEN+1]; 
unsigned int ticket_price; 
unsigned int stock_level; 
}; 
typedef struct stock_node 
{ 
struct stock_data * data; 
struct stock_node * next_node; 
} stock_node; 

struct stock_list 
{ 
stock_node * head_stock; 
unsigned int num_stock_items; 
}; 
+10

Без просмотра кода на самом деле трудно сказать. – ereOn

+0

Не может быть отлажено? – StoryTeller

+0

Проблема наиболее вероятна в функции 'load_data'. Можете ли вы опубликовать свой код? –

ответ

0

Почему вы не изменить подпись:

BOOLEAN load_data(tm_type * tm, const char * stockfile, const char * coinsfile) 

Таким образом, вы убедитесь, что load_data не изменяет данные, которые указывают argv [1] и argv [2]. Это не решит вашу проблему.

Reg предупреждение,

tm -> coins[denom].denomination = strtol(token, &ptr, 01); 

является 01 опечатка или деноминации перечисление только с 2 значениями?

Кроме того, важно инициализировать ваши указатели и закрыть дескрипторы файлов.

+0

Нам не разрешено изменять код запуска, который нам был назначен, прототипы были назначены заранее. – An0nx

+0

Это опечатка, я пропустил это. – An0nx

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