Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как создать переопределяемый динамический массив


Автор: Zero 6.10.2005, 20:53
В общем случае чтобы создать динамический массив, то это делается так:
Код

typedef int*intptr;
............
intptr mas;
mas = new int[1];

//Далее мне нужно определить первый элемент
mas[0] = 5435;

//Далее мне нужно переопределить массив
//но если сделать так
mas = new int[2];
//тогда mas[0] сотрётся и её надо заново вводить

А как сделать так чтобы переменную mas не заново определять, а к текущеё добавить или убрать нужное кол-во элементов.
Хорошо бы если за место функции new была бы функция редактирования кол-ва элементов, как в делфи с помощью функции SetLength можно устанавливать в любой момент времени нужнок кол-во элементов.

Автор: Mayk 6.10.2005, 21:07
использовать vector из stl.

Код

#include <vector>
#include <iostream>

using namespace std;

int main()
{
        vector<int> s(3);
        s[0]=0;
        s[1]=1;
        s[2]=2;
        s.push_back(3);
        s.resize(6);
        s[4]=99;
        s[5]=100;

        for(int i=0;i != s.size(); ++i){
                cout << i << ')' << s[i] << endl;
        }
}

Автор: Zero 6.10.2005, 21:33
Ето, как оно... А с массивом не как нельзя, а то я в дальшейшем планирую массив использовать с типом class

Автор: Mayk 6.10.2005, 21:40
Афаир нет(если не рассматривать изобретение велосипедов).
Цитата(Zero @ 7.10.2005, 01:33)
планирую массив использовать с типом class

А что мешает использовать вектор классов а ля vector<MyClass>?

Автор: Zero 6.10.2005, 22:08
Блин, и чем все этот С++ расхваливают... Ничего по человечески нельзя сделать. Вот делфи тама всё просто, написал
Код

SetLength(Mas,<нужный размер>); 

B всё зашибись... А тут всё через ж....у smile
Ладно, буду использовать массив на 1000 элементов...
Но если кто найдёт, альтернативу функции SetLength, то пишите...
И именно с массивами... smile

Автор: Mayk 6.10.2005, 22:14
Цитата(Zero @ 7.10.2005, 02:08)
И именно с массивами..

А что, вектор чем-то очень сильно отличается от массива? Не так давно уже был спор на тему вектор против массива. Советую посмотреть.


Цитата(Zero @ 7.10.2005, 02:08)
B всё зашибись...

млин, я тебе пример привёл
Код

mas.resize(<нужный размер>)


Можешь realloc юзать, но это си(и соотсно malloc/free вместо new/delete), а не плюсы, и при использовании его в плюсах могут быть серьезные проблемы(operator = и всё такое)


ps. я так и не понял почему vector<Class> не подходит, а Class [] подходит.

Автор: Zero 6.10.2005, 22:26
Ладно, буду делать с векторами... smile

Автор: Helicopterr 6.10.2005, 22:32
сперва почитай, потом делай выводы, всё не так уж и "нахрен"

Автор: Mayk 6.10.2005, 22:41
Цитата(Zero @ 7.10.2005, 02:26)
Зачем из языка помойку делают и потом доказывают что он лучше делфи,

Кто? Где? делают помойку? Нет никакой помойки.

Как бы ни было язык С++ не могут любить за то, что он походит на делфи. Это я к
Цитата(Zero @ 7.10.2005, 02:26)
А зачем в этот С++ понавтыкали однотипных команд? Зачем из языка помойку делают и потом доказывают что он лучше делфи,

Цитата(Zero @ 7.10.2005, 02:08)
И чем все этот С++ расхваливают...  Вот делфи тама всё просто, написал

Дельфи - это дельфи. С++ - это С++. Хвалить язык за похожесть на другой по крайне мере не разумно. По крайне мере в контексте с/паскаль.

Цитата(Zero @ 7.10.2005, 02:26)
А нахрен, в этот С++ понавтыкали однотипных команд?

Цитата(Zero @ 7.10.2005, 02:08)
А тут всё через ж....у

"К проклятьям не прибегну и сдержусь" (с)
Просто посоветую выбирать выражения.


Цитата(Zero @ 7.10.2005, 02:26)
Ладно, прочитаю ка я главу про векторы потом муду думать как дальше поступать...

По-моему это гораздо лучше, чем не зная языка кричать "язык - ацтой, в нем setsize'а нет".

Автор: bel_nikita 6.10.2005, 22:57
smile Zero
Цитата
А нахрен, в этот С++ понавтыкали однотипных команд? Зачем из языка помойку делают и потом доказывают что он лучше делфи, ссылаясь на то что тут можно делать много тупых вещей, глобально запутанных, нарушающих хороший стиль программирования
нахрен, нахрен ....
А чего тогда из Делфи в этот С++ лезешь? smile Сиди в своих Делфях и радуйся жизни smile

Цитата
B всё зашибись... А тут всё через ж....у
скорее руки не так заточены

З.Ы.: http://forum.vingrad.ru/index.php?act=Search&CODE=show&searchid=c70f0beafd0ec4e7f038cb2be405ccca&search_in=posts&result_type=topics&highlite=%E4%E8%ED%E0%EC%E8%F7%E5%F1%EA%E8%E9+%EC%E0%F1%F1%E8%E2

З.Ы.Ы.: тему в мусорку


Автор: Neitron 7.10.2005, 09:39
Блин чо реально было спор вектор vs массив?
Вектор и есть массив.!!!!
Он практически ничем не отличается от массива.
Если судить по свойсвам. Свойсва массива в том что все элементы расположены друг за другом.
Код

mas = new int[2];
//тогда mas[0] сотрётся и её надо заново вводить

У тебя ничего не сотрется. Стирается после выполнения delete
У тебя mas будет указывать уже на новую память. И ПРОИЗОЙДЕТ УТЕЧ КА ПАМЯТИ.
Си всегда рвал Дельфи как шарик грелку.

Я не помню чтобы хоть один нормальный проект писали на дельфях.

Автор: Mayk 7.10.2005, 09:51
Цитата(Neitron @ 7.10.2005, 13:39)
Блин чо реально было спор вектор vs массив?

http://forum.vingrad.ru/index.php?showtopic=65661&view=all&hl=vector
вот здесь немного было. Совсем чуть-чуть, но было.

Цитата(Neitron @ 7.10.2005, 13:39)
Я не помню чтобы хоть один нормальный проект писали на дельфях.

Хех, не советую говорить подобное в разделе по дельфи. Уверен, у них подготовлена бумажка, на которой записаны названия программ написанных на дельфях. smile

Автор: Neitron 7.10.2005, 12:25
Цитата
Уверен, у них подготовлена бумажка, на которой записаны названия программ написанных на дельфях.

ГЫыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыы=)

Автор: En_t_end 7.10.2005, 12:47
Mayk
Цитата(Mayk @ 7.10.2005, 02:14)
Можешь realloc юзать, но это си(и соотсно malloc/free вместо new/delete), а не плюсы, и при использовании его в плюсах могут быть серьезные проблемы(operator = и всё такое)

Не вижу проблем. Перевыделение или добавление памяти под массив - это нормальная практика... кстати в тестах по С++, бывает проскакивает такой вопрос.
Zero
Цитата(Zero @ 7.10.2005, 00:53)
Хорошо бы если за место функции new была бы функция редактирования кол-ва элементов, как в делфи с помощью функции SetLength можно устанавливать в любой момент времени нужнок кол-во элементов.

Дело в том, что этот SetLenght 100% был написан на Си, причем на основе того же realloc, но, используя скорее всего тучу лишних действий.

ЗЫ товарищ Zero, если вы будете продолжать "хаять" С++, то я думаю скоро вам вообще здесь перестанут помогать.
Либо критикуйте конструктивно, либо не критикуйте вовсе.
Цитата(Zero @ 7.10.2005, 02:08)
Блин, и чем все этот С++ расхваливают... Ничего по человечески нельзя сделать. Вот делфи тама всё просто, написал

"Тама" у "васа" в "Дельфя" в "тома" и проблема, что все "така" "проста".

Автор: Mayk 7.10.2005, 19:46
Цитата(En_t_end @ 7.10.2005, 16:47)
Не вижу проблем.

Проблема раз - не всякий класс можно просто так взять и сдвинуть(например, к которому обращаются извне). Другой вопрос что такой класс делает в массиве, но ситуацию придумать можно.

Проблема два - realloc(по Святому Стандарту) вовсе не обязан вызывать ::operator new для выделения памяти. В частности это значит, что если мы перегрузим new/delete(зачем - обсуждается в соседней ветке), то у нас будут проблемы - delete получит указатель не от new.
Привет, дебагер.


Цитата(En_t_end @ 7.10.2005, 16:47)
Дело в том, что этот SetLenght 100% был написан на Си

Из Small C был получен C. Не знаю насчёт дельфи, но имхо он вполне мог быть написан на пасе.
Менеджер памяти имхо написать на дельфях можно. Ф-ция по аллоканию памяти есть в оси.
А если учесть тот факт, что существуют оси написанные на пасе, то очень вероятно предположить, что setlength мог быть написан не на си.

Автор: Zero 7.10.2005, 23:34
Цитата(En_t_end @ 7.10.2005, 12:47)
ЗЫ товарищ Zero, если вы будете продолжать "хаять" С++

Зи товарищ En_t_end, вы не так поняли... я не хаю С++, а просто мои ожидания о нём немного меньше чем я себе представлял...
Тут трудно как то и запутанно он воспринимается...
Вот в делфи там я до некотрых функций дошол методом тыка, не читая литературы, а тут глюки начались с того, когда мне сказали что есть функция ShowMessage, но я как ради практики не старался её записать с учётом регистров, и пол часа до меня доходило что здесь, т.е. С++ чувствительный к регистру...
Учить начал, чисто из-за того что по ООП курсачи заставили делать именно на С++, а так на Делфи то я бы его часа за 3 сделал...

Цитата(Neitron @ 7.10.2005, 09:39)
Вектор и есть массив.!!!!

Неверно... Я сегодня прочитал главу про векторы, и понял их отличия:
размер массива можно определять один раз, но удобен массив тем что в пошаговом режиме его можно просматривать.
Размер вектора можно изменять динамически на любом шаге выполнения программы, но недостаток который я заметил, то что в пошаговом режиме он не показывает свои значения, хотя в документации, написано что работать с ним можно как с обычным массивом (но это наверно имеется ввиду чисто использование операторов, а не всё остальное)

Автор: bel_nikita 8.10.2005, 00:21
Zero
Цитата
Неверно... Я сегодня прочитал главу про векторы, и понял их отличия:
размер массива можно определять один раз, но удобен массив тем что в пошаговом режиме его можно просматривать.
Размер вектора можно изменять динамически на любом шаге выполнения программы, но недостаток который я заметил, то что в пошаговом режиме он не показывает свои значения, хотя в документации, написано что работать с ним можно как с обычным массивом (но это наверно имеется ввиду чисто использование операторов, а не всё остальное)

для векторов все тоже самое, что и для динамического массива

для векторов истино: &v[i] == &v[0] + i

Автор: Earnest 8.10.2005, 16:59
Цитата(Zero @ 7.10.2005, 23:34)
то что в пошаговом режиме он не показывает свои значения,

Просто его надо как следует попросить. Формат просьбы зависит от используемой библиотеки.

Автор: Void 8.10.2005, 17:08
Цитата(Zero @ 8.10.2005, 01:34)
Неверно... Я сегодня прочитал главу про векторы, и понял их отличия:
размер массива можно определять один раз, но удобен массив тем что в пошаговом режиме его можно просматривать.
Размер вектора можно изменять динамически на любом шаге выполнения программы, но недостаток который я заметил, то что в пошаговом режиме он не показывает свои значения, хотя в документации, написано что работать с ним можно как с обычным массивом (но это наверно имеется ввиду чисто использование операторов, а не всё остальное)

Очень хотелось бы знать, что ты читаешь, раз там именно на такие, пардон, "различия", упор сделан.
Я так и не понял, что это за вредные векторы такие, значения не показывают smile Если имеются в виду визуальные отладчики. то дебаггеры VC++ 7.1 и 8.0 (последний - просто smile) прекрасно умеют с ними работать.

Автор: Zero 8.10.2005, 19:05
Цитата(Void @ 8.10.2005, 17:08)
Я так и не понял, что это за вредные векторы такие, значения не показывают

Пример говориш, нужен smile ... Вот держи, вчера на нём икспириминтировал:
Код

vector<int> s(3);
  s[0]=0;
  strcpy(st,IntToStr(s[0]).c_str());  //с помощью этих штук пришлось убеждатся что присваивание работает
  s[1]=1;
  strcpy(st,IntToStr(s[1]).c_str());

Добавлено @ 19:09
В Watch List заношу вот такое значение:
Код

s[0]

И там в вотч листе при выполнении этой команды показывается такое сообщение: smile
Код

s[0]: E2382 Side effects are not allowed

Автор: Void 8.10.2005, 19:27
Zero
М-м... ну что ж, правда ваша, напрямую добавить в Watch List такое выражение не получается. Правда, лично я никогда не испытывал в этом необходимости, Autos в VC++ мои потребности, как правило, покрывали с лихвой.

Автор: Zero 8.10.2005, 19:40
Вот и я то про что...

Автор: Earnest 9.10.2005, 11:49
Zero
Если у тебя STL-port 5.0, то содержимое вектора посмотреть в Watch можно так:
// 10 первых элементов
MyVec._M_impl._M_start,10
// число элементов
MyVec._M_impl._M_finish - MyVec._M_impl._M_start
и т.д.

Если STL-port предыдущих версий или не port, то все то же самое, но без _M_impl. Хотя возможны варианты, в зависимости от реализации STL. Это легко посмотреть - в отладчике раскрой переменную MyVec и посмотри, что внутри.

Со списками и прочими мэпами хуже, в некоторых реализациях можно заглянуть внутрь узла, в других - видны только базовые члены.
Но, как уже сказал Void, в этом редко бывает необходимость. В конце концов, выведи отладочную информацию с помощью OutputDebugString (наверняка и в Борланде есть какие-нибудь команды-оболочки)

Автор: Zero 9.10.2005, 13:02
Цитата(Earnest @ 9.10.2005, 11:49)
Но, как уже сказал Void, в этом редко бывает необходимость.
Хмм... smile , у тех кто с этим не работает, у тех редко. А если я с этим работаю, то мне нужна.
Цитата(Earnest @ 9.10.2005, 11:49)
В конце концов, выведи отладочную информацию с помощью


Цитата(Zero @ 8.10.2005, 19:05)
vector<int> s(3);
  s[0]=0;
  strcpy(st,IntToStr(s[0]).c_str());  //с помощью этих штук пришлось убеждатся что присваивание работает


Автор: Void 9.10.2005, 15:34
Цитата(Zero @ 9.10.2005, 15:02)
Хмм... smile , у тех кто с этим не работает, у тех редко. А если я с этим работаю, то мне нужна.

Вектора использую направо и налево. Но чтобы приходилось контролировать в процессе отладки какой-то конкретный элемент smile
Цитата(Zero @ 9.10.2005, 15:02)
//с помощью этих штук пришлось убеждатся что присваивание работает

Настолько сомневаешься в способностях авторов реализации STL? smile

Автор: Zero 9.10.2005, 18:54
Цитата(Void @ 9.10.2005, 15:34)
Настолько сомневаешься в способностях авторов реализации STL?
Да нет, говорю же с С++ только неделю сижу. smile smile

Автор: Earnest 10.10.2005, 17:09
Цитата(Zero @ 9.10.2005, 13:02)

vector<int> s(3);
  s[0]=0;
  strcpy(st,IntToStr(s[0]).c_str());  //с помощью этих штук пришлось убеждатся что присваивание работает


Проверка присваивания - это круто. Однако бывают менее тривиальные случаи, когда неплохо бы заглянуть внутрь.
Я, собственно, имела в виду что-то вроде
Код

TRACE(_T("v[0]=%d\n"),v[0]);

Все это выводиться на панель output в процессе выполнения программы.
Но это VC (MFC), а у Борланда могут быть другие слова. Ищи в хелпе про отладочную печать.

Автор: ZeroDivide 26.10.2005, 09:18
С++ [censored34! Пожалуйста, соблюдайте элементарные правила приличия при общении на форуме], нахрен его smile
Даёшь Delphi и Free Pascal!

Автор: Neitron 26.10.2005, 10:23
С++ для умных, которым не лень разбираться.

Автор: Лыжа 26.10.2005, 23:16
Код


int  *setlenth(int *a,int n)
{
    int *tmp=a;
    for(int i=0;i<n;i++,a++);
    *a='\0'; 
    return tmp;



что то типо того,не коmпилил ,но маст ворк.Идея вощем ясна я думаю.

Автор: Neitron 27.10.2005, 09:41
Хрень.
Будет ошибка о нарушении доступа к памяти.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)