Mały kąsek informacji dotyczący tworzenia tablic w języku C (gdyby ktoś chciał poznać tablicę gruntownie od teoretycznej strony, zapraszam tutaj). Mimo tego, że przedstawiona tutaj metoda wprowadzania argumentów może jedynie komplikować, to chcę żebyście i tak byli poinformowani o takiej możliwości. Standard języka wprowadzony w 1999 roku przez ISO udostępnia drugi sposób. Po raz kolejny pokażę dwa sposoby celem porównania. Zobaczymy jak wygląda "tradycyjna" tablica w języku C, a potem drugą opcjonalną metodą od standardu C99.
Tweet |
TABLICA W JĘZYKU C MOŻE BYĆ ZDEFINIOWANA NA DWA SPOSOBY
SPOSÓB TRADYCYJNY
Najpierw zaczniemy od ukazania tej pierwszej i częściej używanej metody. Poniższy kod źródłowy przedstawia tworzenie i definiowanie tablicy pięciu liczb całkowitych:
#include <stdio.h>
#define SIZE 5
int main(void)
{
int numbers[SIZE] = {3, 13, 5, 67, -89}; // tablica w języku C wg ANSI C
for (int i = 0; i < SIZE; ++i)
{
printf("numbers[%d] = %d\n", i, numbers[i]);
}
getchar();
return 0;
}
Darowałem sobie osadzenie wypisywania argumentów do osobnej funkcji, aby już nie cudować. Na samym początku funkcji "main" tworzona jest tablica w języku C według standardu ANSI C z 1989 roku. "Zabezpieczamy się" poprzez korzystanie ze stałej wyznaczającej granicę tablicy (dyrektywa "define") i wprowadzamy w klamerkach jedną wartość po drugiej. Proste i zrozumiałe. Dodatkowa informacja jest taka, że nie musimy podawać wszystkich wartości na tym etapie. Wówczas każdy pominięty argument otrzyma wartość równą zero i nawet nie będzie niezdefiniowanego zachowania. Grunt, żeby nie zostawiać tablicy kompletnie bez inicjalizacji, bo wtedy pojawiają się kłopoty.
SPOSÓB STANDARDU C99
A tak wygląda drugi sposób istniejący od 1999 roku (co z tego, że ma już ponad dwadzieścia lat :D?):
#include <stdio.h>
#define SIZE 5
int main(void)
{
int numbers[SIZE] = {[0] = 3, [1] = 13, [2] = 5, [3] = 67, [4] = -89}; // tablica w języku C od standardu C99
for (int i = 0; i < SIZE; ++i)
{
printf("numbers[%d] = %d\n", i, numbers[i]);
}
getchar();
return 0;
}
Tutaj już są potrzebne wyjaśnienia. Otóż nowszy zapis polega na dodaniu przedrostka w postaci indeksu w nawiasach kwadratowych i znaku równości. Tutaj zaprezentowałem wprowadzanie indeksów po kolei, natomiast wcale nie musi tak być. Można połączyć tradycyjny zapis z powyższym i wtedy tablica w języku C wygląda na przykład tak:
int numbers[SIZE] = {3, 13, [2] = 5, [3] = 67, -89};
Można też podawać w dowolnej kolejności, to znaczy najpierw przypisać wartość ostatniemu indeksowi albo zacząć od środka, albo trochę tak i trochę tak:
int numbers[SIZE] = {[4] = -89, [1] = 13, [0] = 3, [2] = 5, 67};
Trzeba tylko uważać na dwie rzeczy! Tablica w języku C wg standardu C99 działa w taki sposób, że podając indeks przy jednym argumencie, kolejne wartości bez tego przedrostka są przypisywane po kolei następnym argumentom. Zatem dla przykładu taki zapis:
int numbers[SIZE] = {[4] = -89, [1] = 13, 3, 5, 67};
spowoduje, że pierwszy argument ([0]) przyjmie wartość zero bo nie posiada przypisanego argumentu, drugi o indeksie #1 będzie równy 13, liczba 3 zajmie indeks #2, "piątka" trafi do trzeciego indeksu, a 67 znajdzie się pod czwartym indeksem mimo tego, że na samym początku przypisaliśmy liczbę -89! Jeśli indeksy "nachodzą" na siebie, brana jest pod uwagę ostatnia wartość. Bądźcie ostrożni, bo taka tablica w języku C może dodatkowo spowodować wykroczenie poza podany zakres i program się wysypie (niezdefiniowane zachowanie). Wówczas kompilator powinien wyświetlić ostrzeżenie typu "excess elements in array initializer", ale nie można tego zagwarantować.
Wątpię w szerokie grono zwolenników takiego zapisu, zbyt dużo pułapek moim zdaniem. Tak czy siak, warto zawsze wiedzieć że macie taką możliwość, o ile kompilator wspiera standard C99.