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

Wprowadzanie liczb do tablicy dynamicznej, zwiekszenie tablicy - C

0 głosów
2,224 wizyt
pytanie zadane 15 marca 2017 w C i C++ przez NyguseK Użytkownik (650 p.)

Witam. Chciałem napisać program, w którym użytkownik wprowadza liczbę do tablicy, a po wpisaniu liczby 0 funkcja wyswietla cala tablice. Poczatkowa wielkosc tablicy powinna wynosic 5. Problem w tym, ze przy dalszych indeksach program wypisuje niepoprawne wartosci. Byłby ktoś w stanie mi podpowiedzieć co mam tu zmienić?

 

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

void fill_array(int *array, int (*size))
{

    int i=0,a,n=1,j;

    while(a!=0)
    {
        if(i == (*size))
        {
            ++n;
            (*size) = n*5;
            printf("%rozmiar %d, \t rozmiar z n+1: %d", (*size), 5*(n+1));

            (array) = realloc((array),(*size)*sizeof(int));
            //for(j = (5*n); j<(5*(n+1)); ++j) array[j]=0; // z tym wierszem przy i = 10 wywala program

        }
        printf("\n%d: \t", i);
        scanf("%d", &a);
        array[i] = a;
        ++i;
    }

}


void print_array(int *array, int (*size))
{
    int i=0;
    for(i; i<(*size); ++i)
    {
        printf("[%d] %d \n",i, array[i]);
    }
}



int main(void)
{
    int *tab=NULL;
    int size = 5;
    tab = calloc(size, size*sizeof(int));
    fill_array(tab, &size);
    print_array(tab, &size);
    free(tab);
    return 0;
}



 

2 odpowiedzi

+1 głos
odpowiedź 15 marca 2017 przez tangarr Mędrzec (155,140 p.)
wybrane 16 marca 2017 przez NyguseK
 
Najlepsza
realloc nie zeruje pamięci.
komentarz 16 marca 2017 przez NyguseK Użytkownik (650 p.)
Ale to ma znaczenie tylko przy tych indeksach, do ktorych scanf nie dociera? Czemu przy wiekszych indeksach, indeksy 0 i 1 nie maja poprawnej wartosci?
komentarz 16 marca 2017 przez tangarr Mędrzec (155,140 p.)
Prawdopodobnie realloc przenosi twoją tablicę w inne miejsce pamięci.
Wskaźnik array w funkcji fill_array jest zmienną lokalną, dlatego przypisanie w 17 linii kodu nie ma wpływu na wskaźnik tab przekazywany do funkcji.
Musisz użyć wskaźniku na wskaźnik (int **array) i do funkcji przekazać adres wskaźnika tab (&tab)
komentarz 16 marca 2017 przez NyguseK Użytkownik (650 p.)
Wprowadzenie tych zmian po wpisaniu 0 wywala program :/
komentarz 16 marca 2017 przez tangarr Mędrzec (155,140 p.)
Pokaz kod
komentarz 16 marca 2017 przez NyguseK Użytkownik (650 p.)

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

int fill_array(int **array, int (*size))
{

    int i=0,a,n=1,j;


    while(a!=0)
    {
        if(i == (*size))
        {
            ++n;
            (*size) = n*5;
            printf("rozmiar %d, \t rozmiar z n+1: %d", (*size), 5*(n+1));

            (*array) = realloc((*array),(*size)*sizeof(int));
            //for(j = (5*n); j<(5*(n+1)); ++j) array[j]=0; // z tym wierszem przy i = 10 wywala program

        }
        printf("\n%d: \t", i);
        scanf("%d", &a);
        array[i] = a;
        ++i;
    }
    return i;

}


void print_array(int **array, int (*size))
{
    int i=0;
    for(i; i<(*size); ++i)
    {
        printf("[%d] %d \n",i, array[i]);
    }
}



int main(void)
{
    int ilosc;
    int *tab=NULL;
    int size = 5;
    tab = calloc(size, size*sizeof(int));
    fill_array(&tab, &size);
    print_array(&tab, &size);
    free(tab);
    return 0;
}
komentarz 16 marca 2017 przez tangarr Mędrzec (155,140 p.)

Nie poprawiłeś zapisywania i wczytywania danych z tablicy.

Poprawiony kod:
 

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

int fill_array(int **array, int (*size))
{
    int i=0,a,n=1;

    do
    {
        if(i == (*size))
        {
            ++n;
            (*size) = n*5;
            printf("rozmiar %d, \t rozmiar z n+1: %d", (*size), 5*(n+1));

            (*array) = realloc((*array),(*size)*sizeof(int));
            //for(j = (5*n); j<(5*(n+1)); ++j) array[j]=0; // z tym wierszem przy i = 10 wywala program

        }
        printf("\n%d: \t", i);
        scanf("%d", &a);
        (*array)[i] = a;
        ++i;
    }
    while(a!=0);
    return i;
}

void print_array(int **array, int (*size))
{
    int i=0;
    for(; i<(*size); ++i)
    {
        printf("[%d] %d \n",i, (*array)[i]);
    }
}

int main(void)
{
    int *tab=NULL;
    int size = 5;
    tab = calloc(size, size*sizeof(int));
    fill_array(&tab, &size);
    print_array(&tab, &size);
    free(tab);
    return 0;
}

 

komentarz 16 marca 2017 przez NyguseK Użytkownik (650 p.)
Wszystko działa. Dziękuję za pomoc :)
0 głosów
odpowiedź 15 marca 2017 przez Evelek Nałogowiec (28,960 p.)

Używasz niezdefiniowanej zmiennej a.

Podobne pytania

0 głosów
0 odpowiedzi 522 wizyt
0 głosów
2 odpowiedzi 1,404 wizyt
0 głosów
1 odpowiedź 1,594 wizyt

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,319 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...