当前位置: 首页 > news >正文

【UE5 C++课程系列笔记】10——动态单播/多播的基本使用

目录

概念

申明动态委托

一、DECLARE_DYNAMIC_DELEGATE 

二、DECLARE_DYNAMIC_MULTICAST_DELEGATE

绑定动态委托

一、BindDynamic

二、AddDynamic

三、RemoveDynamic

执行动态委托

​一、Execute 

二、ExecuteIfBound 

三、IsBound

四、Broadcast

动态单播使用示例

一、两个输入参数无返回值 

二、一个输入参数一个返回值 

动态多播使用示例


上一篇:【UE5 C++课程系列笔记】09——多播委托的基本使用-CSDN博客

概念

        动态单播/多播委托基于虚幻的反射系统,可以在蓝图中进行绑定等操作,这使得它在蓝图与 C++ 交互方面非常有用。动态单播只绑定一个函数,而动态多播可以绑定多个函数,与非动态的单播/多播相比,动态单播/多播提供了蓝图可访问性,使其能在蓝图中进行添加绑定、移除绑定以及调用等操作。与动态单播不同的是动态多播委托通常没有返回值。这是因为动态多播委托的主要目的是实现事件广播机制,它会依次调用所有绑定的函数。

申明动态委托

一、DECLARE_DYNAMIC_DELEGATE 

        DECLARE_DYNAMIC_DELEGATE 是虚幻引擎中用于声明动态单播委托类型的宏。动态委托允许在运行时更灵活地绑定函数,并且支持蓝图(UE 的可视化脚本系统)与 C++ 之间的交互。与普通委托相比,动态委托提供了一种更动态的方式来处理事件响应和函数回调,这在构建复杂的游戏系统,尤其是需要在蓝图中方便地配置和处理事件的场景下非常有用。

无参数的动态委托声明:DECLARE_DYNAMIC_DELEGATE (FDelegateName)。

带一个参数的动态委托声明:DECLARE_DYNAMIC_DELEGATE_OneParam (FDelegateName, ParamType, ParamName)。其中 ParamType 是参数类型,ParamName 是参数名称,用于在蓝图等环境中更清晰地标识参数。例如,声明一个带有一个 int 类型参数的动态委托:DECLARE_DYNAMIC_DELEGATE_OneParam (FMyDynamicDelegate, int, MyIntParam)。

二、DECLARE_DYNAMIC_MULTICAST_DELEGATE

        DECLARE_DYNAMIC_MULTICAST_DELEGATE 用于声明动态多播委托类型的宏。动态多播委托同样支持蓝图和 C++ 的交互,并且可以绑定多个函数。当触发这个委托时,所有绑定的函数都会被依次调用,这对于实现事件广播机制,特别是在需要多个对象或函数对同一事件做出响应,且这些响应可能需要在蓝图中灵活配置的场景下非常有用。

无参数的动态多播委托声明:DECLARE_DYNAMIC_MULTICAST_DELEGATE (FDelegateName)。

带一个参数的动态多播委托声明:DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam (FDelegateName, ParamType, ParamName)。例如,声明一个带有一个 float 类型参数的动态多播委托:DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam (FMyDynamicMulticastDelegate, float, MyFloatParam)。

绑定动态委托

一、BindDynamic

   BindDynamic是虚幻引擎(UE)中用于将函数绑定到动态单播委托上的方法,主要用于动态委托。这种绑定方式支持蓝图(UE 的可视化脚本系统)和 C++ 之间的交互,使得在运行时可以灵活地设置委托所关联的函数,并且能够让蓝图方便地对委托事件进行响应。

语法一般为:DelegateInstance.BindDynamic(ObjectPtr, &FunctionPointer)。其中DelegateInstance是委托实例,ObjectPtr是指向包含函数的对象的指针(通常是UObject指针),&FunctionPointer是要绑定的函数的地址。

在如下示例代码中,当玩家与一个物体交互时,触发一个动态委托。

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyInteractable.generated.h"// 声明一个带有一个FString参数(表示交互物体名称)的动态委托
DECLARE_DYNAMIC_DELEGATE_OneParam(FOnInteract, FString, InteractableName);UCLASS()
class MYGAME_API AMyInteractable : public AActor
{GENERATED_BODY()
public:// 定义动态委托实例FOnInteract OnInteract;void Interact(FString Name){// 触发动态委托(如果已经绑定函数)OnInteract.ExecuteIfBound(Name);}
};class UMyInteractUI : public UUserWidget
{
public:void BindToInteractable(AMyInteractable* Interactable){if (Interactable){// 将本对象的函数动态绑定到交互物体的委托上Interactable->OnInteract.BindDynamic(this, &UMyInteractUI::OnInteractHandler);}}UFUNCTION(BlueprintImplementableEvent)void OnInteractHandler(FString InteractableName){// 这个函数可以在蓝图中实现具体的UI更新逻辑,比如显示交互物体的名称UE_LOG(LogTemp, Warning, TEXT("Interacted with: %s"), *InteractableName);}
};

二、AddDynamic

  AddDynamic主要用于将函数绑定到动态多播委托上。它和BindDynamic类似,都是用于动态地将函数关联到委托,但AddDynamic更侧重于多播委托的操作,用于在已经存在的动态多播委托基础上添加新的函数绑定,使得多个函数可以订阅(绑定)到这个委托,当委托被触发(调用Broadcast)时,所有绑定的函数都会被依次调用。

语法为:DynamicMulticastDelegateInstance.AddDynamic(ObjectPtr, &FunctionPointer)。其中DynamicMulticastDelegateInstance是动态多播委托实例,ObjectPtr是指向包含函数的对象的指针(通常是UObject指针),&FunctionPointer是要添加绑定的函数的地址。

在如下示例代码中,当角色释放技能时,通过动态多播委托通知多个系统进行响应。

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyCharacter.generated.h"// 声明一个带有一个int参数(表示技能ID)的动态多播委托
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSkillCast, int, SkillID);UCLASS()
class MYGAME_API AMyCharacter : public AActor
{GENERATED_BODY()
public:// 定义动态多播委托实例,并使用UPROPERTY(BlueprintAssignable)使其可在蓝图中绑定UPROPERTY(BlueprintAssignable)FOnSkillCast OnSkillCast;void CastSkill(int SkillId){// 触发动态多播委托OnSkillCast.Broadcast(SkillId);}
};class USkillEffectUI : public UUserWidget
{
public:void BindToCharacter(AMyCharacter* Character){if (Character){// 将本对象的函数动态绑定到角色的技能释放委托上Character->OnSkillCast.AddDynamic(this, &USkillEffectUI::OnSkillCastHandler);}}UFUNCTION(BlueprintImplementableEvent)void OnSkillCastHandler(int SkillId){// 在这里可以在蓝图中实现显示技能特效等相关逻辑UE_LOG(LogTemp, Warning, TEXT("Skill %d cast. Displaying effect..."), SkillId);}
};

三、RemoveDynamic

  RemoveDynamic用于从动态委托中移除之前通过BindDynamicAddDynamic绑定的函数。这在对象生命周期结束或者不再需要某个函数对委托事件做出响应时非常重要,可以避免委托在触发时调用已不存在或不需要的函数,从而防止程序出现错误或意外行为。

语法为:DelegateInstance.RemoveDynamic(ObjectPtr, &FunctionPointer)。其中DelegateInstance是委托实例,ObjectPtr是指向包含函数的对象的指针(通常是UObject指针),&FunctionPointer是要移除绑定的函数的地址。

在如下示例代码中,当一个 UI 对象被销毁时,需要从任务进度更新委托中移除它绑定的函数

#include "CoreMinimal.h"
#include "UObject/ObjectPtr.h"
#include "MyQuestSystem.h"
#include "QuestUI.h"void UQuestUI::UnbindFromQuestSystem(AMyQuestSystem* QuestSystem)
{if (QuestSystem){// 从任务系统的进度更新委托中移除本对象绑定的函数QuestSystem->OnQuestProgressUpdate.RemoveDynamic(this, &UQuestUI::OnQuestProgressUpdateHandler);}
}

执行动态委托

一、Execute 

        对于动态委托,Execute用于触发委托所绑定的函数执行。与普通委托类似,它会直接调用绑定的函数。不过在动态委托的语境下,它主要用于触发单播动态委托(通过DECLARE_DYNAMIC_DELEGATE声明的委托),并且要求委托必须已经绑定了函数,否则会导致程序崩溃,因为它不会检查委托是否绑定函数就尝试调用。

        对于无参数的动态委托实例DynamicDelegateInstance,使用DynamicDelegateInstance.Execute()。如果动态委托带有参数,比如声明了一个带有一个int类型参数的动态委托FMyDynamicDelegate,并且已经绑定了函数,在执行时语法为DynamicDelegateInstance.Execute(ParamValue),其中ParamValue是符合委托参数要求的int类型的值。

示例代码:

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyInteractableObject.generated.h"// 声明一个带有一个FString参数(表示交互提示信息)的动态委托
DECLARE_DYNAMIC_DELEGATE_OneParam(FOnInteract, FString, InteractionPrompt);UCLASS()
class MYGAME_API AMyInteractableObject : public AActor
{GENERATED_BODY()
public:// 定义动态委托实例FOnInteract OnInteract;void Interact(){FString Prompt = "Interact with this object";// 假设委托已经绑定了函数,直接执行委托OnInteract.Execute(Prompt);}
};class UMyInteractUI : public UUserWidget
{
public:void BindToInteractable(AMyInteractableObject* Interactable){if (Interactable){// 将本对象的函数动态绑定到交互物体的委托上Interactable->OnInteract.BindDynamic(this, &UMyInteractUI::OnInteractHandler);}}UFUNCTION(BlueprintImplementableEvent)void OnInteractHandler(FString InteractionPrompt){// 在蓝图中实现显示交互提示信息的逻辑UE_LOG(LogTemp, Warning, TEXT("Interaction prompt: %s"), *InteractionPrompt);}
};

二、ExecuteIfBound 

        ExecuteIfBound是一种更安全的执行动态委托的方式,主要用于执行单播动态委托。它会先检查动态委托是否已经绑定了函数,如果已绑定,则执行该函数;如果未绑定,则不执行任何操作,这样可以避免因空指针引用而导致的程序错误。这种方法在不确定委托是否已经绑定函数的情况下非常实用,能够增强程序的健壮性。

        与Execute类似,对于无参数的动态委托实例DynamicDelegateInstance,使用DynamicDelegateInstance.ExecuteIfBound()。如果动态委托带有参数,例如一个带有一个float类型参数的动态委托,语法为DynamicDelegateInstance.ExecuteIfBound(ParamValue),其中ParamValue是符合委托参数要求的float类型的值。

示例代码:

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MySkill.generated.h"// 声明一个带有一个int参数(表示升级后的技能等级)的动态委托
DECLARE_DYNAMIC_DELEGATE_OneParam(FOnSkillLevelUp, int, NewLevel);UCLASS()
class MYGAME_API AMySkill : public AActor
{GENERATED_BODY()
public:FOnSkillLevelUp OnSkillLevelUp;void LevelUp(int NewLevel){// 检查委托是否绑定函数,如果绑定则执行,否则不做任何事OnSkillLevelUp.ExecuteIfBound(NewLevel);}
};

三、IsBound

   IsBound用于检查动态委托是否已经绑定了函数。它返回一个布尔值,true表示动态委托已经绑定了函数,false表示没有绑定函数。这个方法在需要根据委托的绑定状态来执行不同逻辑的场景中非常有用,比如在触发委托之前先检查是否有函数可供执行,或者在动态配置委托绑定关系后检查绑定是否成功等。

        对于动态委托实例DynamicDelegateInstance,语法为bool IsBound = DynamicDelegateInstance.IsBound();

示例代码:

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyEventSystem.generated.h"// 声明一个无参数的动态委托
DECLARE_DYNAMIC_DELEGATE(FOnGameEvent);UCLASS()
class MYGAME_API AMyEventSystem : public AActor
{GENERATED_BODY()
public:FOnGameEvent OnGameEvent;void TriggerEventIfBound(){if (OnGameEvent.IsBound()){// 如果委托已经绑定函数,则触发委托OnGameEvent.ExecuteIfBound();}else{UE_LOG(LogTemp, Warning, TEXT("Event not bound, no function to execute."));}}
};

四、Broadcast

        对于多播动态委托,应该使用Broadcast方法来触发委托。Broadcast会按照函数绑定的顺序依次调用所有绑定的函数,从而实现事件广播的功能,让多个对象或函数对同一个事件做出响应。

示例代码:

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyEventSystem.generated.h"// 声明一个带有一个int参数(表示事件相关的数值)的多播动态委托
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnMultiEvent, int, EventValue);UCLASS()
class MYGAME_API AMyEventSystem : public AActor
{GENERATED_BODY()
public:FOnMultiEvent OnMultiEvent;void TriggerEventCorrect(int Value){// 正确的用法,使用Broadcast触发多播委托OnMultiEvent.Broadcast(Value);}
};

动态单播使用示例

一、两个输入参数无返回值 

        在如下代码中,定义了一个名为 ADynamicSingleDelegateActor 的类,用于处理动态单播委托相关的功能。类中提供了初始化委托、调用委托以及释放委托的函数,分别是InitDynamicTwoParamsDelegate、CallDynamicTwoParamsDelegate、ReleaseDynamicTwoParamsDelegate。

头文件:

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DynamicSingleDelegateActor.generated.h"DECLARE_DYNAMIC_DELEGATE_TwoParams(FDynamicDelegate, FString, InName, int32, InMoney);UCLASS()
class STUDY_API ADynamicSingleDelegateActor : public AActor
{GENERATED_BODY()public:	// Sets default values for this actor's propertiesADynamicSingleDelegateActor();UFUNCTION(BlueprintCallable)void InitDynamicTwoParamsDelegate(FDynamicDelegate InDelegate);UFUNCTION(BlueprintCallable)void CallDynamicTwoParamsDelegate(FString InStr, int32 InMoney);UFUNCTION(BlueprintCallable)void ReleaseDynamicTwoParamsDelegate();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:	// Called every framevirtual void Tick(float DeltaTime) override;protected:FDynamicDelegate DynamicTwoParamsDelegate;
};

源文件:

// Fill out your copyright notice in the Description page of Project Settings.#include "Delegate/DynamicSingleDelegateActor.h"// Sets default values
ADynamicSingleDelegateActor::ADynamicSingleDelegateActor()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;}void ADynamicSingleDelegateActor::InitDynamicTwoParamsDelegate(FDynamicDelegate InDelegate)
{DynamicTwoParamsDelegate = InDelegate;
}void ADynamicSingleDelegateActor::CallDynamicTwoParamsDelegate(FString InStr, int32 InMoney)
{DynamicTwoParamsDelegate.ExecuteIfBound(InStr, InMoney);
}void ADynamicSingleDelegateActor::ReleaseDynamicTwoParamsDelegate()
{DynamicTwoParamsDelegate.Clear();
}// Called when the game starts or when spawned
void ADynamicSingleDelegateActor::BeginPlay()
{Super::BeginPlay();}// Called every frame
void ADynamicSingleDelegateActor::Tick(float DeltaTime)
{Super::Tick(DeltaTime);}

编译后,在UEEditor中先创建派生自DynamicSingleDelegateActor的蓝图类,这里命名为“BP_DynamicSingleDelegateActor”

将“BP_DynamicSingleDelegateActor”拖入视口

在关卡蓝图中,设置运行开始时执行InitDynamicTwoParamsDelegate来绑定一个委托事件,然后当按下1键时,执行委托事件。

执行效果如下,当按下1键时成功触发绑定的自定义事件

二、一个输入参数一个返回值 

        在如下代码中,初始化委托、调用委托以及释放委托的函数,分别是 InitDynamicTwoParamsOneRetDelegate、CallDynamicTwoParamsOneRetDelegate、ReleaseDynamicTwoParamsOneRetDelegate

头文件

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DynamicSingleDelegateActor.generated.h"DECLARE_DYNAMIC_DELEGATE_RetVal_OneParam(int32, FDynamicDelegateRetOne, FString, InName);UCLASS()
class STUDY_API ADynamicSingleDelegateActor : public AActor
{GENERATED_BODY()public:	// Sets default values for this actor's propertiesADynamicSingleDelegateActor();UFUNCTION(BlueprintCallable)void InitDynamicTwoParamsOneRetDelegate(FDynamicDelegateRetOne InDelegate);UFUNCTION(BlueprintCallable)void CallDynamicTwoParamsOneRetDelegate(FString InStr);UFUNCTION(BlueprintCallable)void ReleaseDynamicTwoParamsOneRetDelegate();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:	// Called every framevirtual void Tick(float DeltaTime) override;protected:FDynamicDelegateRetOne DynamicOneParamsOneRetDelegate;
};

源文件

// Fill out your copyright notice in the Description page of Project Settings.#include "Delegate/DynamicSingleDelegateActor.h"// Sets default values
ADynamicSingleDelegateActor::ADynamicSingleDelegateActor()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = false;
}void ADynamicSingleDelegateActor::InitDynamicTwoParamsOneRetDelegate(FDynamicDelegateRetOne InDelegate)
{DynamicOneParamsOneRetDelegate = InDelegate;
}void ADynamicSingleDelegateActor::CallDynamicTwoParamsOneRetDelegate(FString InStr)
{int32 returnVal = DynamicOneParamsOneRetDelegate.Execute(InStr);UE_LOG(LogTemp, Warning, TEXT("return Value: %d"), returnVal);
}void ADynamicSingleDelegateActor::ReleaseDynamicTwoParamsOneRetDelegate()
{DynamicOneParamsOneRetDelegate.Clear();
}// Called when the game starts or when spawned
void ADynamicSingleDelegateActor::BeginPlay()
{Super::BeginPlay();
}// Called every frame
void ADynamicSingleDelegateActor::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}

 编译后,在UEEditor中先创建派生自DynamicSingleDelegateActor的蓝图类,这里命名为“BP_DynamicSingleDelegateActor”

打开“BP_DynamicSingleDelegateActor”,在事件开始后调用InitDynamicTwoParamsOneRetDelegate,由于委托有返回值,这里用“Create Event”节点

创建一个匹配函数,在匹配函数内只打印一下传入的参数,并固定返回100

将蓝图“BP_DynamicSingleDelegateActor”拖入视口

在关卡蓝图中,通过按键1调用函数CallDynamicTwoParamsOneRetDelegate,从而执行委托事件

执行效果如下,可以看到成功打印委托的输入输出参数。

动态多播使用示例

        在如下代码中,定义了一个名为 ADynamicMultiDelegateActor 的类,用于处理动态多播委托相关的功能。类中提供了初始化委托、调用委托的函数,分别是InitDynamicMultiThree、CallDynamicMultiThree。 动态多播委托 FDynamicMultiThree带有三个不同类型的参数,用于传递参数信息。

 头文件

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DynamicMultiDelegateActor.generated.h"DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FDynamicMultiThree, FString, InName, int32, InHealth, int32, InMana);UCLASS()
class STUDY_API ADynamicMultiDelegateActor : public AActor
{GENERATED_BODY()public:	// Sets default values for this actor's propertiesADynamicMultiDelegateActor();void InitDynamicMultiThree(FDynamicMultiThree InDelegate);UFUNCTION(BlueprintCallable)void CallDynamicMultiThree(FString InName, int32 InHealth, int32 InMana);protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:	// Called every framevirtual void Tick(float DeltaTime) override;UPROPERTY(BLUEprintAssignable)FDynamicMultiThree DynamicMultiThree;
};

源文件

// Fill out your copyright notice in the Description page of Project Settings.#include "DynamicMultiDelegateActor.h"// Sets default values
ADynamicMultiDelegateActor::ADynamicMultiDelegateActor()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = false;
}void ADynamicMultiDelegateActor::InitDynamicMultiThree(FDynamicMultiThree InDelegate)
{DynamicMultiThree = InDelegate;
}void ADynamicMultiDelegateActor::CallDynamicMultiThree(FString InName, int32 InHealth, int32 InMana)
{DynamicMultiThree.Broadcast(InName, InHealth, InMana);
}// Called when the game starts or when spawned
void ADynamicMultiDelegateActor::BeginPlay()
{Super::BeginPlay();
}// Called every frame
void ADynamicMultiDelegateActor::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}

创建派生自“DynamicMultiDelegateActor”的蓝图类“BP_DynamicMultiDelegateActor”

打开“BP_DynamicMultiDelegateActor”,在事件开始运行时绑定委托事件

在关卡蓝图中,再次绑定委托。通过按键1调用CallDynamicMultiThree函数,从而调用所有绑定到动态多播委托的函数。

可以看到执行效果如下,按一次按键打印了两次“Test”,表示两个绑定的委托事件都成功触发。

相关文章:

【UE5 C++课程系列笔记】10——动态单播/多播的基本使用

目录 概念 申明动态委托 一、DECLARE_DYNAMIC_DELEGATE 二、DECLARE_DYNAMIC_MULTICAST_DELEGATE 绑定动态委托 一、BindDynamic 二、AddDynamic 三、RemoveDynamic 执行动态委托 ​一、Execute 二、ExecuteIfBound 三、IsBound 四、Broadcast 动态单播使用示…...

Netcat:网络中的瑞士军刀

免责声明:使用本教程或工具,用户必须遵守所有适用的法律和法规,并且用户应自行承担所有风险和责任。 文章目录 一、引言二、简述三、Netcat功能?四、参数选项五、Netcat 的常见功能六、高级用法多连接处理创建简单的代理 七、Netc…...

清理C盘小记

突然C盘就爆满了,想当初还是给他预留了120G的空间,感觉到现在也不够用了,担心出现死机的情况就赶紧进行了清理。有一说一,清理回收站是真的有用。 参考:C盘清理指南,清理出30G起,超详细总结&am…...

Qt WORD/PDF(四)使用 QAxObject 对 Word 替换(QWidget)

关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF(二…...

软件工程 设计的复杂性

复杂性代表事件或事物的状态,它们具有多个相互关联的链接和高度复杂的结构。在软件编程中,随着软件设计的实现,元素的数量以及它们之间的相互联系逐渐变得庞大,一下子变得难以理解。 如果不使用复杂性指标和度量,软件…...

《解决两道有趣的编程问题:交替数字和与简单回文》

在编程的世界里,算法和逻辑的挑战无处不在。今天,我们将用 Python 来解决两道有趣的编程问题,分别是计算交替数字和以及生成简单回文。 一、交替数字和(Alternating Sum of Numbers) 1. 问题描述 给定一系列整数&am…...

C语言(结构体练习)

设计一个结构体,存放一个学员信息并显示&#xff0c;存放两个学员信息&#xff0c;算他们的平均分。 #include <stdio.h> #include <string.h>// 定义结构体 typedef struct {char name[50];float score; } Student;// 函数声明 void display(Student student); f…...

Lumoz主网启航:为ETH3.0、ZK和AI提供无穷算力

一个成熟的区块链主网是技术落地的体现&#xff0c;更是项目战略布局的开端&#xff0c;预示着全球化扩展和技术创新的全面启动。12 月9日&#xff0c;Lumoz主网的正式上线为生态系统注入了强大的潜力&#xff0c;并为未来的技术发展、市场拓展和社区建设提供了坚实的基础&…...

MySQL技术:事务处理与锁机制

在现代数据库系统中&#xff0c;事务处理和锁机制是确保数据一致性和完整性的关键技术。MySQL作为一个强大的关系型数据库管理系统&#xff0c;提供了完善的事务支持和多种锁机制来处理并发数据访问。本文将深入探讨MySQL中的事务处理和锁机制&#xff0c;以及如何有效使用它们…...

uniapp炫酷导航按钮及轮播指示器组件

一个拥有炫酷动效的导航按钮和指示器uniapp组件&#xff0c;帮你构建更炫酷的官网、宣传页、产品介绍等页面。 目前测试了vue2语法在h5和微信小程序的适配&#xff0c;其他平台理论上也能用。 下载及使用方法地址&#xff1a;iliya-desgin 展示&#xff1a; 目标页面出现在可视…...

gdb调试常用指令及案例讲解

一、常用指令 运行 -g&#xff1a;使用该参数编译可以执行文件&#xff0c;得到调试表。 编译 # 运行 gdb ./a.out# 设置参数 set args -s ./data/uvd.tcl 控制参数 断点 list/l &#xff1a;list 1 列出源码。根据源码指定 行号设置断点。 b …...

LeetCode 刷题笔记

LeetCode 刷题笔记 1. 20241218 &#xff08;1&#xff09;2447 std::gcd是C17引入的一个函数&#xff0c;用于计算两个整数的最大公因数。位于<numeric>头文件中。 #include <iostream> #include <numeric> // std::gcdint main() {int a 36;int b 60…...

重新定义页签!Choerodon UI Tabs让管理更高效

01 引言 Tabs 组件通过提供平级区域&#xff0c;将大块内容进行有效的收纳和展现&#xff0c;从而保持界面整洁。但在企业应用的快速发展中&#xff0c;这样传统的页签组件已无法满足我们对界面布局和个性化展示的追求。Choerodon UI Tabs 组件通过支持多级分组、个性化配置、…...

OnlyOffice出现JWT问题和文档下载失败问题解决

一、文档安全令牌未正确形成&#xff1a; 解决方案&#xff1a;禁用jwt&#xff0c;并且重启服务 文件位置&#xff1a;C:\Program Files\ONLYOFFICE\DocumentServer\config\local.json "token": {"enable": {"request": {"inbox":fa…...

Python面试常见问题及答案3

一、基础语法相关 问题&#xff1a;Python中如何实现多态&#xff1f; 答案&#xff1a;在Python中&#xff0c;多态是一种动态类型机制的体现。比如&#xff0c;通过定义一个具有相同方法名的类&#xff0c;不同的类可以根据自身的定义实现这个方法的不同行为。例如&#xff…...

【Java学习笔记】多线程基础

并行&#xff1a;同一时刻&#xff0c;多任务同时进行 多任务分别进行 一、线程相关概念 1.程序 是为完成特定任务、用某种语言编写的一组指令的集合。 简单的说:就是我们写的代码 2.进程 &#xff08;1&#xff09;进程指的就是运行中的程序&#xff0c;比如我们使用QQ,就…...

使用stm32的ADC和NTC热敏电阻R值是10k,B值是3950的测温程序

首先要明确NTC热敏电阻的阻值是随温度升高&#xff0c;电阻降低的一个特性&#xff0c;加上拉电阻10K&#xff0c;不过一下子没有找到10K的上拉电阻&#xff0c;就用了一个8.2K的上拉电阻到3.3V&#xff0c;测温电阻一端接地&#xff0c;中间接stm32的PA1使用ADC测电压来计算温…...

详细解读BSCI验厂

BSCI验厂是指BSCI&#xff08;Business Social Compliance Initiative&#xff09;倡议商界遵守社会责任组织对BSCI组织成员的全球供应商进行的社会责任审核。以下是对BSCI验厂的详细解读&#xff1a; 一、BSCI验厂的定义与背景 定义&#xff1a;BSCI验厂是企业社会责任验厂的…...

Visual Studio 2022 QT5.14.2 新建项目无法打开QT的ui文件,出现闪退情况

新建 Qt Widgets Application项目&#xff0c;如下图&#xff1a; 点击下一步&#xff1a; 项目创建成功如下&#xff1a; 提示异常如下图&#xff1a; ***.ui 无法打开文件。 提供三种解决办法&#xff0c;本文使用第二种方式解决&#xff0c;选择适合您的解决方法&#x…...

Unity3D制作MMORPG所需知识点详解

前言 在制作一款大型多人在线角色扮演游戏&#xff08;MMORPG&#xff09;时&#xff0c;Unity3D引擎提供了丰富的功能和工具&#xff0c;但开发者需要掌握一系列关键技术和知识点。本文将详细介绍使用Unity3D制作MMORPG所需的关键知识点和技术细节。 对惹&#xff0c;这里有…...

Coding Caprice - monotonic stack2

42. 接雨水 class Solution { public:int trap(vector<int>& height) {stack<int> sh;int out 0;for(int i0; i<height.size(); i){while(!sh.empty() && height[sh.top()]<height[i]){int bo height[sh.top()];sh.pop();if(sh.empty()){brea…...

Android Stduio 2024版本设置前进和后退按钮显示在主界面

Android Studio 2024&#xff08;Ladybug&#xff09;安装后发现前进和后退按钮不显示在主界面的工具栏&#xff0c;且以前在View中设置的办法无效&#xff1a; Android Studio 2024&#xff08;Ladybug&#xff09;的设置方式&#xff1a; File->Settings->Appearance&…...

NFT与NFT数据的区别

NFT与NFT数据的区别 NFT与NFT数据的区别 NFT(非同质化代币) NFT是一种基于区块链技术的数字资产。它具有独一无二的特性,就像现实生活中的艺术品原作,每一个NFT都有其独特的标识,无法被其他资产替代。例如,一幅数字画作以NFT的形式存在,它的所有权信息、创作背景、作者签…...

Docker介绍、安装、namespace、cgroup、镜像-Dya 01

0. 容器简介 从生活上来说&#xff0c;容器是一种工具&#xff0c;可以装东西的工具&#xff0c;如衣柜、背包、行李箱等等。 从IT技术方面来说&#xff0c;容器是一种全新的虚拟化技术&#xff0c;它提高了硬件资源利用率&#xff0c;结合k8s还可以让企业业务快速横向扩容、业…...

SQL 查询方式比较:子查询与自连接

在 SQL 中&#xff0c;子查询和自连接是两种常见的查询方式&#xff0c;它们的功能虽然可以相同&#xff0c;但实现的方式不同。本文通过具体示例&#xff0c;深入探讨这两种查询方式&#xff0c;并配合数据展示&#xff0c;帮助大家理解它们的使用场景和差异。 数据示例 假设…...

day15 python(3)——python基础(完结!!)

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、函数 1.1 函数传参中的拆包 1.2 匿名函数的定义 1.3 匿名函数练习 1.4 匿名函数应用——列表中的字典排序 2、面向对象 OOP 2.1 面向对象介绍 2.2 类和对象 2.3 类的构成和设计 2.4 面向对象代码…...

电机频繁烧毁的原因分析

电机作为一种关键的工业设备&#xff0c;广泛应用于各类机械和设备中。然而&#xff0c;电机频繁烧毁的问题却时常困扰着许多企业&#xff0c;导致生产效率降低&#xff0c;维修成本上升&#xff0c;甚至可能引发安全隐患。 一、电机烧毁的基本原理 电机的烧毁通常是指电机内…...

概率论得学习和整理30: 用EXCEL 描述泊松分布 poisson distribution

目录 1 泊松分布的基本内容 1.1 泊松分布的关键点 1.1.1 属于离散分布 1.1.2 泊松分布的特点&#xff1a;每个子区间内概率相等 &#xff0c; λ就是平均概率 1.2 核心参数 1.3 pmf公式 1.4 期望和方差 2 例1&#xff1a;用EXCEL计算泊松分布的概率 3 比较λ不同值时…...

计算机网络技术基础:3.计算机网络的拓扑结构

网络拓扑结构是指用传输媒体互连各种设备的物理布局&#xff0c;即用什么方式把网络中的计算机等设备连接起来。将工作站、服务站等网络设备抽象为点&#xff0c;称为“节点”&#xff1b;将通信线路抽象为线&#xff0c;称为“链路”。由节点和链路构成的抽象结构就是网络拓扑…...

docker login 出错 Error response from daemon

在自己的Linux服务器尝试登陆docker出错 输入完用户密码之后错误如下&#xff1a; 解决方案 1.打开daemo文件&#xff1a; vim/etc/docker/daemon.json 2.常用的国内Docker 镜像源地址 网易云 Docker 镜像&#xff1a;http://hub-mirror.c.163.com 百度云 Docker 镜像&#x…...

【测试】Pytest

建议关注、收藏&#xff01; 目录 功能pytest 自动化测试工具。 功能 单元测试&#xff1a;用于验证代码的最小功能单元&#xff08;如函数、方法&#xff09;的正确性。 简单的语法&#xff1a;不需要继承特定类或使用复杂的结构。断言语句简化。 自动发现测试&#xff1a;P…...

前端拖拽API你会用了么

大家好&#xff0c;今天跟大家分享一个小知识&#xff0c;前端页面的拖拽效果。这个效果可以说还是很常见的&#xff0c;比如说玩一些游戏的时候&#xff0c;将装备直接拖拽到一定区域就会丢掉或者装备上&#xff0c;再比如说一个列表&#xff0c;通过拖拽排序等。那么今天我们…...

NVIDIA推出全新紧凑型超算,加速生成式AI发展,价格大幅下降

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

第100+33步 ChatGPT学习:时间序列EMD-ARIMA-LSTM模型

基于Python 3.9版本演示 一、写在前面 上一节&#xff0c;我们学了经验模态分解&#xff08;Empirical Mode Decomposition&#xff0c;EMD&#xff09;。 如同结尾所说&#xff0c;“那么&#xff0c;做这些分解有什么作用呢&#xff1f;有大佬基于这些分解出来的序列分别作…...

Redis到底是单线程还是多线程?

Redis的线程模型是一个复杂的话题&#xff0c;它既包含了单线程的特性也引入了多线程的概念。理解这一点对于正确使用Redis和优化其性能至关重要。 1.单线程模型 在早期版本中&#xff0c;Redis被设计为单线程模型&#xff0c;这意味着所有客户端请求的处理&#xff08;包括网…...

Qt5与Qt6中的高DPI缩放属性解析

在Qt5中&#xff0c;高DPI缩放默认是禁用的。为了启用它&#xff0c;开发者需要设置Qt::AA_EnableHighDpiScaling应用程序属性。然而&#xff0c;在Qt6中&#xff0c;高DPI缩放默认是启用的&#xff0c;并且不能被禁用。这种变化使得开发者在处理高分辨率屏幕时更加方便&#x…...

[146 LRU缓存](https://leetcode.cn/problems/lru-cache/)

分析 维护一个双向链表保存缓存中的元素。 如果元素超过容量阈值&#xff0c;则删除最久未使用的元素。为了实现这个功能&#xff0c;将get(), put()方法获取的元素添加到链表首部。 为了在O(1)时间复杂度执行get()方法&#xff0c;再新建一个映射表&#xff0c;缓存key与链表…...

顺序表-递增有序表合并

两个递增有序表合并操作 题目&#xff1a; 将两个递增有序的顺序表 A 和 B 合并成一个新的递增有序顺序表 C。 思路&#xff1a; 使用三个索引 i, j, k 分别遍历顺序表 A, B 和合并后的顺序表 C。比较 A 和 B 当前索引指向的元素&#xff0c;将较小的元素放入 C 中&#xf…...

从开始实现扩散概率模型 PyTorch 实现

目录 一、说明 二、从头开始实施 三、线性噪声调度器 四、时间嵌入 五、下层DownBlock类块 六、中间midBlock类块 七、UpBlock上层类块 八、UNet 架构 九、训练 十、采样 十一、配置&#xff08;Default.yaml&#xff09; 十二、数据集 (MNIST) keyword&#xff1a; Diffusion…...

LabVIEW智能焊接系统

焊接作为制造业中的核心工艺&#xff0c;直接影响到产品的性能与可靠性。传统的焊接过程通常依赖操作工的经验控制参数&#xff0c;导致质量波动较大&#xff0c;效率低下且容易产生人为误差。随着工业自动化和智能制造的不断发展&#xff0c;传统焊接方法的局限性愈加明显。本…...

如何快速排查 Wi-Fi 的 TPUT 问题?

1. 如何排查 Wi-Fi TPUT 问题 掌握每个 Wi-Fi 协议下的 Wi-Fi TPUT 的计算方法 一文让你轻松理解WLAN物理层速率计算方式_wifi速率计算公式-CSDN博客配查 CPU 的资源占用率&#xff1a;interrupt、CPU loading Linux/Android 系统使用 mpstat 工具 具体工具的使用方法&#xff…...

C语言单链表、双链表专题及应用

1.链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续&#xff0c;非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的结构跟火车车厢相似&#xff0c;淡季时车次的车厢会相应减少&#xff0c;旺季时车次的车厢会额外增…...

C++4--类

目录 1.类的引入 2.类的定义 3.类的访问限定符及封装 3.1访问的限定符 3.2封装 4.类的作用域 5.类的实体化 1.类的引入 C语言结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。比如&#xff1a;之间在数据结构中&…...

紫光展锐5G融云方案,开启云终端新时代

近年来&#xff0c;云终端凭借便捷、高效、高性价比的优势正逐步在各行各业渗透。研究机构IDC的数据显示&#xff0c;2024上半年&#xff0c;中国云终端市场总体出货量达到166.3万台&#xff0c;同比增长22.4%&#xff0c;销售额29亿元人民币&#xff0c;同比增长24.9%&#xf…...

雪泥鸿爪和屈指可数

paw这个单词&#xff0c;表示“爪或手”&#xff0c;是一个和hoof相对的单词&#xff1a; hoof n.(马等动物的)蹄paw n.爪子&#xff1b;(动物的)爪&#xff1b;(人的)手 v.挠&#xff0c;抓&#xff1b;动手动脚 所以&#xff0c;当你理解了 paw 和 hoof 是相对的概念时&…...

C++并发与多线程(高级函数async)

async 在 C 中&#xff0c;async 关键字用于实现异步编程&#xff0c;它允许你定义异步操作&#xff0c;这些操作可以在后台执行&#xff0c;而不会阻塞当前线程。这是 C11 引入的特性&#xff0c;与 std::async 函数和 std::future 类一起使用。与thread函数模板的区别在于as…...

LeetCode 力扣 热题 100道(二十)三数之和(C++)

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 如下代码…...

类和对象(4)

大家好&#xff0c;今天来给大家介绍一下this引用&#xff0c;在学习类和对象的时候大家一定有一点疑惑吧&#xff0c;类为什么能知道我们传入的是哪个对象&#xff0c;又是怎么实例化我们的成员的&#xff0c;那么我们便来了解一下。 四.this引用 4.1为什么要有this引用 在…...

php基础:正则表达式

1.正则表达式 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止&#xff0c;我们前面所用过的精确&#xff08;文本&#xff09;匹配也是一种正则表达式。 在PHP中&#xff0c;正则表达式一般是由正规字…...

Vue3动态表单实现

实现方法&#xff1a;通过<component />标签动实现动态表单渲染 component标签&#xff1a; 在vue中 component 标签用于动态组件标签的渲染。它允许在同一个挂载点上条件渲染不同的组件&#xff0c;通过is属性可以渲染指定的属性 在上面的例子中&#xff0c;通过调用…...