Реагировать Родной. Высоту Функцией ScrollView

Я пытаюсь установить высоту мой взгляд прокрутите до 72,5% от высоты экрана. Если я поместить границы вокруг, я вижу, что граница указывает на то, что это правильно. Однако, если я что-то вставить в представление ScrollView, элемент внутри намного меньше, чем ожидалось. Высота тоже пропорционально (22%). Тем более что я войти в представление ScrollView, тем больше этих элементов вам (т. е. содержание представления прокрутки становится больше, а значит и элементов внутри масштабирования). Я не хочу этого, я хочу, чтобы elemetns быть 22% от фиксированной 72.5%. Я не пробовала такое мнение, что составило 100% от прокрутки высоте (хотя граница показывает, что он оказывает меньше), я пробовала различные обертывания видом и попытался установить высоту функцией ScrollView напрямую, но никто из них, казалось, чтобы исправить это. Какие-Либо Предложения? Спасибо заранее.

<View style={{ width: "100%%", height: "72.5%%", flexDirection: "column" }}>
   <View style={{width:"100%%", height:"100%%"}}>     
     <ScrollView  showsVerticalScrollIndicator={false} style={{ width: "100%%", height:"100%%", flexDirection: "column" ,borderWidth:2}}>
         <View style={{width:"100%%", height:"100%%", borderWidth:2}}>
             <Bio height={"22%%"} plays={10} audience={10} ownUsername={"TestUser"}/>
             <Bio height={"22%%"} plays={10} audience={10} ownUsername={"TestUser"}/>
         </View>
     </ScrollView>
   </View> 
 </View>
0
2019-09-17 12:11:20
источник
1 ответ

Примечание: ваш код не имеет никакого выбора, поэтому ваш вопрос название является неправильным. Вы выделяем для указателя на указатель на тип , где вы впервые выделить указатели, а затем в блок хранения для каждого объекта, а затем назначить начальный адрес для каждого блока памяти в указатель. (Правило: указатель-это не массив, а массив-это не указатель, хотя на доступ к массив преобразуется в указатель на первый элемент согласно стандарту С11 - 6.3.2.1(П3))


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

Вы можете также установить размер тип для каждого распределения с помощью разыменования указателя , а не пытаться вспомнить для , которая может быть ошибок в условиях. Например, вместо:

    calc_result** results = malloc(sizeof(calc_result*)*calcsPerChunk);

Вы можете использовать sizeof *results (в указатель разыменовывается) установить размер каждого элемента, например,

    calc_results **results = malloc (sizeof *results * calcsPerChunk);

Примечание: в или , как правило, идет с указатель, а не тип. Почему? семантика и делая то, что указатель является явным. Например:

    calc_results* a, b, c;

конечно, не объявить 3-указатели на в. Вместо этого он объявляет указатель на и двух . Обеспечение -это указатель делает ясным, что, например,

    calc_results *a, b, c;

(юридический синтаксис-мудрый, это не имеет значения, компилятор может разобрать без каких-либо проблем-это человеческая сторона, где проблем, как правило, возникают)

Быстрый Пример Подтверждающий Ваш Подход

Для тестирования, вам не нужно:

int numChunks = 10;
int calcsPerChunk = 50;

( и (или что-то больше чем 1) сделаем)

Собираю короткий пример, который проверяет каждого распределения, а также размеров каждого размещения, используя указатель разыменовывается, (и выплевывает выход на каждом уровне просто для удовольствия), вы могли бы сделать:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char *name;
    int index;
    char **finals;
} calc_results;

int main(void)
{
    int numChunks = 3;
    int calcsPerChunk = 5;

    for(int i = 0; i < numChunks; i++) {
        calc_results **results = malloc (sizeof *results * calcsPerChunk);
        if (!results) {
            perror ("malloc-results");
            return 1;
        }
        for(int j = 0; j < calcsPerChunk; j++)
        {
            if (!(results[j] = malloc (sizeof *results[j]))) {
                perror ("malloc-results[j]");
                return 1;
            }
            results[j]->name = "blah";
            results[j]->index = j;
            if (!(results[j]->finals=malloc(sizeof *results[j]->finals*12))) {
                perror ("malloc-results[j]->finals");
                return 1;
            }
            for(int k = 0; k < 12; k++) {
                if (!(results[j]->finals[k] = malloc(70))) {
                    perror ("malloc-results[j]->finals[k]");
                    return 1;
                }
                sprintf (results[j]->finals[k], "grade %%d", k+1);
            }
        }

        /* DO ACTUAL WORK */

        /* output & free stuff */
        printf ("results[%%2d]\n", i);
        for (int a = 0; a < calcsPerChunk; a++) {
            printf ("  %%s %%2d\n", results[a]->name, results[a]->index);
            for (int b = 0; b < 12; b++) {
                printf ("    %%s\n", results[a]->finals[b]);
                free (results[a]->finals[b]);
            }
            // free(results[a]->name);
            free(results[a]->finals);
            free(results[a]);
        }

        free(results);
    }
}

Использование Памяти/Проверить Ошибку

Теперь критическая часть. В любой код, который вы напишете, которая динамически выделяет память, у вас есть 2 обязанности в отношении любой блок памяти, выделенный: (1) всегда сохранять указатель на начальный адрес блока памяти, таким образом, (2) он может быть освобожден , когда она уже не нужна.

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

Для Linux -это нормальный выбор. Есть похожие шашкам памяти для каждой платформы. Все они простые в использовании, просто запустите программу через него.

$ valgrind ./bin/free_nested_struct
==13663== Memcheck, a memory error detector
==13663== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==13663== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==13663== Command: ./bin/free_nested_struct
==13663==
results[ 0]
  blah  0
    grade 1
    grade 2
    grade 3
    grade 4
    grade 5
    grade 6
    ...
    <snip>
==13663==
==13663== HEAP SUMMARY:
==13663==     in use at exit: 0 bytes in 0 blocks
==13663==   total heap usage: 213 allocs, 213 frees, 14,520 bytes allocated
==13663==
==13663== All heap blocks were freed -- no leaks are possible
==13663==
==13663== For counts of detected and suppressed errors, rerun with: -v
==13663== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Всегда убедитесь, что вы освободили все памяти вы выделили и что нет ошибок памяти.

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

+0
2019-09-17 14:41:19

Посмотрите другие вопросы по меткам