Problem z alokacją pamięci dla tablicy struktur

0
struct naj
{
    char* name;   
    int hp;  
    int atk;    
    int obr;    
    int zad;    
    int pen;   
};
naj* spis = (naj*)malloc(20 * sizeof(naj));                     
spis[0] = { "Bob", 100, 12, 8, 80, pensja(spis[0].hp, spis[0].atk, spis[0].obr) };
spis[1] = { "Rolf", 120, 8, 10, 80, pensja(spis[1].hp, spis[1].atk, spis[1].obr) };
spis[2] = { "Billy", 80, 10, 12, 80, pensja(spis[2].hp, spis[2].atk, spis[2].obr) };
```c++
2

Skoro piszesz w C++, to dlaczego utrudniasz sobie życie pisząc w koślawym C? Zresztą, ten kod daje inny komunikat błędu, albo źle przeklejasz, albo źle minimalizujesz przykład.

1

char* name ze struktury to tylko wskaźnik na chara, a Ty próbujesz mu przypisać gotowe C-stringi ("Bob" itd.).

0

Z tego co mi wiadomo ten warunek nie usi być spełniony:

static_assert(20 * sizeof(naj) == sizeof(naj[20]), "remember about alignment");
0
kq napisał(a):

Skoro piszesz w C++, to dlaczego utrudniasz sobie życie pisząc w koślawym C? Zresztą, ten kod daje inny komunikat błędu, albo źle przeklejasz, albo źle minimalizujesz przykład.

Tak wygląda cały początek, jeśli ma to pomóc w identyfikacji problemu, a jeśli chodzi o koślawy C to na potrzebę nauczyciela musiałem użyć malloca.

#include <stdlib.h>
#include <iostream>
#include <ctime>
#include <string>
typedef const int cint;
cint MaxHP = 200;
cint MinHP = 50;
cint MaxStat = 30;
cint MinStat = 5;
cint MaxNaj = 20;
cint Podzielnik = 4;
cint baseZad = 80;
cint baseIlosc = 3;
cint przelicznikRenomy = 500;
```c++
struct naj
{
    char* name;  
    int hp;     
    int atk;    
    int obr;   
    int zad;    
    int pen;   
};
naj* spis = (naj*)malloc((MaxNaj) * sizeof(naj));                      
spis[0] = { "Bob", 100, 12, 8, baseZad, pensja(spis[0].hp, spis[0].atk, spis[0].obr) };
spis[1] = { "Rolf", 120, 8, 10, baseZad, pensja(spis[1].hp, spis[1].atk, spis[1].obr) };
spis[2] = { "Billy", 80, 10, 12, baseZad, pensja(spis[2].hp, spis[2].atk, spis[2].obr) };
```c++
3

Jeżeli jest to w C++ i nauczyciel upiera się aby korzystać w tym języku z funkcji malloc, to ja bym napisał to w następujący sposób.

#include <iostream>
#include <vector>
#include <memory>

using namespace std;

struct naj
{
    string name;
    int hp {0};
    int atk {0};
    int obr {0};
    int zad {0};
    int pen {0};
};

vector<naj> malloc( int size )
{
    return vector<naj>(size);
}

int main()
{
    auto spis = malloc(20);
    spis[0] = { "Bob", 100, 12, 8, 0 , 4 };
    spis[1] = { "Rolf", 120, 2, 8, 0 , 4 };  

    return 0;
}
0

może byś napisał konkretnie jaki błąd dostajesz, nie kompiluje się, program się zawiesza, źle wyświetla wyniki, etc. Te przykładowe minimum poniżej działa, więc w czym problem?

#include <iostream>
#include <cstdlib>

struct naj_s {
    char* name;
    int hp;
};

int main() {
    const int NAJ_MAX_SIZE = 2;
    naj_s* ns = (naj_s*)malloc(sizeof(naj_s) * NAJ_MAX_SIZE);
    ns[0] = { "ala", 1};
    ns[1] = { "ola", 2};

    for (int i = 0; i < NAJ_MAX_SIZE; i++) {
        std::cout << "naj_s:" << ns[i].name << "," << ns[i].hp <<'\n';
    }

    return 0;
}
1

Nie wiem z czym masz problemy dokładnie (bo nic nie opisałeś), ale ta linijka nie może działać:

spis[0] = { "Bob", 100, 12, 8, baseZad, pensja(spis[0].hp, spis[0].atk, spis[0].obr) };

gdyż spis[0].hp nie jest jeszcze wypełnione w momencie wywoływania funkcji pensja.

1 użytkowników online, w tym zalogowanych: 0, gości: 1