Бинарная операция, нужна помощь - PullRequest
1 голос
/ 15 октября 2010

Я собираюсь создать функцию для программы, она является частью программы и предназначена для растрового изображения, содержащего элементы управления, для которых адрес памяти свободен для использования (это не имеет ничего общего с этой функцией),Битовая карта - это бит [64], который содержит 8 x 64 бита, функция принимает номер параметра, который является числом блоков данных, которые должна занимать функция.В массиве data_blocks [] должен указывать номер блока данных со значением бита 0 (свободный).

При выполнении этой программы получаются странные выходные данные, а data_blocks [] дает значения, превышающие длину 512.пожалуйста, дайте мне руку?Спасибо

#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;

    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[count] = 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);

    return 1;
}

1 Ответ

2 голосов
/ 15 октября 2010

k, с чего начать ...

1) "sizeof (char)", скорее всего, равен 1. Итак, у вас есть 512-байтовый массив, а не 64-байтовый массив.

2) массив "bit" не инициализирован.

3) присваивание "char x = bit [bitNum];" должно происходить внутри цикла.

4) "strlen (bit)) "не делает то, что вы думаете, что делаетОн интерпретирует «бит» как текстовую строку.Вы, вероятно, хотите использовать "sizeof (bit) / sizeof (char)".

5) "(x & 0)" всегда равно 0. Что вы пытаетесь сделать?Если вы пытаетесь проверить бит, вы хотите сделать "! (X & 1)".

6) "int data_blocks [number]": это даже компилируется?Вы не можете выделить локальный массив таким образом, если его размер неизвестен во время компиляции.

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

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

8) Вы действительно хотите сбросить «count» в 0 на каждой итерации внешнего цикла?Вы хотите, чтобы код нашел 3 свободных местоположения где-нибудь в массиве или 3 свободных местоположения в одном байте?

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