Mały kąsek informacji dotyczący tworzenia tablic w języku C. 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: "tradycyjna" inicjalizacja tablicy w C, a potem druga opcjonalna metoda.

INICJALIZACJA TABLICY W C - 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};			// inicjalizacja tablicy 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" odbywa się inicjalizacja tablicy według standardu ANSI C z 1989 roku. "Zabezpieczamy się" poprzez korzystanie ze stałej wyznaczającej granicę tablicy 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. Grunt, żeby nie zostawiać tablicy kompletnie bez inicjalizacji bo wtedy pojawiają się kłopoty.

INICJALIZACJA TABLICY W C - 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?):

#include <stdio.h>

#define SIZE 5

int main(void)
{
	int numbers[SIZE] = {[0] = 3, [1] = 13, [2] = 5, [3] = 67, [4] = -89};			// inicjalizacja tablicy od 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 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! Inicjalizacja tablicy 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 inicjalizacja tablicy może dodatkowo spowodować wykroczenie poza podany zakres. 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.

PODOBNE ARTYKUŁY