Массивы. Программа не работает - C (СИ)
Формулировка задачи:
Есть код программы. Он не работает. Укажите, пожалуйста, на ошибке и помогите их исправить.
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
//Prototype func
void PrintArray(double **p);
double** ConstructAr();
void DestructArray(double **p);
const int TERM = -1;
/////////////////////////////////
void main (void)
{
double **pA;
clrscr();
pA = ConstructAr();
PrintArray(pA);
DestructArray(pA);
getch();
}
double** ConstructAr()
{
double** p = NULL;
int N, M;
//poluchaem lo-vo strok
do
{
randomize();
N = random(10);
}while (N < 1 || N > 10);
printf("N = %d\n", N);
//videlyaem pamyat'
p = (double **)malloc(sizeof(double *)*N + sizeof(int));
//zapominaem v -1 kol-vo strok
((int *)p)[0] = N;
//organizuem postrochnyi vvod
for (int i=1; i<N+1; i++)
{
//opredelyaem kol-vo simvolov v stroke
do
{
randomize();
M = random(10);
}while(M < 1 || M > 10);
M=2;
printf("M = %d", M);
//videlyaem pamyat'
p[i] = (double *) malloc(M*sizeof(double) + sizeof(int));
((int *)(p[i]))[M] = TERM;
//vvodim elti s klavy
for (int j=0; j<M; j++)
{
double m;
do
{
printf("\nEnter A[%d][%d](1<=A[%d][%d]<=10): ", i,j,i,j);
scanf("%lf", &m);
}while(m<1 || m>10);
p[i][j]=m;
}
}
return p;
}
void DestructArray(double **p)
{
if(!p) return;//proverka korrekt
int N; // kol-vo strok
N = ((int *)p)[-1];
for(int i=0; i<N; i++)
{
((int *)(p[i]))--;
free(p[i]);
}
((int *)p)--;
free(p);
printf("End free");
}
void PrintArray(double **p)
{
int N,j;
N = ((int*)p)[0];
printf("Poluch N=%d\n", N);
getch();
for(int i=1; i<N+1; i++)
{
getch();
j = 0;
while(((int *)(p[i]))[j] != TERM)
printf("%f ", p[i][j++]);
printf("\n");
}
}Решение задачи: «Массивы. Программа не работает»
textual
Листинг программы
//Prototype func
void PrintArray(double **p);
double** ConstructAr();
void DestructArray(double **p);
const int TERM = -1;
/////////////////////////////////
void main (void)
{
double **pA;
clrscr();
pA = ConstructAr();
PrintArray(pA);
DestructArray(pA);
getch();
}
double** ConstructAr()
{
double** p = NULL;
double**t;
int N, M;
//poluchaem lo-vo strok
do
{
randomize();
N = random(10);
}while (N < 1 || N > 10);
printf("N = %d\n", N);
//videlyaem pamyat'
p = (double **)malloc(sizeof(double *)*N + sizeof(int));
//zapominaem v -1 kol-vo strok
((int *)p)[0] = N;
t = (double **)(((int *)p)[1]); //указатель на начало собственно массива указателей строк
//organizuem postrochnyi vvod
for (int i=0; i<N; i++)
{
//opredelyaem kol-vo simvolov v stroke
do
{
randomize();
M = random(10);
}while(M < 1 || M > 10);
M=2;
printf("M = %d", M);
//videlyaem pamyat'
t[i] = (double *) malloc(M*sizeof(double) + sizeof(int));
*(int *)(t[i]+M) = TERM;
//vvodim elti s klavy
for (int j=0; j<M; j++)
{
double m;
do
{
printf("\nEnter A[%d][%d](1<=A[%d][%d]<=10): ", i,j,i,j);
scanf("%lf", &m);
}while(m<1 || m>10);
t[i][j]=m;
}
}
return p;
}
void DestructArray(double **p)
{
if(!p) return;//proverka korrekt
double ** t;
int N; // kol-vo strok
N = ((int *)p)[0];
t = (double **)(((int *)p)[1]); //указатель на начало собственно массива указателей строк
for(int i=0; i<N; i++)
{
free(t[i]);
}
free(p);
printf("End free");
}
void PrintArray(double **p)
{
int N,j;
double **t;
N = ((int*)p)[0];
t = (double**)(((int *)p)[1]); //указатель на начало собственно массива указателей строк
printf("Poluch N=%d\n", N);
getch();
for(int i=1; i<N+1; i++)
{
getch();
j = 0;
while(((int *)(t[i]))[j] != TERM)
printf("%f ", t[i][j++]);
printf("\n");
}
}
Объяснение кода листинга программы
В этом коде реализована простая программа для работы с двумерными массивами. Она создает двумерный массив фиксированного размера, заполняет его случайными числами от 1 до 10, а затем выводит его на экран. Вот список функций и их назначений:
ConstructAr()- создает новый двумерный массив.DestructArray()- освобождает память, занятую двумерным массивом.PrintArray()- выводит двумерный массив на экран. Вот список переменных и их назначений:TERM- это константа, используемая для обозначения конца массива. Ее значение по умолчанию равно -1.N- количество строк в массиве.M- количество столбцов в массиве.pA- указатель на двумерный массив.t- указатель на начало первой строки массива.iиj- индексы для доступа к элементам массива. Вот список действий, выполняемых в коде:- В функции
main()создается новый двумерный массивpAс помощью функцииConstructAr(). - С помощью функции
PrintArray()на экран выводится содержимое массиваpA. - Функция
DestructArray()освобождает память, занятую массивомpA. - В цикле
forв функцииmain()пользователь вводит значения для каждой строки массива. - В цикле
forв функцииPrintArray()на экран выводятся значения всех элементов массива.