Пересчет индексов вручную
В следующем примере двумерный массив представляется в виде одномерного, а местоположения каждого элемента двумерного массива в одномерном определяется суммой номера столбца и произведения номера строки на длину строки. Способ индексации одинаков как в вызывающей функции, так и в вызываемых.
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXVAL 1000
void *Malloc ( size_t size );
void RandomMatr ( double *Matr, int n, int l );
void OutMatr ( char *name,
double *Matr, int n, int m );
void main( void )
{
size_t n = 5, m = 6;
double *A;
/* Выделение памяти под матрицу */
A = (double *) Malloc( n*m*sizeof(double) );
/* Заполнение матрицы значениями и распечатка */
RandomMatr(A, n, m);
OutMatr("A", A, n, m);
/* освобождение памяти */
free(A);
}
void RandomMatr (double *Matr, int n, int m)
{
int i, j;
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
Matr[i*m+j] = random(MAXVAL) + 1;
}
void OutMatr( char *name, double *Matr, int n, int m )
{
int i, j;
printf("\nМатрица %s\n---------------\n", name);
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
printf("%8.1lf ", Matr[i*m+j]);
printf("\n");
}
}
void * Malloc( size_t size )
{
void *p = malloc(size);
if( !p )
{ printf("Недостаточно памяти!\n"); exit(1); }
return p;
}
Функция rand() с прототипом из <stdlib.h> возвращает псевдослучайное число в диапазоне от 0 до MAXVAL-1.
Массивы с постоянной длиной строки
Если у массива длина строки постоянная, то адресацию динамического двумерного массива может выполнить компилятор:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXVAL 1000
#define STRLEN 6
void *Malloc ( size_t size );
void RandomMatr ( double (*Matr)[STRLEN], int n );
void OutMatr ( char *name,
double (*Matr)[STRLEN], int n );
void main( void )
{
size_t n = 5;
double (*A)[STRLEN];
/* Выделение памяти под матрицу */
A = (double (*)[STRLEN])
Malloc( n*sizeof(double[STRLEN]) );
/* Заполнение матрицы значениями и распечатка */
RandomMatr(A, n);
OutMatr("A", A, n);
/* освобождение памяти */
free(A);
}
void RandomMatr (double (*Matr)[STRLEN], int n)
{
int i, j;
for(i = 0; i < n; i++)
for(j = 0; j < STRLEN; j++)
Matr[i][j] = random(MAXVAL) + 1;
}
void OutMatr( char *name, double (*Matr)[STRLEN], int n )
{
int i, j;
printf("\nМатрица %s\n---------------\n", name);
for(i = 0; i < n; i++)
{
for(j = 0; j < STRLEN; j++)
printf("%8.1lf ", Matr[i][j]);
printf("\n");
}
}
void * Malloc( size_t size )
{
void *p = malloc(size);
if( !p )
{ printf("Недостаточно памяти!\n"); exit(1); }
return p;
}
В этом примере все обращения к элементам двумерного массива аналогичны случаю массива с постоянными границами. Следует обратить внимание на то, что динамическая память выделяется для одномерного массива из элементов типа double[STRLEN], то есть строк двумерного массива, которые должны иметь фиксированную длину.
Дата добавления: 2016-03-10; просмотров: 775;