Предупреждение: присваивание делает целое число из указателя без приведения в алгоритме шеллсорта - PullRequest
0 голосов
/ 17 февраля 2019

Я пишу программу для сортировки по массиву чисел.Сначала я должен сгенерировать последовательность чисел, с которой будет выполняться сортировка.Эта функция генерирует числа вида 2 ^ p * 3 ^ q, которые меньше длины массива, который нужно отсортировать.Затем я сортирую массив последовательностей, который я только что сгенерировал.Вот моя реализация этого:

long * Generate_2p3q_Seq(int length, int *seq_size) {
  int ind = 0;
  long * arr[1000];
  int product;
  int power = 1;
  while (power < length) {
    product = power;
    while (product < length) {
      arr[ind] = product;
      product *= 3;
      ind++;
    }
    power *= 2;
  }
  int i, j, k;
  for (i = 0; i < ind; ++i) {
    for (j = i + 1; j < ind; ++j)
    {
      if (arr[i] > arr[j])
      {
        k =  arr[i];
        arr[i] = arr[j];
        arr[j] = k;
      }
    }
  }
  *seq_size = ind;
  for (int count = 0; count < ind; count++) {
    printf("arr[%d] = %li\n", count, arr[count]);
  }
  return arr;
}

Код предназначен для возврата длинного * массива и установки seq_size в длину массива последовательностей.Например, если мне дан массив из 16 целых чисел для сортировки, сгенерированный здесь массив последовательностей должен быть 8 целых (1, 2, 3, 4, 6, 9, 8, 12), а seq_size должен быть равен 8. IЯ считаю, что мое понимание указателей неверно, потому что вывод моего терминала выглядит следующим образом:

sequence.c: In function ‘Generate_2p3q_Seq’:
sequence.c:14:16: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
       arr[ind] = product;
                ^
sequence.c:26:11: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
         k =  arr[i];
           ^
sequence.c:28:16: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
         arr[j] = k;
                ^
sequence.c:34:25: warning: format ‘%li’ expects argument of type ‘long int’, but argument 3 has type ‘long int *’ [-Wformat=]
     printf("arr[%d] = %li\n", count, arr[count]);
                       ~~^            ~~~~~~~~~~
                       %ln
sequence.c:36:10: warning: return from incompatible pointer type [-Wincompatible-pointer-types]
   return arr;
          ^~~
sequence.c:36:10: warning: function returns address of local variable [-Wreturn-local-addr]

Однако я не уверен, как это изменить, чтобы он работал.Я вызываю эту функцию с помощью:

  long * sequence = Generate_2p3q_Seq(size, &seq_size);

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

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Здесь есть два основных вопроса.Сначала вы объявляете arr как long *arr[1000], что означает, что это массив , указывающий на long, а не массив long.Вот почему вы имеете дело с преобразованиями между указателями и целыми числами.

Правильный способ определения массива long:

long arr[1000];

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

Чтобы исправить это, объявите arr в качестве указателя и используйте malloc для динамического выделения памяти дляit:

long *arr = malloc((product * power) * sizeof *arr);
if (!arr) {
    perror("malloc failed");
    exit(1);
}

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

0 голосов
/ 17 февраля 2019

Передайте указатель на массив в качестве дополнительного параметра и манипулируйте им.

void Generate_2p3q_Seq(long * arr, int length, int *seq_size) {
    // Method stores result in pre-initialized arr.
}

// Call with:

long arr[1000];
Generate_2p3q_Seq(arr, length, seq_size)

// Result stored correctly in arr.
...