C 函数未正确返回计数时

C 函数未正确返回计数时,c,loops,while-loop,C,Loops,While Loop,我正在尝试使用while函数计算一个指针大于0的值 我需要的是计算返回值大于0的金额 以下是我使用的零件代码,同时: struct mode { int m_mode_max[10]; ... } struct gained_var { struct mode var1[10]; ... } struct fs_session { struct gained_var gained[5]; ... } void frist_gained(str

我正在尝试使用while函数计算一个指针大于0的值

我需要的是计算返回值大于0的金额

以下是我使用的零件代码,同时:

struct mode {
    int m_mode_max[10];
    ...
}

struct gained_var {
    struct mode var1[10];
    ...
}

struct fs_session {
    struct gained_var gained[5];
    ...
}

void frist_gained(struct fs_session *fs, int value) {

    struct itv_expanse itv[5];
    memset(itv, 0, sizeof(itv));

    for (int i = 0; i < 5; i++) {
        int count = 0;
        for (int p = 0; p < 10; p++) {
            while (fs>gained[value].var1[i].m_mode_max[p] > 0) {
                count++;
                printf("count %d\n", count);
            }
        }
    }

    itv[value].var1[i].m_mode = fs>gained[value].var1[i].m_mode_max[rand()%count];
    printf("m_mode %d rnd_value %d\n", itv[value].var1[i].m_mode, rnd()%count);
}
结构模式{ int m_mode_max[10]; ... } 结构变量{ 结构模式var1[10]; ... } 结构fs_会话{ 结构获得(var获得)[5];; ... } 获得的第一个无效值(结构fs\u会话*fs,int值){ 结构itv_扩展itv[5]; memset(itv,0,sizeof(itv)); 对于(int i=0;i<5;i++){ 整数计数=0; 对于(int p=0;p<10;p++){ 而(fs>gound[value].var1[i].m\u mode\u max[p]>0){ 计数++; printf(“计数%d\n”,计数); } } } itv[value].var1[i].m_mode=fs>获得[value].var1[i].m_mode_max[rand()%count]; printf(“m_模式%d rnd_值%d\n”,itv[value].var1[i].m_模式,rnd()%count); } 我可以使用if函数来检查计数,但我想使用While


使用while函数执行此操作的最佳方法是什么?

您需要更改while函数中条件的值

while (<SOMETHING> > 0) {
    // change the value of <SOMETHING>, otherwise
    // you get an infinite loop
}
while(>0){
//更改的值,否则为
//你得到一个无限循环
}
对你来说,可能是

        while (fs>gained[value].var1[i].m_mode_max[p] > 0) {
            count++;                     // does not change fs>gained[value].var1[i].m_mode_max[p]
            printf("count %d\n", count); // does not change fs>gained[value].var1[i].m_mode_max[p]
            p++;                         // <== change fs>gained[value].var1[i].m_mode_max[p]
        }
while(fs>获得[value].var1[i].m\u mode\u max[p]>0){
count++;//不更改fs>govered[value].var1[i].m_mode_max[p]
printf(“count%d\n”,count);//不更改fs>govered[value].var1[i].m_mode_max[p]
p++;//获得[value].var1[i].m_mode_max[p]
}

您已经在
i
p
上循环,以遍历该结构。您需要一个
if
来决定递增计数器

问题是每次计数递增时,您都要打印计数。也许您应该只在循环完成时打印它

for (int i = 0; i < 5; i++) {
    int count = 0;
    for (int p = 0; p < 10; p++) {
        // Typo fix: fs>gained to fs->gained
        if (fs->gained[value].var1[i].m_mode_max[p] > 0) {
            count++;
        }
    }
    printf("i: %d, count: %d\n", i, count);
}

是否有必要检查p 0)是的,@Sombra,在这个特定的例子中这是一个非常好的主意:)虽然它应该是
,但是(p<10&&…
这不是与已经在
p
上迭代的
for
循环冗余吗?是否应该将它们组合起来?的
必须删除,因为while内部有
p++
@pmg不
while(p<10&&fs->获得[value].var1[i].m_mode_max[p]>0)
工作吗?循环将在
fs>获得[value]后立即退出。var1[i].m_mode_max[p]如果
是一个函数,同样地,对于其他关键字,包括
开关
返回
,甚至
大小
。如果有多个实例
fs>获得[value]。var1[i].m_mode_max[p] >0
这算一次还是多次?为什么要在这里使用
while
呢?在
for
中使用
if
是合适的。只是为了学会使用所有的可能性。所以我最后说我可以使用if条件,我想知道更多关于while的信息
for (int i = 0; i < 5; i++) {
    int count = 0;
    for (int p = 0; p < 10; p++) {
        // Typo fix: fs>gained to fs->gained
        if (fs->gained[value].var1[i].m_mode_max[p] > 0) {
            count++;
            break;
        }
    }
    printf("i: %d, count: %d\n", i, count);
}