用于在C中打印uknown大小的2D数组的函数

用于在C中打印uknown大小的2D数组的函数,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,我是C编程新手,在创建2D数组打印函数时遇到了一个问题。当我尝试执行下面的代码时,我得到: 点c:13:错误:未知数组元素大小 正如我检查过的,网上有非常相似的代码,它们应该可以工作。我尝试将函数初始化为 int PRINT2DRARY int arrayLen,int elementLen,int arrayLen[arrayLen][elementLen] 但它提出: c点:3:错误:“arrayLen”未声明 有人能告诉我这个代码有什么问题,以及如何修复它吗?我也不明白为什么非常相似的1D

我是C编程新手,在创建2D数组打印函数时遇到了一个问题。当我尝试执行下面的代码时,我得到:

点c:13:错误:未知数组元素大小

正如我检查过的,网上有非常相似的代码,它们应该可以工作。我尝试将函数初始化为

int PRINT2DRARY int arrayLen,int elementLen,int arrayLen[arrayLen][elementLen]

但它提出:

c点:3:错误:“arrayLen”未声明

有人能告诉我这个代码有什么问题,以及如何修复它吗?我也不明白为什么非常相似的1D阵列函数工作得很好。它必须是纯C

#include <stdio.h>
//supposed to print 2D array:
int print2DArray(int array[][], int arrayLen, int elementLen)
{
    int i;
    int j;

    for (i = 0; i < arrayLen; i++)
    {
        for (j=0; j < elementLen; j++)
        {
            printf("%5d", array[i][j]);
        }
        printf("\n");
    }
}

//prints 1D array:

int printArray( int array[], int arrayLen)
{
    int i;
    for (i = 0; i < arrayLen; i++)
    {
        printf("%d", array[i]);
    }
}
--编辑--

我不理解你们中的大多数人指出,函数必须这样调用:

#include <stdio.h>

int print2DArray( int arrayLen, int elementLen, int array[arrayLen][elementLen])
{
    int i;
    int j;

    for (i = 0; i < arrayLen; i++)
    {
        for (j=0; j < elementLen; j++)
        {
            printf("%5d", array[i][j]);
        }
        printf("\n");
    }
}
这会引发一个错误:

c点:3:错误:“arrayLen”未声明


我正在使用tcc for windows,根据文档,它应该支持C99 VLA。

除非您使用的是C99编译器

int print2DArray( int arrayLen, int elementLen, int array[arrayLen][elementLen])
这是不可能的

即使您使用的是C99编译器,您的代码也有问题。您需要首先传递一个维度

int print2DArray(int arrayLen, int elementLen, int arr[][elementLen]);
所以


我不确定您是如何调用print2DArray函数的。除非你发布那段代码,否则很难解决你的问题。确认您正在按上图所示正确调用函数。

除非您使用的是C99编译器

int print2DArray( int arrayLen, int elementLen, int array[arrayLen][elementLen])
这是不可能的

即使您使用的是C99编译器,您的代码也有问题。您需要首先传递一个维度

int print2DArray(int arrayLen, int elementLen, int arr[][elementLen]);
所以


我不确定您是如何调用print2DArray函数的。除非你发布那段代码,否则很难解决你的问题。如上图所示,确认您正在正确调用该函数。

似乎OP的编译器或使用的模式不支持可变长度数组VLA作为函数参数

以下是非VLA方法

void print2DArrayX(int arrayLen, int elementLen, const int *array) {
  int i;
  int j;

  for (i = 0; i < arrayLen; i++) {
    for (j = 0; j < elementLen; j++) {
      printf("%5d", array[i*elementLen + j]);
    }
    printf("\n");
  }
}

OP的编译器或使用的模式似乎不支持可变长度数组VLA作为函数参数

以下是非VLA方法

void print2DArrayX(int arrayLen, int elementLen, const int *array) {
  int i;
  int j;

  for (i = 0; i < arrayLen; i++) {
    for (j = 0; j < elementLen; j++) {
      printf("%5d", array[i*elementLen + j]);
    }
    printf("\n");
  }
}

好的,谢谢你的回答,他们很有帮助。我刚刚尝试在linux中使用gcc,正如您所指出的,这种方法很好:

int PRINT2DRARY int arrayLen,int elementLen,int arrayLen[arrayLen][elementLen]


我猜tcc tiny c编译器,windows版本0.9.27根本不支持VLA。有点奇怪,因为文档上说是这样的。

好的,所以感谢所有的答案-它们非常有用。我刚刚尝试在linux中使用gcc,正如您所指出的,这种方法很好:

int PRINT2DRARY int arrayLen,int elementLen,int arrayLen[arrayLen][elementLen]


我猜tcc tiny c编译器,windows版本0.9.27根本不支持VLA。有点奇怪,因为文档上说是这样。

试试这个解决方案怎么样

#include <stdio.h>


int print2DArray(int* array, int arrayLen, int elementLen)
{
    int i;
    int j;

    for (i = 0; i < arrayLen; i++)
    {
        for (j=0; j < elementLen; j++)
        {
            printf("%5d ", *(array+j+elementLen*i));
        }
        printf("\n");
    }

}

int main(){
    int arr[2][6] = {   {9,258,9,96,-8,5},
                        {1,1212,-3,45,27,-6}
                      };
    print2DArray(*arr,2,6);
    return 0;
}

你试试这个方法怎么样

#include <stdio.h>


int print2DArray(int* array, int arrayLen, int elementLen)
{
    int i;
    int j;

    for (i = 0; i < arrayLen; i++)
    {
        for (j=0; j < elementLen; j++)
        {
            printf("%5d ", *(array+j+elementLen*i));
        }
        printf("\n");
    }

}

int main(){
    int arr[2][6] = {   {9,258,9,96,-8,5},
                        {1,1212,-3,45,27,-6}
                      };
    print2DArray(*arr,2,6);
    return 0;
}

你说你已经把函数写成int print2DArray int arrayLen,int elementLen,int array[arrayLen][elementLen]。但你没有。相反,您已经完成了int-print2darayint-array[]]、int-arrayLen、int-elementLen,这是完全不同的并且是无效的。int-array[][]不是有效的参数,所以请忘记这一点。在此之前,您已经确定了编译器是否支持VLAs可变长度数组?它必须,否则您的int-print2DArray int-arrayLen,int-elementLen,int-arrayLen[arrayLen][elementLen]不可能工作。发布导致我尝试将函数初始化为int-print2DArray int-arrayLen,int-elementLen,int-arrayLen[arrayLen][elementLen的代码。我怀疑您有转录错误。@Peter我知道,我的意思是我尝试了这两种方法。ChrisM我正在使用tcc for windows,根据文档,它应该支持C99 VLA->编译器似乎处于不接受VLA的模式。可能编译器选项是为C89之前的版本设置的,没有VLA或支持C99仅支持C99的大部分。您说您已将函数编写为int print2DArray int arrayLen、int elementLen、int array[arrayLen][elementLen]。但你没有。相反,您已经完成了int-print2darayint-array[]]、int-arrayLen、int-elementLen,这是完全不同的并且是无效的。int-array[][]不是有效的参数,所以请忘记这一点。在此之前,您已经确定了编译器是否支持VLAs可变长度数组?它必须,否则您的int-print2DArray int-arrayLen,int-elementLen,int-arrayLen[arrayLen][elementLen]不可能工作。发布导致我尝试将函数初始化为int-print2DArray int-arrayLen,int-elementLen,int-arrayLen[arrayLen][elementLen的代码。我怀疑您有转录错误。@Peter我知道,我的意思是我尝试了这两种方法。ChrisM我正在使用tcc for windows,根据文档,它应该支持C99 VLA->编译器似乎处于不接受V的模式
洛杉矶。可能编译器选项是为C89之前的版本设置的,没有VLA或支持C99只支持C99的大部分。第一步很好,但是如果int-print2darayint-arrayLen、int-elementLen、int-arr[][elementLen];有效,OP的int-print2DArray int-arrayLen,int-elementLen,int-arrayLen[elementLen]也应该有效,因为它报告了一个错误。@chux:它应该适用于C99,对吧?是的,int-print2DArray int-arrayLen,int-elementLen,int-arrayLen[elementLen]可以在C99中工作,也可以在C11中工作,我想问题在于OP是如何调用这个函数的。需要看一看。答案有缺点,但不是DV。好的第一步,但如果int-print2darayint-arrayLen,int-elementLen,int-arr[][elementLen];有效,OP的int-print2DArray int-arrayLen,int-elementLen,int-arrayLen[elementLen]也应该有效,因为它报告了一个错误。@chux:它应该适用于C99,对吧?是的,int-print2DArray int-arrayLen,int-elementLen,int-arrayLen[elementLen]可以在C99中工作,也可以在C11中工作,我想问题在于OP是如何调用这个函数的。需要看一看。答案有缺点,但不是DV。有点奇怪,因为文档上说它有。->最好张贴错误的tcc报价和tcc版本。你是说这个文件:?不过,我还没有找到任何方法来指定一个特定的标准。@Bob__;是的,这个小文档。由于tcc“帮助”未显示任何用于指定标准的选项,因此我假设默认情况下VLA处于“开启”状态。老实说,至少我发现VLA不是ANSI C标准的一部分。我必须保持在ANSI C中,所以这对我来说不是一个真正的问题。不要打开那罐蠕虫,但即使将C89称为ANSI C是很常见的,它也是C18。有点奇怪,因为文档中说它是。->最好张贴错误的tcc报价和tcc版本。你是说这个文件:?不过,我还没有找到任何方法来指定一个特定的标准。@Bob__;是的,这个小文档。由于tcc“帮助”未显示任何用于指定标准的选项,因此我假设默认情况下VLA处于“开启”状态。老实说,至少我发现VLA不是ANSI C标准的一部分。我必须保持在ANSI C中,所以这对我来说不是一个真正的问题。不要打开那罐蠕虫,但即使将C89称为ANSI C是很常见的,它也是C18。这种方法是否会导致中提到的类型的未定义行为:数组下标超出范围,即使一个对象显然可以通过给定的下标访问,如左值表达式a[1][7]中给定的声明int a[4][5]6.5.6和@exnihilo有趣的是:我想说,给定const int*数组不受int数组[array_LEN][ELEMENT_LEN 2维的限制,只有在print2DArrayX中,整体索引受到ARRAY_LEN*ELEMENT_LEN和no的限制。这种方法不会导致中提到的类型的未定义行为:数组下标超出范围,即使对象显然可以使用给定下标访问,如左值表达式a[1][7]中给定的声明int a[4][5]6.5.6和?@exnihilo有趣的是:如果常量int*数组没有int数组[array_LEN][ELEMENT_LEN]的2维限制,我会说它不是UB,只是整体索引受数组_LEN*ELEMENT_LEN和print2DArrayX中的no的限制。