Слишком много элементов в массиве!

Вы можете использовать виджет «Стек», чтобы расположить кнопку в верхнем правом углу вашего строительного объекта.

Попробуйте что-то вроде:

Stack(children: [
    Positioned(
    // set appropriate positioning
    CustomButton(..),
    )
    TabBar(
      controller: _controller,
      isScrollable: true,
      tabs: <Widget>[
        Tab(text: 'category_1'),
        Tab(text: 'category_2'),
        Tab(text: 'category_3'),
        Tab(text: 'category_4'),
        Tab(text: 'category_5'),
        Tab(text: 'category_6'),
        Tab(text: 'category_7'),
        Tab(text: 'category_8'),
        Tab(text: 'category_9'),
      ],
    ),
])

После того, как вы настроите нижнюю часть, вы также можете использовать стек на своем теле, чтобы отобразить панель, и функция кнопки onTap будет использоваться переключить его видимость

5
задан spiderman 28 April 2009 в 17:50
поделиться

9 ответов

Может случиться, что вы работаете с вашим конкретным компилятором и компьютером, но вы не должны на это рассчитывать.

Поведение вашего кода в соответствии со спецификацией языка C является undefined . Это означает, что он может делать то, что вы надеетесь, или он может вызвать сбой вашего компьютера, или это может привести к тому, что демоны вылетят из носа .

В отличие от языков более высокого уровня, таких как Java и C #, C доверяет вам и не выполняет явных проверок границ массивов. Вы должны нести ответственность и не выходить за пределы массива.

23
ответ дан 18 December 2019 в 05:13
поделиться

Это «работает», только если ваше определение «работает» является синонимом «еще не разбился».

16
ответ дан 18 December 2019 в 05:13
поделиться

«Но почему это так?»

Потому что такова С.

Границы массива не проверяются во время выполнения.

Это «Закон С»

4
ответ дан 18 December 2019 в 05:13
поделиться

Вы видите неопределенное поведение , вызванное доступом к массиву с недопустимым индексом. Неопределенное поведение означает, что может произойти все что угодно, в том числе ваша программа работает правильно.

5
ответ дан 18 December 2019 в 05:13
поделиться

Я просто хотел бы отметить, что все это действительно не определено. Ваш пример «работает» в этом конкретном примере, потому что обе переменные расположены в стеке. То есть адрес cnt находится чуть ниже конца массива. Когда cnt достигает cnt == 5 массив операторов [cnt] = cnt; не записывает в память, выделенную для массива, а сразу после него, где лежит адрес cnt. Это просто удача, что это не меняет ваш счетчик. Когда cnt> 5, нет памяти для мусора, и он просто запишет в «стек пустых» (не знаю правильное слово).

еще один пример, чтобы проиллюстрировать это:

int main(int ac,char **av)
{
    int a[5];
    int cnt;
    int cnt2=3;

    for(cnt=0;cnt<7;cnt++) {
        a[cnt]=cnt;
        printf("%d %d %d\n", a[cnt], cnt, cnt2);
    }
}

output:

0 0 3
1 1 3
2 2 3
3 3 3
4 4 3
5 5 5
6 6 5

Последний две записи цикла перезаписывают данные стека после [] и могут привести к очень запутанным ошибкам. В этом случае cnt2 уничтожается.

4
ответ дан 18 December 2019 в 05:13
поделиться

Массивы в C не проверяются во время выполнения. Другими словами, вы можете «определить» массив размера N и получить доступ к концу конца массива. Если вы выходите из конца массива, то вы удаляете память где-то в стеке (или куче).

Как только вы очистите память где-нибудь, ваша программа, вероятно, вылетит. Эти сбои трудно отследить, потому что они могут дойти далеко от того места, где вы на самом деле пересекали конец массива.

Обычно, когда вы объявляете массивы в C, лучше использовать какую-то константу или #define, чтобы отметить размер массива:

#define MAX_ELEMENTS 10
int array[MAX_ELEMENTS];
int cnt;
for(cnt = 0; cnt < MAX_ELEMENTS; cnt+=1) {
   array[cnt] = cnt;
}

Если вы пропустите MAX_ELEMENTS в присваивании массива, вы можете перезаписать значение cnt. Вы можете перезаписать другую переменную. Все зависит от компилятора и структуры кода. Также обратите внимание на использование знака <в цикле for. Массивы C основаны на 0, поэтому вы должны проверять, используя меньше или меньше или меньше.

2
ответ дан 18 December 2019 в 05:13
поделиться

Границы массива в C не обязательно проверяются во время выполнения. Стандарт оставляет разработчикам свободу делать это, если они выбирают или нет - это часть того, что не определено . В реализации с жирными указателями образец действительно может вызвать какую-то ошибку.

1
ответ дан 18 December 2019 в 05:13
поделиться

Как только вы запускаете конец массива, вы перезаписываете память, которую программное обеспечение не ожидает, и разрушает кучу. Ваше программное обеспечение может продолжать работать, но оно будет очень нестабильным!

0
ответ дан 18 December 2019 в 05:13
поделиться

Зависит от того, как упакована стековая память. Кроме того, он с радостью перезапишет эти значения и даже прочитает их, но, скорее всего, вы повредите стек.

0
ответ дан 18 December 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: