I might do a transpose like this.
#include <stdio.h>
#include <stdlib.h>
int **create ( size_t rows, size_t cols );
void destroy ( int **array, size_t rows);
int **transpose ( const int *const *const array, size_t rows, size_t cols);
void print ( const int *const *const array, size_t rows, size_t cols );
int main(void)
{
size_t rows = 3, cols = 5;
int **array = create(rows, cols);
int **trans = transpose(array, rows, cols);
print(array, rows, cols);
print(trans, cols, rows);
destroy(array, rows);
destroy(trans, cols);
return 0;
}
int **create(size_t rows, size_t cols)
{
size_t r, c;
int k = 0;
int **array = malloc(rows * sizeof *array);
if ( array )
{
for ( r = 0; r < rows; ++r )
{
array[r] = malloc(cols * sizeof *array[r]);
if ( !array[r] )
{
destroy(array, r - 1);
return NULL;
}
for ( c = 0; c < cols; ++c )
{
array[r][c] = k++;
}
}
}
return array;
}
int **transpose(const int *const *const array, size_t rows, size_t cols)
{
size_t r, c;
int **result = malloc(cols * sizeof *result);
if ( result )
{
for ( r = 0; r < cols; ++r )
{
result[r] = malloc(rows * sizeof *result[r]);
if ( !result[r] )
{
destroy(result, r - 1);
return NULL;
}
for ( c = 0; c < rows; ++c )
{
<strong>result[r][c] = array[c][r];</strong>
}
}
}
return result;
}
void destroy(int **array, size_t rows)
{
size_t r;
for ( r = 0; r < rows; ++r )
{
free(array[r]);
}
free(array);
}
void print(const int *const *const array, size_t rows, size_t cols)
{
size_t r, c;
for ( r = 0; r < rows; ++r )
{
for ( c = 0; c < cols; ++c )
{
printf("%2d ", array[r][c]);
}
putchar('\n');
}
putchar('\n');
}
/* my output
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
0 5 10
1 6 11
2 7 12
3 8 13
4 9 14
*/ Dave Sinkula
long time no c
Team Colleague
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314