Решено: Динамический массив структур

Модератор: Модераторы разделов

hippi90
Сообщения: 83
ОС: Debian testing

Решено: Динамический массив структур

Сообщение hippi90 »

Изучаю С++, столкнулся с проблемой. Не могу инициализировать такой массив

Код: Выделить всё

struct CandyBar
    {
        string name;
        float weight;
        int calories;
        };

    CandyBar *snack =new CandyBar [3];

Если массив объявлен статически, всё нормально.
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Решено: Динамический массив структур

Сообщение MakkyWelly »

Код: Выделить всё

struct CandyBar {
    char  *name;
    float weight;
    int   calories;
};

void init_candy_bar (struct CandyBar *t, char *name_, float weight_, int calories_) {
    t->name     = name_;
    t->weight   = weight_;
    t->calories = calories_;
}

void print_candy_bar (struct CandyBar *t) {
    printf("%s\n", t->name);
    printf("%f\n", t->weight);
    printf("%d\n", t->calories);
}

int main () {

   struct CandyBar snack[3];

   init_candy_bar(&snack[0], "marmalad", 5.0, 10);
   init_candy_bar(&snack[1], "chokolate", 7.0, 100);
   init_candy_bar(&snack[2], "ice-cream", 10.0, 1000);

   print_candy_bar(&snack[0]);
   print_candy_bar(&snack[1]);
   print_candy_bar(&snack[2]);

   return 0;
}
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Решено: Динамический массив структур

Сообщение MakkyWelly »

Да, вам же через new надо, тогда так:

Код: Выделить всё

#include <iostream>
#include <string>

struct CandyBar {
    std::string name;
    float       weight;
    int         calories;
};

void init_candy_bar (struct CandyBar *t, char *name_, float weight_, int calories_) {
    t->name     = name_;
    t->weight   = weight_;
    t->calories = calories_;
}

void print_candy_bar (struct CandyBar *t) {
    std::cout << t->name << std::endl;
    std::cout << t->weight << std::endl;
    std::cout << t->calories << std::endl;
}

int main () {
    struct CandyBar *snack;

    try {
        snack = new struct CandyBar[3];
    } catch (std::bad_alloc xa) {
        std::cout << "memory error." << std::endl;
        return 1;
    }

   init_candy_bar(&snack[0], "marmalad", 5.0, 10);
   init_candy_bar(&snack[1], "chokolate", 7.0, 100);
   init_candy_bar(&snack[2], "ice-cream", 10.0, 1000);

   print_candy_bar(&snack[0]);
   print_candy_bar(&snack[1]);
   print_candy_bar(&snack[2]);

   delete [] snack;

   return 0;
}

и ещё немного плюсиризовал, как у Crazy.
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Решено: Динамический массив структур

Сообщение Crazy »

Код: Выделить всё

#include <iostream>
#include <string>

struct CandyBar
{
     std::string name;
     float weight;
     int calories;
};

int main()
{
    CandyBar *snack = new CandyBar[3];
    snack[0].name="Beer";
    snack[1].name="Tee";
    snack[2].name="Aqua";
    std::cout<<snack[0].name<<std::endl;
    std::cout<<snack[1].name<<std::endl;
    std::cout<<snack[2].name<<std::endl;
    delete []snack;
    return 0;
}

Desipere in loco
Спасибо сказали:
hippi90
Сообщения: 83
ОС: Debian testing

Re: Решено: Динамический массив структур

Сообщение hippi90 »

Спасибо, я понял как надо это делать. Просто я ожидал, что это можно сделать проще.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Решено: Динамический массив структур

Сообщение NickLion »

hippi90 писал(а):
04.10.2009 01:46
Спасибо, я понял как надо это делать. Просто я ожидал, что это можно сделать проще.

Это можно будет сделать проще в новом стандарте C++. Судя по http://gcc.gnu.org/projects/cxx0x.html в GCC 4.4 уже поддерживаются Initializer lists. Как его использовать - можете посмотреть здесь. Но стоит ли писать по еще не утвержденным правилам - решать Вам, потому что перенести на другой компилятор будет проблематично.
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Решено: Динамический массив структур

Сообщение Crazy »

hippi90 писал(а):
04.10.2009 01:46
Спасибо, я понял как надо это делать. Просто я ожидал, что это можно сделать проще.

Вот так что ли?

Код: Выделить всё

#include <iostream>
#include <string>

struct CandyBar
{
     std::string name;
     float weight;
     int calories;
     CandyBar()
     {
         std::cout<<"Input name\n";
         std::cin>>name;
     }
};

int main()
{
    CandyBar *snack = new CandyBar[3];
    std::cout<<snack[0].name<<std::endl;
    std::cout<<snack[1].name<<std::endl;
    std::cout<<snack[2].name<<std::endl;
    delete []snack;
    return 0;
}

Desipere in loco
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: Решено: Динамический массив структур

Сообщение MakkyWelly »

hippi90 писал(а):
04.10.2009 01:46
Спасибо, я понял как надо это делать. Просто я ожидал, что это можно сделать проще.

Я кажется уже сам не понимаю смысл изначального вопроса:

Код: Выделить всё

#include <iostream>
#include <string>

struct CandyBar {
    std::string name;
    float weight;
    int   calories;
};

CandyBar *snack = new CandyBar[3];

void main () {
   snack[1].name = "1";
   snack[2].name = "2";
   snack[3].name = "3";
   std::cout << snack[1].name << snack[2].name << snack[3].name << std::endl;
   delete []snack;
}
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
hippi90
Сообщения: 83
ОС: Debian testing

Re: Решено: Динамический массив структур

Сообщение hippi90 »

Сделал вот так

Код: Выделить всё

#include <iostream>
#include <cstring>
using namespace std;

struct CandyBar
    {
        string name;
        float weight;
        int calories;
        };

void init_struct(CandyBar *n, string name_, float weight_, int calories_)
{
    n->name = name_;
    n->weight = weight_;
    n->calories = calories_;
}

void print_struct(CandyBar *n)
{
    cout << "Name: " << n->name << endl;
    cout << "Weight: " << n->weight << endl;
    cout << "Calories: " << n->calories << endl << endl;
}


Всё работает.
Спасибо сказали:
USHEL
Сообщения: 29

Re: Решено: Динамический массив структур

Сообщение USHEL »

Crazy писал(а):
03.10.2009 14:31

Код: Выделить всё

#include <iostream>
#include <string>

struct CandyBar
{
     std::string name;
     float weight;
     int calories;
};

int main()
{
    CandyBar *snack = new CandyBar[3];
    snack[0].name="Beer";//[b][color="#00FF00"][size="6"]Подскажите а можно ли в строку name поместить имя с пробелом(допустим The biggest Beer)?[[/size][/color]/b]
    snack[1].name="Tee";
    snack[2].name="Aqua";
    std::cout<<snack[0].name<<std::endl;
    std::cout<<snack[1].name<<std::endl;
    std::cout<<snack[2].name<<std::endl;
    delete []snack;
    return 0;
}
Спасибо сказали: