m0_69751455 2022-04-17 09:48 采纳率: 66.7%
浏览 26
已结题

数据结构,三维数组输出的是地址


#include<stdio.h>
#include<malloc.h>
#define error 0
#define ok 1
#define notpresent 2
#define duplicate 3
#define illegalindex 4
typedef int status; 
typedef struct array
{
    int m1;
    int m2;
    int m3;
    int* array;
}triplearray;
status creat(triplearray* array,int m1,int m2,int m3);
status destroy(triplearray* array);
status retrieve(triplearray array,int m1,int m2,int m3,int* x);
status store(triplearray* array,int m1,int m2,int m3,int x);
status output(triplearray array);
status copy(triplearray* arrayA,triplearray* arrayB);
int main()
{
    int i1,i2,i3;
    int i;
    triplearray arrayA,arrayB;
    creat(&arrayA,2,2,2);
    creat(&arrayB,2,2,2);
    for(i1=0;i1<arrayA.m1;i1++);
       for(i2=0;i2<arrayA.m2;i2++);
         for(i3=0;i3<arrayA.m3;i3++);
           {
               store(&arrayA,i1,i2,i3,1);               
           }
    for(i1=0;i1<arrayB.m1;i1++);
       for(i2=0;i2<arrayB.m2;i2++);
         for(i3=0;i3<arrayB.m3;i3++);
         {
             store(&arrayB,i1,i2,i3,3);
        }                   
    output(arrayA);
    output(arrayB);    
    return 0;
}
status creat(triplearray* array,int m1,int m2,int m3)
{
    array->m1=m1;
    array->m2=m2;
    array->m3=m3;
    array->array=(int*)malloc(sizeof(int)*m1*m2*m3);
       if(!array->array)
        return error;
    return ok;
}

status destroy(triplearray* array)
{
    if(!array->array)
      return error;
    free(array->array);
    return ok;
}

status retrieve(triplearray array,int m1, int m2,int m3,int* x)
{
    if(!array.array)
      return notpresent;
    if(m1<0||m1>=array.m1)
       return illegalindex;
    if(m2<0||m2>=array.m2)
       return illegalindex;
    if(m3<0||m3>=array.m3)
       return illegalindex;
    *x=*(array.array+m1*array.m2*array.m3+m2*array.m3+m3);
      return ok;
}

status store(triplearray* array, int i1, int i2, int i3, int x)
{
    if (!array->array)
    return notpresent;
    if (i1 < 0 || i2 < 0 || i3 < 0 || i1 > array->m1 || i2 >array->m2 || i3 > array->m3)
        return illegalindex;
    *(array->array + i1 * array->m2 * array->m3 + i2 * array->m3 + i3) = x;
    return ok;
}



status output(triplearray array)
{
    int i1,i2,i3;
    int value;
    if(!array.array)
    return notpresent;
    for(i1=0;i1<array.m1;i1++)
      for(i2=0;i2<array.m2;i2++)
         for(i3=0;i3<array.m3;i3++)
           {           
               retrieve(array,i1,i2,i3,&value);
               printf("array[%d][%d][%d]=%d",i1,i2,i3,value);
           }                      
    printf("\n");
    return ok;      
}

status copy(triplearray* arrayA,triplearray* arrayB)
{
    int i1,i2,i3;
    if(!arrayA->array||!arrayB->array)
       return error;
    if(arrayA->array==arrayB->array)
       return duplicate;
    for(i1=0;i1<arrayA->m1;i1++)
      for(i2=0;i2<arrayA->m2;i2++)
         for(i3=0;i3<arrayA->m3;i3++)
           {
               int value;
               retrieve(*arrayA,i1,i2,i3,&value);
               store(arrayB,i1,i2,i3,value);
            } 
    return ok;    
}




img


得到的却是如图所示的结果。
初步判断是在store函数中出了问题,但找不到错因。经过调试后发现,执行store后数组中是没有正常存储进数值的,我怀疑就是这个原因导致输出全是地址,求解决方法!谢谢

  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-04-17 12:01
    关注
    
    #include<stdio.h>
    #include<malloc.h>
    #define error 0
    #define ok 1
    #define notpresent 2
    #define duplicate 3
    #define illegalindex 4
    typedef int status;
    typedef struct _array
    {
        int m1;
        int m2;
        int m3;
        int* array;
    }triplearray;
    status creat(triplearray* array,int m1,int m2,int m3);
    status destroy(triplearray* array);
    status retrieve(triplearray array,int m1,int m2,int m3,int* x);
    status store(triplearray* array,int m1,int m2,int m3,int x);
    status output(triplearray array);
    status copy(triplearray* arrayA,triplearray* arrayB);
    int main()
    {
        int i1,i2,i3;
        int i;
        triplearray arrayA,arrayB;
        creat(&arrayA,2,2,2);
        creat(&arrayB,2,2,2);
        for(i1=0;i1<arrayA.m1;i1++)
           for(i2=0;i2<arrayA.m2;i2++)
             for(i3=0;i3<arrayA.m3;i3++)
               {
                   store(&arrayA,i1,i2,i3,1);
               }
        for(i1=0;i1<arrayB.m1;i1++)
           for(i2=0;i2<arrayB.m2;i2++)
             for(i3=0;i3<arrayB.m3;i3++)
             {
                 store(&arrayB,i1,i2,i3,3);
            }
        output(arrayA);
        output(arrayB);
        return 0;
    }
    status creat(triplearray* array,int m1,int m2,int m3)
    {
        array->m1=m1;
        array->m2=m2;
        array->m3=m3;
        array->array=(int*)malloc(sizeof(int)*m1*m2*m3);
           if(!array->array)
            return error;
        return ok;
    }
    
    status destroy(triplearray* array)
    {
        if(!array->array)
          return error;
        free(array->array);
        return ok;
    }
    
    status retrieve(triplearray array,int m1, int m2,int m3,int* x)
    {
        if(!array.array)
          return notpresent;
        if(m1<0||m1>=array.m1)
           return illegalindex;
        if(m2<0||m2>=array.m2)
           return illegalindex;
        if(m3<0||m3>=array.m3)
           return illegalindex;
        *x=*(array.array+m1*array.m2*array.m3+m2*array.m3+m3);
          return ok;
    }
    
    status store(triplearray* array, int i1, int i2, int i3, int x)
    {
        if (!array->array)
        return notpresent;
        if (i1 < 0 || i2 < 0 || i3 < 0 || i1 > array->m1 || i2 >array->m2 || i3 > array->m3)
            return illegalindex;
        *(array->array + i1 * array->m2 * array->m3 + i2 * array->m3 + i3) = x;
        return ok;
    }
    
    
    
    status output(triplearray array)
    {
        int i1,i2,i3;
        int value;
        if(!array.array)
        return notpresent;
        for(i1=0;i1<array.m1;i1++)
          for(i2=0;i2<array.m2;i2++)
             for(i3=0;i3<array.m3;i3++)
               {
                   retrieve(array,i1,i2,i3,&value);
                   printf("array[%d][%d][%d]=%d ",i1,i2,i3,value);
               }
        printf("\n");
        return ok;
    }
    
    status copy(triplearray* arrayA,triplearray* arrayB)
    {
        int i1,i2,i3;
        if(!arrayA->array||!arrayB->array)
           return error;
        if(arrayA->array==arrayB->array)
           return duplicate;
        for(i1=0;i1<arrayA->m1;i1++)
          for(i2=0;i2<arrayA->m2;i2++)
             for(i3=0;i3<arrayA->m3;i3++)
               {
                   int value;
                   retrieve(*arrayA,i1,i2,i3,&value);
                   store(arrayB,i1,i2,i3,value);
                }
        return ok;
    }
    
    
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月25日
  • 已采纳回答 4月17日
  • 修改了问题 4月17日
  • 创建了问题 4月17日

悬赏问题

  • ¥20 CST怎么把天线放在座椅环境中并仿真
  • ¥15 任务A:大数据平台搭建(容器环境)怎么做呢?
  • ¥15 r语言神经网络自变量重要性分析
  • ¥15 基于双目测规则物体尺寸
  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?