Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

EstervinaArias avatar EstervinaArias 4 Точки

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

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

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

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

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

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

Привет,

Бих те посъветвал да използваш 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 4803 Точки

Само ще допълня отговор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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.