在C语言中将数组传递给函数

4

当我编译代码时,遇到了gcc错误。这些错误是关于“传递参数1给‘print_path’时,没有使用强制转换从整数转换为指针”的。

以下是我的函数原型:

void print_path(int previous[], int desired_node_index);

这是我的函数:
void print_path(int previous[], int desired_node_index)
{
    if( previous[desired_node_index] != -1 )
        print_path( previous[desired_node_index] );
    printf("-> %d ", previous[desired_node_index]);
}

这里是我调用函数的地方:

print_path(previous, dest_index);

我显然传错了参数,或者在如何将数组传递给函数方面做错了一些事情。有人能帮忙吗?
谢谢大家!

之前和dest_index是什么类型? - ALOToverflow
之前是一个整数数组,dest_index 是一个整数。但是 karlphillip 发现了我的错误,我只传递了一个参数到我的递归调用中。 - Joshua Soileau
1
很少看到问题能像这样清晰地提出并附带所有相关信息。做得好。 - sje397
5个回答

7

这显然是一个递归函数。请注意,print_path()接受两个参数:第一个是一个整数数组,第二个是该数组内某个位置的索引。

调用它:

print_path( previous[desired_node_index] );

这是完全错误的(除非你已经重载了这个函数),因为它需要2个参数,而你只传递了一个。你应该这样做:

print_path( previous, desired_node_index );

这个函数似乎缺少一个操作来增加/减少索引变量,否则你将一直打印数组的同一位置。
不知道你究竟想做什么,有可能你想做这个:
print_path( previous, previous[desired_node_index] );

1
在C语言中没有函数重载。 - Matt Eckert
2
嗯,你知道的,有时这些新手会说他们在用 C,但实际上他们在使用 C++ 编译器并且在我们背后做这些事情。 - karlphillip
1
这会导致无限循环,因为参数没有改变。我的猜测是 - 递归调用应该是 print_path(previous, previous[desired_node_index]); - DCoder
我太蠢了。你是对的,我的递归调用只有一个参数。将其更改为“print_path(previous,previous [desired_node])”,问题就解决了。 - Joshua Soileau
除了你的逻辑有问题之外,你的编译器报错也是有原因的。你定义了 print_path 函数来接收两个参数:int previous[],一个整数数组/指向整数的指针;以及 int desired_node_index,一个整数。previous[desired_node_index] 是一个整数,而不是一个指向整数的指针,所以你的编译器会报错。如果没有逻辑错误,你可以通过传递 &(previous[desired_node_index]) 来解决这个问题。 - Peter Downs
显示剩余2条评论

0
如果你想将数组传递给函数,并在函数中更改元素后返回,可以参考以下示例:
你可以在这里找到解决方案:https://github.com/krishnabhat81/Send-and-return-array-from-function-in-C
#include <stdio.h>

/*
If you want to return a single-dimension array from a function, you would have to 
declare a function returning a pointer as in the following example:
*/

int *getRandom(int arr[])
{
  static int  r[10];
  /*Second point to remember is that C does not advocate to return the address of a 
  local variable to outside of the function so you would have to define the 
  local variable as static variable.*/
  int i;

  for ( i = 0; i < 10; ++i)
  {
     r[i] = arr[i]+1;//rand();
     printf( "r[%d] = %d\n", i, r[i]);

  }

  return r;
}

/* main function to call above defined function */
int main ()
{
   /* a pointer to an int */
   int *p;
   int i;
   int arris[10] = {110,22,33,44,5,6,7,8,9,20};

   p = getRandom(arris);
   for ( i = 0; i < 10; i++ )
   {
       printf( "*(p + %d) : %d\n", i, *(p + i));
   }

   return 0;
}

   return 0;
}

0
一个明显的错误是:

print_path( previous[desired_node_index] );

我不确定你想做什么,但我猜你想要类似这样的东西:
#include <stdio.h>

void print_path(int *previous, int desired_node_index);

int main(void) {

    int dest_index = 2;
    int previous[5] = { -1, 0, 1, 2, 3};

    print_path(previous, dest_index);

    return 0;
}

void print_path(int *previous, int desired_node_index) {
    if( previous[desired_node_index] != -1 )
        print_path( previous, previous[desired_node_index]);
    printf("-> %d ", previous[desired_node_index]);
}

0
void receive_array(int *temp_arr)
{
      int i=0;

      do
      {
         temp_arr[i]=temp_arr[i]+1;
         i++;
      }
      while((char)temp_arr[i]!='\0');

}

0

这里我做了一些修改。数组temp_arr2[]是一个缓冲数组。在我的实际程序中,我从main()函数中打印了该数组。在这里,为了做同样的事情,需要将某些计算的最终结果存储回temp_arr[]中。MAX可以是宏或全局变量。在之前的代码中,我只是忘记编辑这行代码:temp_arr[i]=temp_arr[i]+1;(我的演示示例代码):)

void receive_array(int *temp_arr)
  {
      int i=0;
      int temp_arr2[MAX];


  do
  {
     temp_arr2[i]=temp_arr[i];
     i++;
  }
  while((char)temp_arr[i]!='\0');

 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接