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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2014, 23:32   #1
doss
Пользователь
 
Регистрация: 05.03.2013
Сообщений: 41
По умолчанию Работа с массивом объектов

Код:
int main()
{
	setlocale(LC_ALL, "Rus");
	int mas, *A, j;
	std::cin >> mas;
	Track *A;
	A = new int(mas);
	for (j = 0; j <= mas; j++)
		A[mas] = A[j];
	A[j].setTrack();
	A[j].getTrack();
return 0;
}
Хочу сделать так, что бы я объявил длину массива, а потом вызывалась функция, для ввода/вывода данных...
К примеру ввел A[3] и вводил 3 раза данные.. но увы, не получается с динамическим изменением длины.. подскажите
doss вне форума Ответить с цитированием
Старый 02.11.2014, 23:35   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Код:
new int[mas]
, а не ()

А откуда вы set/getTrack взяли и зачем в цикле mas+1 раз пытаетесь присвоить j-й элемент элементу с номером mas (он за пределами массива) вообще непонятно.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 02.11.2014 в 23:38.
Alex11223 вне форума Ответить с цитированием
Старый 02.11.2014, 23:41   #3
doss
Пользователь
 
Регистрация: 05.03.2013
Сообщений: 41
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Код:
new int[mas]
, а не ()

А откуда вы set/getTrack взяли и зачем в цикле mas+1 раз пытаетесь присвоить j-й элемент элементу с номером mas (он за пределами массива) вообще непонятно.
set|get... это выше фрагмент кода класса, где я присваиваю переменным данные и их же вывожу.

У меня просто был Track A[3] - т.е. я прописывал массив объектов с 3-я заполненными данными и выводил их, теперь хочу сделать так, что бы я сам устанавливал, сколько вводить "на месте этой 3-ки".
doss вне форума Ответить с цитированием
Старый 03.11.2014, 19:04   #4
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Код:
	int mas, *A, j;
	//...
	Track *A;
Посмотрите внимательно. У вас A - это указатель на int и на объект типа Track. Не может быть в одном блоке {} две переменных с одинаковым именем

Цитата:
У меня просто был Track A[3] - т.е. я прописывал массив объектов с 3-я заполненными данными и выводил их, теперь хочу сделать так, что бы я сам устанавливал, сколько вводить "на месте этой 3-ки".
Удобно хранить объекты в std::vector. Вы сможете добавлять столько элементов, сколько захотите вызовом метода push_back:
Код:
#include <iostream>
#include <vector>
#include <string>

struct Person
{
    std::string firstName;
    std::string lastName;
};

int main()
{
    std::vector<Person> persons;

    Person ivan;
    Person petr;

    persons.push_back( ivan );
    persons.push_back( petr );

    return 0;
}
new лучше заменить на std::make_shared Тогда delete не нужен будет. А в векторе хранить умные указатели:

Код:
#include <iostream>
#include <vector>
#include <string>
#include <memory>

struct Person
{
    std::string firstName;
    std::string lastName;
};

int main()
{
    std::vector< std::shared_ptr<Person> > persons;

    auto ivan = std::make_shared<Person>();
    auto petr = std::make_shared<Person>();

    persons.push_back( ivan );
    persons.push_back( petr );

    return 0;
}

Последний раз редактировалось 8Observer8; 03.11.2014 в 19:07.
8Observer8 вне форума Ответить с цитированием
Старый 03.11.2014, 19:12   #5
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Код:
new int[mas]
, а не ()
и так () и так [] - один и тот же эффект вроде!
igoreshka3333 вне форума Ответить с цитированием
Старый 03.11.2014, 21:25   #6
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Цитата:
и так () и так [] - один и тот же эффект вроде!
Попробуйте будет ли тоже эффект, если вы так запишите:
Код:
int *arr;
arr = new int;
Код:
#include <iostream>

int main()
{
    int *arr;
    arr = new int;

    arr[0] = 1;
    arr[5] = 99;

    std::cout << arr[5] << std::endl;

    delete arr;
    return 0;
}
igoreshka3333, выполните ещё у себя такой код и покажите результат:

Код:
#include <iostream>

int main()
{
    int *arr;
    arr = new int(99);

    std::cout << *arr << std::endl;

    return 0;
}

Последний раз редактировалось Stilet; 05.11.2014 в 07:19.
8Observer8 вне форума Ответить с цитированием
Старый 03.11.2014, 22:22   #7
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Здесь и так ясно, что будет крэш так как не выделены ячейки памяти под int:
Цитата:
Попробуйте будет ли тоже эффект, если вы так запишите:
За это спасибо:
Цитата:
igoreshka3333, выполните ещё у себя такой код и покажите результат:
[] - количество ячеек, которые мы хотим выделить
() - вставка значения в кучу
igoreshka3333 вне форума Ответить с цитированием
Старый 04.11.2014, 10:23   #8
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Цитата:
Здесь и так ясно, что будет крэш так как не выделены ячейки памяти под int:
Запускаю следующую программу и она выводит на экран 5. У вас тоже?
Код:
#include <iostream>

int main()
{
    int *arr;

    arr = new int;

    arr[0] = 1;
    arr[1] = 2;
    arr[2] = 3;
    arr[3] = 4;
    arr[4] = 5;

    std::cout << arr[4] << std::endl;

    return 0;
}
Цитата:
() - вставка значения в кучу
Точнее это инициализация:
Код:
#include <iostream>

int main()
{
    int a(5);
    int b(10);
    int *c = new int (11);

    std::cout << a << " " << b << " " << *c << "\n"; // output: 5 10 11

    return 0;
}

Последний раз редактировалось 8Observer8; 04.11.2014 в 10:28.
8Observer8 вне форума Ответить с цитированием
Старый 04.11.2014, 20:01   #9
igoreshka3333
Форумчанин
 
Аватар для igoreshka3333
 
Регистрация: 26.09.2014
Сообщений: 176
По умолчанию

Цитата:
Запускаю следующую программу и она выводит на экран 5. У вас тоже?
Выводит, но в сопровождении креша
Изображения
Тип файла: jpg Безымянный.jpg (29.5 Кб, 149 просмотров)

Последний раз редактировалось igoreshka3333; 04.11.2014 в 21:22.
igoreshka3333 вне форума Ответить с цитированием
Старый 05.11.2014, 01:20   #10
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

У меня в дебажном режиме в Qt прокатывает, а в релизе - нет. Просто хотел показать, что бывают ситуации, когда можно перепутать скобочки и ничего не заметить:

Код:
int *arr = new int(10);
Код:
int *arr = new int[10];
С такими массивами может быть большое количество неприятных ситуаций. Поэтому лучше использовать контейнер std::vector

А если забывать корректно освобождать память, то можно получить: утечку памяти. С delete'ами нужно быть осторожнее, так как можно: не написать их, написать два раза, или написать delete, а потом объект попытаться использовать. Поэтому придумали std::make_shared из C++11. И контейнер std::vector, как обёртку над динамическим массивом
8Observer8 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с массивом Tecknogleb Помощь студентам 1 17.11.2012 16:06
Работа с массивом MikeL 124 rus Помощь студентам 14 09.05.2011 19:05
Работа с массивом в 1с 8.2. LightUA Помощь студентам 0 15.03.2011 12:01
Работа с массивом Aleks2215 Microsoft Office Excel 10 04.11.2010 23:38
Работа с массивом объектов Newnata Паскаль, Turbo Pascal, PascalABC.NET 2 06.12.2007 07:13