Форум программистов, компьютерный форум CyberForum.ru

Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? - C++

Восстановить пароль Регистрация
 
 
casper007
61 / 61 / 21
Регистрация: 12.12.2013
Сообщений: 375
10.01.2014, 21:36     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #1
C++
1
2
int k;
int mass[k];//к-еще не инициализирован, и поэтому выводится ошибка, а менять значение нельзя
Очевидно, что нужен указатель. Но как это реализовать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2014, 21:36     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение?
Посмотрите здесь:

C++ Дан массив действительных чисел, размерность которого N. Подсчитать, сколько в нем отрицательных, положительных и нулевых элементов
C++ Многомерный массив значений, размерность которого возрастает. Оцените код
C++ Какой ответ получим после запуска программы
Какой ответ получим после запуска программы C++
Какой ответ получим после запуска программы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
10.01.2014, 21:44     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #2
C++
1
2
3
4
5
6
int *p;
int n;
cin >> n;
p = new int[n];
...
delete []p;
casper007
61 / 61 / 21
Регистрация: 12.12.2013
Сообщений: 375
10.01.2014, 21:57  [ТС]     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #3
А если работать с классами?
TCLASS KLASS[n];
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
10.01.2014, 21:59     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #4
Цитата Сообщение от casper007 Посмотреть сообщение
А если работать с классами?
TCLASS KLASS[n];
Абсолютно так же
C++
1
2
3
4
5
6
TCLASS *p;
int n;
cin >> n;
p = new TCLASS[n];
...
delete []p;
Если надо массив указателей на экземпляры класса, то так
C++
1
2
3
4
5
6
7
TCLASS **p;
int n;
cin >> n;
p = new TCLASS*[n];
p[0] = new TCLASS();//etc
...
delete []p;
ilja123
43 / 43 / 6
Регистрация: 24.12.2009
Сообщений: 382
10.01.2014, 22:06     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
int main()
{
    int N;//размер массива
    int *ptrArr;//указатель массива
 
    cout << "input num of array: ";
 
    scanf("%d", &N);
 
    ptrArr = new int[N];
 
    cout << ptrArr[0] << endl;
 
    delete ptrArr;
    
    return 0;
}
some_name
Вежливость-главное оружие
 Аватар для some_name
219 / 219 / 55
Регистрация: 19.02.2013
Сообщений: 1,419
10.01.2014, 22:17     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Example
 {   
 public:     
     Example()
     {       
         id = count++;       
         cout<<"Create a new Example class - "<<id<<endl;
     }
     ~Example()
     {
         cout<<"Delte Example class - "<<id<<endl;
     }       
 private:
     static int count;
     int id;
 };
 
 int Example::count = 1;
 
void _tmain(int argc, _TCHAR* argv[])
{
    int size;   
    Example * arr_example;
 
    cout<<"Input array size:"; cin>>size;  
 
    arr_example = new Example[size];
    //some to do
    delete[] arr_example;
    getchar();
    getchar();
}
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
10.01.2014, 22:32     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #7
Цитата Сообщение от ilja123 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
int main()
{
    int N;//размер массива
    int *ptrArr;//указатель массива
 
    cout << "input num of array: ";
 
    scanf("%d", &N);
 
    ptrArr = new int[N];
 
    cout << ptrArr[0] << endl;
 
    delete ptrArr;
    
    return 0;
}
Это неверно
delete ptrArr;
Надо
delete []ptrArr;
ilja123
43 / 43 / 6
Регистрация: 24.12.2009
Сообщений: 382
10.01.2014, 22:49     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #8
Цитата Сообщение от AnDrew_LP Посмотреть сообщение
Это неверно
Как проверить??

Добавлено через 5 минут
Я думаю просто delete это язык Си Delete[] это язык С++ Но, как всегда в Сях пофиХ кто как хочет так и....
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
10.01.2014, 22:50     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #9
Цитата Сообщение от ilja123 Посмотреть сообщение
Как проверить??
Никак. Компилятор ругаться не будет. Он не будет ругаться, если эту строку убрать вовсе. Но память освобождается неверно(верно только, если N=1).
C++
1
delete p;
- здесь освобождается только память, выделенная под первый элемент
C++
1
delete []p;
- так освобождается память, занятая под массив
Я думаю просто delete это язык Си Delete[] это язык С++ Но, как всегда в Сях пофиХ кто как хочет так и....
Нет. Если я не ошибаюсь, то в Си вообще нету такого оператора, а память выделяется с помощью malloc и освобождается с помощью free
ilja123
43 / 43 / 6
Регистрация: 24.12.2009
Сообщений: 382
10.01.2014, 22:52     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #10
ну я в нете видел и такое
C++
1
2
for(i=0; i<=N; i++)
         delete p[i];
Хде правду искать???
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
10.01.2014, 22:58     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #11
Цитата Сообщение от ilja123 Посмотреть сообщение
ну я в нете видел и такое
C++
1
2
for(i=0; i<=N; i++)
         delete p[i];
Хде правду искать???
Здесь двумерный массив. И освобождается память тоже неверно, надо так
C++
1
2
3
4
5
6
7
8
9
int **p;
//выделение памяти
p = new int*[5];
for(int i = 0; i < 5; i++)
     p[i] = new int[5];
//освобождение памяти
for(int i = 0; i < 5; i++)
     delete []p[i];
delete []p;
ilja123
43 / 43 / 6
Регистрация: 24.12.2009
Сообщений: 382
10.01.2014, 22:59     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #12
Может вообще p[] = NULL Чтоб уж наверняка Контролльный так сказать
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
10.01.2014, 23:05     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #13
Цитата Сообщение от ilja123 Посмотреть сообщение
Может вообще p[] = NULL Чтоб уж наверняка Контролльный так сказать
Скорее так)
C++
1
p = nullptr;
Это необязательно, нужно лишь для того, чтобы при попытке использовать этот указатель после того, как память была освобождена, выскочило NullReferenceException.
Иначе, будет использоваться не инициализированный участок памяти и поведение программы предсказать не выйдет.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
10.01.2014, 23:15     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #14
а че никто вектора не предлагает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <vector>
 
int main()
{
  int width = 10;
  int height = 20;
 
  std::vector<int> v(width);
 
  // двумерный
  std::vector< std::vector<int> > v2(height, std::vector<int>(width));
 
  //...
 
  // не надо никаких delete []. все сделается автоматом.
 
  return 0;
}
casper007
61 / 61 / 21
Регистрация: 12.12.2013
Сообщений: 375
10.01.2014, 23:18  [ТС]     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #15
Цитата Сообщение от DU Посмотреть сообщение
а че никто вектора не предлагает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <vector>
 
int main()
{
  int width = 10;
  int height = 20;
 
  std::vector<int> v(width);
 
  // двумерный
  std::vector< std::vector<int> > v2(height, std::vector<int>(width));
 
  //...
 
  // не надо никаких delete []. все сделается автоматом.
 
  return 0;
}
Спасибо! Возьму на заметку.
ilja123
43 / 43 / 6
Регистрация: 24.12.2009
Сообщений: 382
10.01.2014, 23:25     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #16
Ну типа вектора это для слабакоФ, а настоящие прогеры юзают чистые указатели

Добавлено через 1 минуту
А вообще Вектора - лучший выбор ИМХО
some_name
Вежливость-главное оружие
 Аватар для some_name
219 / 219 / 55
Регистрация: 19.02.2013
Сообщений: 1,419
10.01.2014, 23:33     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #17
Цитата Сообщение от ilja123 Посмотреть сообщение
ну я в нете видел и такое
Код C++
1
2
for(i=0; i<=N; i++)
delete p[i];
тоже верно.

Цитата Сообщение от ilja123 Посмотреть сообщение
Хде правду искать???
Просто усвойте, что некоторые вещи можно делать по-разному
ilja123
43 / 43 / 6
Регистрация: 24.12.2009
Сообщений: 382
10.01.2014, 23:35     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #18
Цитата Сообщение от some_name Посмотреть сообщение
Просто усвойте, что некоторые вещи можно делать по-разному
(камнями не бейте) но это недостаток языка
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
11.01.2014, 00:01     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #19
Цитата Сообщение от some_name Посмотреть сообщение
тоже верно.
Нет, это называется неопределенное поведение. Попробуйте запустить программу с delete[] и с delete

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
 
class MyClass
{
public:
    MyClass() {}
    ~MyClass()
    {
        std::cout << "Destructor: " << std::endl;
    }
};
 
int main()
{
    MyClass *p = new MyClass[2];
    delete []p;//попробуйте запустить без []
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2014, 00:30     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение?
Еще ссылки по теме:

C++ Какой ответ получим после запуска следующей программы
C++ ошибка после запуска программы!
Cоздать массив, размер которого задает пользователь C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
some_name
Вежливость-главное оружие
 Аватар для some_name
219 / 219 / 55
Регистрация: 19.02.2013
Сообщений: 1,419
11.01.2014, 00:30     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение? #20
AnDrew_LP, вы правы, я сглупил.

Ведь массив это занимает цельный блок памяти и если нам будет позволено делать что-то типа:
C++
1
delete arr[i];
то мы "разорвем массив", а это уже серьезный косяк.
Yandex
Объявления
11.01.2014, 00:30     Как определить массив, размерность которого определяет пользователь после запуска программы на выполнение?
Ответ Создать тему
Опции темы

Текущее время: 22:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru