繁体   English   中英

如何从C中的函数返回二维数组?

[英]How to return a 2D array from a function in C?

我是一名 Ruby 程序员,最终为 C 开发了代码生成。这就像让一辆豪华轿车拖走 1960 年代的卡车。 反正。

这是我认为应该起作用但不起作用的方法。

float[][] pixels()
{
  float x[][]= { {1,1},{2,2} };
  return x
}

void drawLine(float x[][2])
{
  //drawing the line
}

//inside main
drawLine(pixels());

我把头撞在桌子上,试图让这件事发挥作用。 请帮忙。

你这个可怜的东西。 在 C 中,指针和数组密切相关。 此外,您通常需要将数组的大小作为单独的变量传递。 让我们从你开始:

#include <stdio.h>

float** createArray(int m, int n)
{
    float* values = calloc(m*n, sizeof(float));
    float** rows = malloc(n*sizeof(float*));
    for (int i=0; i<n; ++i)
    {
        rows[i] = values + i*m;
    }
    return rows;
}

void destroyArray(float** arr)
{
    free(*arr);
    free(arr);
}

void drawLine(const float** coords, int m, int n);

int main(void)
{
    float** arr = createArray(2,2);
    arr[0][0] = 1;
    arr[0][1] = 1;
    arr[1][0] = 2;
    arr[1][1] = 2;
    drawLine(arr, 2, 2); 
    destroyArray(arr);
}

C/C++ ,当您将数组传递给函数时,它会衰减为指向数组第一个元素的指针。 因此,在pixels()函数中,您将返回堆栈分配变量的地址。 返回变量的地址不再有效,因为在pixels()返回时,堆栈分配的变量超出范围。 因此,您应该使用动态存储的变量(即,使用 malloc、calloc)。

因此,对于二维数组,您可以使用float** arrayVariable; . 此外,如果您将它传递给一个函数,您应该注意它有多少行和列。

int rows, columns;

float** pixels()
{
    // take input for rows, columns
    // allocate memory from free store for the 2D array accordingly
    // return the array
}

void drawLine( float** returnedArrayVariable )
{
  //drawing the line
}

由于 2D 数组自己管理资源,因此它应该使用free将资源返回到免费存储。

感谢大家的回答,特别是对数组指针关系的详细解释。

我将数组封装在一个结构中

 struct point_group1 {
        float x[3];
        float y[3];
};

struct point_group1 pixels(){
    struct point_group1 temp;

    temp.x[0] = 0.0;
    temp.x[1] = 1.0;
    temp.x[2] = -1.0;

    temp.y[0] = 0.0;
    temp.y[1] = 1.0;
    temp.y[2] = 1.0;

    return temp;    
}



struct point_group1 points1  = pixels();
axPoly(points1.x, points1.y ,3, 0.0);
float (*pixels(void))[2] 
{
  static float x[2][2]= { {1,1},{2,2} };
  return x;
}

void drawLine(float (*x)[2])
{
  //drawing the line
  //x[0][0];
}

//inside main
drawLine(pixels());

最简单的方法可能是在 main 中声明float数组并让pixels填充它:

#define PIXEL_X_SIZE 2
#define PIXEL_Y_SIZE 2

int pixels(float x[][PIXEL_X_SIZE], int len) {
    /* I don't know if you want the logic of this method to ever change,
       but this will be roughly equivalent to what you do above */
    if (len < PIXEL_Y_SIZE) {
        /* the length of the passed array is too small, abort */
        return -1;
    }

    x[0][0] = x[0][1] = 1;
    x[1][0] = x[1][1] = 2;
    return 0;
}

void drawLine(float x[][PIXEL_X_SIZE]) {
    /* this will work fine */
}

int main() {
    float pixel_array[PIXEL_Y_SIZE][PIXEL_X_SIZE];
    pixels(pixel_array, PIXEL_Y_SIZE);
    drawLine(pixel_array);
}

您还可以使用mallocfree并将您的像素存储在堆上,但如果像素数组将变得更大,则实际上没有必要,它只会增加额外的复杂性以确保您的内存始终得到正确分配和获释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM