Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[C] Tworzenie zmiennych przez program ??

maly_elektronik 09 Aug 2008 19:27 4725 8
  • #1
    maly_elektronik
    Level 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
    Osmo
    Level 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.
  • #4
    Osmo
    Level 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
    Dr.Vee
    VIP Meritorious for electroda.pl
    Witam,

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

    Code:
    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():

    Code:
    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
    BoskiDialer
    Level 34  
    Dr.Vee wrote:
    Code:
    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:
    Code:
       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
    Dr.Vee
    VIP Meritorious for electroda.pl
    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