`
lobin
  • 浏览: 437405 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C: 入口函数

 
阅读更多

入口函数

C的入口函数是main,C++的入口函数也是这个。这是相对于C程序来说,对于C/C++运行时来说,入口函数其实是mainCRTStartup函数,main实际上应该称为user entry函数。

 

入口函数形式

入口函数名称指定为main,main函数形式有多种:主要表现在main函数参数以及返回值类型

 

函数参数和返回值类型可以任意组合。但参数要么没有,要么是int argc, char** argv形式。返回值类型要么是void,要么是int类型。

 

无参无返回

void main() {

 

}

 

无参返回int类型

int main(){

 

}

 

有参无返回

void main(int argc, char** argv) {

 

}

 

有参返回int类型

int main(int argc, char** argv) {

 

}

 

以下面的例子为例来讲解入口函数,采用gcc编译器:

#include <stdio.h>

void main()
{
  printf("hello, c!\n");
}

这是一段简单的C程序,只有一个入口函数main函数。

 

编译链接:

>gcc maintest.c -o maintest

>maintest

hello, c!

 

指定入口函数

C程序必须要有入口函数,这个函数就是main函数。但实际上这个说法是不准确的,C程序是必须要有入口函数,但并不非得是main函数。

 

可以通过-e main(main为入口函数名)或者--entry=main(main为入口函数名,这种方式其实已经没用了。gcc: extraneous argument to '--entry' option)来指定入口函数

 

# gcc -nostdlib maintest.c -o maintest

/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000080480b8

/tmp/ccJd078d.o: In function `main':

maintest.c:(.text+0x11): undefined reference to `puts'

collect2: ld returned 1 exit status

 

# gcc -nostartfiles maintest.c -o maintest

/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000080481ec

 

这里在指定-nostartfiles后编译链接有个警告提示,这个警告提示可以通过指定-e main(main为入口函数名)或者--entry=main(main为入口函数名,这种方式其实已经没用了。gcc: extraneous argument to '--entry' option)来消除

 

# gcc -nostartfiles -e main maintest.c -o maintest

 

# ./maintest

hello, c!

Segmentation fault

执行的时候有正常输出,但最后报错:段错误(Segmentation fault)。程序还是有问题。

 

 

下面是在Windows Cygwin下的编译,编译结果表现不一样:

 

>gcc -nostdlib maintest.c -o maintest

/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/cclEIYe9.o:maintest.c:(.te

xt+0xa): undefined reference to `___main'

/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/cclEIYe9.o:maintest.c:(.te

xt+0x16): undefined reference to `_puts'

collect2: ld returned 1 exit status

 

>gcc -nostartfiles maintest.c -o maintest

这里在指定-nostartfiles后编译链接没报什么错。

 

>.\maintest

运行没有任何输出。

 

上面的程序例子在执行的时候会报一个段错误(Segmentation fault),这里稍微对这个程序改一下:

#include <stdio.h>
#include <stdlib.h>

void main()
{
  printf("hello, c!\n");

  exit(0);
}

 

编译链接:

# gcc mainexittest.c -o mainexittest

# ./mainexittest 

hello, c!

 

# gcc -nostdlib mainexittest.c -o mainexittest

/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000080480b8

/tmp/ccXCYx2g.o: In function `main':

mainexittest.c:(.text+0x11): undefined reference to `puts'

mainexittest.c:(.text+0x1d): undefined reference to `exit'

collect2: ld returned 1 exit status

 

# gcc -nostartfiles mainexittest.c -o mainexittest

/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 000000000804821c

 

这里在指定-nostartfiles后编译链接有个警告提示,这个警告提示可以通过指定-e main(main为入口函数名)或者--entry=main(main为入口函数名,这种方式其实已经没用了。gcc: extraneous argument to '--entry' option)来消除

 

# gcc -nostartfiles -e main mainexittest.c -o mainexittest

 

# ./maintest

hello, c!

这里就没有再报段错误(Segmentation fault)了。

 

我们可以不在程序中编写main入口函数,使用自己编写的一个函数作为入口函数。在下面这个程序中没有入口函数main函数:

#include <stdio.h>
#include <stdlib.h>

int start()
{
  printf("hello, c!\n");
  exit(0);
}

我们也可以将它编译出可执行程序。在编译链接的时候通过指定-nostartfiles,在程序链接的时候不使用标准系统启动文件(standard system startup files)

写道
-nostartfiles
Do not use the standard system startup files when linking. The standard system libraries are used normally, unless -nostdlib, -nolibc, or -nodefaultlibs is used.

同时指定-e start来指定入口函数:

 

写道

 

-e entry
--entry=entry
Specify that the program entry point is entry. The argument is interpreted by the linker; the GNU linker accepts either a symbol name or an address.

编译链接:

# gcc maintest2.c -o maintest2

/usr/lib/gcc/i686-redhat-linux/4.4.7/../../../crt1.o: In function `_start':

(.text+0x18): undefined reference to `main'

collect2: ld returned 1 exit status

因为没有入口函数main函数,这里编译链接的时候失败了。

 

# gcc -nostartfiles maintest2.c -o maintest2

/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 000000000804821c

 

这里在指定-nostartfiles后编译链接有个警告提示,这个警告提示可以通过指定-e start(start为入口函数名)或者--entry=start(start为入口函数名,这种方式其实已经没用了。gcc: extraneous argument to '--entry' option)来消除

 

# gcc -nostartfiles -e start maintest2.c -o maintest2

 

# ./maintest2

hello, c!

 

下面是在Windows Cygwin下的编译,编译结果表现不一样:

 

>gcc -nostartfiles maintest2.c -o maintest2

这里编译链接没报什么错。

 

>.\maintest2

运行没有任何输出。

 

入口函数main编译后的汇编代码

 

void main() 
{

}

>gcc -S stacktestmain.c -o stactestmain.S

 

 

	.file	"stacktestmain.c"
	.text
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	popl	%ebp
	ret
	.size	main, .-main
	.ident	"GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-23)"
	.section	.note.GNU-stack,"",@progbits

下面是在Windows Cygwin下gcc反编译出来的汇编代码:

 

	.file	"stacktestmain.c"
	.def	___main;	.scl	2;	.type	32;	.endef
	.text
.globl _main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	pushl	%ebp
	movl	%esp, %ebp
	andl	$-16, %esp
	call	___main
	movl	%ebp, %esp
	popl	%ebp
	ret

其中andl $-16, %esp这条汇编指令是干什么的?

 

 

#include <stdio.h>

int main()
{
  printf("Hello, World\n");
  return 0;
}
$ gcc -E main.c -o main.i

 

也可以使用cpp(C PreProcessor预处理器命令)执行预处理:

$ cpp main.c -o main.i

预处理后的结果如下:

 

# 1 "main.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 330 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.c" 2
... ...
... ...
int printf(const char * restrict, ...) __attribute__((__format__ (__printf__, 1, 2)));
... ...
int puts(const char *);
... ...
... ...
extern int __vsnprintf_chk (char * restrict, size_t, int, size_t,
       const char * restrict, va_list);
# 499 "/usr/include/stdio.h" 2 3 4
# 2 "main.c" 2

int main()
{
  printf("Hello, World\n");
  return 0;
}
上面预处理后的程序经过了些裁剪,只保留了一些主要的信息。

 

$ gcc -S main.i -o main.S

编译后的汇编代码如下:

 

	.section	__TEXT,__text,regular,pure_instructions
	.macosx_version_min 10, 12
	.globl	_main
	.align	4, 0x90
_main:                                  ## @main
	.cfi_startproc
## BB#0:
	pushq	%rbp
Ltmp0:
	.cfi_def_cfa_offset 16
Ltmp1:
	.cfi_offset %rbp, -16
	movq	%rsp, %rbp
Ltmp2:
	.cfi_def_cfa_register %rbp
	subq	$16, %rsp
	leaq	L_.str(%rip), %rdi
	movl	$0, -4(%rbp)
	movb	$0, %al
	callq	_printf
	xorl	%ecx, %ecx
	movl	%eax, -8(%rbp)          ## 4-byte Spill
	movl	%ecx, %eax
	addq	$16, %rsp
	popq	%rbp
	retq
	.cfi_endproc

	.section	__TEXT,__cstring,cstring_literals
L_.str:                                 ## @.str
	.asciz	"Hello, World\n"


.subsections_via_symbols
$ gcc -c main.S -o main.o

 

汇编之后生成对象文件,到这里就生成了最终代码。也可以通过as汇编器来进行汇编:

$ as main.S -o main.o

 

$ gcc main.o -o main

链接生成可执行程序,到这里就生成了最终的程序,可以执行。

$ ./main

Hello, World

链接的时候也可以通过ld链接器完成链接

$ ld -o main main.o

ld: warning: -macosx_version_min not specified, assuming 10.10

ld: warning: object file (main.o) was built for newer OSX version (10.12) than being linked (10.10)

Undefined symbols for architecture x86_64:

  "_printf", referenced from:

      _main in main.o

  "start", referenced from:

     implicit entry/start for main executable

ld: symbol(s) not found for inferred architecture x86_64

这里在链接的时候出错了,没有找到_printf和start符号。程序中调用了printf函数,这里的_printf就是调用printf函数的时候要找到的符号,这个可以理解。至于start符号就不太好理解了,我们在程序中并没有用到呀。先一个个来看。

首先看printf,这个是标准库实现的函数,如libc、glibc。对应的标准库就是libc.dylib,在/usr/lib目录下。

$ ld -o main main.o /usr/lib/libc.dylib 

ld: warning: -macosx_version_min not specified, assuming 10.10

ld: warning: object file (main.o) was built for newer OSX version (10.12) than being linked (10.10)

Undefined symbols for architecture x86_64:

  "start", referenced from:

     implicit entry/start for main executable

ld: symbol(s) not found for inferred architecture x86_64

这样就没有报没有找到_printft符号的错误了。

至于start,在程序中并没有用到,这个其实是编译器提供的,属于运行时库的部分。类似用来引导到main函数执行的,不然程序怎么找到main函数并从main函数开始执行,程序必要要有一个入口函数,这个入口函数默认就是main函数,尽管我们可以指定一个入口函数,这个入口函数并非就一定是main,入口函数名可以是任意的。

 

start函数可以在crt1.o中找到,这是个对象文件,我们可以像main.o那样直接链接进来:

$ ld -o main main.o /usr/lib/crt1.o /usr/lib/libc.dylib

ld: warning: -macosx_version_min not specified, assuming 10.10

ld: warning: object file (main.o) was built for newer OSX version (10.12) than being linked (10.10)

这里出现了两个警告,但可以运行了

$ ./main

 

Hello, World

我们可以指定macosx支持的最低版本-macosx_version_min 10.12.0来消除这个警告信息。这个是系统支持的最低版本。

$ ld -macosx_version_min 10.12.0 -o main main.o /usr/lib/crt1.o /usr/lib/libc.dylib

这样就不会出现警告了。至于这个版本为什么是10.12.0,我们可以通过gcc编译的时候指定-v可以看到在链接的时候指定的macosx支持的最低版本,也就是使用的是当前系统的版本。

$ gcc main.c -o main -v

 

这个其实也不一定就得是10.12.0,得看兼容情况。而且这个10.12.0也不是非的10.12.0,指定成10.12也行。

$ ld -macosx_version_min 10.12 -o main main.o /usr/lib/crt1.o /usr/lib/libc.dylib

根据上面的警告信息,因为没有指定-macosx_version_min,链接的时候它默认的是10.10,我们在指定-macosx_version_min的时候指定为10.10也行,只要兼容就行。

$ ld -macosx_version_min 10.10 -o main main.o /usr/lib/crt1.o /usr/lib/libc.dylib

ld: warning: object file (main.o) was built for newer OSX version (10.12) than being linked (10.10)

 

也可以以库的形式链接进来,对应的库为libclang_rt.osx.a,这个库的完整路径我这里是/Users/admin/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/lib/darwin/libclang_rt.osx.a,如下:

$ ld -arch x86_64 -o main main.o /Users/admin/Downloads/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/lib/darwin/libclang_rt.osx.a /usr/lib/libc.dylib 

ld: warning: -macosx_version_min not specified, assuming 10.10

ld: warning: object file (main.o) was built for newer OSX version (10.12) than being linked (10.10)

注意这里需要指定-arch x86_64。

 

start函数

以下代码来自clang编译器提供的运行时库,libc/loader/linux/x86_64,参考LLVM项目,这里我参考的是llvm-project-llvmorg-12.0.0。

extern "C" void _start() {
  uintptr_t *frame_ptr =
      reinterpret_cast<uintptr_t *>(__builtin_frame_address(0));

  // This TU is compiled with -fno-omit-frame-pointer. Hence, the previous value
  // of the base pointer is pushed on to the stack. So, we step over it (the
  // "+ 1" below) to get to the args.
  Args *args = reinterpret_cast<Args *>(frame_ptr + 1);

  // After the argv array, is a 8-byte long NULL value before the array of env
  // values. The end of the env values is marked by another 8-byte long NULL
  // value. We step over it (the "+ 1" below) to get to the env values.
  uint64_t *env_ptr = args->argv + args->argc + 1;
  uint64_t *env_end_marker = env_ptr;
  while (*env_end_marker)
    ++env_end_marker;

  // After the env array, is the aux-vector. The end of the aux-vector is
  // denoted by an AT_NULL entry.
  Elf64_Phdr *programHdrTable = nullptr;
  uintptr_t programHdrCount;
  for (AuxEntry *aux_entry = reinterpret_cast<AuxEntry *>(env_end_marker + 1);
       aux_entry->type != AT_NULL; ++aux_entry) {
    switch (aux_entry->type) {
    case AT_PHDR:
      programHdrTable = reinterpret_cast<Elf64_Phdr *>(aux_entry->value);
      break;
    case AT_PHNUM:
      programHdrCount = aux_entry->value;
      break;
    case AT_PAGESZ:
      app.pageSize = aux_entry->value;
      break;
    default:
      break; // TODO: Read other useful entries from the aux vector.
    }
  }

  for (uintptr_t i = 0; i < programHdrCount; ++i) {
    Elf64_Phdr *phdr = programHdrTable + i;
    if (phdr->p_type != PT_TLS)
      continue;
    // TODO: p_vaddr value has to be adjusted for static-pie executables.
    app.tls.address = phdr->p_vaddr;
    app.tls.size = phdr->p_memsz;
    app.tls.align = phdr->p_align;
  }

  __llvm_libc::initTLS();

  __llvm_libc::syscall(SYS_exit,
                       main(args->argc, reinterpret_cast<char **>(args->argv),
                            reinterpret_cast<char **>(env_ptr)));
}

这里先主要看最后一条代码:

__llvm_libc::syscall(SYS_exit,

                       main(args->argc, reinterpret_cast<char **>(args->argv),

                            reinterpret_cast<char **>(env_ptr)));

入口main函数就是从这里调用的。这条代码的意思是调用main函数,函数返回之后调用syscall系统调用,这个系统就是SYS_exit,类似调用exit函数,main函数返回值作为参数传给syscall。程序终止,终止返回的值就是main函数返回的值。

 

initTLS函数代码如下:

void initTLS() {
  if (app.tls.size == 0)
    return;

  // We will assume the alignment is always a power of two.
  uintptr_t tlsSize = (app.tls.size + app.tls.align) & -app.tls.align;

  // Per the x86_64 TLS ABI, the entry pointed to by the thread pointer is the
  // address of the TLS block. So, we add more size to accomodate this address
  // entry.
  size_t tlsSizeWithAddr = tlsSize + sizeof(uintptr_t);

  // We cannot call the mmap function here as the functions set errno on
  // failure. Since errno is implemented via a thread local variable, we cannot
  // use errno before TLS is setup.
  long mmapRetVal = __llvm_libc::syscall(
      mmapSyscallNumber, nullptr, tlsSizeWithAddr, PROT_READ | PROT_WRITE,
      MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
  // We cannot check the return value with MAP_FAILED as that is the return
  // of the mmap function and not the mmap syscall.
  if (mmapRetVal < 0 && static_cast<uintptr_t>(mmapRetVal) > -app.pageSize)
    __llvm_libc::syscall(SYS_exit, 1);
  uintptr_t *tlsAddr = reinterpret_cast<uintptr_t *>(mmapRetVal);

  // x86_64 TLS faces down from the thread pointer with the first entry
  // pointing to the address of the first real TLS byte.
  uintptr_t endPtr = reinterpret_cast<uintptr_t>(tlsAddr) + tlsSize;
  *reinterpret_cast<uintptr_t *>(endPtr) = endPtr;

  __llvm_libc::memcpy(tlsAddr, reinterpret_cast<const void *>(app.tls.address),
                      app.tls.size);
  if (__llvm_libc::syscall(SYS_arch_prctl, ARCH_SET_FS, endPtr) == -1)
    __llvm_libc::syscall(SYS_exit, 1);
}

 

 

__llvm_libc::syscall的代码可以参考libc/config/linux/x86_64/syscall.h.inc

__attribute__((always_inline)) inline long syscall(long __number, long __arg1) {
  long retcode;
  LIBC_INLINE_ASM("syscall"
                  : "=a"(retcode)
                  : "a"(__number), "D"(__arg1)
                  : SYSCALL_CLOBBER_LIST);
  return retcode;
}

_start函数是由loader加载器调用的。

 

 

 

0
1
分享到:
评论

相关推荐

    查看进程信息,方便排查问题

    查看进程信息,方便排查问题

    IDA Pro分析STM32F1xx插件

    IDA Pro分析STM32F1xx插件

    基于SSH的线上医疗报销系统.zip-毕设&课设&实训&大作业&竞赛&项目

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    matlab的小型的微电网仿真模型文件

    小型的微电网仿真模型,简单模拟了光伏,家庭负载变化的使用情况

    MATLAB代码实现:分布式电源接入对配电网运行影响深度分析与评估,MATLAB代码分析:分布式电源接入对配电网运行影响评估,MATLAB代码:分布式电源接入对配电网影响分析 关键词:分布式电源 配电

    MATLAB代码实现:分布式电源接入对配电网运行影响深度分析与评估,MATLAB代码分析:分布式电源接入对配电网运行影响评估,MATLAB代码:分布式电源接入对配电网影响分析 关键词:分布式电源 配电网 评估 参考文档:《自写文档,联系我看》参考选址定容模型部分; 仿真平台:MATLAB 主要内容:代码主要做的是分布式电源接入场景下对配电网运行影响的分析,其中,可以自己设置分布式电源接入配电网的位置,接入配电网的有功功率以及无功功率的大小,通过牛顿拉夫逊法求解分布式电源接入后的电网潮流,从而评价分布式电源接入前后的电压、线路潮流等参数是否发生变化,评估配电网的运行方式。 代码非常精品,是研究含分布式电源接入的电网潮流计算的必备程序 ,分布式电源; 配电网; 接入影响分析; 潮流计算; 牛顿拉夫逊法; 电压评估; 必备程序。,基于MATLAB的分布式电源对配电网影响评估系统

    基于Unity-Bolt开发的游戏demo.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    重庆市农村信用合作社 农商行数字银行系统建设方案.ppt

    重庆市农村信用合作社 农商行数字银行系统建设方案.ppt

    光伏并网逆变器设计方案与高效实现:结合matlab电路仿真、DSP代码及环流抑制策略,光伏并网逆变器设计方案:结合matlab电路文件与DSP程序代码,实现高效并联环流抑制策略,光伏并网逆变器设计方案

    光伏并网逆变器设计方案与高效实现:结合matlab电路仿真、DSP代码及环流抑制策略,光伏并网逆变器设计方案:结合matlab电路文件与DSP程序代码,实现高效并联环流抑制策略,光伏并网逆变器设计方案,附有相关的matlab电路文件,以及DSP的程序代码,方案、仿真文件、代码三者结合使用效果好,事半功倍。 备注:赠送逆变器并联环流matlab文件,基于矢量控制的环流抑制策略和下垂控制的环流抑制 ,光伏并网逆变器设计方案; MATLAB电路文件; DSP程序代码; 方案、仿真文件、代码结合使用; 并联环流抑制策略; 下垂控制的环流抑制,光伏并网逆变器优化设计:方案、仿真与DSP程序代码三合一,并赠送并联环流抑制策略Matlab文件

    Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入分类预测(含模型描述及示例代码)

    内容概要:本文介绍了通过 Matlab 实现鲸鱼优化算法(WOA)与门控循环单元(GRU)结合的多输入分类预测模型。文章首先概述了时间序列预测的传统方法局限性以及引入 WOA 的优势。然后,重点阐述了项目背景、目标、挑战及其独特之处。通过详细介绍数据预处理、模型构建、训练和评估步骤,最终展示了模型的效果预测图及应用实例。特别强调利用 WOA 改善 GRU 的参数设置,提高了多输入时间序列预测的准确性与鲁棒性。 适合人群:对时间序列分析有兴趣的研究者,从事金融、能源、制造业等行业数据分析的专业人士,具备一定的机器学习基础知识和技术经验。 使用场景及目标:本项目旨在开发一个高度准确和稳定的多变量时间序列预测工具,能够用于金融市场预测、能源需求规划、生产调度优化等领域,为企业和个人提供科学决策依据。 其他说明:项目提供的源代码和详细的开发指南有助于学习者快速掌握相关技能,并可根据实际需求调整模型参数以适应不同的业务情境。

    基于vue+elment-ui+node.js的后台管理系统 .zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    Python 实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测(含模型描述及示例代码)

    内容概要:本文介绍了Python中基于双向长短期记忆网络(BiLSTM)与AdaBoost相结合的多输入分类预测模型的设计与实现。BiLSTM擅长捕捉时间序列的双向依赖关系,而AdaBoost则通过集成弱学习器来提高分类精度和稳定性。文章详述了该项目的背景、目标、挑战、特色和应用场景,并提供了详细的模型构建流程、超参数优化以及视觉展示的方法和技术要点。此外,还附有完整的效果预测图表程序和具体示例代码,使读者可以快速上手构建属于自己的高效稳定的时间序列预测系统。 适合人群:对深度学习特别是时序数据分析感兴趣的开发者或者科研工作者;正在探索高级机器学习技术和寻求解决方案的企业分析师。 使用场景及目标:适用于希望提升时间序列或多输入数据类别判定准确度的业务情境,比如金融市场的走势预估、医学图像分析中的病变区域判读或是物联网环境监测下设备状态预警等任务。目的是为了创建更加智能且可靠的预测工具,在实际应用中带来更精准可靠的结果。 其他说明:文中提供的所有Python代码片段和方法都可以直接运用于实践中,并可根据特定的问题进行相应调整和扩展,进一步改进现有系统的效能并拓展新的功能特性。

    maven-script-interpreter-javadoc-1.0-7.el7.x64-86.rpm.tar.gz

    1、文件内容:maven-script-interpreter-javadoc-1.0-7.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/maven-script-interpreter-javadoc-1.0-7.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊

    在云服务器上搭建MQTT服务器(超详细,一步到位)

    在云服务器上搭建MQTT服务器(超详细,一步到位)

    复现改进的L-SHADE差分进化算法求解最优化问题详解:附MATLAB源码与测试函数集,复现改进的L-SHADE差分进化算法求解最优化问题详解:MATLAB源码与测试集全攻略,复现改进的L-SHADE

    复现改进的L-SHADE差分进化算法求解最优化问题详解:附MATLAB源码与测试函数集,复现改进的L-SHADE差分进化算法求解最优化问题详解:MATLAB源码与测试集全攻略,复现改进的L-SHADE差分进化算法求最优化问题 对配套文献所提出的改进的L-SHADE差分进化算法求解最优化问题的的复现,提供完整MATLAB源代码和测试函数集,到手可运行,运行效果如图2所示。 代码所用测试函数集与文献相同:对CEC2014最优化测试函数集中的全部30个函数进行了测试验证,运行结果与文献一致。 ,复现; 改进的L-SHADE差分进化算法; 最优化问题求解; MATLAB源代码; 测试函数集; CEC2014最优化测试函数集,复现改进L-SHADE算法:最优化问题的MATLAB求解与验证

    天津大学:深度解读DeepSeek原理与效应.pdf

    天津大学:深度解读DeepSeek原理与效应.pdf 1.大语言模型发展路线图 2.DeepSeek V2-V3/R1技术原理 3DeepSeek效应 4.未来展望

    光伏混合储能微电网能量管理系统模型:基于MPPT控制的光伏发电与一阶低通滤波算法的混合储能系统优化管理,光伏混合储能微电网能量优化管理与稳定运行系统,光伏-混合储能微电网能量管理系统模型

    光伏混合储能微电网能量管理系统模型:基于MPPT控制的光伏发电与一阶低通滤波算法的混合储能系统优化管理,光伏混合储能微电网能量优化管理与稳定运行系统,光伏-混合储能微电网能量管理系统模型 系统主要由光伏发电模块、mppt控制模块、混合储能系统模块、直流负载模块、soc限值管理控制模块、hess能量管理控制模块。 光伏发电系统采用mppt最大跟踪控制,实现光伏功率的稳定输出;混合储能系统由蓄电池和超级电容组合构成,并采用一阶低通滤波算法实现两种储能介质间的功率分配,其中蓄电池响应目标功率中的低频部分,超级电容响应目标功率中的高频部分,最终实现对目标功率的跟踪响应;SOC限值管理控制,根据储能介质的不同特性,优化混合储能功率分配,进一步优化蓄电池充放电过程,再根据超级电容容量特点,设计其荷电状态区分管理策略,避免过充过放,维持系统稳定运行;最后,综合混合储能和系统功率平衡,针对光伏储能微电网的不同工况进行仿真实验,验证控制策略的有效性。 本模型完整无错,附带对应复现文献paper,容易理解,可塑性高 ,光伏; 混合储能系统; 能量管理; MPPT控制; 直流负载;

    Matlab算法下的A星路径规划改进版:提升搜索效率,优化拐角并路径平滑处理,Matlab下的A星算法改进:提升搜索效率、冗余拐角优化及路径平滑处理,Matlab算法代码 A星算法 路径规划A* As

    Matlab算法下的A星路径规划改进版:提升搜索效率,优化拐角并路径平滑处理,Matlab下的A星算法改进:提升搜索效率、冗余拐角优化及路径平滑处理,Matlab算法代码 A星算法 路径规划A* Astar算法仿真 传统A*+改进后的A*算法 Matlab代码 改进: ①提升搜索效率(引入权重系数) ②冗余拐角优化(可显示拐角优化次数) ③路径平滑处理(引入梯度下降算法配合S-G滤波器) ,Matlab算法代码; A星算法; 路径规划A*; Astar算法仿真; 传统A*; 改进A*算法; 提升搜索效率; 冗余拐角优化; 路径平滑处理; 权重系数; S-G滤波器。,Matlab中的A*算法:传统与改进的路径规划仿真研究

    探索与Cursor协作创建一个完整的前后端分离的项目的最佳实践,提示词指南

    项目开发所用的主要提示词模板

    基于OpenVINO.NET实现的人脸检测。.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行;功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    电力系统暂态稳定性仿真分析:Matlab编程与Simulink模型下的各类故障影响研究,电力系统暂态稳定性仿真分析:Matlab编程与Simulink模型下的各类故障影响研究,电力系统暂态稳定性Mat

    电力系统暂态稳定性仿真分析:Matlab编程与Simulink模型下的各类故障影响研究,电力系统暂态稳定性仿真分析:Matlab编程与Simulink模型下的各类故障影响研究,电力系统暂态稳定性Matlab编程 Simulink仿真 单机无穷大系统发生各类(三相短路,单相接地,两相接地,两相相间短路)等短路故障,各类(单相断线,两相断线,三相断线)等断线故障,暂态稳定仿真分析 Simulink搭建电力系统暂态仿真模型 通过仿真,观察串联电抗器,并联补偿器,自动重合闸,以及故障切除快慢对暂态稳定性的影响 ,电力系统暂态稳定性; Matlab编程; Simulink仿真; 短路故障; 断线故障; 暂态稳定仿真分析; 仿真模型搭建; 电抗器影响; 补偿器影响; 自动重合闸; 故障切除时间。,Matlab编程与Simulink仿真在电力系统暂态稳定性分析中的应用

Global site tag (gtag.js) - Google Analytics