int CPMSifDlg::EncodeAndSend(char *firstName, char *lastName, char *roomNumber, char *userId, char *userFirstName, char *userLastName)
{
...
return 1;
}
extern "C"
{
__declspec(dllexport) int start(char *firstName, char *lastName, char *roomNumber, char *userId, char *userFirstName, char *userLastName)
{
return CPMSifDlg::EncodeAndSend(firstName, lastName, roomNumber, userId, userFirstName, userLastName);
}
}
Run Code Online (Sandbox Code Playgroud)
在线return CPMSifDlg::EncodeAndSend
我有一个错误:错误:非静态成员引用必须相对于特定对象.
这是什么意思?
在阅读SICP时,我遇到了逻辑编程第4.4章.然后我开始研究Prolog编程语言并尝试理解Prolog中的一些简单的任务.我发现Prolog似乎在数值计算方面遇到麻烦.
这是标准Prolog中的阶乘计算:
f(0, 1).
f(A, B) :- A > 0, C is A-1, f(C, D), B is A*D.
Run Code Online (Sandbox Code Playgroud)
我发现的问题是我需要引入两个辅助变量(C
和D
),一个新的语法(is
),并且问题是不可逆的(即,f(5,X)
按预期工作,但f(X,120)
不能).
天真的,我希望至少C is A-1, f(C, D)
可以用上面的东西代替f(A-1,D)
,但即使这样也行不通.
我的问题是:为什么我需要在数值计算中做这些额外的"东西",而不是在其他查询中呢?
我明白(并且SICP非常清楚),一般来说,"做什么"的信息不足以回答"如何做"的问题.因此,(至少一些)数学问题的陈述性知识不足以真正解决这些问题.但这引出了下一个问题:Prolog中这些额外的"东西"如何帮助我将制定局限于那些"做什么"足以回答"如何做"的问题?
关于Cobol编程语言在这个论坛上的相关性有一些线索,例如这个线程链接到它们的集合.我对此感兴趣的是基于Gartner 1997年的一项研究经常重复的声明:当时有大约2000亿行代码正在使用中!
我想问一些问题来验证或伪造几个相关点.我的目标是了解这个陈述是否有任何真相,或者它是否完全不切实际.
我提前道歉是因为我对我不确定的事情表达我的思路和自己的看法有点冗长,但我认为这可能有助于把事情放在上下文中,从而突出我做出的任何错误的假设和结论.
有时候,"2000亿行"数字伴随着增加的声称,这相当于所有正在使用的语言中所有编程代码的80%.其他时候,80%只是指所谓的"商业代码"(或者其他一些模糊的短语,暗示读者不会算上主流软件,嵌入式系统或其他任何Cobol几乎不存在的东西).在下面我假设代码不包括对同一软件的多个安装的重复计算(因为这是作弊!).
特别是在y2k问题之前的时间,已经注意到许多Cobol代码已经有20到30年的历史了.这意味着它写于60年代末和70年代.那时,市场领导者是IBM和IBM/370大型机.IBM 在他的网站上公布了价格,配置和可用性的历史性公告.根据该表,对于具有高达半兆字节内存的机器,价格约为一百万美元.
问题1:实际销售了多少台大型机?
那段时间我没有找到任何数字; 的最新数据由Gartner对于2000年,再次.:^(
我猜想实际数字是数百或数千; 如果2000年的市场规模是500亿,并且市场像其他任何技术一样成倍增长,那么1970年可能仅仅几十亿.自IBM/370销售二十年以来,将产生二十万的二十倍在几万台机器中(这非常乐观)!
问题2:代码行中的程序有多大?
我不知道该架构上的一行源代码产生了多少字节的机器代码.但由于IBM/370是一台32位机器,所以任何地址访问都必须使用4个字节加上指令(2个,可能是3个字节?).如果算上该程序的操作系统和数据,那么有多少行代码可以放入半兆字节的主内存中?
问题3:没有标准软件吗?
每台售出的机器都运行一个独特的手动编码系统而没有任何标准软件吗?说真的,即使每台机器都是从头开始编程而没有重用遗留代码(等等......没有违反我们从一开始就开始使用的索赔之一),我们可能有O(50,000 loc/machine)*O(20,000台机器)= O(1,000,000,000 loc).
那仍然远远超过200亿!我错过了一些明显的东西吗?
问题4:我们需要多少程序员编写2000亿行代码?
我真的不确定这个,但如果我们平均每天10个位置,我们需要5500万人年来实现这一目标!在20到30年的时间范围内,这意味着必须有200到300万程序员不断编写,测试,调试和记录代码.那将是和我们今天在中国一样多的程序员,不是吗?
编辑:有几个人提出了自动模板系统/代码生成器等.有人可以详细说明这个吗?我有两个问题:a)我需要告诉系统它应该为我做什么; 因为我需要与计算机通信,计算机将输出代码.这正是编程语言的编译器所做的.所以基本上我使用不同的高级编程语言来生成我的Cobol代码.我不应该使用其他高级语言而不是Cobol吗?为什么中间人?b)在70年代和80年代,最珍贵的商品是记忆.因此,如果我有一个编程语言输出的东西,它应该更简洁.编辑结束
问题5:比赛怎么样?
到目前为止,我在这里提出了两件事:
1)IBM有自己的编程语言,PL/I.上面我假设大部分代码都是使用Cobol专门编写的.然而,在所有其他条件相同的情况下,我想知道IBM营销是否真的将自己的开发推向了市场,而不是Cobol在他们的机器上.PL/I真的没有相关的代码库吗?
2)有时候(也在上面引用的主题中的这个板上)我遇到了"2000亿行代码"对于"政府,银行......"(以及诸如此类)之外的任何人都是不可见的说法.实际上,国防部已经资助了他们自己的语言,以提高成本效益并减少编程语言的扩散.这导致他们使用Ada.如果他们主要使用Cobol,他们真的会担心拥有这么多不同的编程语言吗?如果在主流计算感知之外的"政府和军事"系统上运行任何语言,那么这种语言不会是阿达吗?
我希望有人可以指出我的假设和/或结论中的任何缺陷,并阐明上述声明是否有任何真相.
我可以boost::lock_guard
用来获取一个boost::mutex
对象的锁,这个机制将确定一旦boost::lock_guard
超出范围,锁将被释放:
{
boost::lock_guard<boost::mutex> lock(a_mutex);
// Do the work
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,a_mutex
无论代码块是否被异常退出,都将被释放.
另一方面,a boost::timed_mutex
还支持一种方法try_lock_for(period)
,例如
if(a_timed_mutex.try_lock_for(boost::chrono::seconds(1))) {
// Do the work
a_timed_mutex.unlock(); // <- This is needed!
} else {
// Handle the acquisition failure
}
Run Code Online (Sandbox Code Playgroud)
此代码将不会unlock()
在a_timed_mutex
如果true
该块if
声明退出与异常.
问题: Boost(以及据我所知,C++ 11标准)似乎没有提供lock_guard
适用于try_lock()
或的变体try_lock_for(period)
.处理第二种情况的"推荐"方式或最佳做法是什么?
我有以下代码Datum
在Objective-C函数中使用类的C++对象work
:
void work(const Datum &datum) {
dispatch_async(dispatch_get_main_queue(), ^{
// Work with datum.
});
}
Run Code Online (Sandbox Code Playgroud)
使用实际为a的实例调用此代码boost::shared_ptr<Datum>
,即
boost::shared_ptr<Datum> the_datum(new Datum());
work(*the_datum);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,实例可能the_datum
会在块内部运行之前被释放work
(对此执行dispatch_async
异步操作datum
的调用稍后执行;调用因此函数work
立即返回).这显然会导致灾难.
一种解决方案可能是不传递引用work
,而是传递引用boost::shared_ptr<Datum>
.但是可能存在首选引用的情况,例如参见此线程.有没有办法保持接口work
(即传递datum
作为参考),但仍然阻止在块完成之前重新分配共享指针?
当我在Forth的堆栈上给出一个数字时,我试图实现一个从数组中生成字符串的单词.
我的第一次天真尝试是:
create myarray s" Alpha" , s" Beta" , s" Charlie" ,
Run Code Online (Sandbox Code Playgroud)
这被接受,但它没有按预期工作 - myarray @ type
产生不一致的输出(而不是我天真的期望它可能打印"Alpha").
在网上搜索时,我在Gforth文档中发现创建的字符串s"
具有有限的生命周期,这意味着我的ansatz必然会从一开始就失败.另一方面,根据Len的Forth Tutorial 中的Fours部分中的数组,即使是常规对象的数组似乎也没有标准化.
<Update>显然,这对Forth来说不是一个小问题.Web上有一些库实现了缺少的字符串功能:FFL(str模块)和Bernd Paysan的字符串函数.这是一个很好的起点,虽然它仍然需要工作从那里到一个字符串数组.</更新>
那么如何实现一个从给定数组返回字符串的单词呢?
我想创建一个浮点数的格式化输出,并在Cocoa-Touch上进行正确的本地化.输出应该等于printf("%<a>.<b>f", n)
,其中<a>
是总位数,<f>
最大小数位数.
NSNumberFormatter
使用<a>=6
和设置<f>=2
:(平台是iOS 5.1 SDK,Xcode 4.3.3和iPhone模拟器5.1)
NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
[nf setNumberStyle:NSNumberFormatterDecimalStyle];
[nf setPaddingCharacter:@" "];
[nf setUsesGroupingSeparator:NO];
[nf setLocale:[NSLocale autoupdatingCurrentLocale]];
[nf setUsesSignificantDigits:YES];
[nf setMaximumSignificantDigits:6];
[nf setMaximumFractionDigits:2];
[nf setRoundingMode:NSNumberFormatterRoundFloor];
NSLog(@"Test: %@", [nf stringFromNumber:[NSNumber numberWithDouble:2.64324897]]);
Run Code Online (Sandbox Code Playgroud)
预期输出(使用德语区域设置):Test: 2,64
观察到的输出(使用德语语言环境):Test: 2,64324
其他观察:我试图对小数位数使用不同的值,例如[nf setMaximumFractionDigits:4]
或[nf setMaximumFractionDigits:0]
.结果未更改,似乎忽略了小数位.将区域设置更改为仅更改,
为a .
,而不是小数位数.
问题:如何将printf
-format字符串正确转换为NSNumberFormatter
?
在我的程序中,我手动使用KVO来观察对象属性值的变化.我EXC_BAD_ACCESS
在自定义setter中的以下代码行中收到一个信号:
[self willChangeValueForKey:@"mykey"];
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当工厂方法调用自定义setter并且不应该有任何观察者时,会发生这种情况.我不知道如何调试这种情况.
更新:列出所有已注册观察员的方法是observationInfo
.事实证明,确实列出了一个指向无效地址的对象.但是,我根本不知道它是如何到达那里的.
更新2:显然,对于给定对象,可以多次注册相同的对象和方法回调 - 导致观察对象中的条目相同observationInfo
.删除注册时,仅删除其中一个条目.这种行为有点违反直觉(在我的程序中根本就是添加多个条目的错误),但这并不能解释虚假观察者如何神秘地出现在新分配的对象中(除非有一些缓存/重用)继续,我不知道).
修改过的问题:我怎样才能弄清楚对象何时被注册为观察者?
更新3:特定示例代码.
ContentObj
是一个将字典作为名为的属性的类mykey
.它覆盖:
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey {
BOOL automatic = NO;
if ([theKey isEqualToString:@"mykey"]) {
automatic = NO;
} else {
automatic=[super automaticallyNotifiesObserversForKey:theKey];
}
return automatic;
}
Run Code Online (Sandbox Code Playgroud)
有几个属性有getter和setter,如下所示:
- (CGFloat)value {
return [[[self mykey] objectForKey:@"value"] floatValue];
}
- (void)setValue:(CGFloat)aValue {
[self willChangeValueForKey:@"mykey"];
[[self mykey] setObject:[NSNumber numberWithFloat:aValue]
forKey:@"value"];
[self didChangeValueForKey:@"mykey"];
}
Run Code Online (Sandbox Code Playgroud)
容器类有一个类的属性contents
,NSMutableArray
它保存类的实例ContentObj
.它有几种手动处理注册的方法: …
使用 Xcode 12.4 和 Swift 5.3,我使用清单文件定义了一个包Package.swift
。将其包含在应用程序中后,我想更新包。为此,我更改了新版本的链接并更新了校验和;文件的相关部分如下所示:
let package = Package(
name: "MyPackage",
// omitted platforms and products
targets: [ .binaryTarget( name: "MyPackage",
url: "https://artifactory/mypackage-v1.1.zip",
checksum: "..." ) ] )
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误消息artifact of binary target 'MyPackage' has changed checksum; this is a potential security risk so the new artifact won't be downloaded
。通过删除整个DerivedData
文件夹可以忽略此错误,但这显然不会更新版本号。这个答案中建议了另一个解决方案,但同样它不会影响版本控制。官方文档详细介绍了依赖包版本,但我找不到如何指定 CURRENT 包的版本。
如何合法地指定和更新版本号,以便将新工件识别为不同的新版本并正确下载?
Terraform 有一个专门的“docker”提供程序,它可以处理图像和容器,并且可以使用私有注册表并为其提供凭据,参见。注册表文件。但是,我没有找到任何Dockerfile
不使用单独注册表直接提供 a 的方法。处理对 docker 文件本身的更改的问题已经解决,例如在这个问题中,尽管没有使用 terraform。
我可以做一些解决方法:不使用专用的 docker 提供程序,而是使用其他一些提供程序(尽管我不知道是哪一个)。或者,我可以开始自己的私人注册表(可能与terraform泊坞窗容器),在本地运行的泊坞窗命令其生成的图像文件(从terraform这可能使用来完成null_resource
的的null
供应商),然后继续与那些。
这些解决方法对我来说都没有多大意义。有没有办法直接使用 terraform 部署 docker 文件中描述的 docker 容器?
我在Cocoa中有包含Quartz-2D参考(描述颜色,填充图案,渐变和阴影)的对象.我想NSCoding
在我的对象中实现协议,因此需要序列化那些不透明的Quartz-2D结构.
可能的解决方案可能是
在我的对象中定义一组属性,允许在需要时从头开始设置数据结构.那些可以很容易地序列化.示例:存储四个用于红色,绿色,蓝色和alpha的浮动,然后使用CGColorCreate
.缺点:信息重复,因此潜在的一致性和(迄今为止微小的)空间消耗问题.我需要手动编写属性设置器,以便在组件发生更改时重新创建Quartz结构.这会大大增加我的代码.
使用Quartz函数读出属性.例如:使用CGColorGetComponents
的颜色.缺点:它似乎适用于颜色.但是没有其他结构的等效函数,所以我不知道它如何适用于渐变,阴影,阴影等.
直接从原始的不透明结构中读出属性.缺点:正如文档所说,结构应该是不透明的.因此,如果发生了变化,我的代码就会破裂.(苹果当然不会提供像CGColorGetComponents
应该这样做的功能.)此外,像CGFunctionRef
内部的东西CGShadingRef
真的会要求麻烦.
序列化Quartz结构的最佳实践是什么?
c++ ×4
objective-c ×4
cocoa-touch ×2
arrays ×1
boost ×1
boost-asio ×1
boost-mutex ×1
clang ×1
clpfd ×1
cobol ×1
cocoa ×1
dll ×1
dockerfile ×1
factorial ×1
forth ×1
foundation ×1
history ×1
instancetype ×1
iphone ×1
nscoding ×1
nscopying ×1
prolog ×1
shared-ptr ×1
string ×1
swift ×1
tcp ×1
terraform ×1