我正在尝试返回一个指向结构的指针,但我一直收到这个奇怪的错误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]);
}
答案 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 ++中,只需定义struct
或class
即可定义一种类型,可以在没有struct
或class
前缀的情况下使用。
如果你的代码是在函数定义的开头编译的,那么(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;
或等效的。