• 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

Cloud VPS
0 głosów
1,770 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.)
(*snack).brand alternatywnie.
komentarz 24 stycznia 2017 przez spvce Początkujący (260 p.)
W ten sposób rzeczywiście zadziała, jeżeli będę wprowadzał dane do strumienia wyjściowego.

Tutaj konkretnie chodzi mi o przypisanie wartości polu brandu w kodzie.
komentarz 24 stycznia 2017 przez spvce Początkujący (260 p.)
wejściowego *
komentarz 24 stycznia 2017 przez efiku Szeryf (75,160 p.)

(*snack).brand alternatywnie.

No nie za bardzo, bo walnie  błędem. 

Cin.get lepiej ;)

komentarz 24 stycznia 2017 przez unknown Nałogowiec (39,560 p.)

No nie za bardzo, bo walnie  błędem. 

Niby czemu i niby jakim? 

1
komentarz 24 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)
#include <iostream>
#include <cstdlib>
using namespace std;

struct Batonik
{
	char *brand;
	float weight;
	int kcal;
};

int main()
{

	Batonik * snack = new Batonik[3];

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

	cout << (*snack).brand << endl;
	cout << (*snack).weight << endl;
	cout << (*snack).kcal << endl;

	system("pause");
}

Masz, w ten sposób to zrób.

komentarz 24 stycznia 2017 przez spvce Początkujący (260 p.)
Dzięki piękne Evelek!
1
komentarz 24 stycznia 2017 przez efiku Szeryf (75,160 p.)
Nie w ten sposób.

http://cpp.sh/8a4xi

Pamiętajmy co robimy ;)

Tak specjalnie dałem jedynkę.
komentarz 24 stycznia 2017 przez spvce Początkujący (260 p.)
Sprawdzę i przeanalizuję rozwiązania jak tylko będę przy komputerze
komentarz 24 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)

Graty efik, nie zauważyłem, że tam jest Batonik[3]. smiley

komentarz 24 stycznia 2017 przez efiku Szeryf (75,160 p.)
Evelek, http://cpp.sh/3uodz ;)
komentarz 24 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)

Tylko czy kopiowanie typu char jest tu konieczne? To też jest poprawne przecież:

	snack[1].brand = "Snickers";

 

komentarz 24 stycznia 2017 przez unknown Nałogowiec (39,560 p.)
Jeśli brand jest typu char* to nie jest.
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,800 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,391 wizyt
pytanie zadane 3 lipca 2018 w C i C++ przez qlucha Obywatel (1,790 p.)
0 głosów
1 odpowiedź 2,985 wizyt
pytanie zadane 24 lipca 2017 w C i C++ przez Dooky Początkujący (480 p.)
0 głosów
1 odpowiedź 508 wizyt

93,454 zapytań

142,449 odpowiedzi

322,718 komentarzy

62,833 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

Kursy INF.02 i INF.03
...