【问题标题】:Storing a **pointer returned by another function存储另一个函数返回的**指针
【发布时间】:2020-03-30 20:46:30
【问题描述】:

我有一个函数 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;
}

我认为这让我最接近解决方案,因为它适用于需要编写程序的其余部分的方式,但这会产生 'uninitialized local variable '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;
  }
}

【问题讨论】:

  • 只要return mapa;,然后在main做相应的修改。
  • 这似乎无效 btw **mapa = nacitaj_mapu(&amp;n);。你在哪里称那个加载图?你应该返回int** 而不仅仅是简单的int
  • @1201ProgramAlarm 我得到“返回值类型与函数类型不匹配”
  • @Eraklon 对,对不起,忘了翻译那位,那是 loadmap() 刚刚翻译了一些上下文
  • @Eraklon 你能澄清一下吗?我不确定我会怎么做。如果只是返回 mapa,那么这会给我一个“返回值类型与函数类型不匹配”错误

标签: c arrays pointers return-value


【解决方案1】:

如果要返回双指针mapa,loadmap()的声明应该是int ** loadmap(int *n),返回值是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

【讨论】:

  • 您能否详细说明 main() 的外观?我按照您的建议更改了函数加载映射类型和返回值,但我似乎仍然无法使其正常工作。
  • 更新loadmap函数有什么问题?你能显示其他函数的声明吗,例如najdi_kopec, zidi_kopec
  • 我不知道你想要什么,因为你不是用英文编写或评论代码。我只是改变了一点你的代码,然后它就可以工作了
  • 完美运行,非常感谢!也对代码感到抱歉,我将来必须更好地处理它。
猜你喜欢
  • 2016-08-04
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多