Сколько элементов заполнено в массиве C - PullRequest
0 голосов
/ 27 февраля 2010

Если у вас есть массив в C, как вы можете узнать, сколько его заполнено?

Ответы [ 8 ]

3 голосов
/ 27 февраля 2010

В массиве C любой элемент является объектом. Это не так, как в Java, где у вас есть ссылки, которые сначала должны быть назначены для указания на объекты. Все в C ведет себя как примитивный тип в Java.

Если у вас есть массив указателей в C, вы можете посмотреть на это так же, как в Java. Вы можете использовать нулевые указатели для обозначения «не заполнен, чтобы указывать на объект»:

// creates an array of 10 pointers, and initializes all of
// them to null pointers. If you leave off "{ 0 }", you 
// have to manually initialize them!
struct foo *array[10] = { 0 };

Тогда вы можете просто проверить с помощью

if(array[i] == 0) {
  printf("Position %d does not point to an object!\n", i);
}
1 голос
/ 28 февраля 2010

С точки зрения языка Си нет понятия «заполненный». Как только массив определен, ему выделяется память. Для массивов, таких как array1 (см. Пример ниже), элементы инициализируются равными 0. Однако для массивов, таких как array2, элементы могут иметь случайное значение.

Таким образом, понятие " заполнено " должно быть предоставлено программой. Один из возможных способов in-band : (a) Выберите одно конкретное значение типа элемента (например, 0xFFFFFFFF) и используйте его для обнаружения свойства fill / empty каждого элемента массива (однако следует понимать, что этот подход убирает одно действительное значение в противном случае из набора элементов) (b) «инициализировать» все элементы массива до этого запрещенного значения в подходящей позиции в области действия программы. (c) Чтобы найти уровень заполнения массива, посчитайте количество допустимых элементов.

$ cat t2.c
#include <stdio.h>
#define N 10

typedef unsigned long int T;

static const T EmptyElementValue = 0xFFFFFFFF;
// Choose any suitable value above. However, the chosen value
// would not be counted as an "empty" element in the array.

static T array1[ N ];

void
printArray( T a[], size_t length )
{
    size_t i;
    for( i = 0; i < length; ++i )
    {
        printf( "%lu, ", a[ i ] );
    }
    printf( "\n" );
}

size_t
numFilledElements( T a[], size_t length )
{
    size_t fillCount = 0;
    size_t i;

    for( i = 0; i < length; ++i )
    {
        if( a[ i ] != EmptyElementValue )
        {
            fillCount += 1;
        }
    }

    return fillCount;
}

int main()
{
    T array2[ N ];
    size_t i;

    printArray( array1, N );
    printArray( array2, N );

    //------------------------------------------//

    // Make array2 empty
    for( i = 0; i < N; ++i )
    {
        array2[ i ] = EmptyElementValue;
    }

    // Use some elements in array2
    array2[ 2 ] = 20;
    array2[ 3 ] = 30;
    array2[ 7 ] = 70;
    array2[ 8 ] = 80;

    printf( "Number of elements \"filled\" in array2 = %u\n",
        numFilledElements( array2, N  ));

    // Stop using some elements in array2
    array2[ 3 ] = EmptyElementValue;

    printf( "Number of elements \"filled\" in array2 = %u\n",
        numFilledElements( array2, N ) );


    return 0;
}


$ gcc -Wall t2.c -o t2


$ ./t2
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 60225, 2280452, 1627469039, 1628881817, 2281060, 2280680, 1628304199, 1628881818, 47, 
Number of elements "filled" in array2 = 4
Number of elements "filled" in array2 = 3

$
1 голос
/ 27 февраля 2010

Я согласен с другими ответами, но могу предложить вам способ облегчить вашу работу. Вы можете управлять массивом как объектом и контролировать добавление и удаление данных. Если вы реализуете две функции, одну для добавления элементов и одну для их удаления, с соответствующей логикой для управления фрагментацией и многопоточностью, вы можете отслеживать количество элементов в массиве, считывающем счетчик, который записывается только путем добавления и удаления функция. Поэтому вам не нужно выполнять цикл каждый раз, когда вам нужно посчитать элементы.

1 голос
/ 27 февраля 2010

Вы должны следить за этим самостоятельно. Не существует понятия «полный» (или что-то промежуточное по этому вопросу): вы должны определить это.

Конечно, если элементы являются смежными в массиве, вы можете использовать элемент NULL для обозначения «конца» массива, таким образом определяя «полное» состояние одновременно.

0 голосов
/ 25 марта 2012

в C, нет встроенного способа узнать, сколько элементов заполнено данными, которые вам небезразличны. Вам нужно будет построить его самостоятельно. Как было сказано ранее, если вы можете иметь значение, которое ничего не будет представлять (например, 0), вы можете:

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

С другой стороны, если вам нужно представить экстент ваших данных, вам понадобится массив флагов, который будет отслеживать заданные и не заданные элементы:

Например, если у вас есть массив из 32 элементов или меньше, вам нужно только целое число без знака для отслеживания вашего массива: 1100010 ...

Значения:

1 -> Установить

2 -> Установить

3 -> нет набора

4 -> не установлено

5 -> не установлено

6 -> установить

и т.д.

Таким образом, всякий раз, когда вы заполняете элемент, вы вызываете функцию, которая устанавливает правильный бит, и когда вы «незаполняете» данные, вы сбрасываете бит, который ему соответствует.

Как только это будет сделано, все, что вам нужно сделать, это просто вызвать popcount над массивом флагов.

0 голосов
/ 28 февраля 2010

Вы можете сделать цикл while(yourArray != NULL) и через цикл просто увеличить целочисленное значение, и это должно сказать вам.

0 голосов
/ 27 февраля 2010

Вычтите количество пустых элементов из размера массива. ; -)

Извините, нет способа (кроме отслеживания) узнать, был ли изменен элемент массива.

0 голосов
/ 27 февраля 2010

Это все заполнено, поэтому ответом будет любой размер вашего массива.Массив - это непрерывный сегмент памяти, поэтому по умолчанию он заполняется тем, что было в этом месте памяти раньше.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...