malloc, wielkosc tablicy

0

Cześć! Od godziny męczę się ze znalezieniem wielkości tablicy dynamicznej. Mój kod:

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


int size_1 = 0;
int size_2 = 0;
int i = 0;


void insert(int x, int Q[]){
    
    
    if(size_1 == 0){
        *(Q+size_1) = x;
        ++size_1;
    }
    else{
        for(i = 0; i < size_1; ++i){
            if( *(Q+i) == x ){
                break;
            }
            
            if( size_1-1 == i ){
                *(Q+size_1) = x;
                ++size_1;
            }
        }
        
    }
    
    
    

}


int main() {

    int *Q, *S;
    Q = malloc(size_1 * sizeof(int));
    S = malloc(size_1 * sizeof(int));
    

    
    
    
    insert(1, Q);
    insert(2, Q);



    
}


Z tego co wyczytałem to nie da się pobrać wielkości tablic dynamicznych więc w jaki sposób to obejść? W przypadku gdy chcę uzyc insert(1,S) (czyli wrzucenie czegoś do innej tablicy niż Q) potrzebuję jej wielkość w funkcji insert, aby program dobrze działał.

Próbowałem strukturami, ale jakoś nie widzę rozwiązania.. Jakieś dziwne skomplikowane porównania też pewnie sensu nie będą miały i będą zawierały wiele wyjątków..

Nie mogę też dodać nowego parametru do funkcji insert. Jedynymi argumentami są insert( LICZBA, NAZWA TABLICY ).
Jakieś propozycje?

1

musisz podac ilosc itemkow w tablicy jako argument funkcji, jedynym wyjatkiem jest char* bo ostatnim znakiem jest NULL.
a btw to nie mam zielonego pojecia co probujesz sworzyc w tym kodzie. jestem przekonany ze to co chcesz osiagnac mozna zrobic znacznie prosciej

0

Nie bardzo rozumiem, co do pierwszego pytania... czy nie możesz użyć operatora sizeof?

0
Craith napisał(a):

musisz podac ilosc itemkow w tablicy jako argument funkcji, jedynym wyjatkiem jest char* bo ostatnim znakiem jest NULL.
a btw to nie mam zielonego pojecia co probujesz sworzyc w tym kodzie. jestem przekonany ze to co chcesz osiagnac mozna zrobic znacznie prosciej

Mam za zadanie zrobić funkcje dzięki której będę mógł do tablicy wpisywać ciągi liczb. Do wykonania jest kilka operacji typu insert, delete, merge, print itd.

Gdybym operował tylko na 1 tablicy to byłoby wszystko ok, ponieważ jej wielkość przechowywałbym sobie gdziekolwiek chcę. Sęk w tym, że mam ich kilka i np. dla:

insert(Q,1); insert(Q,2);

Zmienna: size_1 będzie miała wartość 2 przez co:
insert(S,1); da mi rezultat:

S[0] = 0;
S[1] = 0;
S[2] = 1;

Zamiast

S[0] = 1;

I dalej zmienna size_1 bedzie znowu wieksza o 1 i operacja na tablicy Q znowu bedzie wariować. Aby to wyeliminować potrzebuję zdobyć ROZMIAR tablicy dynamicznej i uzywać jej w funkcji insert zamiast zmiennej size_1.

Czy wszystko teraz jasne? :P

Nie mogę użyć operatora sizeof, ponieważ nie działa on na tablice dynamiczne:

You can't. You have to pass the length as a parameter to your function. The size of a pointer is the size of a variable containing an address, this is the reason of 4 ( 32 bit address space ) you found

0

... w tym cytacie masz opisane jak masz to zrobić... i po co ci te zmienne globalne? ZAZWYCZAJ możesz zrobić to samo bez globali, podając zmienne jako argumenty funkcji...

0

W zadaniu mam zaznaczone, że tak mają wygladać argumenty i koniec kropka. Wymyśliłem inny sposób. Struktura tablicy ( tab adress/tab size ) i wpisywanie adresu tablicy. Do zamkniecia.

2

Zawsze możesz sobie napisać taki wrapper, który będzie przechowywał dla ciebie wskaźnik do tablicy oraz jej rozmiar w postaci struktury:

#include <stdio.h>

struct wrapper{
    int size;
    int *array;
    int count;
};

void insert(int value, struct wrapper *tab){
    if(tab->count < tab->size){
        tab->array[tab->count] = value;
        tab->count ++;
    }
}

int main() {
    int size = 10;
    int tab[size];

    struct wrapper arr;
    arr.size = size;
    arr.array = tab;
    arr.count = 0;


    // TEST
    int i;
    for(i = 0; i < arr.size; i++){
        insert(i, &arr);
        printf("%d\n", arr.array[i]);
    }

    return 0;
}

Kiedy taką strukturę przekażesz przez wskaźnik do funkcji to będziesz miał rozmiar tablicy w polu size, jak w przykładzie. Twoje założenie będzie wtedy ok, bo ilość argumentów funkcji insert pozostanie niezmieniona względem treści zadania.

EDIT: Eeee się napisałem... autor sam na to wpadł :) ...a już niech zostanie.

0

Dzięki Grzesiek! Doceniam. :)

Już prawie doszedłem do konca, został mi tylko jeden problem. Aktualnie przechowuję w strukturze:

 typedef struct{
    int **tab_adress;
    int tab_size;
}sizes;
 sizes sizeofTab[3];

2 dane - adres tablicy oraz jej rozmiar. Potrzebuję teraz zrobić tak aby ta funkcja:

int size(int Q[]){
    
    return sizeofTab[0].tab_size;

} 

Odczytywała tab_size dla adresu tablicy Q.

Probowałem różne cuda typu:

 int size(int Q[]){
    for (i = 0; i<3; ++i){
if(sizeofTab[i].tab_adress == &Q){
    return sizeofTab[i].tab_size; }
else return 0;

}

Ale bez wiekszych efektow. Szukam ciagle jak poprawnie pobrac adres podanego argumentu w tablicy. Mozecie jakos naprowadzic? A moze w porownianiu jest jakis problem w przypadku wskaznikow?

Mam tylko 3 tablice, ktore wprowadzam do tej funkcji dlatego i < 3. Musi rozpoznac o ktora tablice chodzi na podstawie jej adresu.

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