• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dynamiczna alokacja tablicy struktur a obiekt char

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,748 wizyt
pytanie zadane 24 stycznia 2017 w C i C++ przez spvce Początkujący (260 p.)

Witam!

Stworzyłem dynamicznie zaalokowaną tablicę struktur, w których to strukturach jedno z pól stanowi tablica znaków char o wielkości 20.

Gdy próbuję odwołać się do tego pola (przyjmując że snack to adres pierwszej struktury = &snack[0]) używając operatora -> i przypisać temu polu łańcuch napisowy, kompilator pokazuje następujący błąd:

incompatible types in assignment of 'const char [9]' to 'char [20]'|

Rozumiem, że napisy w programie są zapisywane jako stałe, przy czym ten ma długość 8 znaków + znak NULL, czyli razem 9. Co zrobić w takim razie by używając tablicy char przypisać temu polu napis?

Dodam, że użycie klasy string w strukturze rozwiązuje cały problem, lecz zastanawia mnie co robię źle w tym przypadku.

snack->weight i snack->kcal działają poprawnie.
 

#include <iostream>

struct Batonik
{
    char brand[20];
    float weight;
    int kcal;
};

int main()
{
    using namespace std;

    Batonik * snack = new Batonik [3];

    snack->brand = "Snickers";
    snack->weight = 45.5;
    snack->kcal = 220;

    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 24 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)
wybrane 24 stycznia 2017 przez spvce
 
Najlepsza
cin.get(snack->brand, 20); spróbuj w ten sposób.
komentarz 24 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)
No zgadza się efik, nazwa struktury to jej pierwszy element. :)

EDIT. (W tym wypadku to w sumie wskaźnik, nie nazwa struktury).
komentarz 24 stycznia 2017 przez spvce Początkujący (260 p.)
Stała łańcuchowa "Snickers" jest tak naprawdę adresem, wiec myślę ze można to przypisać do pola typu char* struktury Batonik
komentarz 24 stycznia 2017 przez efiku Szeryf (75,160 p.)

To w takim razie dlaczego dostajemy ostrzeżenie:

warning: deprecated conversion from string constant to 'char*'

2
komentarz 24 stycznia 2017 przez unknown Nałogowiec (39,560 p.)
Powinien być nawet error ale gcc jest bardzo łaskawy.
komentarz 24 stycznia 2017 przez spvce Początkujący (260 p.)
Rzeczywiście "Snickers" jest stała wartością występująca w kodzie i przypisanie tej stałej do wskaźnika nie jest dobrym pomysłem. Utworzenie w tym celu zmiennej text i przypisanie wskaźnikowi brand jej adresu może się okazać lepszym wyjściem.
+1 głos
odpowiedź 24 stycznia 2017 przez mokrowski Mędrzec (158,660 p.)

Skompiluj program zgodnie ze standardem C++11 i zamiast inicjalizować pola "na piechotę", możesz zrobić tak:

*snack = {"Snickers", 45.5, 220 };

 

komentarz 24 stycznia 2017 przez spvce Początkujący (260 p.)
Owszem, próbowałem tak zrobić lecz jeszcze gdy miałem char brand[20] w kodzie i wyskakiwał problem "'const char [9]' to 'char [20]'|", co skłoniło mnie do rozbicia tego na pojedyncze przypisania by sprawdzić co jest nie tak.

Podobne pytania

0 głosów
2 odpowiedzi 1,389 wizyt
pytanie zadane 3 lipca 2018 w C i C++ przez qlucha Obywatel (1,790 p.)
0 głosów
1 odpowiedź 2,979 wizyt
pytanie zadane 24 lipca 2017 w C i C++ przez Dooky Początkujący (480 p.)
0 głosów
1 odpowiedź 504 wizyt

93,440 zapytań

142,431 odpowiedzi

322,679 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...