我正在尝试将此代码段转换为Swift.由于一些困难,我正在努力开始起飞.
- (BOOL) connectedToNetwork
{
// Create zero addy
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
return NO;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
return (isReachable && !needsConnection) ? YES : NO;
}
Run Code Online (Sandbox Code Playgroud)
我遇到的第一个和主要问题是如何定义和使用C结构.在struct sockaddr_in zeroAddress;
上面代码的第一行()中,我认为他们正在定义一个zeroAddress
从struct sockaddr_in(?)调用的实例,我假设.我试着宣布var
这样的话.
var zeroAddress …
Run Code Online (Sandbox Code Playgroud) 我已经struct
在头文件和声明中看到了s的完整定义- 一种方法对另一种方法有什么优势吗?
如果它有所不同,我通常会在这里输入一个这样的结构 .h
typedef struct s s_t;
Run Code Online (Sandbox Code Playgroud)
需要明确的是,选项是头文件中的声明和类中的定义,或者头文件中的声明和定义.两者都应该产生相同的可用性,即使一个是通过联系,不应该吗?
我看到很多几乎重复,例如这里但没有完全匹配.如果我在这方面错了,请纠正我.
我正在窥探我的MSP430微控制器的头文件,我遇到了这个<setjmp.h>
:
/* r3 does not have to be saved */
typedef struct
{
uint32_t __j_pc; /* return address */
uint32_t __j_sp; /* r1 stack pointer */
uint32_t __j_sr; /* r2 status register */
uint32_t __j_r4;
uint32_t __j_r5;
uint32_t __j_r6;
uint32_t __j_r7;
uint32_t __j_r8;
uint32_t __j_r9;
uint32_t __j_r10;
uint32_t __j_r11;
} jmp_buf[1]; /* size = 20 bytes */
Run Code Online (Sandbox Code Playgroud)
我知道它声明了一个匿名结构和typedef它jmp_buf
,但我无法弄清楚它是什么[1]
.我知道它声明jmp_buf
是一个有一个成员(这个匿名结构)的数组,但我无法想象它用于什么.有任何想法吗?
比较以下结构的两个实例,我收到一个错误:
struct MyStruct1 {
Position(const MyStruct2 &_my_struct_2, const int _an_int = -1) :
my_struct_2(_my_struct_2),
an_int(_an_int)
{}
std::string toString() const;
MyStruct2 my_struct_2;
int an_int;
};
Run Code Online (Sandbox Code Playgroud)
错误是:
错误C2678:二进制'==':找不到哪个运算符带有'myproj :: MyStruct1'类型的左手操作数(或者没有可接受的转换)
为什么?
我已经定义了这个结构:
typedef struct
{
char A:3;
char B:3;
char C:3;
char D:3;
char E:3;
} col;
Run Code Online (Sandbox Code Playgroud)
该sizeof(col)
给我3的输出,但它不应该是2?如果我只评论一个元素,sizeof
则为2.我不明白为什么:3位的5个元素等于15位,并且小于2个字节.
在定义像这样的结构时是否存在"内部大小"?我只需要澄清一下,因为从我到目前为止的语言概念来看,我预计大小为2字节,而不是3字节.
当谈到在Swift中改变值类型时,有些事情我并不完全理解.
正如"The Swift Programming Language"iBook所述: 默认情况下,不能在其实例方法中修改值类型的属性.
因此,为了实现这一点,我们可以mutating
在结构和枚举中使用关键字声明方法.
对我来说并不完全清楚的是:您可以从结构外部更改var,但不能从自己的方法中更改它.这对我来说似乎是违反直觉的,因为在面向对象语言中,你通常会尝试封装变量,因此它们只能从内部进行更改.对于结构,这似乎是另一种方式.详细说明,这是一段代码片段:
struct Point {
var x = 0, y = 0
mutating func moveToX(x: Int, andY y:Int) { //Needs to be a mutating method in order to work
self.x = x
self.y = y
}
}
var p = Point(x: 1, y: 2)
p.x = 3 //Works from outside the struct!
p.moveToX(5, andY: 5)
Run Code Online (Sandbox Code Playgroud)
有没有人知道结构不能从他们自己的上下文中改变他们的内容的原因,而内容可以很容易地在其他地方改变?
我很熟悉在Go中,接口定义功能而不是数据.您将一组方法放入接口,但是您无法指定实现该接口的任何字段.
例如:
// Interface
type Giver interface {
Give() int64
}
// One implementation
type FiveGiver struct {}
func (fg *FiveGiver) Give() int64 {
return 5
}
// Another implementation
type VarGiver struct {
number int64
}
func (vg *VarGiver) Give() int64 {
return vg.number
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用接口及其实现:
// A function that uses the interface
func GetSomething(aGiver Giver) {
fmt.Println("The Giver gives: ", aGiver.Give())
}
// Bring it all together
func main() {
fg := &FiveGiver{}
vg := &VarGiver{3}
GetSomething(fg)
GetSomething(vg) …
Run Code Online (Sandbox Code Playgroud) 我即将在代码中创建100,000个对象.它们很小,只有2或3个属性.我将它们放在一个通用列表中,当它们存在时,我将循环它们并检查值a
并可能更新值b
.
将这些对象创建为类还是结构更快/更好?
编辑
一个.属性是值类型(我认为字符串除外?)
湾 他们可能(我们还不确定)有一个验证方法
编辑2
我想知道:堆上的对象和堆栈是否由垃圾收集器同等处理,或者它的工作方式有何不同?
可能重复:
为什么GCC不优化结构?
为什么C++不能使结构更紧凑?
请考虑以下32位x86计算机上的示例:
由于对齐约束,以下结构
struct s1 {
char a;
int b;
char c;
char d;
char e;
}
Run Code Online (Sandbox Code Playgroud)
如果成员被重新排序,则可以更有效地表示内存(12对8字节)
struct s2 {
int b;
char a;
char c;
char d;
char e;
}
Run Code Online (Sandbox Code Playgroud)
我知道C/C++编译器不允许这样做.我的问题是为什么语言是这样设计的.毕竟,我们最终可能会浪费大量的内存,而且struct_ref->b
不会关心差异.
编辑:谢谢大家的非常有用的答案.您解释为什么由于语言的设计方式,重新排列不起作用.然而,它让我想到:如果重新排列是语言的一部分,这些论点是否仍然有效?让我们说有一些指定的重新排列规则,我们至少需要这个规则
我一个接一个地论证你的论点:
低级别的数据映射,"最惊喜的元素":只写你的结构以紧身款式自己(像@佩里的回答),并没有发生任何改变(要求1).如果由于一些奇怪的原因,你想要内部填充,你可以使用虚拟变量手动插入,和/或可能有关键字/指令.
编译器差异:要求3消除了这种担忧.实际上,从@David Heffernan的评论来看,我们今天似乎遇到了这个问题,因为不同的编译器填充不同?
优化:重新排序的重点是(内存)优化.我在这看到很多潜力.我们可能无法一起删除填充,但我没有看到重新排序如何以任何方式限制优化.
类型铸造:在我看来,这是最大的问题.不过,应该有办法解决这个问题.由于规则是用语言修复的,编译器能够弄清楚成员的重新排序方式,并做出相应的反应.如上所述,在您想要完全控制的情况下,始终可以防止重新排序.此外,要求2确保类型安全代码永远不会中断.
我认为这样的规则有意义的原因是因为我发现按结构内容而不是按类型对结构成员进行分组更为自然.当我有很多内部结构时,编译器也更容易选择最适合我的顺序.最佳布局甚至可能是我无法以类型安全的方式表达的布局.另一方面,它似乎使语言更复杂,这当然是一个缺点.
请注意,我不是在谈论改变语言 - 只有它可以(/应该)设计不同.
我知道我的问题是假设的,但我认为讨论提供了对机器和语言设计较低层次的更深入的了解.
我在这里很新,所以我不知道是否应该为此产生一个新问题.请告诉我是否是这种情况.
我正在尝试创建一个结构数组,其中每个结构代表一个天体,用于解决我正在课堂上工作的问题.我没有那么多结构体验,这就是为什么我决定尝试使用它们而不是一大堆数组,但是,我继续遇到许多不同的错误,即使我试图实现这些技术我已经在各种线程和stackoverflow上看到过(例如在C和C中的结构数组 - 初始化结构数组),但并非所有这些都适用,所以我无法完全复制的方式做它.在我向您展示我正在尝试做的事情之前,只需要预先警告,因为我已经醒了很长时间,因此我需要睡觉几个小时才能回复评论/问题/答案.我真的很抱歉,但是在忙碌了一天并且已经解决了这个问题好几个小时之后我真的很累.
对于那些已经阅读过这一点的人的进一步信息:我不需要任何这些是动态的,我知道/事先确定一切的大小.我还需要这个全局数组(喘气 GLOBAL VARIABLES),因为我在几个不同的方法中访问它,这些方法已经定义了参数(即GLUT方法).
这就是我在标题中定义结构的方式:
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
Run Code Online (Sandbox Code Playgroud)
在定义结构内部之前,我有一个其他全局变量的列表,其中一个是这个结构的数组(基本上,如果我在模糊的说话中太不清楚,下面这一行高于上面的东西):
struct body bodies[n];
Run Code Online (Sandbox Code Playgroud)
只是你知道,n
这是我合法定义的东西(即#define n 1
).
我在几个不同的方法中使用这个数组,但最容易和最少占用空间的是我的main的简化形式,我初始化每个结构中的所有变量,只是为了在我修改它们之前设置变量办法:
int a, b;
for(a = 0; a < n; a++)
{
for(b = 0; b < 3; b++)
{
bodies[a].p[b] = 0;
bodies[a].v[b] = 0;
bodies[a].a[b] = 0;
}
bodies[a].mass = 0;
bodies[a].radius = 1.0;
}
Run Code Online (Sandbox Code Playgroud)
我正面临的当前错误是nbody.c:32:13: error: array type …
struct ×10
c ×6
c++ ×2
swift ×2
arrays ×1
c# ×1
declaration ×1
go ×1
header ×1
interface ×1
ios ×1
reachability ×1
typedef ×1
value-type ×1