Przypisanie do pola struktury danych z innej struktury

0

Cześć, mam mam takie struktury

struct Header {
    unsigned int msgID;
    unsigned int contentSize;
    char payload[1];
};
struct activeUsers {
    char username[128];
    int socket;
};
struct Login {
    char username[128];
    char passwd[128];
};

Przez memcpy ładuje Login do payload i potem na niej działam. Problem pojawia przy próbie przypisania do pola username struktury activeUsers. Pisząc:

tempUsers.username = receivePayload->username;

dostaję błąd
invalid array assigment
Nie mam też stworzonej tablicy struktur bo nie mam takiej potrzeby.

2

Do kopiowania C-tablic masz memcpy/strcpy/std::copy, w zależności od potrzeb. Może po prostu użyj std::string?

0

Próbujesz całą tablicę (czyli wskaźnik na jej pierwszy element) przypisać do innego wskaźnika. Jeśli rzeczywiście chcesz przenieść zawartość jednej tablicy do drugiej, to użyj właśnie memcpy tak jak to zrobiłeś z Login

edit: Swoją drogą... W jaki sposób:

Przez memcpy ładuje Login do payload

skoro Login to struktura z dwiema ogromnymi tablicami (128 bajtów na login? Nie lepiej std::string ??) to jak wrzucasz ją do payload o wielkości jednego bajta?

0
Bartosz36 napisał(a):

skoro Login to struktura z dwiema ogromnymi tablicami (128 bajtów na login? Nie lepiej std::string ??) to jak wrzucasz ją do payload o wielkości jednego bajta?

W taki sposób:

memcpy(msg->payload, loginData, sizeof(Login));

@kq

Wolę użwać char bo przy wysyłaniu za pomogą send() nie musze serializować danych

0

payload jest tablicą 1-bajtową, nie możesz jej użyć jako większej.

0
kq napisał(a):

payload jest tablicą 1-bajtową, nie możesz jej użyć jako większej.

loginData jest utworzony za pomocą new, czasem zdarzy się że kopiuje do payload sama tablice char więc wtedy używam referencji i wszystko działa jak powinno zawsze

0

Dzięki wyrównaniu to może i wskaźnik skopiujesz i użyjesz bez crasha, ale zwyczajnie jest to błąd.

0
Sashore napisał(a):
Bartosz36 napisał(a):

skoro Login to struktura z dwiema ogromnymi tablicami (128 bajtów na login? Nie lepiej std::string ??) to jak wrzucasz ją do payload o wielkości jednego bajta?

W taki sposób:

memcpy(msg->payload, loginData, sizeof(Login));

Jak to mówią: "więcej szczęścia niż rozumu". Nie rób tak nigdy. Przez przypadek to działa(ło) do tej pory, ale -- znając komputery -- rypsnie się, jak będzie potrzeba, żeby akurat było niezawodne. Zresztą, nie nazwałbym tego szczęściem, bo jak program działa, choć nie powinien, to raczej jest pech, bo puścisz takiego bubla dalej i dopiero będziesz miał zabawę, jak się komuś spali komputer albo i dom (UB) przez Twój program...

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