错误:结构前的预期表达式

时间:2014-11-05 03:30:54

标签: c pointers struct

我正在尝试返回一个指向结构的指针,但我一直收到这个奇怪的错误bboard.c:35: error: Expecte expression before 'BBoard'是否有人对可能导致这种情况的原因有任何想法。我在c中相当新,所以我对此道歉是一个微不足道的问题。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "bboard.h"

struct BBoard {
int create[MAX_ROWS][MAX_COLS];
};


BBoard * bb_create(int nrows, int ncols){
int i,j;
srand(time(NULL));
struct BBoard Bboard;
for (i = 0; i < nrows; i++){
    for (j = 0; j < ncols; j++){
        int r = rand() % 4;
        //printf("%d",r);

        if( r == 0){ 
        Bboard.create[i][j] = 1;}
        if(r == 1){
        Bboard.create[i][j] = 2;}
        if(r == 2){ 
        Bboard.create[i][j] = 3;}
        if(r == 3){
        Bboard.create[i][j] = 4;}
        printf(" %d ",Bboard.create[i][j]);
            }
        printf("\n");
        }
struct BBoard *boardPtr = malloc(sizeof(struct BBoard));
if (boardPtr != NULL){
//printf("%d",boardPtr->create[1][1]);
return BBoard *boardPtr;
}
else{
printf("Error");
}
}

/**extern void bb_display(BBoard *b){
int i,j;
BBoard Bboard = b;
for (i = 0; i < 5; i++){
    for (j = 0; j < 5; j++){
        printf("%d",Bboard.create[i][j]);
        }
    }
}**/


int main(){
BBoard *bptr;
bptr = bb_create(5,5);
//printf("%d",bptr->create[0][1]);
}

1 个答案:

答案 0 :(得分:3)

在C中,您需要使用struct BBoard,直到您使用:

typedef struct BBoard BBoard;

在C ++中,您不需要创建typedef。


  

你能详细说明一下吗?我不明白。

你有:

struct BBoard
{
    int create[MAX_ROWS][MAX_COLS];
};


BBoard * bb_create(int nrows, int ncols)
{
    …

结构定义创建一个类型struct BBoard。它不会创建类型BBoard;它只会创建struct BBoard。因此,当您下次编写BBoard *bb_create时,没有类型BBoard,因此编译器会抱怨。

如果您编写其中一个序列 - 或者:

typedef struct BBoard
{
    int create[MAX_ROWS][MAX_COLS];
} BBoard;

或:

typedef struct BBoard BBoard;
struct BBoard
{
    int create[MAX_ROWS][MAX_COLS];
};

或:

struct BBoard
{
    int create[MAX_ROWS][MAX_COLS];
};
typedef struct BBoard BBoard;

然后你们都定义了一个类型struct BBoard和一个类型BBoard的别名,然后你的代码就会编译。

在C ++中,只需定义structclass即可定义一种类型,可以在没有structclass前缀的情况下使用。


如果你的代码是在函数定义的开头编译的,那么(a)你没有使用标准的C编译器,(b)你的代码还有问题:

return BBoard *boardPtr;

因为这是:

的一部分
    struct BBoard *boardPtr = malloc(sizeof(struct BBoard));
    if (boardPtr != NULL){
        //printf("%d",boardPtr->create[1][1]);
        return BBoard *boardPtr;
    }
    else{
        printf("Error");
    }
}

你真的根本不需要转换返回类型,但是如果你认为你做了,你应该使用适当的强制转换符号(这两个中的一个,最好是第一个):

        return boardPtr;
        return (BBoard *)boardPtr;

else子句中的错误消息应该提供更多信息,应该以新行结束,应该写入标准错误,并且应该后跟return 0;或等效的。