Почему мой массив не хранит структуру правильно? - PullRequest
1 голос
/ 30 ноября 2011

У меня немало проблем с чем-то, что должно быть действительно простым. В моей программе есть структура под названием «Run»:

typedef struct{
    char name[MAXNAMELENGTH], day[MAXDAYLENGTH];
    int distance, intDay;
    Date startDate;
    Time startTime;
    Time runTime;
} Run;

Я анализирую данные из текстового файла в эту структуру, используя fgets () для анализа одной строки в массиве с именем line [], а затем вызываю эту функцию:

void parseTable(char line[NUMBEROFLINES], Run run, Run runs[NUMBEROFLINES], int *j){
    sscanf(line,"%s %s %s %d, %s %d:%d %d %d:%d:%d",run.name, run.day, run.startDate.month, &run.startDate.date, run.startDate.year,&run.startTime.hours, &run.startTime.minutes, &run.distance, &run.runTime.hours, &run.runTime.minutes, &run.runTime.seconds);
    runs[*j] = run;
    *j+=1;    
}

Теперь эта функция правильно назначает все данные для запуска структуры и сохраняет эту структуру в массиве run [], но после этого я хочу присвоить структуре новое значение: intDay. Для этого я вызываю следующую функцию:

void dayToInt(Run run, Run runs[NUMBEROFLINES], int *i, int *a, int *b){
    if (strcmp(run.day,"Mon") == 0)
        run.intDay = 1;
    else if (strcmp(run.day,"Tue") == 0)
        run.intDay = 2;
    else if (strcmp(run.day,"Wed") == 0)
        run.intDay = 3;
    else if (strcmp(run.day,"Thu") == 0)
        run.intDay = 4;
    else if (strcmp(run.day,"Fri") == 0)
        run.intDay = 5;
    else if (strcmp(run.day,"Sat") == 0)
        run.intDay = 6;
    else if (strcmp(run.day,"Sun") == 0)
        run.intDay = 7;
    runs[*i] = run;
    *i += 1;
}

Но это не хранит значение intDay в моем массиве run [], и я действительно не понимаю, почему это не так. Я смотрел здесь и на других форумах, чтобы увидеть примеры того, как это сделать, но я должен что-то упускать, но если кто-нибудь скажет мне, что это, то это будет очень признательно:)

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Здесь возникает проблема «Передача по значению».

Когда вы вызываете функцию: void dayToInt (Выполнить запуск, Выполнить запуск [NUMBEROFLINES], int * i, int * a, int * b) {

первый параметр, run, фактически копируется в локальную копию функции.Когда вы изменяете run.intDay, он изменяет только локальную копию.

Когда вы возвращаетесь из функции, все локальные модификации теряются, а исходная структура в области видимости вызывающей стороны остается неизменной.

Чтобы устранить проблему, измените функцию на «Передача по ссылке», то есть передайте указатель на структуру, которую вы хотите изменить:

void dayToInt(Run *prun, Run runs[NUMBEROFLINES], int *i, int *a, int *b){
    if (strcmp(prun->day,"Mon") == 0)
        prun->intDay = 1;
    else if (strcmp(prun->day,"Tue") == 0)
        prun->intDay = 2;
[etc, etc]

Редактировать В дальнейшемПри осмотре это выглядит как строка:

runs[*i] = run;

должна выполнить копию структуры и сохранить изменения в области видимости вызывающего.Поэтому я не уверен, почему изменения в run.intDay теряются.Расследование дальше.

0 голосов
/ 30 ноября 2011

Ваш код работает.

Итак, ваша проблема заключается в том, как вы вызываете функцию, или в том, как вы проверяете, работает ли она (проверяете ли вы правильный элемент массива, т. Е. Тот, который находится перед текущим значением i, которое при возврате только что был увеличен?)

...