Увеличен размер массива.после функции successSize некоторые аргументы одного и того же массива недопустимы.C lang - PullRequest
0 голосов
/ 23 января 2019

Программа принимает ввод txt из файла "numbers.txt".Сначала он подсчитывает сумму всех чисел (freqCount) в этом текстовом файле, затем снова читает файл и с помощью malloc создает два массива A и B, из которыхоба имеют размер, равный количеству всех чисел в текстовом файле.Все идет нормально.

Теперь я хочу увеличить размер массива A, чтобы в него можно было добавить больше аргументов "freqCount".В созданной мной функции freqRepeat есть функция increment, которая принимает тот же массив A и использует realloc для добавления в нее 2 * freqCount дополнительных аргументов.

После вызова упомянутой функции IncreaseSize возникает проблема, потому что только часть аргументов остается неизменной, и существует несколько аргументов, которые становятся огромным числом.Это серьезная проблема.Может кто-нибудь, пожалуйста, предоставьте мне некоторую помощь?спасибо

пс.Я включаю вводный текстовый файл в конце кода.

#include <stdio.h>
#include <stdlib.h>
int read_ints(const char *file_name, int *result);
int *scanFreq(const char *file_name, int *A, int *B, int *resultTab);
int freqRepeat(int *A, int *B, int freqCount);
int *increaseSize(int *A, int freqCount);
void calcmalc(int freqCount);
int *nextArray(int *A, int *B, int freqCount, int freqStart);

int main()
{
  int result = 0;
  int resultTab = 0;
  int freqCount;
  freqCount = read_ints("numbers.txt", &result);
  printf("freqCount is %d", freqCount);
  int *A = (int *)malloc(freqCount * sizeof(int));
  int *B = (int *)malloc(freqCount * sizeof(int));
  scanFreq("numbers.txt", A, B, &resultTab);
  freqRepeat(A, B, freqCount);

}
int read_ints(const char *file_name, int *result)
{
  FILE *file = fopen("numbers.txt", "r");
  int i = 0;
  int n = 0; //row number//

  if (file == NULL)
  {
    printf("unable to open file %s", file_name);
  }

  while (fscanf(file, "%d", &i) == 1)
  {
    n++;
    printf("%d\n ", i);
    *result += i;
    printf("\n we are at row nr. %d sum of this number and all numbers before is: %d\n", n, *result);
  }
  fclose(file);
  return n;
}
int *scanFreq(const char *file_name, int *A, int *B, int *resultTab)
{
  FILE *file = fopen("numbers.txt", "r");
  int i = 0;
  int n = 0; //row number//

  if (file == NULL)
  {
    printf("unable to open file %s", file_name);
  }

  while (fscanf(file, "%d", &i) == 1)
  {
    n++;
    *resultTab += i;
    B[n] = i;
    A[n] = *resultTab;
  }
  fclose(file);
  return 0;
}

int freqRepeat(int *A, int *B, int freqCount)
{
  int lastFrequency;

  lastFrequency = freqCount;
   freqCount = freqCount + freqCount;
  A = increaseSize(A, freqCount);

  printf("\n\nwcis enter\n\n");
  getchar();

  for (int i = 1; i < 15; i++)
  {
    printf("array argument after increasing array size %d \n", A[i]);

    // why some of the arguments have been changed ????????
    }
return 0;
}
int *increaseSize(int *A, int freqCount)
{

  return realloc(A, 2 * sizeof(int));
}


text input:
-14
+15
+9
+19
+18
+14
+14
-18
+15
+4
-18
-20
-2
+17
+16
-7
-3
+5
+1
-5
-11
-1
-6
-20
+1
+1
+4
+18
+5
-20
-10
+18
+5
-4
-5
-18
+9
+6
+1
-19
+13
+10
-22
-11
-14
-17
-10
-1
-13
+6
-17

1 Ответ

0 голосов
/ 23 января 2019

Вы безоговорочно изменяете размер массива, чтобы он содержал только два int элемента. Всегда. Любой доступ к элементам, кроме этих двух, приведет к неопределенному поведению .

Вы, вероятно, хотели сделать

return realloc(A, freqCount * sizeof(int));
...