DavidRC
DavidRC

Reputation: 103

How to create a variable sized array, pass a variable 2d array to a function and return another 2d array?

How do you create an 2d array with variable size, pass that variable array, and return a new 2d array of different dimensions? I've been working on this for hours and I can't find a solution. I managed to create an array of pixel values for a PGM image, but now I'm trying to "rotate" the array, but this is getting incredibly complex since my compiler won't let me declare a variable-sized object.Thank you so much to those who answer.

This is the statement that calls the function. Somebody told me to use malloc since you can't create an array with variable size.

char *SpunArray = malloc(image->x * image->y * sizeof(PGMPixel));
SpunArray = Rotate90Array(image->x, image->y, CreatedArray);

This is the function:

//char * Rotate90Array(int x, int y, char *array[x][y] )
char * Rotate90Array(int x, int y, char *array )
{
    printf("\nLine 179");
    // These have to be swapped because the image is being rotated
    char *RotatedArray = malloc(x * y * sizeof(char));
    printf("\nLine 182");
    int u = x - 1;
    int v = y - 1;
    int i = 0;
    int j = 0;
    printf("\nLine 187");
    char *ptr;
    printf("\nLine 189");
    for (i = 0; i < x; i++)
    {
        printf("\nLine 192");
        *ptr = RotatedArray[i];
        printf("\nLine 194");
        for (j = 0; j < y; j++)
        {
            printf("\nLine 197");
//          *ptr = *(array[u-j][i]);
            *(ptr+((j*x)+(u-i))) = *(array+((i*y)+j));
            printf("\nLine 200");
            ptr++;
            printf("\nLine 202");
        }
    }
    printf("\nLine 205");
    return RotatedArray;
}

I'm using the MingGW gcc, and windows 8 if that helps.

Upvotes: 0

Views: 359

Answers (2)

Lidong Guo
Lidong Guo

Reputation: 2857

I think this code can work as expect:

char * Rotate90Array(int x, int y, char *array )
{
    printf("\nLine 179");
    // These have to be swapped because the image is being rotated
    char *RotatedArray = malloc(x * y * sizeof(char));
    printf("\nLine 182");
    int u = x - 1;
    int v = y - 1;
    int i = 0;
    int j = 0;
    printf("Line 187\n");
    char *ptr;
    printf("Line 189\n");
    ptr = RotatedArray;             //I add this line
    for (i = 0; i < x; i++)
    {
        printf("Line 192\n");
       // *ptr = RotatedArray[i];   //I delete this line 
        printf("Line 194\n");
        for (j = 0; j < y; j++)
        {
            printf("Line 197\n");
//          *ptr = *(array[u-j][i]);
            *(ptr+((j*x)+(u-i))) = *(array+((i*y)+j));
            printf("Line 200\n");
        //    ptr++;                // I delete this line
            printf("Line 202\n");
        }
    }
    printf("Line 205\n");
    return RotatedArray;
}

Upvotes: 0

herolover
herolover

Reputation: 803

You have a memory leak. Why do you creating two arrays instead one?

Do like this:

char *SpunArray = malloc(image->x * image->y * sizeof(PGMPixel));
Rotate90Array(image->x, image->y, CreatedArray, SpunArray);

void Rotate90Array(int width, int height, char *array, char *RotatedArray)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < width; i++)
    {
        for (j = 0; j < height; j++)
        {
            // check this line on correct
            RotatedArray[i * height + j] = array[j * width + width - i - 1];
        }
    }
}

Upvotes: 1

Related Questions