1

Тема: Передача в функцію

не можу передати в функцію динамічний двовимірний масив, як це робиться?

#include <iostream> 
#include <stdlib.h>
#include <time.h>
using namespace std;
 
void newmas(int dmas1_[ ][ ], int mm, int nn,int indd,int indd2)
{        
    char ji;
        int i, j;
        int **dmas2 = new int*[mm];
        for (i = 0; i < mm; i++)
            dmas2[i] = new int[nn];

        if (indd == 1)
        {
            nn = +indd2;
            ji = i;
        }
        else if (indd == 2)
        {
            mm = indd2;
            ji = j;
        }

        cout << "======================================\n";
        for (i = 0; i < mm; i++)
        {
            for (j = 0; j < nn; j++)
            {
                if (indd == 1)
                {    
                    if (j>indd2 - 1)
                        dmas2[i][j] = dmas1_[i][j - indd2];
                    else dmas2[i][j] = 0;
                    cout << dmas2[i][j] << "\t";
                }
                else if (indd == 2)
                {
                    if (i>indd2 - 1)
                        dmas2[i][j] = dmas1_[i - indd2][j];
                    else dmas2[i][j] = 0;
                    cout << dmas2[i][j] << "\t";
                }
            }
            cout << endl;
        }
} 
 
void main()
{
    srand(time(NULL));
    int i, j, n, m, ind, ind2; 
    cout << "stvorennia massuvy\n";
    cout << "Shirina, Dovgota:";
    cin >> n >> m;
    int **dmas1 = new int*[m];
    for (i = 0; i < m; i++)
        dmas1[i] = new int[n];

    for (i = 0; i < m; i++)
    {
        for (j = 0; j <n; j++)
        {
            dmas1[i][j] = rand() % 25;
            cout << dmas1[i][j] << "\t";
        }
        cout << endl;
    }

    
    while (1)
    {

        cout << "kuda sdvigat? (1-storonu; 2-niz)";
            cin >> ind;
        if (ind == 1 || ind == 2)
        {
            break;
        }
        else
            cout << "ERROR\t";
    }

        cout << "na skilki?:";
            cin >> ind2;
 
    if (ind == 1)
    { 
        newmas(dmas1,m,n,ind,ind2);
          
    }
    else if (ind == 2)
    {
        newmas(dmas1, m, n, ind, ind2);
    }

    system("pause");
}

 

2

Re: Передача в функцію

Спробуйте задати його розмір, принаймні кількість "рядків" (інакше кажучи - розмір другого виміру).

3 Востаннє редагувалося koala (27.02.2015 22:02:58)

Re: Передача в функцію

Проблема в тому, що в C++, строго кажучи, немає двовимірних динамічних масивів. У вас динамічний масив динамічних масивів - тому вам треба передавати в функцію, крім самого посилання, ще й всі розміри (з урахуванням того, що всі підмасиви однакової довжини, достатньо передавати два розміри, m та n).
Ось вам ще варіанти: http://replace.org.ua/topic/2131/

4

Re: Передача в функцію

koala написав:

Проблема в тому, що в C++, строго кажучи, немає двовимірних динамічних масивів. У вас динамічний масив динамічних масивів - тому вам треба передавати в функцію, крім самого посилання, ще й всі розміри (з урахуванням того, що всі підмасиви однакової довжини, достатньо передавати два розміри, m та n).
Ось вам ще варіанти: http://replace.org.ua/topic/2131/

Як це робити коли розміри задаються вже при роботі exe файла я не знаю.
Якщо цікавить ось ця сама програма ще не перероблена під використання функції

#include <iostream> 
#include <stdlib.h>
#include <time.h>
using namespace std;
 

void main()
{
    srand(time(NULL));
    int i, j, n, m, ind, ind2;
    cout << "stvorennia massuvy\n";
    cout << "Shirina, Dovgota:";
    cin >> n >> m;
    int **dmas1 = new int*[m];
    for (i = 0; i < m; i++)
        dmas1[i] = new int[n];

    for (i = 0; i < m; i++)
    {
        for (j = 0; j <n; j++)
        {
            dmas1[i][j] = rand() % 25;
            cout << dmas1[i][j] << "\t";
        }
        cout << endl;
    }


    while (1)
    {

        cout << "kuda sdvigat? (1-storonu; 2-niz)";
        cin >> ind;
        if (ind == 1 || ind == 2)
        {
            break;
        }
        else
            cout << "ERROR\t";
    }

    cout << "na skilki?:";
    cin >> ind2;

    if (ind == 1)
    {
        int **dmas2 = new int*[m];
        for (i = 0; i < m; i++)
            dmas2[i] = new int[n + ind2];

        cout << "======================================\n";
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < n + ind2; j++)
            {
                if (j>ind2 - 1)
                    dmas2[i][j] = dmas1[i][j - ind2];
                else dmas2[i][j] = 0;
                cout << dmas2[i][j] << "\t";
            }
            cout << endl;
        }
    }
    else if (ind == 2)
    {
        int **dmas2 = new int*[m + ind2];
        for (i = 0; i < m + ind2; i++)
            dmas2[i] = new int[n];

        cout << "======================================\n";
        for (i = 0; i < m + ind2; i++)
        {
            for (j = 0; j < n; j++)
            {
                if (i>ind2 - 1)
                    dmas2[i][j] = dmas1[i - ind2][j];
                else dmas2[i][j] = 0;
                cout << dmas2[i][j] << "\t";
            }
            cout << endl;
        }
    }

    system("pause");
}

5

Re: Передача в функцію

Ви неправильно робите. Не спочатку пишете неправильно, а потім переробляєте під функції, а спочатку пишете з викликами ще ненаписаних функцій, дивитеся, як зручніше, а потім вже пишете ці функції.

6

Re: Передача в функцію

koala написав:

Ви неправильно робите. Не спочатку пишете неправильно, а потім переробляєте під функції, а спочатку пишете з викликами ще ненаписаних функцій, дивитеся, як зручніше, а потім вже пишете ці функції.

Добре, я ж навчаюсь. так реально передати двовимірний динамічний масив з динамічними значеннями?

7

Re: Передача в функцію

koala написав:

Ви неправильно робите. Не спочатку пишете неправильно, а потім переробляєте під функції, а спочатку пишете з викликами ще ненаписаних функцій, дивитеся, як зручніше, а потім вже пишете ці функції.

А це погано?

Re: Передача в функцію

Dopamine, дивиться, будь ласка. Здається масиви пєредаються в функцію в плюсах так.

void newmas(int**dmas1_, int mm, int nn,int indd,int indd2)
Подякували: Dopamine1

9

Re: Передача в функцію

quez написав:
koala написав:

Ви неправильно робите. Не спочатку пишете неправильно, а потім переробляєте під функції, а спочатку пишете з викликами ще ненаписаних функцій, дивитеся, як зручніше, а потім вже пишете ці функції.

А це погано?