我即将创建一个保存512位控制的位图,所有512位应该为0,表示程序启动时该位是空闲的。函数occupyDataBlocks(int number)应该找到空闲位,将位的位置放在数组int data_blocks []中,并将占用位设置为1。
Under是一些执行某些工作的代码:除了在函数内部声明了char位[512/8],因此当我调用occupyDataBlocks时会声明数组,这会产生相同的输出并且在我的prog,程序返回当我尝试将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;
}
答案 0 :(得分:1)
我不确定,你想做什么,阅读你的代码。 无论是太混乱还是太忙。
1。)如果你想要从一个以上的循环“中断”,你可能想为循环编写一个辅助函数,而是“返回”。
2。)我不确定你是否知道这个:b ++表示:返回b的值然后再增加变量。
b++ equals:
{int x=b; b=b+1; return x;}
++b equals:
{b=b+1; return b;}
3。)运营商&amp;和|和^是按位,&amp;&amp;和||而且!是布尔运算符,它隐含地将0 / NULL转换为false / 0,将其他所有内容转换为true / 1。因此,(x&amp; 0)总是等于0,而!(x&amp; 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]))
答案 1 :(得分:0)
可能有所帮助的一些要点:
int data_blocks[ab];
)无效C(C99除外)。您可能需要使用malloc()
。(x & 0)
始终等于0
。if (count == number)
没有任何意义。答案 2 :(得分:0)
正如您所提到的,数组bit
需要在函数occupyDataBlocks()
之外维护状态。对于此程序,您可以在main()
中定义它们并将其作为
int main() {
unsigned char bit[512/8]; // Note: unsigned
occupyDataBlocks( bit, 3 );
occupyDataBlocks( bit, 3 );
}
我仍然不清楚为什么int data_blocks[]
数组。如果您使用更精确的要求和两个示例更新您的问题,那么我可以提供更好的建议。