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

question-closed Dynamiczna tablica (automatycznie zwiększa swoją pojemność) język C

Object Storage Arubacloud
0 głosów
679 wizyt
pytanie zadane 4 marca 2018 w C i C++ przez Bartek Kotarski Początkujący (480 p.)
zamknięte 4 marca 2018 przez Bartek Kotarski

Witam

Próbuję zrobić program, który będzie automatycznie powiększał tablice (buffer) o 5 kolejnych miejsc, czyli użytkownik będzie wprowadzał liczby i jeśli wprowadzi ich więcej niż 5 to tablica się zwiększy, więc będzie 10 elementowa(tak do nieskończoności co 5). Udało mi się to już osiągnąć, aczkolwiek chce również podzielić cały program na funkcje. Pojawił się tu problem, ponieważ jeśli wyświetlanie dam w funkcji wpisywanie to wszystko działa okej, ale jeśli tak jak tutaj podzieliłem je na dwie osobne to jakby po wykonaniu funkcji wpisywanie w main zmienna "buffer" się nie powiększała, tylko dalej była 5 elementowa. Ma ktoś jakiś pomysł ?

#include <stdio.h>
#include <stdlib.h>

void wpisywanie(size_t rozmiar, int *buffer)
{
    size_t maximumLength = rozmiar;

    int liczba;
    int i = 0; // zmienna sterujaca

     while(liczba != 0)
    {
        printf("Podaj liczbe: ");
        scanf("%d", &liczba);

        if(i == maximumLength)
        {
            int *newBuffer = realloc(buffer, (maximumLength = maximumLength + rozmiar) * sizeof (*buffer) );
            if (!newBuffer)
            {
                free(buffer);
                perror("blad realloc");
            }
            buffer = newBuffer;
        }

        buffer[i++]=liczba;
    }


}


void wyswietlanie(int *array)
{
    int i = 0;
    while(array[i] != 0)
    {
        printf("%d ",array[i]);
        i++;
    }
}




int main()
{
    const size_t rozmiar = 5; //poczatkowy rozmiar
    int *buffer;
    buffer = (int*)malloc(rozmiar * sizeof(*buffer));//oblicza potrzebną wielkość tablicy. Dla każdej zmiennej int potrzebujemy tyle bajtów, ile zajmuje ten typ danych



    wpisywanie(rozmiar,buffer);
    wyswietlanie(buffer);

    free(buffer);

    return 0;
}

 

komentarz zamknięcia: Rozwiązanie problemu

1 odpowiedź

+1 głos
odpowiedź 4 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 4 marca 2018 przez Bartek Kotarski
 
Najlepsza
Wskaźnik to zwykła zmienna. Musisz przesłać jej adres, aby ją zmodyfikować. Czyli drugi argument funkcji wpisywanie musi być podwójnym wskaźnikiem, a przy wywoływaniu tej funkcji przesyłaj adres wskaźnika.
komentarz 4 marca 2018 przez Bartek Kotarski Początkujący (480 p.)

Poprawiłem tak jak Pan napisał, ale teraz kiedy chce wprowadzić 3 liczbę od razu wyskakuje błąd.

#include <stdio.h>
#include <stdlib.h>

void wpisywanie(size_t rozmiar, int **buffer)
{
    size_t maximumLength = rozmiar;

    int liczba;
    int i = 0; // zmienna sterujaca

     while(liczba != 0)
    {
        printf("Podaj liczbe: ");
        scanf("%d", &liczba);

        if(i == maximumLength)
        {
            int *newBuffer = realloc(buffer, (maximumLength = maximumLength + rozmiar) * sizeof (*buffer) );
            if (!newBuffer)
            {
                free(buffer);
                perror("blad realloc");
            }
            *buffer = newBuffer;
        }

        *buffer[i++]=liczba;
    }


}


void wyswietlanie(int *array)
{
    int i = 0;
    while(array[i] != 0)
    {
        printf("%d ",array[i]);
        i++;
    }
}




int main()
{
    const size_t rozmiar = 5; //poczatkowy rozmiar
    int *buffer;
    buffer = (int*)malloc(rozmiar * sizeof(*buffer));//oblicza potrzebn¹ wielkoœæ tablicy. Dla ka¿dej zmiennej int potrzebujemy tyle bajtów, ile zajmuje ten typ danych



    wpisywanie(rozmiar,&buffer);
    wyswietlanie(buffer);

    free(buffer);

    return 0;
}

 

komentarz 4 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)
int liczba;
int i = 0; // zmienna sterujaca

while(liczba != 0)
{

Nie używaj zmiennych lokalnych bez nadanej wartości. Takowa zmienna zawiera śmieci i może być powodem błędów. Jeśli chcesz wyjść z pętli po wprowadzeniu zera, zastosuj pętlę do-while.

int *newBuffer = realloc(buffer, (maximumLength = maximumLength + rozmiar) * sizeof (*buffer) );

Używasz złych parametrów funkcji realloc. W pierwszym musi być *buffer, zaś w drugim zamień sizeof(*buffer) na sizeof(**buffer) lub po prostu sizeof(int).

free(buffer);

Tu dokładnie to samo. Powinieneś też zakończyć tutaj cały program. Przecież wtedy zwalniasz całą pamięć i reszta kodu nie ma racji bytu.

*buffer[i++]=liczba;

Operator [] ma wyższy priorytet niż *.

1
komentarz 4 marca 2018 przez Bartek Kotarski Początkujący (480 p.)
Zamykam temat, program jest dobrze napisany. Problem był jedynie na moim komputerze, ponieważ kiedy pracowałem nad programem nie używałem na końcu funkcji free(...) , dopiero kiedy skończyłem program go dodałem. Przez to wskazywało cały czas na te zajęte już adresy i wychodziły błędy. Reset komputera wyczyścił zajęte komórki i teraz program się poprawnie kompiluje. Dziękuję za pomoc, bo faktycznie lepiej to chodzi z pętlą do i zainicjowaną zmienną liczba.

Pozdrawiam
komentarz 4 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)

Zamykam temat, program jest dobrze napisany. 

No niezbyt, jeśli nie zastosowałeś się do moich porad (mogłem coś pominąć, ale wątpię). 

Przez to wskazywało cały czas na te zajęte już adresy i wychodziły błędy. Reset komputera wyczyścił zajęte komórki i teraz program się poprawnie kompiluje.

Jak to jest możliwe? Wszelkie dzisiejsze systemy operacyjne czyszczą zasoby po zakończeniu procesu. Na jakiej ty pracujesz konfiguracji? 

Podobne pytania

0 głosów
1 odpowiedź 687 wizyt
pytanie zadane 4 stycznia 2016 w C i C++ przez sympi Nowicjusz (240 p.)
0 głosów
3 odpowiedzi 1,537 wizyt
pytanie zadane 17 października 2015 w C i C++ przez Ehlert Ekspert (212,670 p.)
+1 głos
4 odpowiedzi 4,662 wizyt
pytanie zadane 14 września 2015 w C i C++ przez Wojtek Wiedeński Bywalec (2,460 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...