Ошибка с выводом значений матр. при использовании malloc - C (СИ)
Формулировка задачи:
Не получается организовать правильный ввод и вывод. Пример ввода: N=2; (1,2,3,4) Результат: (3,4,3,4).
Компилятор никаких проблем не видит.
Долго возился с указателями, возможно где-то накосячил. На остальные ошибки в коде просьба внимание не обращать. Заранее спасибо за помощь!
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//Константы
#define M 2
#define E 0
void Svod(int N,int *a) //+
{
int z;
int *c;
for (z=0;z<N;z++)
{
c=(a+(N-1)+z);
scanf("%d",c);
}
}
//Ввод матрицы
void vvod(int A[][E],int N,int *a) //+
{
int i;
for (i=0;i<M;i++)
{
Svod(N,a);
}
}
void vivodS(int N,int *a)
{
int j;
int *c;
for (j=0;j<N;j++)
{
c=a+(N-1)+j;
printf("%d",*c);
}
}
//Вывод матрицы
void vivod(int A[][E],int N,int *a)
{
int i;
for (i=0;i<M;i++)
{
vivodS(N,a);
}
}
//Сколярное произведение
int proizv(int A[E],int B[E],int N,int a)
{
int i,s;
s=0;
for (i=0;i<=N-1;i++)
s=s+(*(A+i+a))*(*(B+i+a));
return s;
}
//Проверка условия задачи
int proverka(int A[][E],int N,int a)
{
int i,j,flag;
i=0;
j=i+1;
flag=0; //Установка флага
while ((i<=M-1)&&(proizv(A[i],A[i],N,a)==1)) //A[i]*A[i]
{
i++;
}
if (i==M) //A[i]*A[j]; i<>j
{
i=0;
while ((i<=M-2)&&(proizv(A[i],A[j],N,a)==0))
{
j=i+1;
while ((j<=M-1)&&(proizv(A[i],A[j],N,a)==0)){j++;}
i=i+1;
}
if (i>M-2)flag=1;
}
return (flag);
}
int main()
{
int N;
int *a; //Указатель
printf("Введите число столбцов");
scanf("%i",&N);
int A[M][E];
a = (int*) malloc(M*N*sizeof(int)); //Указатель "а" указывает на начальный элемент выделенной памяти размера установленного массива
vvod(A,N,a); //передаем 'a' как указатель
//if (proverka(A,N,a)==1)printf("Условие выполнено");
// else
// {
// printf("Условие не выполнено");
// }
vivod(A,N,a);
free(a);
return 0;
}Решение задачи: «Ошибка с выводом значений матр. при использовании malloc»
textual
Листинг программы
void input_a(int *a, int rows, int cols)
{
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
scanf("%d", (a+i*cols+j));
}
void print_a(int *a, int rows, int cols)
{
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
printf("%d", *(a+i*cols+j));
}
int main()
{
int rows, cols;
int *a;
printf("Введите число строк и столбцов через пробел");
scanf("%d %d" ,&rows, &cols);
a = (int*) malloc(rows * cols * sizeof(int)); //Указатель "а" указывает на начальный элемент выделенной памяти размера установленного массива
input_a(a, rows, cols); //передаем 'a' как указатель
print_a(a, rows, cols);
free(a);
return 0;
}
Объяснение кода листинга программы
- Ввод данных в матрицу с помощью функции input_a.
- Вывод данных из матрицы с помощью функции print_a.
- Выделение памяти под матрицу с помощью функции malloc.
- Освобождение памяти с помощью функции free.
- Компиляция кода в язык C.