鱼C论坛

 找回密码
 立即注册
查看: 2801|回复: 3

写C程序时遇到用指针访问数组的问题

[复制链接]
发表于 2023-2-3 01:02:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码目的是实现输入一个数,把它的每个数位标记到数组里,想问问大家代码有什么问题呀(用在51单片机上的,不知道是不是这段代码出了问题)麻烦了!
int Pow(int a, int b)
{
        int c = a;
        
        if(b==0)
        {
                a = 1;
        }
        while(b)
        {
                a = a * c;
                b--;
        }

        return a;
}

int* counter(unsigned long int count)
{
        unsigned long int a;//a从0开始+1直到==count,从而计算count每一位上的数字
        int number[8], b, dight = 7;//b作临时计数变量,计算每一位的大小并赋值给数组
        
        while(dight+1)
        {
                for(a=Pow(10,dight+1),b=1;a=a-Pow(10,dight),b++;a>=0)
                {
                        if(a < count)
                        {
                                count -= a;
                                number[dight] = (10 - b);
                                break;
                        }
                }
                dight--;
        }
        
        return number;
}

void main()
{        
        bit flag = 1;
        int checker, timer[8], num;//timer储存counter中的数组,num临时计数
        int *pa = counter(20);//pa储存数组地址
        for(num=0;num++,pa+=4;num<=7)
        {
                timer[num] = *pa;
        
        }
        
        for(num=0;num++;num<=7)
        {
                if(timer[num] == 0 && flag == 1)
                {
                        checker = num;
                        flag = 0;
                }
                if(timer[num] != 0 && flag == 0)
                {
                        flag = 1;
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-3 01:24:06 | 显示全部楼层
本帖最后由 桃花飞舞 于 2023-2-3 01:31 编辑

你的代码不行吧!
为什么for循环这么写
for(num=0;num++,pa+=4;num<=7)  //这里有pa++不行么?   而且for循环这么写不对吧  改为 for(num=0;num<=7;num++,pa++;) 
for(num=0;num++;num<=7)          //for循环这么写不对  改为for(num=0;num<=7;num++)    
int* counter(unsigned long int count)  函数里 
 int number[8], b, dight = 7;//b作临时计数变量,计算每一位的大小并赋值给数组   
上句这句改为
int *number = malloc(8*sizeof(int));
int b = 0,dight = 7;
return number; //这样返回局部数组的地址是不正确的 具体可以把函数int* counter(unsigned long int count) 做成int* counter(int * number,int n ,unsigned long int count) ,
这样就可以返回 number,你这里的用法还不太会。
或者用上面malloc的方法来写
细节多多少少还有问题,慢慢改吧,你的程序没有给出输入输出样例,我也不好给你改错



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-2-3 07:51:06 | 显示全部楼层
int Pow(int a, int b)
{
    if(b==0)
    {
        return 1;
    }
    b-=1;
    int c = a;
    while(b)
    {
        a = a * c;
        b--;
    }

    return a;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-2-3 11:32:57 | 显示全部楼层
本帖最后由 两手空空儿 于 2023-2-3 11:43 编辑

你要先把楼上兄弟们说的错误改正
我说点逻辑上的,我没看懂的的想法。。。。。。。
int* counter(unsigned long int count)
{
        unsigned long int a;//a从0开始+1直到==count,从而计算count每一位上的数字
              //这里注释a是从0开始
        int number[8], b, dight = 7;//b作临时计数变量,计算每一位的大小并赋值给数组
       
        while(dight+1)
        {
                for(a=Pow(10,dight+1),b=1;a=a-Pow(10,dight),b++;a>=0)
                            //这里a是从10^8开始 ,,,第二次循环a= a- 10^6,丢了7啊
                            //假如补上7,第一次a=10^8, 第二次 a= 10^8 - 10^7 = 10, 这不合理,怎么拿到每一位的数字?
                {
                        if(a < count)
                        {  // 这一段我没看明白 参数count = 20传进来, 当a=10时进入这里
                                count -= a;   // count = 10
                                number[dight] = (10 - b);    // 10 -  循环次数(b) ,这是想记录什么??????
                                break;     //想遍历这里应该是用 continue,要不if只进一次就结束while循环了
                        }
                }
                dight--;
        }
       
        return number;
}
还有第45行for(num=0;num++,pa+=4;num<=7)
这里可能也有问题, C51是8位机,要确认一下你的环境int是不是4个字节 ,要不pa += 4 一下就超了, 没有必要手动,已经定义了pa 是int 型, 直接p++就是下一个int的位置了
//一般我们提取各个位上的数字是用求余的方式
int count = 56214;  //待分析数字
int dig;  //存放拿到的一位数字
for( ; count > 0; count /= 10)
{    //从个位开始拿到每一位数字
             dig = count % 10;
             printf("%d\n", dig);
}
// 这一段会输出 
// 4
// 1
// 2
// 6
// 5 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 21:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表