使用"char"的布尔数组

v1A*_*xvw 3 c arrays malloc free boolean

我创建了一个实际上代表一个存储在char中的8个布尔数组的对象.我用它来学习更多关于按位运算符以及在C中创建自己的对象的内容.所以我有两个问题:

  1. 如果以下代码始终有效,我可以确定吗?
  2. 这是一个很好的实现,可以创建一个不会在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
Run Code Online (Sandbox Code Playgroud)
/*
 *  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;
}
Run Code Online (Sandbox Code Playgroud)

我更像是一个Objective-C家伙,但我真的想更多地学习C语言.任何人都可以要求更多的"功课",我可以提高自己吗?

谢谢,ief2

Car*_*rum 10

  1. 不检查无符号类型< 0,它没有意义,并在某些编译器上引起警告.
  2. 如果没有指定大小(,等)unsigned int,请不要使用无符号类型unsigned char.
  3. 如果flag == 0你为什么要设置它0
  4. 我不喜欢*在a中抽象出来typedef,但无论如何都没有.
  5. 您无需调用memset()即可将单个字节设置为0.
  6. 使用pow计算位偏移是疯了.查看<<>>运算符,然后使用它们
  7. 完全填充您的if陈述条件,或为将来调试痛苦做好准备.
  8. 如果您使用按位运算符&|不是算术,+并且-SetBitAtIndex函数中,您if无论如何都不需要所有这些复杂的语句.
  9. 你的GetBitAtIndex例程不受限制index.

从这个列表中,#9是唯一一个意味着你的程序在所有情况下都无法工作的人,我想.我没有详尽地测试它 - 这只是第一眼检查.