外部结构基于 aCC (HP-UX) 而不是 macOS (Xcode)
Extern struct builds on aCC (HP-UX) but not on macOS (Xcode)
我有以下在两个源文件中共享的头文件:
sth.h:
#define NBALLS 10
#define NBOTS 2
struct {
float px, py, pz, vx, vy, vz;
}bots[NBOTS];
struct {
float px, py, pz, vx, vy, vz;
}balls[NBALLS];
我在两个源文件中使用相同的方式:
a.c:
#include "sth.h"
void makeBalls(void) {
int i;
srand(time(NULL));
for (i=1;i<NBALLS;i++) {
balls[i].px = MIN + randf()*(MAX-MIN);
balls[i].py = MIN + randf()*(MAX-MIN);
//pz[i] = 0.9;
balls[i].pz = MIN + randf()*(MAX-MIN);
balls[i].vx = -1.5+randf()*3.0;
balls[i].vy = -1.5+randf()*3.0;
balls[i].vz = -1.0+randf()*2.0;
}
}
和b.c:
#include "sth.h"
void makeBots(void) {
int i;
srand(time(NULL));
for (i=1;i<NBOTS;i++) {
bots[i].px = MIN + randf()*(MAX-MIN);
bots[i].py = MIN + randf()*(MAX-MIN);
//pz[i] = 0.9;
bots[i].pz = MIN + randf()*(MAX-MIN);
bots[i].vx = -1.5+randf()*3.0;
bots[i].vy = -1.5+randf()*3.0;
bots[i].vz = -1.0+randf()*2.0;
}
}
在 HP-UX 中,它可以正常构建和运行。
在最新的 macOS 中,它会抱怨重复的符号。
如果我在 sth.h 中进行以下更改:
static struct {
float px, py, pz, vx, vy, vz;
}bots[NBOTS];
static struct {
float px, py, pz, vx, vy, vz;
}balls[NBALLS];
它构建并运行良好。但是,自然地,我的程序不起作用。
我尝试按照此处的建议进行操作:
但是 Xcode 抱怨
bots[i].px = MIN + randf()*(MAX-MIN);
不是向量或指针。
我很困惑为什么它在 HP-UX 下工作。我正在学习 C(非常初学者)并努力确保我的代码保持可移植性,同时也在学习如何处理字节顺序问题。
谢谢,一如既往。
编辑:
我根据建议所做的更改,回答了下面的评论:
sth.h:
#define NBALLS 10
#define NBOTS 2
struct {
float px, py, pz, vx, vy, vz;
}botsZ[NBOTS];
struct {
float px, py, pz, vx, vy, vz;
}ballsZ[NBALLS];
extern struct botsZ bots;
extern struct ballsZ balls;
Xcode returns on a.c and b.c: "Subscripted value is not an array, pointer, or vector" on the every line of the function inside the for 循环。
为什么 aCC 构建得很好?我认为 MIPSPro 也可以构建它(我将测试一次我 return 从旅行)
botsZ
是 2
个匿名结构实例的数组,定义为 htis:
struct {
float px, py, pz, vx, vy, vz;
};
这是头文件中该数组的定义:
#define NBOTS 2
struct {
float px, py, pz, vx, vy, vz;
}botsZ[NBOTS];
以下
extern struct botsZ bots;
声明了一个名为bots
的外部变量,类型为struct botsZ
,但没有这样的类型。 botsZ
是一个实例。
建议:
- 在
.h
文件中定义您需要的 struct
和 typedef
extern
声明实例
- 在
.c
文件中定义 个实例
示例:
sth.h
#ifndef STH_H
#define STH_H
#define NBALLS 10
#define NBOTS 2
typedef struct {
float px, py, pz, vx, vy, vz;
} botsZ;
typedef struct {
float px, py, pz, vx, vy, vz;
} ballsZ;
extern botsZ bots[NBOTS];
extern ballsZ balls[NBALLS];
#endif
sth.c
#include "std.h"
botsZ bots[NBOTS] = {0};
ballsZ balls[NBALLS] = {0};
我有以下在两个源文件中共享的头文件:
sth.h:
#define NBALLS 10
#define NBOTS 2
struct {
float px, py, pz, vx, vy, vz;
}bots[NBOTS];
struct {
float px, py, pz, vx, vy, vz;
}balls[NBALLS];
我在两个源文件中使用相同的方式: a.c:
#include "sth.h"
void makeBalls(void) {
int i;
srand(time(NULL));
for (i=1;i<NBALLS;i++) {
balls[i].px = MIN + randf()*(MAX-MIN);
balls[i].py = MIN + randf()*(MAX-MIN);
//pz[i] = 0.9;
balls[i].pz = MIN + randf()*(MAX-MIN);
balls[i].vx = -1.5+randf()*3.0;
balls[i].vy = -1.5+randf()*3.0;
balls[i].vz = -1.0+randf()*2.0;
}
}
和b.c:
#include "sth.h"
void makeBots(void) {
int i;
srand(time(NULL));
for (i=1;i<NBOTS;i++) {
bots[i].px = MIN + randf()*(MAX-MIN);
bots[i].py = MIN + randf()*(MAX-MIN);
//pz[i] = 0.9;
bots[i].pz = MIN + randf()*(MAX-MIN);
bots[i].vx = -1.5+randf()*3.0;
bots[i].vy = -1.5+randf()*3.0;
bots[i].vz = -1.0+randf()*2.0;
}
}
在 HP-UX 中,它可以正常构建和运行。 在最新的 macOS 中,它会抱怨重复的符号。
如果我在 sth.h 中进行以下更改:
static struct {
float px, py, pz, vx, vy, vz;
}bots[NBOTS];
static struct {
float px, py, pz, vx, vy, vz;
}balls[NBALLS];
它构建并运行良好。但是,自然地,我的程序不起作用。
我尝试按照此处的建议进行操作:
但是 Xcode 抱怨
bots[i].px = MIN + randf()*(MAX-MIN);
不是向量或指针。
我很困惑为什么它在 HP-UX 下工作。我正在学习 C(非常初学者)并努力确保我的代码保持可移植性,同时也在学习如何处理字节顺序问题。
谢谢,一如既往。
编辑: 我根据建议所做的更改,回答了下面的评论: sth.h:
#define NBALLS 10
#define NBOTS 2
struct {
float px, py, pz, vx, vy, vz;
}botsZ[NBOTS];
struct {
float px, py, pz, vx, vy, vz;
}ballsZ[NBALLS];
extern struct botsZ bots;
extern struct ballsZ balls;
Xcode returns on a.c and b.c: "Subscripted value is not an array, pointer, or vector" on the every line of the function inside the for 循环。
为什么 aCC 构建得很好?我认为 MIPSPro 也可以构建它(我将测试一次我 return 从旅行)
botsZ
是 2
个匿名结构实例的数组,定义为 htis:
struct {
float px, py, pz, vx, vy, vz;
};
这是头文件中该数组的定义:
#define NBOTS 2
struct {
float px, py, pz, vx, vy, vz;
}botsZ[NBOTS];
以下
extern struct botsZ bots;
声明了一个名为bots
的外部变量,类型为struct botsZ
,但没有这样的类型。 botsZ
是一个实例。
建议:
- 在
.h
文件中定义您需要的struct
和typedef
extern
声明实例- 在
.c
文件中定义 个实例
示例:
sth.h
#ifndef STH_H
#define STH_H
#define NBALLS 10
#define NBOTS 2
typedef struct {
float px, py, pz, vx, vy, vz;
} botsZ;
typedef struct {
float px, py, pz, vx, vy, vz;
} ballsZ;
extern botsZ bots[NBOTS];
extern ballsZ balls[NBALLS];
#endif
sth.c
#include "std.h"
botsZ bots[NBOTS] = {0};
ballsZ balls[NBALLS] = {0};