Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将double类型的数组元素相乘_Ios_C_Arrays - Fatal编程技术网

Ios 将double类型的数组元素相乘

Ios 将double类型的数组元素相乘,ios,c,arrays,Ios,C,Arrays,我有这个数组 double numbers[] = {40.0, 8.0, 45.0, 55.0, 30.0, 10.0, 20.0}; 还有一些乘数 CGFloat multiplier = 2.67; 我想用乘法器乘以数组中的每个元素。 因此,数组将类似于 double numbers[] = {106.80, 21.36, 120.15, 146.85, 80.1, 26.7, 53.4}; 我得到“发送'double'到不兼容类型'id\u Nonnull'的参数” 在这个数字数组

我有这个数组

double numbers[] = {40.0, 8.0, 45.0, 55.0, 30.0, 10.0, 20.0};
还有一些乘数

CGFloat multiplier = 2.67;
我想用乘法器乘以数组中的每个元素。 因此,数组将类似于

double numbers[] = {106.80, 21.36, 120.15, 146.85, 80.1, 26.7, 53.4};
我得到“发送'double'到不兼容类型'id\u Nonnull'的参数”


在这个数字数组中找到max no最简单的方法是什么。

C数组比ObjC
NSArray快,但是当前的设备速度非常快,因此通常最好使用对象编写代码,这样会降低速度,但提高可读性

您的问题“我想将数字数组的每个元素乘以乘法器。在该数字数组中查找最大否的最简单方法是什么?”的解决方案是:


但是,如果您是由于错误、缺乏知识或其他原因而这样做的:我强烈建议使用
NSArray
s,除非性能是这里已知的问题。

因为您需要一个循环来乘以每个元素,所以可以添加一行来检查并设置最大值

CGFloat multiplier = 2.67;
double numbers[] = {40.0, 8.0, 45.0, 55.0, 30.0, 10.0, 20.0};
int numberOfElements = sizeof(numbers) / sizeof(double);
double max = 0.0;

for (int i = 0; i < numberOfElements; i++) {
    numbers[i] *= multiplier;
    if (numbers[i] > max) max = numbers[i];
}
NSLog(@"maximum value: %f", max);
CGFloat乘数=2.67;
双数[]={40.0,8.0,45.0,55.0,30.0,10.0,20.0};
int numberOfElements=sizeof(数字)/sizeof(双精度);
双最大值=0.0;
for(int i=0;imax)max=numbers[i];
}
NSLog(@“最大值:%f”,最大值);

我会用Objective-C而不是C编写代码:

NSMutableArray* numbers = 
    [@[@40.0, @8.0, @45.0, @55.0, @30.0, @10.0, @20.0] mutableCopy];
CGFloat multiplier = 2.67;
[numbers enumerateObjectsUsingBlock:^(NSNumber* obj, NSUInteger idx, BOOL* stop) {
    numbers[idx] = @(obj.doubleValue * multiplier);
}];

该方法的额外结果:您只需说
[numbers-valueForKeyPath:@“@max.self”]
即可获得最大值

但是,除了Objective-C之外,我还会用Swift编写代码。你显然是一个初学者,Objective-C和C不是初学者语言。这在Swift中是如此简单和容易

var arr = [40.0, 8.0, 45.0, 55.0, 30.0, 10.0, 20.0]
let multiplier = 2.67
arr = arr.map {$0 * multiplier}
let max = arr.max()

有什么理由不使用实际的NSArray吗?我想维护双值数组。您使用了NSArray标记,但这不是NSArray。NSArray保存对象(例如指针),但您有一个由双值组成的直接数组。我猜你是想用它做点什么,这意味着它是一个NSArray,而事实并非如此。哪一行代码给出了你引用的错误?@matt可能此人是新手,因此不完全了解这些代码之间的区别。虽然你向他指出了这些问题,并将其删除,因为他将能够提高自己,这是额外的,但我不理解关于“抱怨”的第二点——这是相当激进和不必要的。每个人都会犯错误,在问答网站上,我们在提问和技术知识方面都在提高自己,所以只要让人们学习,请安静一点:-)祝大家晚上愉快@matt您的第一条评论没有什么新内容,您只是编辑了stonz2Plus的评论,使用NSArray,您可以使用
[array valueForKeyPath:@“@max.self”]
快速查找数组中的最大值。使用NaN在FP数字中查找“max”,代码可以使用
double max=NaN。。。if(!(numbers[i]@chux有趣的想法,谢谢!唯一的一点是,处理这种方法的人需要记住处理NAN值,无论如何,这是一种非常有趣的方法!这个答案的问题是,你假设这些数字是正的。如果数组发生变化,你将忽略所有的负值(如果整个数组为负数,则输出将无效)。因此,
max
应声明为
-DBL_max
,而不是
0
。我理解你的观点,但在这个问题上,数字是正数。@vadian不依赖轶事证据集,也永远不要低估用户的潜在愚蠢性。。)事实上,在这种情况下,你甚至可以将其与8(或16)进行比较,因为在本例中,所有数字都高于此:)如果提出问题的人会利用这个功能,他可能会失败。此外,虽然你的答案是正确的,但这是问答网站,因此也许值得表明还有其他需要注意的因素。没有压力,祝你愉快:-)小调:
sizeof(numbers)/sizeof(numbers[0])
更为惯用。3个小点:1)在第一行,您可以立即创建一个可变版本的对象-在这里,您首先将其创建为不可变版本,然后执行对象(本例中为数组)的(可变)副本。2) 在现代ObjC中,您可以使用
@(newValue)
而不是
[[NSNumber alloc]initWithDouble:newValue]
。3) 此外,您还可以在枚举中立即声明类型,而不是稍后强制转换:
enumerateObjectsUsingBlock:^(NSNumber*number,NSUInteger idx[…])
@Vive“在第一行,您可以立即创建一个对象作为可变版本”如何?我想在这种情况下,最有效的内存是:
[[NSMutableArray alloc]initWithObjects:@40.0、@8.0、@45.0、@55.0、@30.0、@10.0、@20.0、nil]
。但如果有人真的想要内存效率高的代码,普通C数组比ObjC快得多(不过,如果不考虑内存问题,最好使用ObjC)。@Vive这并不比“内存效率高”比我做的要多。一点也不。它也不像我做的那样“立即成为可变版本”。您的代码首先创建一个不可变版本,然后将其复制到可变版本。此外,我编写了一个简单的循环测试,检查这两种可能性,在10万个循环中,init的时间为0.262631,我的时间为0.232170。也在这里(所有)人们似乎也和我有相同的观点:。你能解释一下为什么你不这么认为吗?
NSMutableArray* numbers = 
    [@[@40.0, @8.0, @45.0, @55.0, @30.0, @10.0, @20.0] mutableCopy];
CGFloat multiplier = 2.67;
[numbers enumerateObjectsUsingBlock:^(NSNumber* obj, NSUInteger idx, BOOL* stop) {
    numbers[idx] = @(obj.doubleValue * multiplier);
}];
var arr = [40.0, 8.0, 45.0, 55.0, 30.0, 10.0, 20.0]
let multiplier = 2.67
arr = arr.map {$0 * multiplier}
let max = arr.max()