Zmiana rozmiaru tablicy char* tab

Odpowiedz Nowy wątek
2020-05-05 16:25

Rejestracja: 9 miesięcy temu

Ostatnio: 3 miesiące temu

0

Witam. Mam napisać program, który każe użytkownikowi wpywać znaki, dopóki nie wpisze dwóch tych samych. Problem w tym, że tablica ma mieć na początek rozmiar 5 znaków, jeżeli użytkownik będzie wpisywał więcej znaków, mam zwiększyć rozmiar tablicy o 5. Funkcja, która jest za to odpowiedzialna, nie dziala jak powinna (gdy wypisuje elementy tablicy maksymalnie jest 8 znaków
Mój kod:


using namespace std;

char* resizeArray(char* old, int rozmiar){
    char* nowa = new char[rozmiar+5];

    for (int i = 0 ; i < rozmiar; i++){
        nowa[i] = old[i];

    }
    delete[] old;
    old = nowa;
    return old;
}

int main(){
    char znak;
    char* tablica = new char[5];
    char tmp = '\0';

    for(int i = 0 ; ; i++){
        cout << "Wpisz znak: ";
        cin >> znak;

        if (i > sizeof(tablica) / sizeof(tablica[1]) ){
            tablica =  resizeArray(tablica, sizeof(tablica) / sizeof(tablica[1]) );
        }
        if (znak == tmp){
            break;
        }
        tablica[i] = znak;
        tmp = znak;
    }

    for (int i = 0; i < sizeof(tablica) / sizeof(tablica[1]) ; i++){
        cout << tablica[i];
    }

}

Szukałem odpowiedzi ale nic nie znalazłem, stąd też moja prośba o pomoc.

Pozostało 580 znaków

2020-05-05 16:48

Rejestracja: 9 lat temu

Ostatnio: 1 godzina temu

0

Sprawdz wartosc sizeof(tablica).


przed i po wykonaniu funkcji jest rowna 8. To znaczy, że funkcja nie nie zmienia jej rozmiarów? - kacper123 2020-05-05 16:52

Pozostało 580 znaków

2020-05-05 16:52

Rejestracja: 7 lat temu

Ostatnio: 6 godzin temu

Operator sizeof na wskaźniku mówi jaka jest wielkość wskaźnika. To będzie 8 bajtów niezależnie od wielkości tablicy, na którą wskazuje ten wskaźnik. Musisz samemu pamiętać rozmiar.

Czyli rozmiar poczatkowy bedzie 20 bajtow? (5 charów *4 bajty) - kacper123 2020-05-05 16:54
Nie. Nie będzie. - Delor 2020-05-05 17:06
To bedzie 8 bajtow pod warunkiem ze architektura docelowa jest 64 bitowa. - vpiotr 2020-05-05 18:20
@vpiotr: tak, ale myślę, że to jest wystarczające uproszczenie na tym poziomie (szczególnie, że o 32-bitowy sprzęt coraz trudniej, trzeba patrzeć na ARMy czy MIPSy) - enedil 2020-05-05 18:47

Pozostało 580 znaków

2020-05-05 17:20

Rejestracja: 1 rok temu

Ostatnio: 12 godzin temu

1

Zamiast początkującym tłumaczyć do czego służy sizeof, prościej jest powiedzieć wprost, że

SIZEOF NIE SŁUŻY DO SPRAWDZANIA ROZMIARU TABLICY

Ja jeszcze dodaję, że każdemu kto tego w ten sposób użyje w programie oddanym do oceny postawię 2.0, no ale ja wredny jestem ;)

Pokaż pozostałe 5 komentarzy
W C sizeof ma zastosowanie, w C++ jest std::size dla rozmiaru kontenera. Chociaż jeśli się czepiać słówek, to sizeof służy właśnie do sprawdzania rozmiaru tablicy, a nie np. wskaźnika, jak tu to zrobiono :​) - kq 2020-05-05 21:15
Std::size wyglada spoko tylko trzeba wspomniec ze to od C++17 - vpiotr 2020-05-05 21:28
Jak wspominamy o C++17 to możemy od razu wspomnieć, że mamy 2020 :+) (ale racja, niech będzie. Ale newb niech się uczy na nowym toolchainie, a jak ktoś jest bardziej doświadczony to i tak takie rzeczy wie) - kq 2020-05-05 21:42
Żeby się mógł uczyć musi ten toolchain odpowiednio odpalić bo niestety przynajmniej gcc/g++ wg moich testów (na tym domyślnym w OS - Linux Mint 19.3 to g++ 7.5) sam z siebie nie kompiluje C++17 (wymagane są dodatkowe parametry: https://4programmers.net/Pastebin/15662), a np. taki ideone w ogóle nie supportuje tego standardu. To chyba główny powód dla którego od któregoś tam standardu część ludzi podaje w którym to standardzie działa - tak z czystej uprzejmości dla newb. - vpiotr 2020-05-05 23:44

Pozostało 580 znaków

Odpowiedz

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