bestsource

C의 함수에서 2D 배열을 반환하는 방법은?

bestsource 2023. 9. 21. 20:39
반응형

C의 함수에서 2D 배열을 반환하는 방법은?

저는 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(m*sizeof(float*));
    for (int i=0; i<m; ++i)
    {
        rows[i] = values + i*n;
    }
    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);
}

답변해 주신 모든 분들께 감사드리며, 구체적으로 배열-포인트 관계에 대한 자세한 설명에 감사드립니다.

배열을 구조물 안에 캡슐화했습니다.

 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);

C/C++, 배열을 함수에 전달하면 배열의 첫번째 요소를 가리키는 포인터로 바뀝니다.그래서.pixels()함수, 스택 할당된 변수의 주소를 반환하는 것입니다.반환 변수의 주소가 on이기 때문에 더 이상 유효하지 않습니다.pixels()반환, 스택 할당 변수가 범위를 벗어납니다.따라서 대신 저장이 동적인 변수(예: malloc, calloc 사용)에 대해 사용해야 합니다.

따라서, 2차원 배열의 경우,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 어레이는 자체적으로 리소스를 관리하기 때문에 무료로 리소스를 무료 저장소로 반환해야 합니다.

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());

가장 쉬운 방법은 아마도 다음을 선언하는 것일 것입니다.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);
}

사용할 수도 있습니다.malloc그리고.free픽셀을 힙에 저장할 수 있습니다. 하지만 픽셀 어레이가 커질수록 더 커질 필요가 없으며 메모리가 항상 적절하게 할당되고 자유로워질 수 있도록 추가적인 복잡성을 더해줄 뿐입니다.

언급URL : https://stackoverflow.com/questions/5201708/how-to-return-a-2d-array-from-a-function-in-c

반응형