我将如何为iOS创建可由任何人编译的Xcode项目?
我想要做的是编写一个简单的应用程序并将整个项目(只是归档整个项目文件夹)发送给朋友,以便他可以编译它并在他自己的设备上测试它.
我们俩都是作为个人iOS开发者单独注册的; 我们都可以下载示例项目并成功运行它们; 而我可以在我的iPad上运行我的应用程序.但是,当我将存档发送给我的同事时,他无法对其进行测试(他说它已构建但不会尝试在设备上安装或运行,只会抱怨"未找到有效的签名身份").
很明显,我不了解有关开发配置文件如何工作的过程.肯定有一些方法可以生成一个可以由任何人编译的项目,并且不需要我的配置文件在机器上,或者示例项目将无法编译?(为什么只有源代码形式的项目甚至需要附加一个配置文件?)
我是否正确理解1)我以某种方式将我的个人开发人员信息捆绑到仅源项目中,这使其无法由另一个未连接的开发人员构建,以及2)如果是这样,实际上可以共享项目通过这种方式?我如何将项目与个人资料分开?
我模糊地意识到这也是分享项目的"错误"方式:我对改变这一点的建议持开放态度,但仍然想要了解我做错了什么,以及我错过了哪些必须明显的东西在供应过程中.
我正在使用FSharp.Data.JsonProviderTwitter推文.
使用此示例代码 https://github.com/tpetricek/Documents/tree/master/Samples/Twitter.API
我想扩展推文中的网址
let expandUrl (txt:string) (url:Search.DomainTypes<...>.DomainTypes.Url) =
txt.Replace( url.Url, url.ExpandedUrl )
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
Lookup on object of indeterminate type based on information prior to this program point.
A type annotation may be needed prior to this program point to constrain the type of the object.
Run Code Online (Sandbox Code Playgroud)
我的问题是如何TypeProvider在上面的expandUrl函数中定义url 的类型?
类型感染告诉我这个
val urls : FSharp.Data.JsonProvider<...>.DomainTypes.Url []
Run Code Online (Sandbox Code Playgroud)
但是在类型声明中不接受这一点.我假设"<...>"不是F#synatx.
如何使用TypeProvider类型进行类型注释,例如 FSharp.Data.JsonProvider<...>.DomainTypes.Url ?
以下是完整的代码段:
open TwitterAPI // github.com/tpetricek/Documents/tree/master/Samples/Twitter.API
let twitter = TwitterAPI.TwitterContext( _consumerKey, _consumerSecret, _accessToken, _accessTokenSecret )
let query = "water" …Run Code Online (Sandbox Code Playgroud) 它已经成熟并且是一个规范的参考问题,在C++结构和类中,在手动编写代码时几乎可以互换.
但是,如果我想链接到现有代码,如果我在原始代码之后将头重新声明为一个类,或者反之亦然,我可以期望它能够产生任何差异(例如,中断,鼻子恶魔等)产生的?
所以这种情况是被编译成一个结构(或类)的类型,而我则改变了头文件到其他声明,包括它在我的项目之前.
真实世界的用例是我用SWIG自动生成代码,根据是给定结构还是类,生成不同的输出; 我需要将其中一个更改为另一个以使其输出正确的界面.
这个例子在这里(Irrlicht,SVertexManipulator.h) - 给出:
struct IVertexManipulator
{
};
Run Code Online (Sandbox Code Playgroud)
我机械地重新声明它:
/*struct*/class IVertexManipulator
{public:
};
Run Code Online (Sandbox Code Playgroud)
原始库使用原始标题进行编译,不受影响.包装器代码使用修改后的表单生成,并使用它们进行编译.然后将这两个链接到同一个程序中以便一起工作.假设我对两个库使用完全相同的编译器.
这种事情是不确定的?"未定义",但预计会在现实编译器上工作?完全允许?
我正在做的其他类似的更改包括从参数中删除一些默认值(以防止歧义),以及从SWIG不可见类型的几个类中删除字段声明(这改变了类的结构,但我的推理是生成的代码应该需要该信息,仅链接到成员函数).再次,这会造成多大的破坏?
s32 addHighLevelShaderMaterial(
const c8* vertexShaderProgram,
const c8* vertexShaderEntryPointName/*="main"*/,
E_VERTEX_SHADER_TYPE vsCompileTarget/*=EVST_VS_1_1*/,
const c8* pixelShaderProgram=0,
...
Run Code Online (Sandbox Code Playgroud)
public:
//IIndexList *Indices;
Run Code Online (Sandbox Code Playgroud)
......等等.其他更改包括使用typedef替换某些模板参数类型并packed从某些结构中删除该属性.同样,如果更改的结构声明从未在机器代码中实际使用(仅生成链接到主库中的访问器函数的名称),似乎应该没有问题,但这是否可靠?这样的情况?
很明显,C中的数组不能在它们的元素之间插入填充.但是,有没有规则说他们不能在整个数组的末尾添加尾随填充?
即这个计划是否保证在各地都能得到相同的结果?
#include <stdio.h>
int main(void) {
typedef char a[3];
typedef a b[3];
printf("%zu %zu\n", sizeof(a), sizeof(b)); // -> 3 9
}
Run Code Online (Sandbox Code Playgroud)
据我所知a,在一个误导的优化尝试中添加一个或五个大小的尾随字节,不会破坏数组访问规则(b[1][1]仍然精确地映射到*(&b + sizeof(a) * 1 + 1)它所包含的a对象的大小,并访问超出包含的长度a是UB无论如何).
我不能在C标准,其中它实际上任何地方找到说彻底一个数组的大小的元素类型乘以元素数的大小.6.5.3.4只表示sizeof返回数组中的"字节数"(它确实sizeof array / sizeof array[0]作为代码示例给出,但它只是一个例子 - 它没有说它必须工作,并且它没有提供任何细节) .
隐式保证对于编写依赖于精确数据布局的可移植代码非常有用,例如传递打包的RGB值:
typedef uint8_t RGB[3];
RGB * data = ...;
glColorPointer(3, GL_UNSIGNED_BYTE, 0, data);
Run Code Online (Sandbox Code Playgroud)
(好的,所以OpenGL可以接受步幅值,所以这是一个不好的例子,但你明白了)
就此而言,我从广泛的概念(甚至标准中的例子)中假设你可以得到数组的元素数量,sizeof无论如何这可能在任何地方都适用 - 有没有任何已知的情况,它不是"T?
如果有效数的最低有效位被设置为随机值,那么对浮点数学的影响可能是多少?
说明:
语言PicoLisp使用一个结构分配所有值,该结构由两个"机器字"组成.在32位系统上,这意味着单元是两个32位指针或整数的八字节结构.单元格与其大小对齐,这意味着至少字的最低三位可以自由地用作类型和GC标签数据.
PicoLisp极简主义.语言缺乏的(许多)事物之一是对浮点数的任何支持,而是完全依赖于文档称为"缩放的固定点"表示.我认为尝试添加浮点支持会很有趣.
在32位系统上,64位浮点数可以整齐地放在一个单元格内,这很方便地意味着分配系统可以完全相同,除了一个小问题:双重使用所有64位.但是GC期望使用位0作为GC标记位.天真地进行,在每个收集周期之后,位0将被设置为零,而不管双倍中实际存储了什么值.
(这是假设的大小和正确ENDIANNESS所有行承担的这一点,他们做的目的;如果他们不这样做,那么整个问题是完全不相关和不同的策略不一定必须使用.)
那么:对于通用数学,使用硬件浮点运算有多少问题?
如果它是所有减轻双微小剂量的精度,然后我的身影,实际上并不是一个问题:只要是记录在案的是,在解释浮点数学是不是精确的用户所期望的,他们应该如果他们需要严格准确的行为,可以回到修复点或库或其他东西.我对它的直观理解是应该是这种情况,因为它是最不重要的一点(当你转换为字符串时甚至不显示......?).
另一方面,浮点是,呃,巫术.这种小小的琐事是否会严重影响数学的有用性或产生任何一致结果的能力?
(我已经考虑过分配器的其他几种实现可能性.我特别感兴趣的是这种策略是否具有愚蠢性,因为它是最简单的,而且我很懒.)
Visual Studio的失败static_assert的错误消息完全由一个错误代码和static_assert的第二个参数组成,没有任何其他消息表明它是静态断言失败.我想制作一个宏来解决这个问题.例如,作为第一次尝试:
#define STATIC_ASSERT(x) static_assert(x, "static assertion failed: " #x)
Run Code Online (Sandbox Code Playgroud)
您遇到的第一个问题是C预处理器不理解< >为封闭分隔符,这会导致模板出现语法错误.以下内容变为非法:
template <typename T, typename U>
auto SafeMultiply(T x, U y) -> decltype(x * y)
{
STATIC_ASSERT(std::is_same<T, U>::value);
STATIC_ASSERT(!std::numeric_limits<T>::is_signed);
if (x > (std::numeric_limits<decltype(x * y)>::max)())
throw std::overflow_error("multiplication overflow");
return x * y;
}
Run Code Online (Sandbox Code Playgroud)
这是非法的,因为第一个中的T和U之间的逗号STATIC_ASSERT被解释为分隔两个宏参数,而不是模板参数.C预处理器抛出错误,因为STATIC_ASSERT宏只接受一个参数.
这个问题的两个主要解决方案是使用双括号,最近使用可变参数宏:
// Invoke the macro this way...
STATIC_ASSERT((std::is_same<T, U>::value));
// ...or define it this way:
#define STATIC_ASSERT(...) static_assert((__VA_ARGS__), \
"static assertion failed: " #__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
后一种解决方案更好,只需要更改宏定义.(__VA_ARGS__新定义中的额外括号是为了在某些更奇怪的情况下保持正确的操作顺序.在这个特定的宏中可能无关紧要,但在宏定义中将括号括在宏的参数周围是个好习惯. )
现在,如果我想更改我的 …
假设我有一个场景,我需要确保我的代码中使用的值是编译时常量(例如,可能是P10规则2 "固定循环边界" 的严格解释).如何在C语言级别强制执行此操作?
C支持语言级的整数常量表达式的概念.必须有可能找到一种方法来利用这一点,以便只能在表达式中使用符合此规范的值,对吗?例如:
for (int i = 0; i < assert_constant(10); ++i) {...
Run Code Online (Sandbox Code Playgroud)
一些不太通用的部分解决方案在多种情况下都很有用:
Bitfields:static_assert在C11之前用C 实现的经典策略是使用一个位域,当条件失败时它的值是非法的:
struct { int _:(expression); }
Run Code Online (Sandbox Code Playgroud)
虽然这可以很容易地包装以用作表达式的一部分,但它根本不是通用的 - expression"[may]" 的最大值不超过将指定的类型的对象的宽度,冒号和表达式被省略"(C11 6.7.2.1),对可观的数量expression(通常可能为64)设置了非常低的便携式限制.它也可能不是负面的.
枚举:一个enum要求的任何初始化表达式是整数常量表达式.但是,enum声明不能嵌入到表达式中(与struct定义不同),需要自己的声明.由于枚举器列表中的标识符被添加到周围的范围,因此我们每次都需要一个新名称.__COUNTER__没有标准化,所以没有办法从宏内实现这一点.
情况:同样,对case一行的参数表达式必须是整数常量.但这需要一个周围的switch声明.这并不比enum它好多了,而且它是你不想隐藏在宏中的东西(因为它会生成真实的语句,即使它们很容易被优化器删除).
数组声明:从C99开始,数组大小甚至不必是常量,这意味着它无论如何都不会产生所需的错误.它也是一个声明,要求在周围范围内引入一个名称,遇到同样的问题enum.
当然有一些方法可以隐藏在可重复的宏中的常量检查,传递值(因此它可以用作表达式),并且不需要语句行或引入额外的标识符?
我已经在我的 Linux 内核中定义了一个“helloworld”系统调用并重新编译了它。系统调用的代码是:
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/sched.h>
#include<linux/syscalls.h>
#include "processInfo.h"
asmlinkage long sys_listProcessInfo(void)
{
printk("Hello World. My new syscall..FOSS Lab!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我从具有另一个内核版本(不包括此系统调用)的同一操作系统调用此系统调用时,请使用以下代码:
#include<stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>
int main()
{
long int var = syscall(326);
printf("Returning: %ld\n",var);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该变量var的值为 -1。我想知道如何var获取 -1 而不是显示错误。
我需要创建一个派生自JTextComponent(从JTextPane,实际)的类,其中至少有一个默认键映射被更改.也就是说,在我特殊的JTextPane中,我希望">"键击执行操作而不是将该字符添加到文本窗格中,因为默认情况下会处理所有可打印的键入字符.
为了打破正常行为,有以下API:
JTextComponent.getKeymap() Keymap.addActionForKeyStroke()JTextComponent.setKeymap()但是,我发现尽管这些方法不是静态的,但它们会影响JTextComponent我的应用程序中所有s 使用的键盘映射.没有简单的机制可以克隆Keymap,可能会解决问题,或者我错过了什么.
我所追求的是一种改变我的JTextPane类的键映射的方法,但不是所有来自JTextComponent类的键.
或者我应该在别处寻找?
我几乎可以肯定,别人也有这个问题,这可能是重复的,但我不知道叫什么命令一样<C-L>,所以我还没有得到任何运气找到一个现有的问题.如果这是重复,请重定向我.
问题来自vimrc部分,其内容如下:
" Map <C-L> (redraw screen) to also turn off search highlighting until the
" next search
nnoremap <C-L> :nohl<CR><C-L>
Run Code Online (Sandbox Code Playgroud)
那么我按哪种键组合(在哪种模式下)来输入<C-L>映射?
c ×5
c++ ×2
keymapping ×2
abi ×1
c99 ×1
compile-time ×1
f# ×1
f#-data ×1
ios ×1
java ×1
linux ×1
linux-kernel ×1
provisioning ×1
swig ×1
swing ×1
vim ×1
xcode ×1