Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Динамическая память под двумерный массив, где ошибка?) (http://forum.oszone.net/showthread.php?t=177307)

SeRgikON 03-06-2010 19:35 1426816

[решено] Динамическая память под двумерный массив, где ошибка?)
 
Собственно вот программа
Код:

#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");
    }
}

как реализовать выделение динамической памяти? (вариант который сейчас не работает, как и тот который закомментирован ниже) если кому не трудно, подскажите плиз

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

Oleg_SK 03-06-2010 20:55 1426855

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;
}

Я закоментил твой код выделяющий память под массив и заполняющий его и заменил его своим вариантом. Вроде бы теперь программа работает, но я особо не разбирался... В конец программы я добавил свой код для организации задержки; для завершения программы нужно ввести число.

SeRgikON 03-06-2010 21:36 1426866

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

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;


pva 04-06-2010 18:31 1427465

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



Время: 11:40.

Время: 11:40.
© OSzone.net 2001-