Должно быть стандартной функцией, но по какой-то причине она не включена ни в стандартные C, ни в C ++ ...
#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]);
}
}
В Фортране вы могли:
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 i;
for(i = 0; i < 100; ++i) {
printf("arr[%u] = %u.\n", i, arr[i]);
}
}
Что, если бы это был массив из 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;
}
Один из способов взломать это - с помощью предварительной обработки ... (приведенный ниже код не охватывает крайние случаи, но написан для быстрой демонстрации того, что можно сделать.)
#!/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);
person
Dmitry
schedule
03.04.2016
{0}
не является особым случаем для структур или массивов. Правило состоит в том, что элементы без инициализатора инициализируются, как если бы они имели0
в качестве инициализатора. Если есть вложенные агрегаты (например,struct x array[100]
), то инициализаторы применяются к неагрегатам в строковом порядке; при этом фигурные скобки можно опустить.struct x array[100] = { 0 }
действительно в C; и действителен в C ++ до тех пор, пока первый членstruct X
принимает0
в качестве инициализатора. - person M.M   schedule 03.12.2015{ 0 }
не является особенным в C, но гораздо сложнее определить тип данных, который нельзя инициализировать с его помощью, поскольку нет конструкторов и, следовательно, нет способа остановить0
от неявного преобразования и присвоения something i >. - person Leushenko   schedule 03.04.2016