Loading...
beholder avatar beholder 2 Точки

Предаване на pointer към array от обекти на функция и промяна на оригиналния обект

Здравейте опитвам се да се преборя с подточката от домашното за функция която да променя полето на цена на обект. Въпреки че ползвам pointer към масива от обекти и следователно истинския обект като елемент от този масив, а не копие крайния резултат е, че цената не се променя и съм зациклил. 

 

void ChangePrice(Item Itemslist[], string SearchCode, double NewPrice)
{
    for (int i = 0; i < sizeof(Itemslist) / sizeof(Item); i++)
    {
        if (Itemslist[i].Code == SearchCode)
        {
            Itemslist[i].Price = NewPrice;
        }
        cout << "value" << Itemslist[i].Price;
    }
};

В main: 

Item Items[numberOfItemsInShop];
    Item * ItemListPointer = Items;

        int newPrice;
        string searchCode;

            case 'P':
                cout << "Code and new price" << endl;
                cin >> searchCode;
                cin >> newPrice;
                ChangePrice(ItemListPointer, searchCode, newPrice);
                break;

 

0
C++ Programming 26/06/2016 02:58:20
beholder:
Получих помощта, която ми трябваше!
M.Yankov avatar M.Yankov 52 Точки
Best Answer

Направих един бърз sample. Мисля че проблема идва във функцята ChangePrice(). Понеже Itemslist ще сочи към първия елемент в масива, тогава sizeof(Itemslist) / sizeof(Item);  ще е равно на 0 и цикъла не се изпълнява изобщо.
 

Можеш да го подкараш тук http://cpp.sh/62sc

Ето го и кода:

#include <iostream>
#include <array>

void exampleTheTest();

int main ()
{
   exampleTheTest();
}

class TestItem
{
public:
	TestItem(double price, long code) : price(price), code(code)
	{
	}
	
	double price;
	long code;
};

void change(TestItem items[], long code, double price, int length)
{
	int testLength = sizeof(items) / sizeof(TestItem);
    std::cout << "sizeof(items) / sizeof(TestItem) = " <<  testLength << std::endl;

	for (int i = 0; i < length; i++)
	{
		if (items[i].code == code)
		{
			items[i].price = price;
		}
	}
}

void exampleTheTest()
{
	TestItem items[] = 
	{
		TestItem(1.1, 2313),
		TestItem(1.1, 2314),
		TestItem(1.1, 2315),
		TestItem(1.1, 2316),
		TestItem(1.1, 2317),
		TestItem(1.1, 2318),
	};

	TestItem * itempointer = items;

	int length = sizeof(items) / sizeof(TestItem);
	change(itempointer, 2315, 99, length);
	
	for (int i = 0; i < length; i++)
	{
		std::cout << items[i].code << " : " << items[i].price << std::endl;
	}
}

Разликата е единствено че в примера code е от тип long . Надявам се да ти свърши работа.

0
26/06/2016 14:12:25
beholder avatar beholder 2 Точки

Много, много ти благодаря!

0
fl3x1324 avatar fl3x1324 60 Точки

По този метод можеш ли да го достъпиш и да принтираш данните в конзолата?

0
Lirik avatar Lirik 22 Точки

Може да не се променя цената на обекта, а да се добави нова оферта (обект, цена) за студенти примерно?

https://www.youtube.com/watch?v=2KvslbLHTUY

0
26/06/2016 14:08:14
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.