Битовая карта в C, бинарные операции - PullRequest
0 голосов
/ 17 октября 2010

Я собираюсь создать битовую карту, которая будет контролировать 512 бит, все 512 бит должны быть 0, чтобы указывать, что бит свободен при запуске программы.Функция занимаютDataBlocks (int number) должны найти свободные биты, поставить позицию бита в массиве int data_blocks [] и установить занятый бит на 1.

Under - это некоторый код, который выполняет часть работы: за исключением того, чтобит char [512/8] объявляется внутри функции, поэтому массив будет объявлен, когда я вызываю занимаемую dataDataBlocks, что приводит к тому же результату, и в моей проге происходит большой сбой, программы возвращают недостаточно памяти, когда я пытаюсь объявить бит char какглобальная переменная.

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

        #include <stdio.h>
        #include <string.h>

        void occupyDataBlocks(int number)
        {

            int ab = number;

            char bit[512/8];

            int bitNum = 0;

            int count;

            int data_blocks[ab];

            int b = 0;

            for(bitNum = 0; bitNum < (sizeof(bit)/sizeof(char)); bitNum++) {
                char x = bit[bitNum];

                for(count = 0; x != 0; x >>= 1 ) {
                    if(!(x & 0)) {
                        data_blocks[b++] = count;
                    }

                    if(count == number) {
                        break;
                    }
                    count++;
                }
                if(count == number) {
                    break;
                }
            }

            if(count == number) {
                int a;

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

            } else {
                printf("Not enough data blocks\n");
            }
        }

        int main(void)
        {
            occupyDataBlocks(3);
            occupyDataBlocks(3);


            return 1;
        }

#include <stdio.h>
#include <string.h>

int occupyDataBlocks(char bit, int number)
{

    int ab = number;

    int bitNum = 0;

    int count;

    int data_blocks[ab];

    int b = 0;

    for(bitNum = 0; bitNum < (sizeof(bit)/sizeof(char)); bitNum++) {
        char x = bit[bitNum];

        for(count = 0; x != 0; x >>= 1 ) {
            if(!(x & 0)) {
                data_blocks[b++] = count;
            }

            if(count == number) {
                break;
            }
            count++;
        }
        if(count == number) {
            break;
        }
    }

    if(count == number) {
        int a;

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

    } else {
        printf("Not enough data blocks\n");

        return 0;
    }

    return 1;
}

int main(void)
{
    unsigned char bit[512/8];

    /*
     * I need 3 data blocks that is ready for me to use. Put the position to the free data block in array data_blocks[],
     * where data_blocks[0] can be 100 (the first free data block), data_block[1] = 400 (second free datablock) etc.
     *
     */

    int data_blocks[3];
        memcpy(data_blocks, occupyDataBlocks(bit, 3), sizeof(data_blocks));/* A try to copy the result of occypyDataBlocks to data_blocks*/

    return 1;
}

Ответы [ 3 ]

1 голос
/ 17 октября 2010

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

1.) Если вы хотите «разорвать» более чем один цикл, вы можете написать вспомогательную функцию для циклов и вместо этого «return».

2.) Я не уверен, знаете ли вы это: b ++ означает: вернуть значение b, а затем увеличить значение переменной.

b++ equals:
{int x=b; b=b+1; return x;}

++b equals:
{b=b+1; return b;}

3.) Операторы & и | и ^ побитовые, && и || а также ! являются логическими операторами, которые неявно приводят 0 / NULL к false / 0, а все остальное к true / 1. Таким образом, (x & 0) всегда равно 0, а! (X & 0) равно 1.

4.) Я не уверен в этом, мои C-знания не полны: какова ценность этого:

((signed char)0xff) >> 1  == 0xff
or
((signed char)0xff) >> 1  == 0x7f

символы официально не являются ни подписанными, ни неподписанными; это разные типы, которые могут быть похожи на символы со знаком или без знака, в зависимости от компилятора.

5.) Этот код равен:

for(a,aa;b;c,cc)d,dd;

{a;aa; while(b){d;dd;c;cc;} }

Использование for вместо while может прояснить ситуацию, но эти три параметра for должны быть явно использованы, чтобы прояснить ситуацию. Для компилятора это не так актуально, но для читателя.

6.) Sizeof (char) всегда равен 1. То, что вы можете написать, вот что: (SizeOf (MyArray) / SizeOf (MyArray [0]))

0 голосов
/ 17 октября 2010

Как вы упомянули, массив bit должен поддерживать состояние вне функции occupyDataBlocks(). Для этой программы вы можете определить их в main() и передать в функцию как

int main() {

    unsigned char bit[512/8];      // Note: unsigned

    occupyDataBlocks( bit, 3 );
    occupyDataBlocks( bit, 3 );
}

Мне до сих пор неясно, почему массив int data_blocks[]. Если вы обновите свой вопрос с более точными требованиями и двумя примерами, то я смогу предложить лучшие предложения.

0 голосов
/ 17 октября 2010

Некоторые моменты, которые могут помочь:

  • Недопустимо C (кроме C99) объявлять «массивы переменного размера», такие как int data_blocks[ab];. Возможно, вам придется использовать malloc().
  • (x & 0) будет всегда равно 0.
  • if (count == number) не имеет никакого смысла.
  • Вам нужно разобраться, что произойдет, если не хватит свободных битов.
...