Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2011, 21:54   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию динамические массивы

Давно не программировал на плюсах, сейчас сижу и вспоминаю
Если я создаю
int* i = new int[7],
то удалять я его буду как delete [] i;
А если я двумерный создаю?
на delete [,] i
компилятор ругается,
Однако почему-то
delete [] i
и
delete i
вижуал почему-то вполне устраивают, причём оба!
Dimarik вне форума Ответить с цитированием
Старый 27.02.2011, 22:06   #2
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

delete-у не нада указывать размерность данных, если они были созданы оператором new. Ему достаточно указателя
Guy вне форума Ответить с цитированием
Старый 27.02.2011, 22:16   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Вот я пишу:
int* array = new int[7,6];
Затем двумя вложенными циклами прогоняю, записывая
int[i,j] = i+j;
и в итоге в отладчике я вижу что у меня массив из одного элемента О_о
что такое?
а потом я ljk;ty yfgbcfnm delete * array;
так?
Dimarik вне форума Ответить с цитированием
Старый 27.02.2011, 22:33   #4
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
#include <iostream>

int main()
{
    int **m;
    m = new int*[2];
    for(int i = 0; i < 2; i++)
        m[i] = new int[2];

    m[0][0] = 1;
    m[0][1] = 2;
    m[1][0] = 3;
    m[1][1] = 4;

    for(int i = 0; i < 2; i++)
    {
        for(int j = 0; j < 2; j++)
            std::cout << m[i][j] << " ";

        std::cout << '\n';
    }

    for(int i = 0; i < 2; i++)
        delete []m[i];
    delete []m;

    return 0;
}
profi вне форума Ответить с цитированием
Старый 27.02.2011, 23:19   #5
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

А такие как в C# нельзя создавать, получается?Так?
ну там так делалось:
int[,] a = new int[3,4];
Dimarik вне форума Ответить с цитированием
Старый 28.02.2011, 21:30   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Дело в том что yy - переменная, а _unsCharMod, поэтому с точки зрения скорости работы, надо создать динамический массив, а внутри него статический.

Код:
    int**  unsIntText = new int*[yy];

	//создаём "столбцы"
	for (int i = 0; i < _unsCharMod; i++)
		unsIntText[i][_unsCharMod];


	for (int i = 0; i < _unsCharMod; i++)
	{
		//по столбцам
		for(int j = 0; j < yy; j++)
		{
			unsIntText[i][j] = i+j;
		}
	}

	///////////////////////////
	//удаление массива
	//////////////////////////
	delete  [] unsIntText;
В точке присваивания значения элементу массива, выскакивает ошибка при выполнении
Необработанное исключение в "0x00ee71a3" в "A.exe": 0xC0000005: Нарушение прав доступа при записи "0xcdcdcdcd".
Ну это понятно: обращение по несуществующему адресу, то есть я память неправильно выделил.
В принципе есть предположение где ошибка:
Или надо int* unsIntText = new int[yy]; (зачем 2 указателя????)
или же надо
*unsIntText[i][_unsCharMod];
Но в обоих случаях компилятор ругается
Dimarik вне форума Ответить с цитированием
Старый 28.02.2011, 22:27   #7
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Цитата:
надо создать динамический массив, а внутри него статический.
Это что за новое изобретение? Книжки пробовал читать? Если "нет" - начни прямо сейчас.
profi вне форума Ответить с цитированием
Старый 28.02.2011, 23:20   #8
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

я смотрел в книгах, гуглил - ничего не нашел, поэтому и спросил.
profi, по твоему примеру. Я сделал точку останову перед удалением массива.
навижу на m и всплывает контекстное меню.
и у меня показывает отладчик только адрес первого элемента массива. Как мне в отладчике посмотреть его содержание?
Конечно, можно по-отдеельности смотреть каждую переменную, то есть если навести на m[0][0] то вижуал покажет что там находится,
а как сразу просмотреть весь массив?
Dimarik вне форума Ответить с цитированием
Старый 01.03.2011, 07:58   #9
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Я Visual C++ вообще не пользуюсь.
profi вне форума Ответить с цитированием
Старый 01.03.2011, 16:22   #10
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Как создавать и удалять в C++ двумерный массив:
Код:
int** Array = new int*[N];
for (int i = 0; i < N; i++)
   {
   Array[i] = new int[N];
   for (int j = 0; j < N; j++)
      Array[i][j] = 0;
   }
//...
for (int i = 0; i < N; i++)
   delete[] Array[i];
delete[] Array;
По поводу ваших запятых. В С++ есть оператор запятая, который возвращает самый правый аргумент. Т.о.
Код:
int* array = new int[7,6];
эквивалентно
Код:
int* array = new int[6];
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические массивы tolik_gd Общие вопросы C/C++ 6 28.12.2010 00:04
Динамические массивы в c++ kosteck Помощь студентам 1 19.12.2010 18:08
Динамические массивы в с++ Metallica Помощь студентам 0 23.11.2010 18:32
Динамические массивы и массивы варианты N@stya Помощь студентам 0 11.06.2010 21:09
Динамические массивы Matr1x Общие вопросы C/C++ 5 07.12.2009 13:38