我制作了一个对象,它实际上表示存储在 char 中的 8 个 boolean 值数组。我这样做是为了学习更多关于按位运算符和在 C 中创建自己的对象的知识。所以我有两个问题:
- 我可以确定下面的代码是否 总是有效?
- 这是一个很好的实现吗 制作一个不会丢失的对象 在 C 中,除非你释放它 你自己。
代码:
/*
* IEFBooleanArray.h
* IEFBooleanArray
*
* Created by ief2 on 8/08/10.
* Copyright 2010 ief2. All rights reserved.
*
*/
#ifndef IEFBOOLEANARRAY_H
#define IEFBOOLEANARRAY_H
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef char * IEFBooleanArrayRef;
void IEFBooleanArrayCreate(IEFBooleanArrayRef *ref);
void IEFBooleanArrayRelease(IEFBooleanArrayRef ref);
int IEFBooleanArraySetBitAtIndex(IEFBooleanArrayRef ref,
unsigned index,
int flag);
int IEFBooleanArrayGetBitAtIndex(IEFBooleanArrayRef ref,
unsigned index);
#endif
/*
* IEFBooleanArray.c
* IEFBooleanArray
*
* Created by ief2 on 8/08/10.
* Copyright 2010 ief2. All rights reserved.
*
*/
#include "IEFBooleanArray.h"
void IEFBooleanArrayCreate(IEFBooleanArrayRef *ref) {
IEFBooleanArrayRef newReference;
newReference = malloc(sizeof(char));
memset(newReference, 0, sizeof(char));
*ref = newReference;
}
void IEFBooleanArrayRelease(IEFBooleanArrayRef ref) {
free(ref);
}
int IEFBooleanArraySetBitAtIndex(IEFBooleanArrayRef ref, unsigned index, int flag) {
int orignalStatus;
if(index < 0 || index > 7)
return -1;
if(flag == 0)
flag = 0;
else
flag = 1;
orignalStatus = IEFBooleanArrayGetBitAtIndex(ref, index);
if(orignalStatus == 0 && flag == 1)
*ref = *ref + (int)pow(2, index);
else if(orignalStatus == 1 && flag == 0)
*ref = *ref - (int)pow(2, index);
return 0;
}
int IEFBooleanArrayGetBitAtIndex(IEFBooleanArrayRef ref, unsigned index) {
int result;
int value;
value = (int)pow(2, index);
result = value & *ref;
if(result == 0)
return 0;
else
return 1;
}
我更像是一个 Objective-C 的人,但我真的很想学习更多的 C。任何人都可以要求一些我可以提高自己的“作业”吗?
谢谢, IEF2
最佳答案
- 不要用
< 0
检查无符号类型,它没有意义,并且会在某些编译器上引起警告。 - 不要在未指定大小的情况下使用无符号类型(
unsigned int
、unsigned char
等)。 - 如果
flag == 0
你为什么要把它设置为0
? - 我不喜欢抽象
*
远离typedef
,但这无论如何都不是错误。 - 您无需调用
memset()
将单个字节设置为0
. - 使用
pow
计算一点偏移量是疯狂的。查看<<
和>>
运算符并改用它们 - 将您的
if
完全括起来声明条件或为将来的调试痛苦做好准备。 - 如果您使用按位运算符
&
和|
而不是算术+
和-
在你的SetBitAtIndex
功能,你不需要所有那些复杂的if
无论如何声明。 - 你的
GetBitAtIndex
例程不进行边界检查index
.
我认为,从该列表中,#9 是唯一表示您的程序无法在所有情况下运行的列表。我没有详尽地测试它 - 这只是第一眼检查。
关于c - 使用 "char"的 boolean 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3432321/