logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Tworzenie zmiennych przez program ??

maly_elektronik 09 Sie 2008 19:27 5079 8
  • #1 5424469
    maly_elektronik
    Poziom 23  
    Witam
    Czy jest możliwość aby program sam sobie tworzył zmienne :?: Bo potrzebowałbym aby w pętli która powtarza się x razy program stworzył x zmiennych np o nazwie zmienna0, zmienna1, ...zniennaX
    Oczywiście wszystko w C i dla avr
  • #2 5424643
    Osmo
    Poziom 18  
    Hmm, mysle ze najprostrzym rozwiązaniem bedzie zastosowanie tablicy i dodawanie kolejnych indeksów do niej.

    Nie wiem dokładnie jak to jest w C na uC, ale na PC mozna bez problemu dodawać kolejne indeksy, nie deklarując wczesniej jej rozmiaru, załatwia to kompilator.
  • #3 5424670
    __Grzegorz__
    Poziom 30  
    Proponuję poczytać o instrukcji malloc :)
  • #4 5425143
    Osmo
    Poziom 18  
    Słuszna uwaga, w mikrokontrolerach jestem nowy, wiec nie chce tu wypisywać głupot, czy wprowadzać kogos w bład.
    Jesli chodzi o PC, tu nie mamy problemów z ograniczeniem miejsca na zmienne, natomiast uC stawia pewne ograniczenia.
    Po bliższym zapoznaniu sie z instrukcją malloc i 'spokrewnionymi' mysle ze problem mozna łatwo rozwiązac przy uzyciu tablic. Jako ze pętla powtarza się x razy, liczba kolejnych indeksów jest wiadoma i mozesz łatwo 'zarezerwowac' miejsce dla kolejnych zmiennych w tablicy (jak rozumiem liczba powtórzeń jest z góry założona i nie zmienia sie w czasie wykonywania pętli).
  • #5 5425165
    Dr.Vee
    VIP Zasłużony dla elektroda
    Witam,

    Zmiennych się nie tworzy, tylko deklaruje.
    Jeśli wiesz, ile maksymalnie razy wykona się pętla, to użyj tablicy:

    char tablica[ROZMIAR];
    int i;
    for (i = 0; i < ROZMIAR; ++i)
        tablica[i] = ...

    Oczywiście ROZMIAR nie może być zmienną.

    Jeśli nie wiesz, albo Ci szkoda tyle pamięci na raz, to tablicę przydziel dynamicznie -> funkcje malloc(), calloc(), lub alloca():

    char *tablica;
    ...
    tablica = malloc(rozmiar);
    for (i = 0; i < rozmiar; ++i)
        tablica[i] = ...
    ...
    free(tablica);

    Tutaj rozmiar może być np. przkazany jako zmienna do funkcji.

    Pozdrawiam,
    Dr.Vee
  • #7 5428403
    BoskiDialer
    Poziom 34  
    Dr.Vee napisał:
    char tablica[ROZMIAR];
    int i;
    for (i = 0; i < ROZMIAR; ++i)
        tablica[i] = ...

    Oczywiście ROZMIAR nie może być zmienną.

    Jesteś tego pewien? Ja zrobiłem u siebie mały test, w samym środku funkcji wstawiłem tablicę o rozmiarze ustalanym przez zmienną (nie można wartości ustalić w czasie kompilacji, sama tablica nie może być usunięta przy optymalizacji) i oto co uzyskałem w środku funkcji:
    	in r24,__SP_L__
    	in r25,__SP_H__
    	sub r24,r17
    	sbc r25,__zero_reg__
    	in __tmp_reg__,__SREG__
    	cli
    	out __SP_H__,r25
    	out __SREG__,__tmp_reg__
    	out __SP_L__,r24
    	in r22,__SP_L__
    	in r23,__SP_H__
    	subi r22,lo8(-(1))
    	sbci r23,hi8(-(1))

    Czyli na stosie jest alokowana tablica o rozmiarze zależnym od wartości zmiennej. Zrobiłem też test, gdzie tablica wychodzi poza zakres, wtedy ramka stosu jest zmniejszana.
  • #9 5429483
    Dr.Vee
    VIP Zasłużony dla elektroda
    Witam,

    Tak domykając offtopic - oczywiście w ANSI C (C89) tego rodzaju konstrukcje są zabronione. Tablice VLA zostały wprowadzone w standardzie C99, więc oczywiście (przy odpowiednich lub nawet domyślnych opcjach) kompilator Boskiego Dialera może takie tablice wspierać. Prawdopodobnie ich implementacja jest taka sama, jak funkcji alloca().

    Pozdrawiam,
    Dr.Vee
REKLAMA