 |
|
[решено] Динамическая память под двумерный массив, где ошибка?)
Собственно вот программа
Код:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define N 100
#define M 100
void main()
{
setlocale(LC_ALL, "Russian");
//int Q[N][M]; //исходная матрица
float summa_v_stroke[N];
//int **Q;
int l,m; //индексы элементов матрицы
int rows,cols; //размер матрицы
//Ввод размерности матрицы
printf("Введите элементы матрицы\n");
printf("Строки=");
scanf("%d", &rows);
printf("Столбцы=");
scanf("%d", &cols);
//Выделение динамической памяти под массив
float **Q=(float**) malloc (rows*sizeof(float*));
Q[0]=(float*) malloc (rows*cols*sizeof(float));
for(l=1; l<rows; l++)
{
Q[l]=Q[0]+l*cols;
}
// Q=(int**) calloc (rows/cols,sizeof(int*));
// for(int i=0;i<rows/cols;i++)
// {
// *(Q+i)=(int*) calloc (cols,sizeof(int));
// }
//Ввод элементов матрицы
printf("Введите элементы матрицы\n");
for(l=0; l < rows; l++)
for(m=0; m < cols; m++)
scanf("%f", *(*(Q+l)+m));
//Вычисление среднего арифметического в строках матрицы
printf("Найдите средние значения строк\n\n");
for(l=0; l < rows; l++)
{
summa_v_stroke[l]=0;
for(m=0; m < cols; m++)
{
summa_v_stroke[l] +=Q[l][m]; //нахождение суммы элементов в строке
}
summa_v_stroke[l] = summa_v_stroke[l]/cols; //нахождение среднего арифметического в строке
printf("Среднее значение %d строки %.2f\n", l, summa_v_stroke[l]);
}
printf("\n\n");
//Вывод полученной матрицы
printf("Результат:\n");
for(l=0; l < rows; l++)
{
printf("\n");
for(m=0; m < cols; m++)
{
Q[l][m] = Q[l][m]-summa_v_stroke[l];
printf("%f\t", Q[l][m]);
}
printf("\n");
}
}
как реализовать выделение динамической памяти? (вариант который сейчас не работает, как и тот который закомментирован ниже) если кому не трудно, подскажите плиз
П.С при компиляции ошибок нет, но при запуске

|
SeRgikON
Посмотри, так вроде работает:
Код:
// Помощь.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
//
//
//int _tmain(int argc, _TCHAR* argv[])
//{
// return 0;
//}
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define N 100
#define M 100
void main()
{
setlocale(LC_ALL, "Russian");
//int Q[N][M]; //исходная матрица
float summa_v_stroke[N];
//int **Q;
int l,m; //индексы элементов матрицы
int rows,cols; //размер матрицы
//Ввод размерности матрицы
cout << "Введите элементы матрицы\n";
cout << "Строки=";
cin >> rows;
cout << "Столбцы=";
cin >> cols;
////////////////Выделение динамической памяти под массив
////////////// float **Q=(float**) malloc (rows*sizeof(float*));
////////////// Q[0]=(float*) malloc (rows*cols*sizeof(float));
////////////// for(l=1; l<rows; l++)
////////////// {
////////////// Q[l]=Q[0]+l*cols;
////////////// }
float ** Q = new(float* [rows]);
for(int i = 0; i < rows; ++i)
{
Q[i] = new(float[cols]);
}
// Q=(int**) calloc (rows/cols,sizeof(int*));
// for(int i=0;i<rows/cols;i++)
// {
// *(Q+i)=(int*) calloc (cols,sizeof(int));
// }
////////////////////Ввод элементов матрицы
////////////////// printf("Введите элементы матрицы\n");
////////////////// for(l=0; l < rows; l++)
////////////////// for(m=0; m < cols; m++)
////////////////// scanf("%f", *(*(Q+l)+m));
cout << "Введите элементы матрицы\n";
for(l=0; l < rows; l++)
for(m=0; m < cols; m++)
cin >> Q[l][m];
//Вычисление среднего арифметического в строках матрицы
printf("Найдите средние значения строк\n\n");
for(l=0; l < rows; l++)
{
summa_v_stroke[l]=0;
for(m=0; m < cols; m++)
{
summa_v_stroke[l] +=Q[l][m]; //нахождение суммы элементов в строке
}
summa_v_stroke[l] = summa_v_stroke[l]/cols; //нахождение среднего арифметического в строке
printf("Среднее значение %d строки %.2f\n", l, summa_v_stroke[l]);
}
printf("\n\n");
//Вывод полученной матрицы
printf("Результат:\n");
for(l=0; l < rows; l++)
{
printf("\n");
for(m=0; m < cols; m++)
{
Q[l][m] = Q[l][m]-summa_v_stroke[l];
printf("%f\t", Q[l][m]);
}
printf("\n");
}
int x;
cin >> x;
}
Я закоментил твой код выделяющий память под массив и заполняющий его и заменил его своим вариантом. Вроде бы теперь программа работает, но я особо не разбирался... В конец программы я добавил свой код для организации задержки; для завершения программы нужно ввести число.
|
спасибо) но нужно прогу на С (ввод\вывод и динамика на С++ не прокатит) и поэтому проверил свой код в момент ввода элементов...оказалось просто пропустил & и из-за него весь геморой :)
|
El Scorpio |
04-06-2010 06:05 1427041 |
Ничего не понимаю. Есть же стандартный код?
Код:
//Выделение динамической памяти под массив
float **Q=(float**) malloc (rows*sizeof(float*));
for(i=0; i<rows; i++)
Q [i] = malloc (cols * sizeof (float));
......................
//Освобождение памяти
for(i=0; i<rows; i++)
free Q [i];
free Q;
|
почему в C++ считается что va_args - это порождение зла? потому что нет контроля типов. Вот и ошибка:
Код:
printf("Введите элементы матрицы\n");
for(l=0; l < rows; l++)
for(m=0; m < cols; m++)
scanf("%f", *(*(Q+l)+m));
данные вводятся по адресу reinterpret_cast<float*>(Q[0][0]), а не &Q[0][0]
вот так будет работать:
Код:
printf("Введите элементы матрицы\n");
for(l=0; l < rows; l++)
for(m=0; m < cols; m++)
scanf("%f", (*(Q+l)+m));
|
Время: 17:48.
© OSzone.net 2001-