为什么不能将数组作为函数参数传递?
我一直在阅读这本C++书,上面写着"你不能将数组作为函数参数传递",但它从未解释过为什么.此外,当我在网上查找时,我发现了一些评论,比如'你为什么要这样做?' 这不是我会这样做的,我只是想知道为什么你不能这样做.
由于上学原因,我最近没有编码,但我决定再次开始从事OS开发工作.最近我听说EFI作为BIOS的替代品.我想为使用EFI而不是BIOS的平台开发操作系统.我无法确定从哪里开始.谁能指出我正确的方向?也许解释一下EFI对OS开发的意义,也许可以告诉我可以使用哪些测试环境(最好是虚拟的).坦率地说,我真的不确定EFI到底是什么.我也应该花时间研究ARM组装吗?我知道x86汇编,但我觉得这也已经过时了.我真的迷路了,我很想听听你的意见.
谢谢
我目前正在学习Linux上的汇编语言.我一直在使用"从头开始编程"一书,所有的例子都是32位的.我的操作系统是64位,我一直在尝试以64位的方式完成所有示例.我遇到了麻烦:
.section .data
.section .text
.global _start
_start:
movq $60, %rax
movq $2, %rbx
int $0x80
Run Code Online (Sandbox Code Playgroud)
这只是调用Linux退出系统调用或它应该.相反,它会导致SEG FAULT,而当我改为执行此操作时
.section .data
.section .text
.global _start
_start:
movq $1, %rax
movq $2, %rbx
int $0x80
Run Code Online (Sandbox Code Playgroud)
有用.显然,问题是我转向%rax的价值.我在第二个例子中使用的$ 1值是"从头开始编程"所说的,但互联网上有多个来源说64位系统呼叫号码是60美元.参考 我做错了什么?还应该注意哪些其他问题以及我应该使用什么作为参考?万一你需要知道,我在第5章"从头开始编程".
可能重复:
学习C++:多态和切片
这是我之前提出的一个问题.这些类看起来像这样:
class Enemy
{
public:
void sayHere()
{
cout<<"Here"<<endl;
}
virtual void attack()
{
}
};
class Monster: public Enemy
{
public:
void attack()
{
cout<<"RAWR"<<endl;
}
};
class Ninja: public Enemy
{
public:
void attack()
{
cout<<"Hiya!"<<endl;
}
};
Run Code Online (Sandbox Code Playgroud)
我是C++的新手,我很困惑为什么这只能用指针(忍者和怪物都来自敌人):
int main()
{
Ninja ninja;
Monster monster;
Enemy *enemies[2];
enemies[0] = &monster;
enemies[1] = &ninja;
for (int i = 0; i < 2; i++)
{
enemies[i]->attack();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么我不能这样做呢?:
int main()
{
Ninja ninja;
Monster …
Run Code Online (Sandbox Code Playgroud) 我一直在阅读函数指针以及将它们用作其他函数的参数.我的问题是如何在不使用指针的情况下通过引用传递函数?我一直试图在互联网上找到答案,但我没有找到一个好的答案.我知道您可以通过引用传递变量,如下所示: void funct(int& anInt);
.你会如何做与此类似的事情,但是对一个变量的引用而不是对函数的引用是参数?另外,如何在函数体中使用函数的引用?
我无法链接2个目标文件,其中一个是从汇编语言源文件生成的,另一个是从C源文件生成的.
C源代码:
//main2.c
extern int strlength(char *);
int main(){
char * test = "hello";
int num = strlength(test);
return num;
}
Run Code Online (Sandbox Code Playgroud)
汇编源代码:
#strlength.s
.include "Linux32.s"
.section .text
.globl strlength
.type strlength, @function
strlength:
pushl %ebp
movl %esp, %ebp
movl $0, %ecx
movl 8(%ebp), %edx
read_next_byte:
movb (%edx), %al
cmpb $END_OF_FILE, %al
jle end
incl %edx
incl %ecx
jmp read_next_byte
end:
movl %ecx, %eax
popl %ebp
ret
Run Code Online (Sandbox Code Playgroud)
当我使用'gcc'编译和运行时,如下所示:
gcc main2.c strlength.s -m32 -o test
./test
echo $?
Run Code Online (Sandbox Code Playgroud)
我得到5这是正确的.但是,当我单独编译/汇编然后链接'ld'时,如下所示:
as strlength.s --32 …
Run Code Online (Sandbox Code Playgroud) 我几天来一直无法为TCP做校验和.我在互联网上查看了很多来源,但我见过的所有示例都没有向您展示如何进行TCP校验和.我也查看了RFC文档,但仍遇到问题:
下面是我用来生成校验和的代码:
unsigned short checksum(unsigned short * buffer, int bytes)
{
unsigned long sum = 0;
unsigned short answer = 0;
int i = bytes;
while(i>0)
{
sum+=*buffer;
buffer+=1;
i-=2;
}
sum = (sum >> 16) + (sum & htonl(0x0000ffff));
sum += (sum >> 16);
return ~sum;
}
Run Code Online (Sandbox Code Playgroud)
此功能适用于IP校验和.
下面是我为TCP标头制作的结构:
struct tcp_header
{
unsigned short tcp_sprt;
unsigned short tcp_dprt;
unsigned int tcp_seq;
unsigned int tcp_ack;
unsigned char tcp_res:4;
unsigned char tcp_off:4;
unsigned char tcp_flags;
unsigned short tcp_win;
unsigned …
Run Code Online (Sandbox Code Playgroud) 我有一个现有的数据库,我试图用 Django 访问它。我曾经python manage.py inspectdb
为数据库创建模型。目前我能够将模型导入 python shell 但是当我尝试以任何方式访问任何实际对象时,我收到此错误OperationalError: (1054, "Unknown column 'some_table.id' in 'field list'")
。我看到数据库中的表实际上没有id字段。我怎样才能解决这个问题?我是否需要更新Meta类中的托管字段并运行迁移以便它可以自动创建此字段?
我一直在看这个代码,我对rep cmpsb线感到困惑.
.LOOP:
push cx
mov cx, 0x000B ; eleven character name
mov si, ImageName ; image name to find
push di
rep cmpsb ; test for entry match
pop di
je LOAD_FAT
pop cx
add di, 0x0020 ; queue next directory entry
loop .LOOP
jmp FAILURE
Run Code Online (Sandbox Code Playgroud)
我明白它会重复cmpsb cx次,但是如何比较这两个字符串呢?比如说比较"Hey\0"和"hey\0",这个循环比较4个字符串.第一个字符是不同的,因此将设置EFlags寄存器.但是,重复cmpsb指令,下一个字符将是相同的.我可能误解了cmpsb是如何工作的,但看起来这个循环没有正确地比较两个字符串.这个循环实际上有效吗?
可能重复:
'unsigned temp:3'表示什么
我一直在尝试用C学习原始套接字编程,并且遇到过这样的问题:
unsigned char iph_ihl:5, iph_ver:4;
Run Code Online (Sandbox Code Playgroud)
我对':'的含义感到困惑.它甚至做了什么吗?或者它只是变量名称的一部分?