Почему мой 2D массив печатается неправильно? (используя fprintf) - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть 2D VLA, который содержит X строк и 6 столбцов.

Эта функция SaveInfo сохраняет значения в каждом столбце для каждой строки и печатает функцию в текстовом файле.

Все печатается правильно, за исключением последнего столбца "Выплачено процентов"

Что может быть причиной этой проблемы? Может ли это быть, где я освобождаю память для printArray? В настоящее время он находится внизу моей основной функции

Вот объявление массива в main:

  double **printArray = malloc(arrSize * sizeof *printArray);
  for(int i = 0; i < arrSize; i++) {
    printArray[i] = malloc(arrSize * sizeof *printArray[i]);
  }
void SaveInfo(double interestRate, int duration, double principalAmt, double monthlyPayment, double** printArray) {
  double remainingBalance = principalAmt;
  double monthlyPrinciple;
  double totalPaid = 0;
  double interestPaid;
  double monthlyInterest;

  //open file in write mode
  FILE *p;
  p = fopen("outputFile.txt", "w");

  //With every month as a row, assign variable values to column in current row (month)
  for(int i = 0; i < duration * 12; i++) {

    printArray[i][0] = i + 1;

    monthlyInterest = (interestRate/12) * remainingBalance;
    printArray[i][1] = monthlyInterest;

    monthlyPrinciple = monthlyPayment - monthlyInterest;
    printArray[i][2] = monthlyPrinciple;

    remainingBalance = remainingBalance - monthlyPrinciple;
    printArray[i][3] = remainingBalance;

    totalPaid = totalPaid + monthlyPayment;
    printArray[i][4] = totalPaid;

    interestPaid = interestPaid + monthlyInterest;
    printArray[i][5] = interestPaid;

  }

  //Print printArray using nested loop
  fprintf(p, "%-7s %-14s %-14s %-14s %-14s %-14s", "Month", "Interest", "Principal", "Balance", "Total Paid", "Interest Paid");
  fprintf(p, "\n");
  for(int i = 0; i < duration * 12; i++) {
    for(int j = 0; j < 6; j++) {
      if(j == 0) {
        fprintf(p, "| %-3.0lf | ", printArray[i][j]);
      }
      else {
        fprintf(p, "| %10.2lf | ", printArray[i][j]);
      }
    }
    fprintf(p, "\n");
  }
}

Month   Interest       Principal      Balance        Total Paid     Interest Paid 
| 1   | |       4.17 | |      81.44 | |     918.56 | |      85.61 | |      -1.#R | 
| 2   | |       3.83 | |      81.78 | |     836.78 | |     171.21 | |      -1.#R | 
| 3   | |       3.49 | |      82.12 | |     754.66 | |     256.82 | |      -1.#R | 
| 4   | |       3.14 | |      82.46 | |     672.20 | |     342.43 | |      -1.#R | 
| 5   | |       2.80 | |      82.81 | |     589.39 | |     428.04 | |      -1.#R | 
| 6   | |       2.46 | |      83.15 | |     506.24 | |     513.64 | |      -1.#R | 
| 7   | |       2.11 | |      83.50 | |     422.74 | |     599.25 | |      -1.#R | 
| 8   | |       1.76 | |      83.85 | |     338.89 | |     684.86 | |      -1.#R | 
| 9   | |       1.41 | |      84.20 | |     254.70 | |     770.47 | |      -1.#R | 
| 10  | |       1.06 | |      84.55 | |     170.15 | |     856.07 | |      -1.#R | 
| 11  | |       0.71 | |      84.90 | |      85.25 | |     941.68 | |      -1.#R | 
| 12  | |       0.36 | |      85.25 | |      -0.00 | |    1027.29 | |      -1.#R | 

1 Ответ

3 голосов
/ 24 апреля 2020

Код операции использует interestPaid неинициализировано. С double interestPaid;, interestPaid является объявленным , но имеет неопределенное значение . Код продолжает пытаться использовать это неопределенное значение (вызывая неопределенное поведение) с:

interestPaid = interestPaid + monthlyInterest;

Чтобы исправить, инициализируйте с:

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