Przypisanie do pola struktury danych z innej struktury

Odpowiedz Nowy wątek
2018-05-16 15:50
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.

Pozostało 580 znaków

2018-05-16 15:57
kq

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


Pozostało 580 znaków

2018-05-16 15:57
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?

edytowany 1x, ostatnio: Bartosz36, 2018-05-16 15:59
Pewnie używa jakiejś wariacji VLS (choć w C++ to UB), chociaż wprost tego nie napisał, i dziwne tagi jeśli tak robi. - kq 2018-05-16 16:04

Pozostało 580 znaków

2018-05-16 16:05
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

edytowany 2x, ostatnio: furious programming, 2018-05-16 16:47

Pozostało 580 znaków

2018-05-16 16:07
kq
0

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


Pozostało 580 znaków

2018-05-16 16:15
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

Pozostało 580 znaków

2018-05-16 17:12
0

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

Pozostało 580 znaków

2018-05-16 18:48
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...

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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