Хранение указателя **, возвращенного другой функцией - PullRequest
0 голосов
/ 30 марта 2020

У меня есть функция loadmap (), которая в основном загружает сетку из файла. В нем я динамически создаю массив целых чисел с именем 'mapa'.

int loadmap(int *n) {
  int i, j;
  int **mapa;
  int num;
  char space;
  int count = 0;
  FILE *f;
  f = fopen(SUBOR, "r");

  fscanf(f, "%d%c", &num, &space);
  while (space != '\n') {
    count++;
    fscanf(f, "%d%c", &num, &space);
  }

  mapa = (int **)malloc(pocet * sizeof(int *));
  for (i = 0; i < pocet; i++) {
    mapa[i] = (int *)malloc(pocet * sizeof(int));
  }

  rewind(f);

  for (i = 0; i < pocet; i++) {
    for (j = 0; j < pocet; j++) {
      fscanf(f, "%d%c", &num, &space);
      mapa[i][j] = num;
    }
  }

  *n = count;

  return **mapa;
}

Затем в основном я хотел бы использовать этот возвращаемый указатель на массив в качестве аргумента для других функций. Я пытался сохранить его во всех возможных переменных, но ничего не получалось. Вот то, что у меня сейчас есть.

int main() {
  int **mapa;
  int n;
  int ki, kj;

  **mapa = loadmap(&n);
  printf("rozmer stvorcovej mapy: %d\n", n);
  najdi_kopec(mapa, n, &ki, &kj);
  printf("suradnice kopca: %d, %d\n", ki, kj);
  zidi_kopec(mapa, n, ki, kj);

  return 0;
}

Я думаю, что это ближе всего к решению, потому что оно работает с тем, как должна быть написана остальная часть программы, но это создает 'неинициализированную локальную переменную 'mapa' used 'error . Я не уверен, что использую правильный подход, я только начинаю с C. Не могли бы вы предложить некоторые настройки, чтобы сделать то, что у меня есть работа или другой рабочий подход в целом?

Спасибо

--------- РЕДАКТИРОВАТЬ --------- ---

добавление объявлений других функций


void najdi_kopec(int **mapa, int n, int *ki, int *kj) {
  int i, j;
  *ki = *kj = 0;
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      if (mapa[i][j] > mapa[*ki][*kj]) {
        *ki = i;
        *kj = j;
        // printf("i: %d, j: %d, mapa: %d\n", *ki, *kj, mapa[*ki][*kj]);
      }
}

void zidi_kopec(int **mapa, int n, int ki, int kj) {
  int i, j, max;
  while (ki != 0 && ki != n - 1 && kj != 0 && kj != n - 1) {
    max = 0;
    // sever
    if (ki - 1 >= 0 && mapa[ki - 1][kj] > max &&
        mapa[ki - 1][kj] < mapa[ki][kj]) {
      i = ki - 1;
      j = kj;
      max = mapa[i][j];
    }

    // vychod
    if (kj + 1 < n && mapa[ki][kj + 1] > max &&
        mapa[ki][kj + 1] < mapa[ki][kj]) {
      i = ki;
      j = kj + 1;
      max = mapa[i][j];
    }
    // juh
    if (ki + 1 < n && mapa[ki + 1][kj] > max &&
        mapa[ki + 1][kj] < mapa[ki][kj]) {
      i = ki + 1;
      j = kj;
      max = mapa[i][j];
    }
    // zapad
    if (kj - 1 >= 0 && mapa[ki][kj - 1] > max &&
        mapa[ki][kj - 1] < mapa[ki][kj]) {
      i = ki;
      j = kj - 1;
      max = mapa[i][j];
    }
    printf("i: %d, j: %d, vyska: %d\n", i, j, max);
    ki = i;
    kj = j;
  }
}

1 Ответ

0 голосов
/ 31 марта 2020

Объявление loadmap () должно быть int ** loadmap(int *n), если вы хотите вернуть двойной указатель mapa, а возвращаемое значение - mapa вместо ** mapa.

В основной функции Вы объявили двойной указатель mapa, но при вызове функции loadmap() вы просто берете первое значение, на которое указывает mapa. Таким образом, если вы используете mapa для другой функции в качестве аргумента, mapa не был инициализирован, поскольку мы не выделяли этот указатель (например, с использованием malloc).

Ваш код неверен. Вы должны опубликовать другие функции здесь.

ОБНОВЛЕНО:

#include <stdio.h>
#include <stdlib.h>

int pocet = 5;
#define SUBOR "text.txt"
int ** loadmap(int *n) {
  int i, j;
  int **mapa;
  int num;
  char space;
  int count = 0;
  FILE *f;
  f = fopen(SUBOR, "r");
  if (!f) 
    exit(-1);
  fscanf(f, "%d%c", &num, &space);
  while (space != '\n') {
    count++;
    fscanf(f, "%d%c", &num, &space);
  }

  mapa = (int **)malloc(pocet * sizeof(int *));
  for (i = 0; i < pocet; i++) {
    mapa[i] = (int *)malloc(pocet * sizeof(int));
  }

  rewind(f);

  for (i = 0; i < pocet; i++) {
    for (j = 0; j < pocet; j++) {
      fscanf(f, "%d%c", &num, &space);
      mapa[i][j] = num;
    }
  }

  *n = count;

  return mapa;
}

void najdi_kopec(int **mapa, int n, int *ki, int *kj) {
  int i, j;
  *ki = *kj = 0;
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      if (mapa[i][j] > mapa[*ki][*kj]) {
        *ki = i;
        *kj = j;
        // printf("i: %d, j: %d, mapa: %d\n", *ki, *kj, mapa[*ki][*kj]);
      }
}

void zidi_kopec(int **mapa, int n, int ki, int kj) {
  int i, j, max;
  while (ki != 0 && ki != n - 1 && kj != 0 && kj != n - 1) {
    max = 0;
    // sever
    if (ki - 1 >= 0 && mapa[ki - 1][kj] > max &&
        mapa[ki - 1][kj] < mapa[ki][kj]) {
      i = ki - 1;
      j = kj;
      max = mapa[i][j];
    }

    // vychod
    if (kj + 1 < n && mapa[ki][kj + 1] > max &&
        mapa[ki][kj + 1] < mapa[ki][kj]) {
      i = ki;
      j = kj + 1;
      max = mapa[i][j];
    }
    // juh
    if (ki + 1 < n && mapa[ki + 1][kj] > max &&
        mapa[ki + 1][kj] < mapa[ki][kj]) {
      i = ki + 1;
      j = kj;
      max = mapa[i][j];
    }
    // zapad
    if (kj - 1 >= 0 && mapa[ki][kj - 1] > max &&
        mapa[ki][kj - 1] < mapa[ki][kj]) {
      i = ki;
      j = kj - 1;
      max = mapa[i][j];
    }
    printf("i: %d, j: %d, vyska: %d\n", i, j, max);
    ki = i;
    kj = j;
  }
}

int main() {
  int **mapa;
  int n;
  int ki, kj;

  mapa = loadmap(&n);
  printf("rozmer stvorcovej mapy: %d\n", n);
  najdi_kopec(mapa, n, &ki, &kj);
  printf("suradnice kopca: %d, %d\n", ki, kj);
  zidi_kopec(mapa, n, ki, kj);

  return 0;
}

text.txt лайки:

1 2 3 4 5 6
1 2 3 4 5

Результат, когда я проверяю, как показано ниже:

rozmer stvorcovej mapy: 5
suradnice kopca: 1, 0

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