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

Tworzenie tablic bez podawania indeksów.

Object Storage Arubacloud
0 głosów
384 wizyt
pytanie zadane 20 lipca 2017 w C i C++ przez amited Początkujący (470 p.)

Próbuję napisać program, który pobiera od użytkownika wpisane liczby, zapisuje je w tabeli i liczy ich średnią. Tyle, że nie podaję ilości indeksów ponieważ chcę jak najmniej pamięci zabrać. Więc zastosowałem strukturę. Problem w tym że wpisuję sobie ileś liczb, wpisuję 's' (bez różnicy jaki to byłby znak) i tutaj wywala błędy. Jeżeli nie macie możliwoścu skompilować kodu to tutaj co wpisuję "1,2,3,4,s" (, to enter:)), oto wynik w konsoli:

http://wklej.org/id/3221977/

A tutaj kod:

#include <iostream>

using namespace std;

int liczbaWpisana;
int iloscLiczb=0;
int iloscIndeksow=0;
int suma;
struct licz
{
    int tablica[];
};

int main()
{
    licz dodaj;

    for(;;)
    {
        cin>>liczbaWpisana;
        if(!cin)//jezeli nie wpisze sie liczby
            break;
        else
        dodaj.tablica[iloscIndeksow]=liczbaWpisana;
        iloscIndeksow++;
        iloscLiczb++;
    }

    cout<<"Indeks 0: "<<dodaj.tablica[0]<<endl;
    cout<<"Indeks 1: "<<dodaj.tablica[1]<<endl;
    cout<<"Indeks 2: "<<dodaj.tablica[2]<<endl;
    cout<<"Indeks 3: "<<dodaj.tablica[3]<<endl;
    cout<<"Ilosc liczb: "<<iloscLiczb<<endl;

    for(int i=0;i<iloscLiczb;i++)
    {
        cout<<"Indeks: "<<i<<" wartosc: "<<dodaj.tablica[i]<<endl;
    }
    return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 20 lipca 2017 przez draghan VIP (106,230 p.)

Tyle, że nie podaję ilości indeksów ponieważ chcę jak najmniej pamięci zabrać. Więc zastosowałem strukturę.

Ummm... Jesteś pewien, że wiesz co robisz?

Generalnie to Twój kod jest błędny. Nie wiem, skąd pomysł że umieszczając deklarację tablicy w strukturze, otrzymasz tablicę automatycznie rozszerzalną. Dlaczego nie zastosujesz, np. std::vector?

komentarz 20 lipca 2017 przez amited Początkujący (470 p.)
Moim 1. pomysłem było wprowadzanie danych do struktury, i z niej do dynamicznej tabeli o ilości indeksów zmiennej "iloscIndeksow". Nie wychodziło mi to i zmieniałem kod do tego momentu. A jako że nie uczyłem się vectorów to myślałem że takie coś przejdzie. Jest możliwość zrobienie tego bez vectora? Oraz dlaczego indeks 0 ma wartość 0 skoro przed pętlą miał wartość 1? Do cpp powracam po 3-4 latach, więc już dużo zapomniałem.
komentarz 20 lipca 2017 przez draghan VIP (106,230 p.)

Rozumiem, że nie chcesz skorzystać z mechanizmów biblioteki standardowej (nie wiem, dlaczego ale to nie moja sprawa).

Możesz to zrobić, ręcznie zarządzając pamięcią. W momencie kiedy zapotrzebowanie na miejsce wzrośnie, musisz zaalokować nowy obszar pamięci, przepisać wartości ze starego obszaru (jeśli jakieś są), zwolnić stary obszar pamięci.

W najbardziej naiwnym przypadku możesz dokonywać takiej operacji co każdy dołożony element, ale to mało efektywne. Zazwyczaj rezerwuje się trochę zapasowego miejsca, żeby nie dokonywać alokacji, kopiowania i dealokacji co każdy jeden element tablicy.

Generalnie w celach dydaktycznych to jak najbardziej dobra sprawa, jednak dla jakiegoś poważniejszego użytku zalecam wykorzystać dobrodziejstwa std. ;) To naprawdę nie boli. :)

dlaczego indeks 0 ma wartość 0 skoro przed pętlą miał wartość 1

Zapewne jest to związane z naruszeniem pamięci - piszesz do obszarów, do których de facto nie powinieneś i mogą się dziać "nieprzewidziane" rzeczy (przypominam, że Twoja deklaracja tablicy i operacje na niej są błędne). Stawiam na to, że tablica[0] w pętli pokazuje Ci wartość zmiennej i, jako że może to być pierwsza zmienna w bloku pamięci zaraz za strukturą dodaj. Dla testów możesz w każdym obiegu pętli wypisywać dodatkowo wartość tablica[0] i potwierdzić / obalić moje przypuszczenia.

komentarz 20 lipca 2017 przez amited Początkujący (470 p.)
edycja 20 lipca 2017 przez amited
Jest błędna? Operacje również? Więc gdzie leży błąd?

 

edit

Cóż po przeczytaniu czym jest vector to zrozumiałem o co chodzi. Nie było tego kiedy się uczyłem a to co robię to coś w stylu zadania domowego po tym jak przerabiałem tablice, strukruty, unie itp. więc myślałem że to jest wyjście.
komentarz 21 lipca 2017 przez draghan VIP (106,230 p.)
edycja 21 lipca 2017 przez draghan

Jest błędna? Operacje również? Więc gdzie leży błąd?

Jest błędna, ponieważ standard C++ wymaga podania rozmiaru tablicy statycznej*. Twój kod nie kompiluje się na GCC 6.3 (-std=c++1z), powodem jest właśnie linia:

struct licz
{
    int tablica[];
};

Domyślam się, że przez niektóre kompilatory może to być potraktowane jak deklaracja tablicy o liczbie elementów równej 0. I dalej: nie została zaalokowana pamięć dla żadnego z elementów tablicy, więc każda operacja zapisu/odczytu z niej jest niepoprawna.


*- w zasadzie to nie do końca prawda (patrz paragraf Arrays of unknown bound). Niemniej pamięć dla elementów tak czy inaczej nie została w tym momencie zaalokowana.

Podobne pytania

0 głosów
1 odpowiedź 849 wizyt
0 głosów
0 odpowiedzi 155 wizyt
0 głosów
1 odpowiedź 169 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...