Jason. Cała informatyka w jednym miejscu!

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.

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.

PODOBNE ARTYKUŁY