我是CS专业的第二年,我只有C课程(第一门课程,然后是多态数据结构课程),C++(OOP焦点),MIPS汇编和编译课程.我在夏天在WinForms和C#工作过.我通过Little Schemer工作,我真的很想学习某种LISP.
Emacs是我的首选编辑--Emacs LISP应该是一个很好的起点.
除了自定义emacs,我还可以在哪里使用emacs LISP?根据链接文本,使用elisp代码创建可执行文件几乎是不可能的.有什么其他限制?
我应该学习Scheme还是Common Lisp?
当我使用bison parser.y -d -t编译我的.y文件然后在我的flex文件中包含parser.tab.h文件时,gcc说"错误:数字常量之前的语法错误".它引用第32行,这是yytokentype枚举中的第一行.
enum yytokentype {
BREAK = 258,
... }
Run Code Online (Sandbox Code Playgroud)
该错误大约是"BREAK = 258".老实说,我不知道为什么会这样 - 我真的想使用生成的yylval,我需要从这个头文件中获取它.即使我在我的flex文件中声明yytokentype这样,我也会得到同样的错误.我可能做错什么?
我正在完成暑期工作,为行李扫描仪编写图形软件.一切都在.NET或MFC中完成,使用普通的C++进行硬件通信(我不做任何硬件工作).我有时使用Win32 API调用(如SendMessage)来提高表单或控件的性能.我只有一年的CS课程(全部用C语言),但我对Win32 API很着迷 - 它比我想象的要大得多,也更强大.
.NET是否只是隐藏了Win32 API的所有"乏味"或底层工作?最终软件在.NET中消耗更多系统资源还是执行速度更慢?
Emacs在Flex和Bison中对自动缩进的处理很差.事实上,它似乎不支持flex模式.那么,emacs用户如何应对这些?我喜欢VIm,但我不想切换,因为我在Emacs中更快更舒服.
几个月前,我为Bison设立了第三方elisp模块,但当它的缩进破坏时,它永远不会被修复.简而言之,这是一个糟糕的黑客.
或者有没有办法可以关闭.l和.y文件的自动缩进(所以按下会做一个缩进)?我如何仅为emacs更改此elisp设置?
一个简洁的elisp指南也非常有用.如果我有正确的文档,我不介意花几天时间编写自己的flex和bison模式.
在过去的一周里,我一直在尝试使用AT&T语法为x86汇编找到一个合适的浮点运算资源.理想情况下,操作码列表,它们的作用以及浮点数的存储位置.我熟悉IEEE 754表示法.我不熟悉浮点堆栈,以及任何涉及浮点运算的程序集.
这很难找到.
编辑:我一直在研究过去一个月学习装配的gcc -S输出.这就是我如何计算除浮点运算之外的所有东西.即使经过几十个没有优化编译的小程序,我仍然无法弄清浮点操作码和堆栈.我只在网上找到了琐碎的例子.
看起来有点像一个愚蠢的问题,但它让我思考......
根据这里,time要求在兼容系统上是线程安全的,对吗?无论函数的参数如何,此要求都成立.如果提供了NULL参数,则列出的一些函数不需要是线程安全的,并且time不包括在内.
所以看起来任何POSIX符合要求的系统都应该有一个线程安全的实现time.
但是,POSIX系统是否可以选择time_t在实际上使其成为指针且仍然符合要求的情况下实现?因此,如果提供一个NULL参数来存储结果,那么它的线程安全上的所有下注都不会被关闭,因为它可能会返回指向某个静态存储的指针吗?或者是否有一些time_t我在这方面缺少的要求或约定?
我如何最好地验证time在几个UNIX平台上是否是线程安全的?特别是AIX,HP-UX,Linux,和Solaris.在调试器中单步执行反汇编可能会有效,但实现可能会更改.
我正在为一门课程编写一个编译器.我遇到了一些优化问题,我不确定如何以最佳方式处理.假设输入语言中有一个while循环使用N个局部变量,这些变量必须保存在寄存器中(或者应该用于快速计算).假设N> K,寄存器的数量.条件寄存器有可能在while循环结束时被更改.
例如,假设在以下语句之前确定了x的寄存器(假设i386上的%eax):
while ( x ) { x = x - 1 ; /* more statements */ }
Run Code Online (Sandbox Code Playgroud)
在更多语句代码中,x可能会溢出到堆栈中.当代码跳回到while循环的开头以重新评估x时,它将尝试使用%eax - 但这可能甚至不能保持x的值.所以我们可以有类似的东西
movl -8(%ebp), %eax # eax <- x
.... # do stuff but let x stay in %eax
_LOOP1: cmpl $0, %eax
....
movl -12(%ebp), %eax #eax now holds something else
....
jmp _LOOP1
Run Code Online (Sandbox Code Playgroud)
我正在使用的一个解决方案是强制代码在while语句之前溢出所有修改的寄存器(因此从代码生成器的角度来看寄存器被视为空).在while循环的标签之后,代码必须根据需要将所有内容加载到寄存器中.
我的解决方案是这样的:
movl -8(%ebp), %eax # eax <- x
.... # do stuff but let x stay in %eax
movl %eax, -8(%ebp) # …Run Code Online (Sandbox Code Playgroud) 我在文件中有一堆C宏,其中的东西NEXT( pL )扩展到了( ( pL ) -> next )
我想删除大部分内容,因为它们是不必要的.
我想做的是将文本放在宏中的括号内pL.我希望替换正则表达式使用该文本进行重写.例如,在Perl中我可以做类似的事情/NEXT\(\s*(.+)\s*)(可能有点不正确),然后输出类似的东西$1->next,这应该变成一条线
if ( NEXT( pL ) != NULL ) {
Run Code Online (Sandbox Code Playgroud)
成
if ( pL->next != NULL ) {
Run Code Online (Sandbox Code Playgroud)
在Emacs中,我想在逐个文件的基础上在emacs replace-regexp中使用匹配组.我不完全确定如何在Emacs中执行此操作.
我正在编写一个编译器项目,它将生成汇编代码作为目标语言.但是,根据操作系统的不同,需要考虑一些小的变化,我不知道如何检查操作系统.如果重要,我只关心32位.我在一些源代码中看到过类似的东西
#ifdef WIN32
Run Code Online (Sandbox Code Playgroud)
但我不知道这是如何工作的.
编辑:一些澄清.我在所有三个平台上都使用gcc.我不知道在每个平台中是否通过gcc定义了像WIN32这样的宏.如果是这样,这些常数似乎解决了我的问题.
我的一门课程是将DrRacket用于SICP的某些部分.我们正在研究metacircular评估员,我有一个R5RS代码文件(set-car!和set-cdr!),我需要与我的工作一起使用.因为R5RS文件大约是500行,所以我更喜欢将它保存在单独的缓冲区中.如何将其包含在我的答案缓冲区的定义中?这似乎racket/include需要#lang racket,但set-car!并set-cdr!没有在该语言.
我将一个线程局部变量添加到几个始终直接链接到可执行文件的目标文件中。这些对象永远不会包含在共享库中(并且可以安全地假设在可预见的未来这将适用)。这意味着这些对象不需要 -fPIC 标志,对吗?
默认情况下,我们的代码库对所有对象都有 -fPIC 标志。其中许多都包含在共享库中,因此使用 -fPIC 是有意义的。但是,此标志会出现调试新线程局部变量的问题,因为GDB 在使用 -fPIC 单步执行线程局部变量时会崩溃。如果我使用新的线程局部变量从那几个目标文件中删除 -fPIC,我可以正确调试。
我找不到任何权威声明,在可执行文件中将非 PIC 对象与 PIC 对象混合是可以的。到目前为止,我的测试表明它可以,但感觉不洁净,并且由于共享库案例,在线讨论通常是“不要混合 PIC 和非 PIC”。
在这种情况下,将非 PIC 对象链接到使用 PIC 对象和库构建的可执行文件是否安全?也许 GCC 文档中有关于安全性的权威声明,但我找不到它。
编辑:二进制修补 gcc 以避免此错误在短期内不是解决方案。在 Linux 上切换编译器不是一个可能的解决方案。
我是SQL的新手,所以如果这是一个愚蠢的问题我会道歉.
我什么时候需要在模式和表名称周围使用括号'['和']'?我可以一直使用它们吗?
现在,假设我执行了以下操作来创建表
CREATE TABLE [dbo].[table1] ([ID] VARCHAR(5))
Run Code Online (Sandbox Code Playgroud)
这很有效.我通过运行select语句验证了它.假设时间继续,我添加了一堆行.现在如果我想删除所有行,我应该使用delete还是truncate?看来我应该这样做
TRUNCATE [dbo].[table1]
Run Code Online (Sandbox Code Playgroud)
但是当我通过jtds jdbc驱动程序执行此操作时,我继续在'dbo'附近获取不正确的语法或在关键字TRUNCATE附近使用不正确的语法.
我对语法缺少什么?
我在大学和目前的工作中使用gdb进行了很多工作,但我需要学习如何在Windows上使用CDB和WinDBG进行开发.我更喜欢使用CDB,因为在Emacs中有一个很好的模式.
如何在启动CDB后更改当前目录?这很有用,因为当前目录默认为可执行目录(cdb C:/dev/myexe.exe虽然我从中启动了cdb C:/testdir,但是会给出当前的dir = c:/ dev ),但我可能在不同的驱动器上有一个测试目录,我更喜欢使用它工作目录.或者我可能有多个测试目录,我想在不丢失进程断点的情况下轻松切换它们.更改工作目录可以使用GDB在GDB中完成cd.如何在国家开发银行完成这项工作?
假设我cdb my.exe arg1 arg2在设置断点和代码步进几分钟后开始调试一个新进程,我意识到我应该指定一个额外的参数.在GDB中,每当我运行process(r arg1 arg2 newarg3 ...)时,我都可以设置命令行参数.我的断点和工作区中的所有内容都保持不变.在CDB可以做到这一点吗?看起来我需要保存工作区,使用调试过程的新参数重新启动CDB,然后加载工作区以获取断点,这比发出运行命令要多得多.
在过去几周搜索和关闭之后,我没有找到这些答案,我真的想摆脱Visual Studio的调试.
编辑:澄清#1和#2