zamiana tablicy statycznej na dynamiczną w tym kodzie programu

0

W jaki sposób zrobićz tej tablicy statycznej tablicę dynamiczną
linijka 52: double *tablica1[4][5]={0};//zamiana na tablicę dynamiczną *tab[M][L] ??

// wskazniki na tablice.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include <conio.h>

using namespace std;

void (__cdecl funkcja1)(int N,int M,int L,double *tablica2);

int _tmain(int argc, _TCHAR* argv[])
{
    double tab[3][4][5]={0};
    cout<<"przed funkcja"<<endl;
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<4;j++)
        {
            for(int k=0;k<5;k++)
            {
            tab[i][j][k]=i+j+k;
            cout<<" "<<tab[i][j][k];
            }
            cout<<endl;
        }
        cout<<endl;
    }
    system("pause");
    //cout<<"przed funkcja"<<endl;
    ////////////////////////
    funkcja1(3,4,5,&tab[0][0][0]);
    ////////////////////////
    cout<<"po funkcji"<<endl;    for(int i=0;i<3;i++)
    { 
       for(int j=0;j<4;j++)
        {
            for(int k=0;k<5;k++)
            {
            cout<<" "<<tab[i][j][k];
            }
            cout<<endl; 
       }
        cout<<endl;
    }
    system("pause");
    return 0;
}

void (__cdecl funkcja1)(int N,int M,int L,double *tablica2)
{
    cout<<"w funkcji"<<endl;
    double *tablica1[4][5]={0};//zamiana na tablicę dynamiczną tab[M][L] ??
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++)
        {
            tablica1[i][j]=&tablica2[j*L+i*M*L];//budowa tablicy
        }
    }
    for(int i=0;i<N;i++) 
   {
        for(int j=0;j<M;j++)
        {
            for(int k=0;k<L;k++)
            {
            cout<<" "<<tablica1[i][j][k];
            tablica1[i][j][k]=9;
            }
            cout<<endl;
        }
        cout<<endl;
   }
    system("pause");
}// koniec void (__cdecl funkcja1)(double *tablica3)
1

Najwydajniej:

double** Tablica = new double*[N * M];

Odwoływanie się do pojedynczego elementu o indeksach i, j:

Tablica[i * N + j]

Zwalnianie:

delete[] Tablica;

Jeśli koniecznie chcesz dwuwymiarową:

double*** Tablica = new Double**[N];
for( int i = 0; i < N; ++i)
{
   Tablica[i] = new Tablica[M];
}

zwalnianie tak samo, tylko odwrotnie:

for( int i = 0; i < N; ++i)
{
   delete[] Tablica[i];  //Tutaj zrobiłem błąd - zamiast 'i' napisałem 'M'
}

delete[] Tablica;
0

już działa z tym że nie wiem czy zwalnianie pamięci mam dobrze zrobiono:

 


// wskazniki na tablice.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include <conio.h> 

using namespace std;

 void (__cdecl funkcja1)(int N,int M,int L,double *tablica2);

 int _tmain(int argc, _TCHAR* argv[])
{
    double tab[3][4][5]={0};
    cout<<"przed funkcja"<<endl;
    for(int i=0;i<3;i++) 
   {
        for(int j=0;j<4;j++)
        { 
           for(int k=0;k<5;k++)
            {
            tab[i][j][k]=i+j+k;
            cout<<" "<<tab[i][j][k];
            }
            cout<<endl;
        }
        cout<<endl;
    }
    system("pause");
    //cout<<"przed funkcja"<<endl;
    ////////////////////////
    funkcja1(3,4,5,&tab[0][0][0]);
    ////////////////////////
    cout<<"po funkcji"<<endl;
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<4;j++)
        {
            for(int k=0;k<5;k++)
            {
            cout<<" "<<tab[i][j][k];
            }
            cout<<endl;
        }
        cout<<endl;
    }
    system("pause");
    return 0;
}

 void (__cdecl funkcja1)(int N,int M,int L,double *tablica2)
{
    cout<<"w funkcji"<<endl;
    //double *tablica1[4][5]={0};//zamiana na tablicę dynamiczną tab[M][L] ??

    double*** Tablica = new double**[M];
    for( int i = 0; i < M; ++i)
    {
      Tablica[i] = new double*[L];
    } 
   
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++)
        {
            Tablica[i][j]=&tablica2[j*L+i*M*L];//budowa tablicy
        }
    }
    //system("pause");
    /*for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++) 
       { 
           tablica1[i][j]=&tablica2[j*L+i*M*L];//budowa tablicy
        }
    } 
  */ 
   for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++)
        {
            for(int k=0;k<L;k++)
            {
            //cout<<" "<<tablica1[i][j][k];
            cout<<" "<<Tablica[i][j][k];
            //tablica1[i][j][k]=9;
            Tablica[i][j][k]=9;
            }
            cout<<endl;
        }
        cout<<endl;
   }
        for( int i = 0; i < M; ++i)
   {
       delete[] Tablica[i];
    }
    delete[] Tablica;

    system("pause");
}// koniec void (__cdecl funkcja1)(double *tablica3)

0

Wygląda dobrze - za to ja zrobiłem błąd :>

1 użytkowników online, w tym zalogowanych: 0, gości: 1