標準機能だったらいいのに:
#include <stdio.h>
__asm__
(
" .global _arr; "
" .section .data; "
"_arr: .fill 100, 1, 2; "
);
extern char arr[];
int main()
{
int i;
for(i = 0; i < 100; ++i) {
printf("arr[%u] = %u.\n", i, arr[i]);
}
}
Fortran では、次のことができます。
program main
implicit none
byte a(100)
data a /100*2/
integer i
do i = 0, 100
print *, a(i)
end do
end
ただし、私の知る限り、符号なしの数値はありません。
現代の C/C++ に、以下のコードのようなことを行うための省略形としてそれがあればいいのにと思います。
#include <stdio.h>
#include <stdint.h>
/* did I count it correctly? I'm not quite sure. */
uint8_t arr[] = {
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
};
int main(int argc, char **argv)
{
int i;
for(i = 0; i < 100; ++i) {
printf("arr[%u] = %u.\n", i, arr[i]);
}
return 0;
}
それが 1,000,000 バイトの配列である場合は、さらにイライラすることになり、おそらく関数を使用して実行時に入力を行うことを選択するようになるでしょう。
それは完全に移植性があり、言語にない理由はありません。
次のようにハックするだけです:
#include <stdio.h>
#include <stdint.h>
/* a byte array of 100 twos declared at compile time. */
uint8_t twos[] = {100:2};
int main()
{
uint_fast32_t i;
for (i = 0; i < 100; ++i) {
printf("twos[%u] = %u.\n", i, twos[i]);
}
return 0;
}
それをハッキングする 1 つの方法は、前処理を使用することです... (以下のコードは特殊なケースをカバーしていませんが、何ができるかをすばやく示すために書かれています。)
#!/usr/bin/perl
use warnings;
use strict;
open my $inf, "<main.c";
open my $ouf, ">out.c";
my @lines = <$inf>;
foreach my $line (@lines) {
if ($line =~ m/({(\d+):(\d+)})/) {
printf ("$1, $2, $3");
my $lnew = "{" . "$3, "x($2 - 1) . $3 . "}";
$line =~ s/{(\d+:\d+)}/$lnew/;
printf $ouf $line;
} else {
printf $ouf $line;
}
}
close($ouf);
close($inf);
注:これは2016年からの素朴な(不器用なひざまずく)答えであり、当時は互換性の問題が私を襲っていませんでした. 下位互換性に対処することは悪夢であり、利便性を自動化するためのカスタムツールを維持することも特に楽しいものではないため、言語に「欲しいという理由だけでクールな新機能」を取得することはもう望んでいません。