Hello, I am trying to create a program that has Ingredients, which contain a name and value, and also Drinks, which contain a name and an array of Ingredients. Here is the code to the classes;
class Ingredient {
public:
String ingName;
int ingVal;
Ingredient (String ingName_, int ingVal_){
ingName = ingName_;
ingVal = ingVal_;
}
};
class Drink {
public:
String drinkName;
Ingredient ingredients[];
byte MAX = 2;
Drink (String drinkName_, Ingredient ingredients_[]){
drinkName = drinkName_;
ingredients[MAX] = ingredients_[MAX];
}
};
I would like to create something along the lines of;
Drink drink_list[2] = {
Drink drink1("drink1", Ingredient ingdrink1[2] = {
("ingName1", 55),
("ingName2", 12)
};,
...
...
};
I have had success in creating an Ingredient array and then referencing that array in the Drink constructor, but have errors when trying to make an array of Drinks like so;
Ingredient dryMartini_[2] = {
Ingredient("gin", 75),
Ingredient("dry vermouth", 15)
};
Drink dryMartini("Dry Martini", dryMartini_);
Any help would be appreciated 
This compiles without warning or error:
class Ingredient
{
public:
String ingName;
int ingVal;
Ingredient (String ingName_, int ingVal_)
{
ingName = ingName_;
ingVal = ingVal_;
}
};
class Drink
{
public:
String drinkName;
Ingredient ingredients[];
const byte MAX = 2;
Drink (String drinkName_, Ingredient ingredients_[])
{
drinkName = drinkName_;
ingredients[MAX] = ingredients_[MAX];
}
};
// I would like to create something along the lines of;
Ingredient ing1 = {"ingName1", 55};
Ingredient ing2 = {"ingName2", 12};
Ingredient ing3 = {"ingName3", 25};
Ingredient ing4 = {"ingName4", 107};
Ingredient ingA[2] = {ing1, ing2};
Ingredient ingB[2] = {ing3, ing4};
Drink drink_list[2] =
{
{"drink1", ingA} ,
{"drink2", ingB}
};
void setup() {}
void loop() {}
Here is the entirety of my code, I have updated it slightly from before;
class Ingredient {
public:
String ingName;
int ingVal;
Ingredient (String ingName_, int ingVal_){
ingName = ingName_;
ingVal = ingVal_;
}
};
class Drink {
public:
String drinkName;
Ingredient *ingredients;
byte s;
Drink (String drinkName_, Ingredient ingredients_[], byte s_){
drinkName = drinkName_;
ingredients = ingredients_;
s = s_;
}
};
Ingredient ing1_[] = {
Ingredient("name1", 75),
Ingredient("name2", 15)
};
Ingredient ing2_[] = {
Ingredient("name3", 45),
Ingredient("name4", 55)
};
Drink drink1("Drink1", ing1_, sizeof(ing1_)/sizeof(ing1_[0]));
Drink drink2("Drink2", ing2_, sizeof(ing2_)/sizeof(ing2_[0]));
Drink drink1("Drink1", ing1_, sizeof(ing1_)/sizeof(ing1_[0]));
Drink drink2("Drink2", ing2_, sizeof(ing2_)/sizeof(ing2_[0]));
Drink drink_list[2] = {drink1, drink2};
void setup() {
Serial.begin(9600);
for (int a = 0; a < sizeof(drink_list); a++){
Serial.println(drink_list[a].drinkName);
}
}
When I run this, the serial port spits out nonsense like this;
Drink2
Drink1
name3
Ϳ⸮⸮7⸮⸮d+⸮⸮ۦب⸮ˬ⸮'⸮⸮}^⸮⸮⸮⸮⸮⸮⸮⸮?)})⸮⸮W⸮O⸮??m⸮j⸮n⸮⸮⸮⸮⸮⸮⸮⸮⸮>⸮⸮⸮⸮
⸮O⸮⸮⸮~⸮⸮/⸮⸮⸮[⸮&⸮⸮⸮⸮⸮ҿ|⸮⸮}⸮⸮zw&⸮;⸮⸮⸮⸮⸮⸮㻿⸮⸮⸮?⸮⸮⸮K⸮⸮ܾ⸮]⸮⸮⸮⸮]⸮⸮|d=6w⸮s⸮y⸮{⸮x⸮=wk⸮_⸮⸮⸮⸮⸮]GtϟG⸮Y⸮euO4⸮⸮⸮W⸮O⸮N⸮⸮ڹ⸮⸮⸮&S⸮⸮{?⸮⸮⸮⸮⸮}⸮⸮⸮⸮1⸮⸮|⸮~⸮⸮e⸮⸮ze⸮⸮Q⸮⸮^⸮⸮⸮⸮⸮⸮⸮8⸮s⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮U⸮_⸮⸮⸮⸮⸮z?⸮⸮{eN⸮ǻ⸮⸮⸮⸮⸮mݮT⸮7⸮⸮⸮⸮e߯⸮Ĵ⸮⸮⸮⸮⸮W>{⸮+⸮⸮⸮⸮7~⸮ڳ⸮⸮⸮Vð⸮⸮⸮⸮⸮⸮w⸮⸮⸮⸮|⸮co⸮⸮Z⸮⸮⸮⸮⸮⸮⸮n?⸮⸮U⸮⸮⸮⸮~⸮⸮⸮ǻ⸮/⸮⸮e⸮⸮⸮⸮⸮3⸮=⸮⸮⸮⸮c⸮⸮⸮⸮⸮⸮w⸮⸮ֽ⸮w⸮E⸮⸮O⸮⸮⸮⸮⸮o[⸮⸮⸮_⸮⸮II⸮⸮⸮<⸮⸮⸮⸮⸮⸮⸮~+⸮⸮⸮⸮⸮⸮⸮⸮⸮σ⸮f{~⸮;⸮{⸮⸮⸮⸮x_⸮}mٟ⸮⸮V⸮ut⸮w⸮⸮}⸮⸮w⸮E⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮i⸮5⸮O⸮⸮g⸮⸮^⸮⸮⸮k⸮{⸮⸮e9⸮⸮⸮⸮[e⸮⸮ue{z⸮n⸮⸮⸮⸮v㮮⸮⸮⸮⸮⸮⸮⸮y\⸮⸮⸮6⸮⸮⸮g⸮⸮={⸮@⸮⸮⸮5?⸮[⸮⸮⸮⸮⸮i9⸮⸮⸮⸮ie⸮o⸮]⸮^_߯⸮o⸮V⸮⸮⸮wO⸮⸮~⸮oW⸮{z⸮⸮ҍ⸮⸮߿]⸮?⸮>⸮⸮_⸮⸮⸮O⸮⸮⸮⸮⸮:⸮{⸮⸮⸮a⸮⸮⸮=⸮⸮s⸮/⸮⸮⸮⸮⸮Q⸮u⸮⸮⸮2⸮⸮⸮o⸮⸮s⸮⸮⸮⸮⸮S⸮t⸮M⸮⸮|⸮⸮#⸮⸮⸮w=W⸮⸮⸮⸮⸮⸮}⸮⸮⸮⸮e⸮4n⸮e⸮S⸮⸮⸮⸮⸮⸮멿⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮=⸮}⸮mg⸮⸮ց-⸮⸮⸮\s⸮|⸮⸮⸮_⸮~~⸮⸮⸮⸮⸮⸮⸮6o⸮⸮⸮⸮⸮⸮^⸮⸮⸮⸮⸮⸮;K5⸮⸮羵{ׯ⸮⸮⸮⸮⸮⸮
O⸮⸮⸮⸮=⸮⸮⸮O⸮Vv⸮⸮⸮⸮⸮⸮O⸮⸮⸮⸮⸮⸮⸮⸮;⸮E⸮⸮⸮⸮O⸮K⸮⸮⸮u⸮⸮ޟ⸮m⸮]⸮^⸮⸮o⸮⸮⸮?o⸮w⸮⸮⸮⸮⸮⸮u\sU⸮⸮⸮⸮⸮g⸮⸮⸮⸮{⸮?⸮|w⸮⸮⸮~⸮⸮⸮c⸮⸮⸮⸮4⸮⸮⸮⸮߷⸮⸮⸮M_{ς⸮{⸮⸮_⸮⸮}⸮
Why isn't it printing a value?
It is printing values. It prints "Drink1" and "Drink2" (strangely in reverse order) and then goes on to print a bunch more elements that were not initialized because: for (int a = 0; a < sizeof(drink_list); a++){
You are using the number of bytes in 'drink_list' where you meant to use the number of elements in 'drink_list'.
Try this:
void setup()
{
Serial.begin(9600);
for (byte a = 0; a < (sizeof drink_list / sizeof drink_list[0]); a++)
{
Serial.println(drink_list[a].drinkName);
for (byte j = 0; j < drink_list[a].s; j++)
{
Serial.print("\t");
Serial.print(drink_list[a].ingredients[j].ingName);
Serial.print("\t");
Serial.print(drink_list[a].ingredients[j].ingVal);
}
}
}
void loop() {}
Thank you! It is working perfectly