Получение нарушения прав записи - PullRequest
0 голосов
/ 03 июня 2019

когда код отлажен, одна из моих функций выдает исключение при записи, и я не совсем уверен, почему. проблема выбрасывается из моей функции computeFunction, целью которой является установка нескольких значений. он вызывается внутри цикла и содержит множество значений int, а также адрес для 4-х двойных, включая homeOffense (который выдает исключение).

Я посмотрел на код, который делает то, что я пытаюсь сделать, и я не вижу разницы в том, что я делал.

void main() {

    int homeAttackStrength, homeDefensiveStrength, homeGoalieRating, homeFieldAdvg, homeExp, visitAttackStrength,
        visitDefensiveStrength, visitGoalieRating, visitRoad, visitExp, weather, hScore, vScore, gameCount, x;
    double homeOffense, visitO, crowd, experience,homeWinCount,drawCount,homeWin,draw;
    char home[20], visit[20];
    FILE *fpi1, *fpo1;

    fpi1 = fopen("soccer1.txt","r");

    homeWinCount = 0;
    drawCount = 0;
    gameCount = 0;
    x = 0;


    while (getInput(fpi1, home, &homeAttackStrength, &homeDefensiveStrength, &homeGoalieRating, &homeFieldAdvg, &homeExp,
        visit, &visitAttackStrength, &visitDefensiveStrength, &visitGoalieRating, &visitRoad, &visitExp, &weather) != EOF) {


        computeFunctions(homeAttackStrength, homeDefensiveStrength, homeGoalieRating, homeFieldAdvg, homeExp, visitAttackStrength,
            visitDefensiveStrength, visitDefensiveStrength, visitGoalieRating, visitRoad, visitExp, &homeOffense, &visitO, &crowd, &experience);
...

void computeFunctions(int homeAttackStrength, int homeDefensiveStrength, int homeGoalieRating, int homeFieldAdvg, int homeExp,
    int visitAttackStrength, int visitDefensiveStrength, int visitGoalieRating, int visitRoad, int visitExp, double *homeOffense, 
    double *visitO, double *crowd, double *experience) {

    *homeOffense= (HOME_SCORING_ADVANTAGE * homeAttackStrength + HOME_SCORING_ADJUSTMENT) / (((long double)visitDefensiveStrength + (long double)visitGoalieRating) * AWAY_IMPACT);
    *visitO= ((long double)visitAttackStrength + (long double)visitExp) * AWAY_IMPACT - ((long double)homeDefensiveStrength + (long double)homeGoalieRating + homeExp * EXPERIENCE_ADJUSTMENT);
    *crowd= HOME_FIELD_IMPACT * homeFieldAdvg / visitRoad;
    *experience= ((long double)homeExp - (long double)visitExp) * EXPERIENCE_ADJUSTMENT;
}

сообщение об ошибке:

Исключение: нарушение прав записи.

homeOffense был 0x2.

1 Ответ

0 голосов
/ 03 июня 2019

Скорее всего, нарушение прав доступа происходит из-за того, что вы пытаетесь записать длинный двойной тип в двойной указатель. Размер длинного двойника определенно больше, чем двойного, поэтому запись длинного двойного в двойное в конечном итоге приведет к записи в каком-либо месте, которое находится за пределами допустимого адреса. Это похоже на выполнение * char_ptr = long_val, которое может привести к сбою. Не могли бы вы попробовать привести результаты расчетов перед записью в указатели homeOffense, visit0 и Experience? Может быть, это решит проблему сбоя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...