数组一个有效的索引没有返回在C正确的状态code [英] Array with a valid index is not returning the right status code in c

查看:199
本文介绍了数组一个有效的索引没有返回在C正确的状态code的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个功能在这里,这对于intarr_set(),如果索引是有效的,我将在IA [指数]值设置为VAL并返回INTARR_OK这是一个状态code和其它功能intarr_get ()将设置*我对保险业监督[指数]如果索引也有效。但是,当我与我产生一个随机序列,这是[11 49 36 69 3 21 72 73 94 69 2 22 2 96 64 93]测试我的功能,我得到一个消息,说我intarr_get()函数没有返回INTARR_OK即使我得到了一个有效的索引。有谁知道我在哪里出了错?

下面是我对阵列结构:

  typedef结构{
  为int *的数据;
  unsigned int类型LEN;
} intarr_t;

下面是我为intarr_set功能:

  intarr_result_t intarr_set(intarr_t * IA,
                unsigned int类型指数,
                INT VAL){
    如果(IA == NULL)
    {
        返回INTARR_BADARRAY;
    }
    其他
    {
        如果(IA-GT&;!数据[索引] = 0)
        {
            IA-GT&;数据[指数] = VAL;
            返回INTARR_OK;
        }
        其他
        {
            返回INTARR_BADINDEX;
        }
    }
    返回0;
}

和这里是我的intarr_get功能:

  intarr_result_t intarr_get(常量intarr_t * IA,
                unsigned int类型指数,
                INT * I​​)
{
    如果(IA == NULL)
    {
        返回INTARR_BADARRAY;
    }
    其他
    {
        如果(IA-GT&;!数据[索引] = 0)
        {
            如果(我!= NULL)
            {
                * I = IA-GT&;数据[指数]
            }
            返回INTARR_OK;
        }
        其他
        {
            返回INTARR_BADINDEX;
        }
    }
    返回0;
}


解决方案

这个问题你的 intarr_set intarr_get 功能是在你的测试无效索引的方式。处理这种情况的正确方法是存储当前分配大小为 AI->数据 AI-> LEN 。保留当前的分配大小允许首页 AI-&GT简单的测试; LEN 确定有效性。它还提供了一个电流的方式来保持大小连你的realloc AI->数据在一段时间后。所作的改变是:

  intarr_result_t intarr_set(intarr_t * IA,
                unsigned int类型指数,
                INT VAL)
{
    ...
        //如果(IA-GT&;!数据[索引] = 0)
        如果(指数< IA-GT&; LEN)
}intarr_result_t intarr_get(常量intarr_t * IA,
                unsigned int类型指数,
                INT * I​​)
{
    ...
        //如果(IA-GT&;!数据[索引] = 0)
        如果(指数< IA-GT&; LEN)
}

进行更改后,一个简短的测试是建立使用您为首页提供的数组数来测试是否 INTARR_OK INTARR_BADINDEX 正常表现。同结果一起完整的测试 - code如下。放一个评论,如果您还有其他问题:

 的#include<&stdio.h中GT;
#包括LT&;&stdlib.h中GT;#定义INTARR_OK 1
#定义INTARR_BADINDEX -1
#定义INTARR_BADARRAY -2的typedef intarr_result_t诠释;typedef结构{
为int *的数据;
unsigned int类型LEN;
} intarr_t;intarr_result_t intarr_set(intarr_t * IA,
                unsigned int类型指数,
                INT VAL)
{
    如果(IA == NULL)
    {
        返回INTARR_BADARRAY;
    }
    其他
    {
        //如果(IA-GT&;!数据[索引] = 0)
        如果(指数< IA-GT&; LEN)
        {
            IA-GT&;数据[指数] = VAL;
            返回INTARR_OK;
        }
        其他
        {
            返回INTARR_BADINDEX;
        }
    }
    返回0;
}intarr_result_t intarr_get(常量intarr_t * IA,
                unsigned int类型指数,
                INT * I​​)
{
    如果(IA == NULL)
    {
        返回INTARR_BADARRAY;
    }
    其他
    {
        //如果(IA-GT&;!数据[索引] = 0)
        如果(指数< IA-GT&; LEN)
        {
            如果(我!= NULL)
            {
                * I = IA-GT&;数据[指数]
            }
            返回INTARR_OK;
        }
        其他
        {
            返回INTARR_BADINDEX;
        }
    }
    返回0;
}INT主要(无效)
{
    INT RTMP [] = {11,49,36,3,69,21,72,73,94,69,2,22,2,96,64,93};
    unsigned int类型RSZ = sizeof的(RTMP)/ sizeof的(* RTMP); / *组索引数组大小* /
    unsigned int类型I = 0;
    INT X = 0;
    INT结果为0;    intarr_t myArr,该= {NULL,0}; / *初始化结构为NULL,0 * /    myarr.data =释放calloc(RSZ,sizeof的(myarr.data)); / *分配intarr_t,设置为零* /
    myarr.len = RSZ; / *保存后的realloc和放大器;测试* /    / *测试intarr_set和intarr_get * /
    的printf(\\ nSetting和检索数组值,有效索引(0℃;指数<%D)\\ n \\ n,RSZ);
    对于(i = 0; I< RSZ;我++)
    {
        结果= intarr_set(安培; myArr,该,设rtmp [I]中,I + 1);
        的printf(设置myarr.data [%2U] =%d个(返程:%S)\\ n,RTMP [I],I + 1,
                (结果大于0)? INTARR_OK:INTARR_BADINDEX);
        intarr_get(安培; myArr,该,设rtmp [I],&放大器; X);
        的printf(得到myarr.data [%2U] =%d个(返程:%S)\\ n,RTMP [I],X,
                (结果大于0)? INTARR_OK:INTARR_BADINDEX);
    }    的printf(\\ nResulting myarr.data阵列\\ n \\ n);
    对于(i = 0; I< myarr.len;我++)
        如果(myarr.data [I])
            的printf(myarr.data [%2U] =%d个\\ N,我,myarr.data [I]);
        其他
            的printf(myarr.data [%2U] = 0 \\ n,I);
    的printf(\\ n);    如果(myarr.data)/ *自由分配的数据* /
        免费(myarr.data);    返回0;
}

输出:

 设置和检索数组值,有效索引(0℃;指数< 16)  设置myarr.data [11] = 1(返程:INTARR_OK)
  有myarr.data [11] = 1(返程:INTARR_OK)
  设置myarr.data [49] = 2(返程:INTARR_BADINDEX)
  有myarr.data [49] = 1(返程:INTARR_BADINDEX)
  设置myarr.data [36] = 3(返程:INTARR_BADINDEX)
  有myarr.data [36] = 1(返程:INTARR_BADINDEX)
  设置myarr.data [3] = 4(返程:INTARR_OK)
  有myarr.data [3] = 4(返程:INTARR_OK)
  设置myarr.data [69] = 5(返程:INTARR_BADINDEX)
  有myarr.data [69] = 4(返程:INTARR_BADINDEX)
  设置myarr.data [21] = 6(返程:INTARR_BADINDEX)
  有myarr.data [21] = 4(返程:INTARR_BADINDEX)
  设置myarr.data [72] = 7(返程:INTARR_BADINDEX)
  有myarr.data [72] = 4(返程:INTARR_BADINDEX)
  设置myarr.data [73] = 8(返程:INTARR_BADINDEX)
  有myarr.data [73] = 4(返程:INTARR_BADINDEX)
  设置myarr.data [94] = 9(返程:INTARR_BADINDEX)
  有myarr.data [94] = 4(返程:INTARR_BADINDEX)
  设置myarr.data [69] = 10(返程:INTARR_BADINDEX)
  有myarr.data [69] = 4(返程:INTARR_BADINDEX)
  设置myarr.data [2] = 11(返程:INTARR_OK)
  有myarr.data [2] = 11(返程:INTARR_OK)
  设置myarr.data [22] = 12(返程:INTARR_BADINDEX)
  有myarr.data [22] = 11(返程:INTARR_BADINDEX)
  设置myarr.data [2] = 13(返程:INTARR_OK)
  有myarr.data [2] = 13(返程:INTARR_OK)
  设置myarr.data [96] = 14(返程:INTARR_BADINDEX)
  有myarr.data [96] = 13(返程:INTARR_BADINDEX)
  设置myarr.data [64] = 15(返程:INTARR_BADINDEX)
  有myarr.data [64] = 13(返程:INTARR_BADINDEX)
  设置myarr.data [93] = 16(返程:INTARR_BADINDEX)
  有myarr.data [93] = 13(返程:INTARR_BADINDEX)造成myarr.data阵列  myarr.data [0] = 0
  myarr.data [1] = 0
  myarr.data [2] = 13
  myarr.data [3] = 4
  myarr.data [4] = 0
  myarr.data [5] = 0
  myarr.data [6] = 0
  myarr.data [7] = 0
  myarr.data [8] = 0
  myarr.data [9] = 0
  myarr.data [10] = 0
  myarr.data [11] = 1
  myarr.data [12] = 0
  myarr.data [13] = 0
  myarr.data [14] = 0
  myarr.data [15] = 0

I have two functions here, which for intarr_set(), if an index is valid, I would set the value at ia[index] to val and return INTARR_OK which is a status code, and the other function intarr_get() would set *i to ia[index] if the index is valid as well. But when I was testing my function with a random array I generated, which was [ 11 49 36 3 69 21 72 73 94 69 2 22 2 96 64 93 ], I got a message saying that my intarr_get() function didn't return INTARR_OK even though I got a valid index. Does anybody know where I went wrong?

Here's my struct for the array:

typedef struct {
  int* data;
  unsigned int len;
} intarr_t;

Here's my function for intarr_set:

intarr_result_t intarr_set( intarr_t* ia, 
                unsigned int index, 
                int val )

{
    if (ia == NULL)
    {
        return INTARR_BADARRAY;
    }
    else
    {
        if ( ia->data[index] != 0 )
        {
            ia->data[index] = val;
            return INTARR_OK;
        }
        else
        {
            return INTARR_BADINDEX;
        }
    }
    return 0;
}

And here's my function for intarr_get:

intarr_result_t intarr_get( const intarr_t* ia, 
                unsigned int index, 
                int* i )
{
    if (ia == NULL)
    {
        return INTARR_BADARRAY;
    }
    else
    {
        if (ia->data[index] != 0)
        {
            if (i != NULL)
            {
                *i = ia->data[index];
            }
            return INTARR_OK;
        }
        else
        {
            return INTARR_BADINDEX;
        }
    }
    return 0;
}

解决方案

The problem with your intarr_set and intarr_get functions were in the way you were testing for an invalid index. The proper way to handle this is to store the current allocated size for ai->data as ai->len. Keeping the current allocated size allows for easy testing of index against ai->len to determine validity. It also provides a current way to keep the size in the even you realloc ai->data at some later time. The changes made were:

intarr_result_t intarr_set( intarr_t* ia, 
                unsigned int index, 
                int val )
{
    ...
        // if ( ia->data[index] != 0 )
        if ( index < ia->len )
}

intarr_result_t intarr_get( const intarr_t* ia, 
                unsigned int index, 
                int* i )
{
    ...
        // if (ia->data[index] != 0)
        if ( index < ia->len )
}

After making the changes, a short test was setup using the array numbers you provided as index to test whether INTARR_OK and INTARR_BADINDEX behaved properly. The full test-code along with the results are below. Drop a comment if you have further questions:

#include <stdio.h>
#include <stdlib.h>

#define INTARR_OK 1
#define INTARR_BADINDEX -1
#define INTARR_BADARRAY -2

typedef int intarr_result_t;

typedef struct {
int* data;
unsigned int len;
} intarr_t;

intarr_result_t intarr_set( intarr_t* ia, 
                unsigned int index, 
                int val )
{
    if (ia == NULL)
    {
        return INTARR_BADARRAY;
    }
    else
    {
        // if ( ia->data[index] != 0 )
        if ( index < ia->len )
        {
            ia->data[index] = val;
            return INTARR_OK;
        }
        else
        {
            return INTARR_BADINDEX;
        }
    }
    return 0;
}

intarr_result_t intarr_get( const intarr_t* ia, 
                unsigned int index, 
                int* i )
{
    if (ia == NULL)
    {
        return INTARR_BADARRAY;
    }
    else
    {
        // if (ia->data[index] != 0)
        if ( index < ia->len )
        {
            if (i != NULL)
            {
                *i = ia->data[index];
            }
            return INTARR_OK;
        }
        else
        {
            return INTARR_BADINDEX;
        }
    }
    return 0;
}

int main (void)
{
    int rtmp[] = { 11, 49, 36, 3, 69, 21, 72, 73, 94, 69, 2, 22, 2, 96, 64, 93 };
    unsigned int rsz = sizeof (rtmp)/sizeof (*rtmp);    /* set size of index array      */
    unsigned int i = 0;
    int x = 0;
    int result = 0;

    intarr_t myarr = { NULL, 0 };                   /* initialize struct to NULL, 0     */

    myarr.data = calloc (rsz, sizeof (myarr.data)); /* allocate intarr_t, set to zero   */
    myarr.len = rsz;                                /* save for later realloc & testing */

    /* test intarr_set and intarr_get */
    printf ("\nSetting and retrieving array values, valid index (0 < index < %d)\n\n", rsz);
    for (i = 0; i < rsz; i++)
    {
        result = intarr_set ( &myarr, rtmp [i], i + 1 );
        printf ("  set myarr.data[%2u] = %d  (return: %s)\n", rtmp[i], i+1,
                (result > 0) ? "INTARR_OK" : "INTARR_BADINDEX");
        intarr_get ( &myarr, rtmp [i], &x );
        printf ("  got myarr.data[%2u] = %d  (return: %s)\n", rtmp[i], x,
                (result > 0) ? "INTARR_OK" : "INTARR_BADINDEX");
    }

    printf ("\nResulting myarr.data array\n\n");
    for (i = 0; i < myarr.len; i++)
        if (myarr.data[i])
            printf ("  myarr.data[%2u] = %d\n", i, myarr.data[i]);
        else
            printf ("  myarr.data[%2u] = 0\n", i);
    printf ("\n");

    if (myarr.data)                                 /* free allocated data */
        free (myarr.data);

    return 0;
}

output:

Setting and retrieving array values, valid index (0 < index < 16)

  set myarr.data[11] = 1  (return: INTARR_OK)
  got myarr.data[11] = 1  (return: INTARR_OK)
  set myarr.data[49] = 2  (return: INTARR_BADINDEX)
  got myarr.data[49] = 1  (return: INTARR_BADINDEX)
  set myarr.data[36] = 3  (return: INTARR_BADINDEX)
  got myarr.data[36] = 1  (return: INTARR_BADINDEX)
  set myarr.data[ 3] = 4  (return: INTARR_OK)
  got myarr.data[ 3] = 4  (return: INTARR_OK)
  set myarr.data[69] = 5  (return: INTARR_BADINDEX)
  got myarr.data[69] = 4  (return: INTARR_BADINDEX)
  set myarr.data[21] = 6  (return: INTARR_BADINDEX)
  got myarr.data[21] = 4  (return: INTARR_BADINDEX)
  set myarr.data[72] = 7  (return: INTARR_BADINDEX)
  got myarr.data[72] = 4  (return: INTARR_BADINDEX)
  set myarr.data[73] = 8  (return: INTARR_BADINDEX)
  got myarr.data[73] = 4  (return: INTARR_BADINDEX)
  set myarr.data[94] = 9  (return: INTARR_BADINDEX)
  got myarr.data[94] = 4  (return: INTARR_BADINDEX)
  set myarr.data[69] = 10  (return: INTARR_BADINDEX)
  got myarr.data[69] = 4  (return: INTARR_BADINDEX)
  set myarr.data[ 2] = 11  (return: INTARR_OK)
  got myarr.data[ 2] = 11  (return: INTARR_OK)
  set myarr.data[22] = 12  (return: INTARR_BADINDEX)
  got myarr.data[22] = 11  (return: INTARR_BADINDEX)
  set myarr.data[ 2] = 13  (return: INTARR_OK)
  got myarr.data[ 2] = 13  (return: INTARR_OK)
  set myarr.data[96] = 14  (return: INTARR_BADINDEX)
  got myarr.data[96] = 13  (return: INTARR_BADINDEX)
  set myarr.data[64] = 15  (return: INTARR_BADINDEX)
  got myarr.data[64] = 13  (return: INTARR_BADINDEX)
  set myarr.data[93] = 16  (return: INTARR_BADINDEX)
  got myarr.data[93] = 13  (return: INTARR_BADINDEX)

Resulting myarr.data array

  myarr.data[ 0] = 0
  myarr.data[ 1] = 0
  myarr.data[ 2] = 13
  myarr.data[ 3] = 4
  myarr.data[ 4] = 0
  myarr.data[ 5] = 0
  myarr.data[ 6] = 0
  myarr.data[ 7] = 0
  myarr.data[ 8] = 0
  myarr.data[ 9] = 0
  myarr.data[10] = 0
  myarr.data[11] = 1
  myarr.data[12] = 0
  myarr.data[13] = 0
  myarr.data[14] = 0
  myarr.data[15] = 0

这篇关于数组一个有效的索引没有返回在C正确的状态code的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆