我已经定义了列表结构,现在我正在尝试创建一个包含一些规则的列表。 这是迄今为止的代码:
List: aa
| i start current aNumber|
start := Test new setValue:2.
current := start.
aNumber:=3.
i:=0.
[i<=aa] whileTrue:[
current:=start.
[aNumber \\ current =0] whileFalse:
[[current getNext = nil] ifTrue:[current addLinkedVlue:aNumber. i=i+1].current:=current getNext].
aNumber:=aNumber+1].
我有方法printListFrom获取参数aa。目的是获得一个长度为aa的列表。该列表不能包含可以在没有提醒的情况下划分的数字,这些数字已经在列表中。例如,如果列表包含数字:2 3 5并且我们需要检查6然后6/2 = 3,它没有提醒,因此我们无法将其添加到列表中。如果我们要检查7,那么7/2 = 3提醒1,7 / 3 = 2提醒1,7 / 5 = 1提醒2,在这种情况下我们可以在列表中添加7。
如果我们有aa = 3,那么我必须得到有3个数字(2 3 5)的列表,如果aa = 4,那么list应该是(2 3 5 7),依此类推。
在我的代码中,在whileTrue循环中,我将aNumber除以列表中的数字(当前),如果我得到的提醒为0我只是将1添加到aNumber,如果提醒大于0,则我将aNumber除以下一个数字如果我将aNumber除以列表中的所有数字并在每次除法后得到一些提醒,我将1添加到i表示列表的长度,并且我还将aNumber添加到列表中。
代码运行不正常,我得到了:
MessageNotUnderstood: adaptToNumber:andSend:
我不知道什么是错的。
这是我在List方法中声明和使用的其他方法的声明:
setValue: i
a := i.
getNext
^next
addLinkedValue: n
next := Test new setValue: n.
答案 0 :(得分:2)
问题出在这一行:
[aNumber \\ current] whileFalse:
因为aNumber
是Integer
但current
不是current
。实际上Test
是aNumber
类的一个实例,因此\\
在参数(current
时不知道如何处理消息Integer
在这种情况下)不是aNumber
。
接收者adaptToInteger: aNumber andSend: #quo:
试图解决这个问题的方法是让参数应对这种情况,并且这样做会将参数告知\\
。
请注意,选择器不是quo:
,而是\\
。原因在于Integer
的实现方式,这使得接收方在发送消息quo:
之前没有意识到参数不是adaptToInteger:andSend:
。
现在,鉴于您未在Test
中实施Object
,从Test
继承的实施进入场景,adaptToNumber:andSend:
的实例收到Test
},这是更一般的。
然后,解决方案将包括在adaptToNumber: aNumber andSend: aSymbol
^aNumber perform: aSymbol withArgument: a
中实现此方法
a
将消息委托给(数字)实例变量// Example program
#include <iostream>
#include <string>
void a (const char c[][2])
{
std::cout << "func c: " << (sizeof(c)/sizeof(c[0])) << std::endl;
}
int main()
{
const char c[][2] = {
{1,2},
{3,4},
{5,6},
{7,8},
{9,10},
{11,12},
};
std::cout << "main c: " << (sizeof(c)/sizeof(c[0])) << std::endl;
a(c);
return 0;
}
。
说完这些之后,我建议你修改代码,试图让它变得更简单。