Професионална програма
Loading...
+ Нов въпрос
EstervinaArias avatar EstervinaArias 4 Точки

Двумерен, динамичен масив.

Здравейте, как да създам двумерен динамичен масив като:

броя на клетките на единия да се задава от потребителя  и да се зададе отново от потребителя начална стойност на първата клетка, която да служи  като номерация .
пример:

потребителят въвежда 7-за брой клетки

и 201 за начало на номерацията им
с указатели ако може

Тагове:
0
C++ Programming
j.petrov_90 avatar j.petrov_90 370 Точки

Привет,

Бих те посъветвал да използваш std::vector.
Щом държиш да го направиш на ръка...така да бъде.

В примера, който си дала казваш, че масива щи има големина N. Имай предвид, че 2D масивите не винаги са квадрати, а може и да са правоъгълници (т.е. да имаш различна широчина от височина).
В кода, който ще ти напиша отдолу ти показвам как динамично да заделиш/освободиш памет за 2D масив.
Твоя задача е да разбереш какво прави този код, а не просто да го copy-paste-неш.
Другото, което оставям на теб е сама да попълниш стойностите на масива според условието на задачата.

#include <iostream>

int main()
{
    int rows = 0;
    int cols = 0;
    std::cin >> rows >> cols;

    //allocate memory
    int ** arr = new int *[rows];
    for(int row = 0; row < rows; ++row)
    {
        arr[row] = new int[cols];
    }

    //deallocate(release) memory
    for(int row = 0; row < rows; ++row)
    {
        delete[] arr[row];
        //it is good practice to set pointer to null once deleted
        arr[row] = nullptr;
    }

    delete[] arr;

    //it is good practice to set pointer to null once deleted
    arr = nullptr;

    return 0;
}

П.П. имай предвид, че динамичното заделяне на памет с оператора new може да не успее и да върне nullptr/NULL, ако нямаш достатъчно памет за заделянето.
 

1
16/12/2018 10:36:14
MartinBG avatar MartinBG 3972 Точки

Само ще допълня отговорa на колегата, че това не е точно 2D масив, а масив от поинтъри към масиви. :)

Разликата е в това, че елементите на 2D масивите заемат последователни клетки в паметта (последната клетка на предходния ред и първата клетка на следващия са съседни в паметта), докато при масивите от поинтъри към масиви само елементите на един ред са последователни.

Недостатък на многомерните масиви в C++ e, че размерът на всички измерения без първото трябва да е известен още по време на компилацията, т.е. само първото измерение (редовете за 2D масив) може да бъде променяно (напр. въвеждано от потребителя) по време на изпълнение на програмата.

Тук е обяснено по-подробно.

Ето и кратко демо:

#include <iostream>

int main() {

  constexpr size_t cols = 1000; // 2nd and later dimensions should be known at compile-time

  size_t rows;
  std::cin >> rows; // Only first dimension could be specified at run-time

  auto arr = new int[rows][cols]{ };  // Create 2d int array on the heap and initialize its elements with 0

  // Usage demo
  arr[0][0] = 42; // Change value on row 0, column 0 to 42
  arr[rows - 1][cols - 1] = 69; // Change value on last row's last column to 42
  std::cout << arr[0][0] << ", " << arr[rows - 1][cols - 1] << std::endl;

  // Addresses in memory demo
  // first element on the second row is sizeof(int) bytes after the last element on the first row
  if (rows > 1) {
    std::cout << (void*) &arr[0][cols - 1] << ", " << (void*) &arr[1][0] << " dif should be " << sizeof(int);
  }

  delete[] arr; // Release memory

  return 0;
}

 

1
19/12/2018 02:39:51