Skocz do zawartości

C++


Mentoss

Rekomendowane odpowiedzi

Z moim poprzednim problemem udało mi się już na szczęście poradzić, jednak moje szczęście nie trwało długo.

1.)

class plr
{
    public:
        bool jest;
        double sck;
        char* imie[];
};

int main()
{
    int i;
    plr gracz[5];
    for(i=0;i<5;i++)
    {
        gracz[i].jest=false;
        gracz[i].imie[0]="PLEJER";
    };

i mam genialny efekt - gracze od 0 do 3 włącznie mają w nazwę ustawione domyślnie libgcj_s.dll. Ktoś wie dlaczego?

Odnośnik do komentarza
Udostępnij na innych stronach

class plr
{
    public:
        bool jest;
        double sck;
        char* imie;
};

int main()
{
    int i;
    plr gracz[5];
    for(i=0;i<5;i++)
    {
        gracz[i].jest=false;
        gracz[i].imie="PLEJER";
    };

 

Może tak?

Odnośnik do komentarza
Udostępnij na innych stronach

Zamiast operować na char*, użyj std::string

Odnośnik do komentarza
Udostępnij na innych stronach

Ale z czym problem bo nie rozumiem? Rzutowanie (char*) i tyle to normalne działanie. Jeśli jest z tym jakiś problem to można od razu pojechać z jakaś funkcja do wysyłania, które operuje na czystych bajtach writeBytes czy coś podobnego. To, że jest char a nie const char to wina twórcy dll bo powinno być const.

 

Dodatkowo Mentoss w jakim środowisku pracujesz? Bo jak na moje oko to ten kod w ogóle nie powinien przejść przez proces kompilowania. Powinno wywalić coś z zero sized arrays. Oczywiście kod Skowrona też się nie skompiluje bo jest błędny, do jednego elementy tablicy o wielkość bajta nie można wpakować kilkunastu.

Odnośnik do komentarza
Udostępnij na innych stronach

Z Code::Blocks -a korzystam i oprócz warnów " warning: deprecated conversion from string constant to 'char*' " nie wywala nic. Przynajmniej teraz. Miałem jeszcze parę innych błędów, ale pogooglałem, popoprawiałem literówki i działa.

Przestań korzystać 0.0 Jeśli ten kod z pierwszego posta przechodzi to strach się bać co jeszcze ten CB nie łapie.

 

btw Kod skowrona jest dobry, nie zauważyłem, że zmienił też deklaracje. mea culpa.

Odnośnik do komentarza
Udostępnij na innych stronach

Coś ci się chyba pokręciło tam jest i<5 czyli tablica będzie od 0 do 4 czyli tak jak powinno

 

no chyba że mówisz o czymś innym. Ale nie wiem nie jestem programistą :P

 

Pisałem o wewnętrznej tablicy ;) Chodziło o to: gracz.imie[0]="PLEJER"; Nie o samo odwołanie gracz tylko dalszą część.

Odnośnik do komentarza
Udostępnij na innych stronach

a niby czemu to jest źle. Zmieniam wartości w tablicy, której pierwszy element mieści się w gracz.imie[0]. Wszystko jest ok.

A w, którym miejscu ustawiasz rozmiar tej tablicy? Można założyć, że kompilator CB wrzuci tam jedynkę jeśli tablica jest pusta ale to jest co najmniej dziwne. Nawet jeśli to powinien wypluć warning o tym informujący.

Odnośnik do komentarza
Udostępnij na innych stronach

Też nie widzie w tym nic nadzwyczajnie dziwnego po prostu tablica której wielkość została automatycznie zadeklarowana od długości znaków

 

nic w tym nowego ani nadzwyczajnego

 

choć wiem że w visual c++ by to pewnie nie przeszło, dla mnie porypany kompilator/środowisko programistyczne/IDE ale każdy używa to co lubi :)

 

o gustach się nie dyskutuje.

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra:

 

to:

char* imie[];

jest różne od:

char* (imie*)[];

 

Trzeba poczytać o zmiennych alokowanych na stosie i na stercie. Nie ma żadnej magicznej alokacji dla tablicy charów bo niczym się nie różni od innych tablic, dla samego ciągu znaków to już inna sprawa. Ja nie piszę o alokacji dla ciągu znaków tylko dla tablicy będącej własnością klasy.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...