首页 > 解决方案 > 尝试使用指针使函数返回两个值,但出现错误:期望标识符

问题描述

它应该是根据用户选择的范围返回两个随机数的函数,我读到我可以使用指针从函数返回两个值,但我在expected an identifier之前得到错误int* ran1int* ran2当我运行代码时我得到错误和 expected ')' before 'int'都是全局变量。即使我为指针使用不同的名称,我仍然会遇到相同的错误。ran1ran2

int level(lev, ran1, ran2, int* ran1, int* ran2){
    srand(time(0));
    if(lev == 'l'){
            ran1=(rand()%10+1);
            ran2=(rand()%10+1);
    }
    if(lev == 'm'){
        ran1=(rand()%50+11);
        ran2=(rand()%50+11);
    }
    if(lev == 'h'){
        ran1=(rand()%100+51);
        ran2=(rand()%100+51);
    }
}

标签: cfunctionpointers

解决方案


“我在 int* ran1 和 int* ran2 之前收到错误预期标识符”

C 编译器错误消息短语“期望一个标识符”出现在许多语法错误中,在各种编译器中(甚至对于其他语言)。在这种情况下,编译器正在喋喋不休地关注带有非类型变量的类型变量。这

int level(lev, ran1, ran2, int* ran1, int* ran2){
          ^^^ untyped ^^^  ^^^^ typed ^^^^^^^^^

虽然今天很少使用这种过时的语法,但当一些 C 编译器接受时,它是为了提供与旧版本 C 语言的向后兼容性。通过用括号括起来使编译器静音:

int level((lev), int* ran1, int* ran2){

(注意ran1ran2,删除。即使在位置 2 和 3 中以某种方式合法,也会导致位置 4 和 5 中相同变量的多个定义)

顺便说一句,并非所有参数都是完成您的代码示例所必需的。下面显示的代码删除了那些不需要的代码。

注意,当传递一个int要更新的指针时,它的值需要更新,在这种情况下是*ran1or *ran2,不是ran1or ran2

*在此上下文中使用的符号取消引用指针,在此示例中,取消引用的指针是要更新的值。)

此外,正如评论中所指出的,srand()只需要在程序会话期间调用一次,并且应该被播种,以便如果程序的运行时间很短,并且可以快速连续调用,将有一个每次调用的唯一种子值。

下面说明了代码中的这些更正:

int level(int lev, int *ran1, int *ran2){//removed unused parameters
    //srand(clock());//moved to main, so just called once
    if(lev == 'l'){
            *ran1=(rand()%10+1);//Updating value *ran1 not pointer ran1 (apply to all)
            *ran2=(rand()%10+1);
    }
    if(lev == 'm'){
        *ran1=(rand()%50+11);
        *ran2=(rand()%50+11);
    }
    if(lev == 'h'){
        *ran1=(rand()%100+51);
        *ran2=(rand()%100+51);
    }
    return 0;//prototype requires a return statement
             //alternatively, the prototype can be made void
             //as 'level(...)' returns its work via its parameters.
}

int main(void)
{
    //calling this only once per execution, 
    srand(GetTickCount());//number of milliseconds elapsed since system started,
    
    int lev = 1, ran1, ran2;
    
    level(lev, &ran1, &ran2);
    
    return 0;//int main(void) requires a return statement
}

推荐阅读