在学校,我们被分配设计一种语言,然后实施它,(我实现它很有趣=)).我的老师告诉我们使用yacc/lex,但我决定使用java + regex API,这就是我设计的语言的样子:
Program "my program"
var yourName = read()
if { equals("guy1" to yourName) }
print("hello my friend")
else
print("hello extranger")
end
Program End
Run Code Online (Sandbox Code Playgroud)
好吧,正如你所看到的,它是一种非常基本的语言=).
我以为我可以以一种非常OOP的方式实现它,比如创建一个抽象类Sentence然后有子类等VariableAssignment,IfSentence并且有一个Program只有一堆句子的类吧?然后eval在所有Sentences 上调用一个抽象方法,所以我最初编译语言的方法只包括两个阶段:
当然,如果在任何阶段出现问题,Ii都可能引发错误.
我的问题是,我做错了吗?我应该像理论一样(词汇,句法,语义)来讨论所有阶段吗?我应该继续使用我天真的两阶段编译器吗?
任何人都可以推荐一个好的Delphi源代码导航和分析工具,它可以实现代码浏览,显示类层次结构和evtl.有编辑选项吗?我尝试了Code-Navigator,它非常快,但在复杂的依赖项中它有点不稳定.
我最近接受了一次采访,并且遇到了一个我要编写代码的小问题.
问题基本上是在长度为n的数组中找到重复,使用O(n)中的常量空间.每个元素在1-(n-1)范围内,并保证是重复的.这就是我想出的:
public int findDuplicate(int[] vals) {
int indexSum=0;
int valSum=0;
for (int i=0; i< vals.length; i++) {
indexSum += i;
valSum += vals[i];
}
return valSum - indexSum;
}
Run Code Online (Sandbox Code Playgroud)
然后我们讨论了这个算法的运行时间.从0 - > n =(n ^ 2 + n)/ 2的系列之和,它是二次的.但是,算法是不是O(n)时间?操作数量受数组长度的限制吗?
我错过了什么?这个算法是O(n ^ 2)吗?
我对vs 2010上的c ++代码运行代码分析我在这些行上遇到错误
va_arg(argList, TCHAR_ARG);
va_arg(argList, int*);
Run Code Online (Sandbox Code Playgroud)
警告C6269:操作顺序可能不正确:取消引用被忽略
在这两条线路上收到警告的原因是什么?
我在Switch案件上遇到错误
case 'C':
case 'C'|_atltmpFORCE_ANSI:
case 'C'|_atltmpFORCE_UNICODE:
case 'o';
case 'p':
case 'n':
Run Code Online (Sandbox Code Playgroud)
完整的代码
inline void CXString::FormatV(LPCTSTR lpszFormat, va_list argList)
{
va_list argListSave = argList;
// make a guess at the maximum length of the resulting string
int nMaxLen = 0;
for (LPCTSTR lpsz = lpszFormat; *lpsz != '\0'; lpsz = CharNext(lpsz))
{
// handle '%' character, but watch out for '%%'
if (*lpsz != '%' || *(lpsz = CharNext(lpsz)) == …Run Code Online (Sandbox Code Playgroud) 即使在算法分析和Big-Oh方面检查代码的性能也很好!符号我想看看代码在我的电脑中执行需要多少.我已经将List初始化为9999count并从中删除了偶数元素.可悲的是,执行此操作的时间似乎是0:0:0.对结果感到惊讶,我执行时间的方式肯定有问题.有人可以帮我解释代码的时间吗?
IList<int> source = new List<int>(100);
for (int i = 0; i < 9999; i++)
{
source.Add(i);
}
TimeSpan startTime, duration;
startTime = Process.GetCurrentProcess().Threads[0].UserProcessorTime;
RemoveEven(ref source);
duration = Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(startTime);
Console.WriteLine(duration.Milliseconds);
Console.Read();
Run Code Online (Sandbox Code Playgroud) 我正在PriorityQueue<T>上课,现在我正在List<T>用作后备商店.以下是我得到的错误:
有正确的后缀/没有不正确的后缀
不要暴露 List<T>
对于-Queue后缀我需要继承Queue<T>,但是为了排序Queue<T>,我需要清空队列,排序,然后重新填充队列.此外,如果我继承Queue<T>,我会违反LSP,因为优先级队列不是FIFO集合.
对于其中一种PriorityQueues,我正在使用a IComparer<T>来比较元素,但IComparer<T>只支持在数组和List<T>.
我确实看到了这个问题,但它与我的问题没有完全相关.
所以这是我的问题:我应该抑制这些代码分析警告吗?我应该继承Queue<T>并重写我的类来解决它,即使效率较低吗?如果没有,我还应该换掉List<T>其他东西吗?
编辑:我不知道这是否会有所不同,但以下是我的每个类的设置:
PriorityQueue<T> - 抽象基类(Sort()是抽象的)
PriorityQueue<T, TComparer> - 使用比较器进行排序的子类
ReflectionPriorityQueue<T> - 使用反射进行排序的子类,对此问题不重要的细节.我有以下(简化)方法:
public bool DoWorkWithRetry()
{
for (int remainingTries = Constants.MaxRetries; remainingTries >= 0; remainingTries--)
{
try
{
return DoWork();
}
catch (Exception ex)
{
if (remainingTries == 0)
{
throw new WorkException(
String.Format("Failed after {0} retries.", Constants.MaxRetries),
ex);
}
// fall through to retry
}
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得这个方法要么退还要么抛出.但是,C#编译器向我抱怨not all code paths return a value.
for循环可以完成没有投掷或返回?我在代码分析中有一个CA2000警告.但我无法找到如何解决它或为什么它是一个问题.这是失败的代码:
IController controller = new ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
Run Code Online (Sandbox Code Playgroud)
我试图像这样解决它:
using (IController controller = new ErrorController())
{
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
Run Code Online (Sandbox Code Playgroud)
但是MVC给了我这个错误:
55 'System.Web.Mvc.IController': type used in a using statement must be implicitly convertible to 'System.IDisposable'
Run Code Online (Sandbox Code Playgroud)
我可以压制错误,但我想知道导致错误的原因并解决问题.
我有这样的类定义:
[Serializable]
public class MyDictionary: Dictionary<string, object>
{
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到此代码分析警告:
CA2229实现序列化构造函数使用以下签名向TcpFieldValueDictionary添加构造函数:'protected TcpFieldValueDictionary(SerializationInfo info,StreamingContext context)'.
但是,通用字典已经具有构造函数,只有public修饰符.
添加这个构造函数很容易(见下文),但为什么要这样做呢?有什么好处?
protected MyDictionary(SerializationInfo info, StreamingContext context)
: base(info, context)
{ }
Run Code Online (Sandbox Code Playgroud) 我可以将C值更高到3n³+ 4n-5 == O(n²)是真的吗?
例:
3n³+ 4n-5 <=3000n²+4000n²==7000n²C
= 7000
code-analysis ×10
c# ×5
algorithm ×3
big-o ×1
c++ ×1
constraints ×1
delphi ×1
exception ×1
for-loop ×1
java ×1
navigation ×1
time ×1
visual-c++ ×1