Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Динамическая память под двумерный массив, где ошибка?)

Ответить
Настройки темы
C/C++ - [решено] Динамическая память под двумерный массив, где ошибка?)

Аватара для SeRgikON

Новый участник


Сообщения: 34
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: SeRgikON
Дата: 03-06-2010
Описание: решено
Собственно вот программа
Код: Выделить весь код
#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");
    }
}
как реализовать выделение динамической памяти? (вариант который сейчас не работает, как и тот который закомментирован ниже) если кому не трудно, подскажите плиз

П.С при компиляции ошибок нет, но при запуске

Отправлено: 19:35, 03-06-2010

 

Аватара для Oleg_SK

Ветеран


Сообщения: 1328
Благодарности: 144

Профиль | Отправить PM | Цитировать


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;
}
Я закоментил твой код выделяющий память под массив и заполняющий его и заменил его своим вариантом. Вроде бы теперь программа работает, но я особо не разбирался... В конец программы я добавил свой код для организации задержки; для завершения программы нужно ввести число.

-------
Здесь вместо "Спасибо" принято щелкать на "Полезное сообщение" у тех постов, которые вам помогли, или показались полезными.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:55, 03-06-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для SeRgikON

Новый участник


Сообщения: 34
Благодарности: 1

Профиль | Отправить PM | Цитировать


спасибо) но нужно прогу на С (ввод\вывод и динамика на С++ не прокатит) и поэтому проверил свой код в момент ввода элементов...оказалось просто пропустил & и из-за него весь геморой

Отправлено: 21:36, 03-06-2010 | #3


ИО Капитана Очевидности


Contributor


Сообщения: 5382
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Ничего не понимаю. Есть же стандартный код?
Код: Выделить весь код
//Выделение динамической памяти под массив
    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;

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.


Отправлено: 06:05, 04-06-2010 | #4

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


почему в 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));

Отправлено: 18:31, 04-06-2010 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Динамическая память под двумерный массив, где ошибка?)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скажите под какую память этот разъем? vasya0348 Материнские платы и память 7 20-08-2009 02:51
[решено] где взять драйвер для Сanon MF3228 под 2003 сервер Anatoliy2004 Поиск драйверов, прошивок и руководств 2 11-06-2009 16:59
Как правильно выбрать память под чипсет? borison Материнские платы и память 3 04-01-2009 11:48
Где производят оригинальную память? D@n1k007 Материнские платы и память 5 20-05-2008 21:35
Динамическая библеотека Guest Microsoft Windows 95/98/Me (архив) 3 19-10-2003 21:33




 
Переход