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
'bestsource' 카테고리의 다른 글
헤드리스 워드프레스로 실 시작 명령에 핫 재장전을 시도하는 중 (0) | 2023.09.21 |
---|---|
jquery clear 입력 기본값 (0) | 2023.09.21 |
jwordpress를 사용하여 WordPress에 게시물 게시 (0) | 2023.09.16 |
SQL 또는 TSQL 튜링이 완료되었습니까? (0) | 2023.09.16 |
$(문서)입니다.필요하신가요? (0) | 2023.09.16 |