1. 程式人生 > >UE4 C++程式設計常用知識點總結

UE4 C++程式設計常用知識點總結

1,給角色新增元件:       UCameraComponent* Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera0")); 2,字串組合(藍圖中組合字串):    BuildString, string +int/float/Object/vector2/boolean……+ string 3.將屬性公開到編輯器(UE4 Doc)   UPROPERTY(EditAnyWhere,BlueprintReadWrite,Category="Damage")   UPROPERTY(BlueprintReadOnly,VisibleAnywhere,Transient,Category="Damage")
  VisibleAnywhere標記意為在編輯器中可見,但不能進行編輯   Transient意為無法從硬碟儲存或載入,它應該為派生的非持久值   用於編輯器屬性值的狀態更新:   PostInitProperties()函式   #if WITH_EDITOR   PostEditChangeProperty(FPropertyChangeEvent& PropertyChangedEvent)   {   }   #endif   UE4中藍圖中顯示C++函式:   UFUNCTION(BlueprintCallable,Category="Damage")   C++/藍圖混合實現同一種函式:
  UFUNCTION(BlueprintNativeEvent,Category="Damage")   void CalledFromCpp();   CalledFromCpp_Implementation()   {   }   當你建立的類不是繼承自Actor時,要找到你建立的UCLASS,你必須關掉Class Viewer中的過濾器中的Actors Only(預設的情況下是被檢測的,也就是說會過濾掉非繼承自Actor的自定義UCLASS)。--摘選自Cookbook   用FStringAssetReferences 和 StaticLoadObject載入資源也是一種選擇方式   可以通過全域性函式ConstructObject<> 或者NewObject<>來建立繼承自UObject的類
  UPROPERTY(EditAnywhere,BlueprintReadWrite,Category=UClassNames)   TSubclassOf<UUserProfile> UPBlueprintClassName;   ObjectType* object = ConstructObject<ObjectType>(UClassReference);   例如:   AChapterGameMode *gm = Cast<AChapterGameMode>(GetWorld()->GetAuthGameMode());   if(gm)   {      UUserProfile* object = ConstructObject<UUSerProfile>(gm->UPBlueprintClassName);   }   //NewObject用法   UProfile* object = NewObject<UProfile>(GetTransientPackage(),uclassReference);   刪除一個非使用的UObject:    objectInstance->ConditionalBeginDestroy();    強制GC進行資源回收的方式:    GetWorld()->ForceGarbageCollection(true)    結構體的寫法:    #pragma once    #include "Chapter2.h"    #include "ColoredTexture.generated.h"   USTRUCT()   struct CHAPTER2_API FColoredTexture   {   GENERATED_USTRUCT_BODY()   public:   UPROPERTY( EditAnywhere, BlueprintReadWrite, Category =   HUD )  UTexture* Texture;  UPROPERTY( EditAnywhere, BlueprintReadWrite, Category =   HUD )   FLinearColor Color;   }   列舉的寫法: UENUM() enum Status { Stopped UMETA(DisplayName = "Stopped"), Moving UMETA(DisplayName = "Moving"), Attacking UMETA(DisplayName = "Attacking"), }; 使用方法:  UPROPERTY(EditAnywhere,BlueprintReadWrite,Category=Status) TEnumAsByte<Status> status; 繼承自Actor的類使用NewObject<>和SpawnActor<>方式進行例項化,例如: UAction* action = NewObject<UAction>(GetTranientPackage(),UAction::StaticClass()); UObject類的回收(你也可以通過設定引用計數為0的方式來達到釋放的目的): UObject *o  = NewObject<UObject>(……); o->ConditionalBeginDestory(); 或者通過: GetWorld->ForceGarbageCollection(true); 的方式也可以達到同樣的目的。 UObject和它的派生類(建立的任何東西NewObject或ConstructObject)不能使用TSharedPtr! TSharedPtr,TSharedRef,TWeakPtr,TAutoPtr基本使用方法: class MyClass{} TSharedPtr<MyClass> sharedPtr(new MyClass()); weak pointers 與 shared pointers之間有一些不同,弱指標沒有能力保留物件的記憶體當引用計數到0時 弱指標的好處是它回收記憶體後,指標的引用會變成NULL,可以通過檢測弱指標是否可用來進一步處理: if(ptr.IsValid()) { } 那些繼承自UObjects的類不能使用TSharedRef TScopedPointer<AWarrior>warrior(this); TScopedPointer在作用域內避免被銷燬的指標型別,也是通過引用計數的方式來進行管理的 生成繼承自Actor的物件,例: SpawnActor = GetWorld()->SpawnActor<AChapter04Actor>(AChapter04Actor::StaticClass(),SpawnLocation); 定時器的基本使用方法: FTimerHandle Timer; GetWorldTimerManager().SetTimer(Timer,this,&AUE4GameMode::DestroyActorFunction,10); 設定物件的生命週期可以對Actor進行銷燬控制: SetLifeSpan(10); 初始化物體元件: auto MeshAsset = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("Static Mesh'/Engine/BasicShapes/Cube.Cube'")); if(MeshAsset.Object!=nullptr) { Mesh->SetStaticMesh(MeshAsset.Object); } 需要在標頭檔案中加入: #include “ConstructorHelpers.h” Debug資訊到螢幕上: GEngine->AddOnScreenDebugMessage(-1, 1, FColor::Red, FString::Printf(TEXT("%s left me"), *(OtherActor- >GetName()))); 1、委託寫法(無參): DECLARE_DELEGATE(FStandardDelegateSignature) 定義成員: FStandardDelegateSignature  MyStandardDelegate; 繫結: MyStandardDelegate.BindUObject(this,&ADelegateListener::EnableLight); 簡單的C++類物件函式繫結要用BindRaw 靜態函式的繫結:BindStatic 執行: MyStandardDelegate.ExecuteIfBound(); 解除當前的繫結: MyStandardDelegate.Unbind(); 2、委託寫法(含參): DECLARE_DELEGATE_OneParam(FParamDelegateSignature,FLinearColor)
DECLARE_EVENT( OwningType, EventName ) 建立一個事件。
DECLARE_EVENT_OneParam( OwningType, EventName, Param1Type ) 建立帶一個引數的事件。
DECLARE_EVENT_TwoParams( OwningType, EventName, Param1Type, Param2Type ) 建立帶兩個引數的事件。
DECLARE_EVENT_<Num>Params( OwningType, EventName, Param1Type, Param2Type, ...) 建立帶 N 個引數的事件。
新增成員: FParamDelegateSignature MyParamDelegate; 繫結: 同無參繫結類似 執行: MyParamDelegate.ExecuteIfBound(FLinearColor) 3,多播委託的寫法: DELCARE_MULTICAST_DELEGATE(FMulticastDelegateSignature) 新增成員到指定的類中: FMulticastDelegateSignature FMultiDelegate; 繫結類似: FMultiDelegate->AddUObject(this,AMulticastDelegateListener::ToggleLight); 執行: FMultiDelegate->Broadcast(); 解除繫結: FMultiDelegate->Remove(AMulticastDelegateListener::ToggleLight);
DECLARE_MULTICAST_DELEGATE[_Const, _RetVal, etc.]( DelegateName ) 建立一個多播的多播代理。
DECLARE_DYNAMIC_MULTICAST_DELEGATE[_Const, _RetVal, etc.]( DelegateName ) 建立一個動態的多播代理。
DECLARE_DYNAMIC_MULTICAST_DELEGATE[_Const, _RetVal, etc.]( DelegateName ) 建立一個封裝的動態多播代理。
4,自定義事件: DECLARE_EVENT(AMyTriggerVolume,FPlayerEntered) 定義: FPlayerEntered OnPlayerEntered; 執行: OnPlayEntered.Broadcast(); 繫結: OnPlayEntered.AddUObject(this,&ATriggerVolEventListener::OnTriggerEvent);     獲取當前關卡中所有的指定型別AActor:  UGameplayStatics::GetAllActorsOfClass(const UObject* WorldContextObject, TSubclassOf<AActor> ActorClass, TArray<AActor*>& OutActors) 例如: TArray<AActor*> TimeOfDayHandlers; UGameplayStatics::GetAllActorsOfClass(GetWorld(), ATimeOfDayHandler::StaticClass(), TimeOfDayHandlers); UE4定時器的使用方法: FTimerHandle MyTimer; GetWorld()->GetTimerManager().SetTimer(MyTimer,this,&APickupSppawner::SpawnPickup,10,false); UE4中的迭代器的用法: AActor的迭代器位於“EngineUtil.h”標頭檔案中,基本使用方法: for(TActorIterator<AActor> It(GetWorld(),AActor::StaticClass());It;++It) {    AActor* Actor = *It;    IMyInterface* MyInterfaceInstance = Cast<IMyInterface>(Actor);    if(MyInterfaceInstance)    {       MyInterfaceInstances.Add(MyInterfaceInstance);     } } 給指定的靜態網格物體元件附加預設模型檔案: auto MeshAsset = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("Static Mesh'/Engine/BasicShapes/Cube.Cube'")); if(MeshAsset.Object!=nullptr) {    MyMesh->SetStaticMesh(MeshAsset.Object); } UINTERFACE(meta=(CannotImplementInterfaceInBlueprint)) 可解決與介面方法UNFUNCTION(BlueprintCallable)的衝突問題 如果非實現的方法,可以在函式裡寫入unimplemented();比如說介面的方法。 暴露介面供藍圖使用: UFUNCTION(BlueprintCallable,Category = Test) virtual void OnPostBeginPlay(); 接著可以在cpp檔案中實現該函式, 其他的繼承用法和常規C++實現方式類似,就不記錄了。 介面在藍圖中的實現: 主要的宣告部分: UFUNCTION(BlueprintImplementableEvent,BlueprintCallable,Category=AttackAvoider) void AttackInComing(AActor* AttackActor); 藍圖中覆蓋C++中實現的介面函式: 主要的宣告部分;  UFUNCTION(BlueprintNativeEvent,BlueprintCallable,Category=Wearable) void OnEquip(APawn* Wearer); 函式的主體部分: void IWearable::OnEquip_Implementation(APawn* Wearer) { } 繼承子類的寫法: virtual void OnEquip_Implementation(APawn* Wearer) override {    IWearable::OnEquip_Implementation(Wearer); } C++呼叫藍圖實現的介面: 基本是通過<IInterface>::Execute_<FunctionName>的方式完成呼叫的 繼承自UObject的物件可以通過宣告UCLASS(BlueprintType)的方式來讓藍圖識別並作為變數使用 UCLASS(Blueprintable)可以讓藍圖繼承該類 可以同時用UCLASS(Blueprintable,BlueprintType)的方式讓該類即能作為藍圖變數使用又能作為可繼承的基類使用 宣告方法為UFUNCTION(BlueprintImplementableEvent)可以在藍圖中實現該事件並進行呼叫 向藍圖中暴露多播委託 首先宣告一個多播委託: DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnKingDeathSignature,AKing*,DeathKing); 其次在類中宣告委託變數: UPROPERTY(BlueprintAssignable) FOnKingDeathSignatrue OnKingDeath; 函式中呼叫: OnKingDeath.Broadcast(this); 在藍圖可以掛在當前的多播事件,並通過呼叫OnKingDeath.Broadcast的函式完成呼叫 解綁繫結的函式,可以通過UnBind系列的函式完成 列舉在藍圖中的公開及使用: 1, UENUM(BlueprintType)       enum TreeType{Tree_Poplar,Tree_Spruce,Tree_Eucalyptus,Tree_Redwood}; 2,在類中的宣告:      UPROPERTY(BlueprintReadWrite)      TEnumAsByte<TreeType> Type; 屬性在細節面板中可見性及修改的控制: UPROPERTY(EditDefaultsOnly) //預設藍圖類列表中細節屬性可修改 bool EditDefaultsOnly; UPROPERTY(EditInstanceOnly)//例項化的藍圖類的細節列表中可修改 bool EditInstanceOnly; UPROPERTY(EditAnywhere) //以上兩者都能進行修改 bool EditAnywhere; UPROPERTY(VisibleDefaultsOnly)//可見性控制,預設藍圖類列表中可見 bool VisibleDefaultsOnly; UPROPERTY(VisibleInstanceOnly)//例項化的細節列表中可見 bool VisibleInstanceOnly; UPROPERTY(VisibleAnywhere)//以上兩者皆可見 bool VisibleAnywhere; 屬性在藍圖中呼叫及修改的基本控制:      UPROPERTY(BlueprintReadWrite,Category=Cookbook)//讀寫      bool ReadWriteProperty;      UPROPERTY(BlueprintReadOnly,Category=Cookbook)//讀      bool ReadOnlyProperty; C++中新增藍圖中的Construction事件指令碼: virtual void OnConstruction(const FTransform& Transform) override; 主要在該函式中完成。 建立一個新的編輯器模組: 1,在你的UE4 專案中的uproject檔案中找到Module模組配置引數:加上例項類似的內容(一個完整的模組配置引數): {"Name":"UE4CookBookEditor","Type":"Editor","LoadingPhase":"PostEngineInit","AdditionalDependencies":["Engine","CoreUObject"]} 2,在你的專案原始碼目錄資料夾中建立一個新的資料夾命名為:UE4CookBookEditor,並新增文字配置檔案:UE4CookBookEditor.Build.cs 3,在文字配置檔案中新增以下程式碼: using UnrealBuildTool; public class UE4CookBookEditor : ModuleRules { public UE4CookBookEditor(TargetInfo Target)     {         PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "RHI", "RenderCore", "ShaderCore" });         PublicDependencyModuleNames.Add("CookBook");         PrivateDependencyModuleNames.AddRange(new string[] { "UnrealEd"});     } } 4,建立基本元件模組的標頭檔案:UE4CookBookEditor.h和UE4CookBookEditor.cpp實現檔案,他們的具體內容如下: //標頭檔案內容 #pragma once #include "Engine.h" #include "ModuleManager.h" #include "UnrealEd.h" class UE4CookBookEditorModule:public IModuleInterface { }; //實現檔案的具體內容 #include "UE4CookBookEditor.h" IMPLEMENT_GAME_MODULE(FUE4CookBookEditorModule,UE4CookBookEditor) 關閉VS,右鍵點選你的UE專案,選擇Generate Visual Studio Project files檔案 新新增的模組是不支援熱更新的,就像執行時程式碼一樣,如果你得到一個編譯錯誤,其中提到了對生成的標頭檔案的更改,只需關閉編輯器,然後從IDE中重新構建。 自定義資源型別的寫法: 1,首先建立一個資源類,繼承自UObject,例如: #pragma once #include "Object.h" #include "MyCustomAsset.generated.h" UCLASS() class COOKBOOK_API UMyCustomAsset :public UObject { GENERATED_BODY() public: UPROPERTY(EditAnywhere, Category = "Custom Asset") FString Name; }; 2,建立繼承自UFactory的自定義資源工廠,並重寫建立函式FactoryCreateNew: #pragma once #include "Factories/Factory.h" #include "CustomAssetFactory.generated.h" UCLASS() class COOKBOOK_API UCustomAssetFactory :public UFactory { GENERATED_BODY() public:        UCustomAssetFactory(); virtual UObject* FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn, FName CallingContext) override; }; 3,實現檔案: #pragma once #include "CustomAssetFactory.h" #include "CookBook.h" #include "MyCustomAsset.h" UCustomAssetFactory::UCustomAssetFactory() :Super() {        bCreateNew = true;        bEditAfterNew = true;        SupportedClass = UMyCustomAsset::StaticClass(); } UObject* UCustomAssetFactory::FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn, FName CallingContext) { auto NewObjectAsset = NewObject<UMyCustomAsset>(InParent,InClass,InName,Flags); return  NewObjectAsset; } 4,別忘了新增模組引用 “UnrealEd",否則會出現連結錯誤! UE4中關於檔案讀取的一些內容: 判定當前檔案是否存在以及檔案大小的本地化方式儲存在標頭檔案一下標頭檔案中:
Runtime/Core/Public/GenericPlatform/GenericPlatformFile.h
Runtime/Core/Public/HAL/PlatformFilemanager.h
如果你想得到檔案的大小,你可以這樣做: FPlatformFileManager::Get().GetPlatformFile().FileSize(*MyFilePath);//當然你也可以直接調取GenericPlathformFile.h標頭檔案來完成,只不過通過FPlatformFileManager可以通過一層單例模式獲取 如果你要寫檔案讀取相關的內容,你可以通過以下標頭檔案和模組找到你想要的標頭檔案: #include "Paths.h" #include "Http.h"   FPlatformFileManager::Get().GetPlatformFile()下擁有打量的檔案操作函式,其中包括,增刪資料夾,建立檔案,修改內容,移動檔案,查詢檔案大小等 程式中控制滑鼠的顯示: GetWorld()->GetFirstPlayerController()->bShowMouseCursor=true; UE4 Log相關 UE_Log(LogTemp,Warning,TEXT("Message %d"),1); 自定義Log: 首先開啟專案標頭檔案: 包含Engine標頭檔案#include“Engine.h” DECLARE_LOG_CATEGORY_EXTERN(LogCustom,Log,All); 第一個引數:CategoryName:Log的名稱 第二個引數:DefaultVerbosity:自定義的Log列印輸出資訊 第三個引數:CompileTimeVerbosity:這是對編譯後的程式碼進行烘焙後的一段程式碼(有道翻譯,沒理解什麼意思) Message Log相關: #define LOCTEXT_NAMESPACE "CustomLogMessage" extern FName LoggerName; extern FMessageLog Logger; #define FTEXT(x) LOCTEXT(x,x) FName LoggerName("CustomLog") FMessageLog CreateLog( FName name ) { FMessageLogModule& MessageLogModule = FModuleManager::LoadModuleChecked<FMessageLogModule> ("MessageLog"); FMessageLogInitializationOptions InitOptions; InitOptions.bShowPages = true;// Don't forget this! InitOptions.bShowFilters = true; FText LogListingName = FTEXT( "Chapter 12's Log Listing" ); MessageLogModule.RegisterLogListing( LoggerName, LogListingName, InitOptions ); } AChapter12GameMode::AChapter12GameMode() { //這個沒有測試,估計是上面函式的呼叫,可能要改成CreateLog(LoggerName); CreateLogger( LoggerName ); // Retrieve the Log by using the LoggerName. FMessageLog logger( LoggerName ); logger.Warning( FTEXT( "A warning message from gamemode ctor" ) ); } 呼叫 Logger.Info(FTEXT("Info Log")); Logger.Warning(FTEXT("Warning Log")); Logger.Error(FTEXT("Error Log")); FMessageLog( LoggerName ).Info( FTEXT( "An info message") ); 螢幕輸出資訊: #include“Engine.h” GEngine->AddOnScreenDebugMessage(-1,5.f,FColor::Red,TEXT("Send your Message to Screen!")); 旋轉角的知識點: FRotator(FVector); FQuat(FVector Axis,float AngleRed); //四元數,FVector指的是旋轉軸,angleRed指的是旋轉的角度 GameplayAbilities外掛: 實用的技能外掛,可以在相關的部落格上具體的學習一下 UE4中嵌入Content內容的方式: 可以通過快捷方式新增命令的形式實現,比如: mklink /j  F:\UE4Project\CookBook\ShowLink  F:\ShowLink

相關推薦

UE4 C++程式設計常用知識點總結

1,給角色新增元件:       UCameraComponent* Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Ca

c語言數組常用知識點總結

地址 char 就是 c語言 AI 常用 一個 如果 涵蓋 做這個總結的宗旨是夠用就好,所以目前只總結了一維數組的部分,這些運用幾乎涵蓋了我目前碰到的全部問題,以後遇到其他問題再做添加 一.一維數組1. 初始化方法第一種:完全初始化。依次賦值 如:a[5] = {2,3,

python 不常用知識點總結

string rate lis 字符 列表 obj object 一個 判斷 1、isdigit() 判斷是否是數字型字符串 2、enumerate(list) 將列表、字典、元祖加上下標 3、\033[31;1m string \033[0m 將stri

【溫故知新】——BABYLON.js基礎·常用知識點總結

前言:複習BABYLON.js官網101基礎文件之後,總結了一些在公司專案中常用的基礎知識點。官網文件地址:http://doc.babylonjs.com/babylon101/   一、建立場景的模板: var createScene = function () { /

C++程式設計常用程式碼

計時: #include<chrono> chrono::steady_clock::time_point t1=chrono::steady_clock::now(); //do something chrono::steady_clock::time_point t2=chron

ESP8266:C語言常用知識點

ESP8266:C語言常用知識點 ESP8266開發過程中,常常用到字串處理,HEX轉ASCII, IP地址處理,定時任務處理,TCP/UDP等。特此進行整理,以備不時之需。 字串處理 定義字串   uint8 uart_buff[256]; //定義字串或記憶體空間,

elementui常用知識點總結

1.淡入淡出效果: 1 <transition name="el-fade-in-linear"> 2 <div v-show="show" class="transition-box">.el-fade-in-linear</div> 3

javascript常用知識點總結

null和undefined兩者數值相等,型別不同 if(null==undefined)返回true;if(null===undefined)返回false,兩者不同型別; var test="2e3";test=parseFloat(test);//test=parseInt(

C++繼承相關知識點總結

1:派生類繼承基類的成員並且可以定義自己的附加成員。每個派生類物件包含兩個部分:從基類繼承的成員和自己定義的成員。         每個派生類物件都有基類部分,包括基類的private成員。類可以訪

Linux C程式設計——常用標頭檔案

1 資料型別 1.1 stdint.h uint8_t uint16_t uint32_t 1.2 stdbool.h     C語言中是沒有bool型別的(C++中有),若要使用此型別,需要包含標

2019秋招結束,C++後臺方向知識點總結

作者:東北第一菜雞 連結:https://www.nowcoder.com/discuss/118716 來源:牛客網   漫漫秋招路,在今天結束了。最後拿到了百度,intel,360,oppo,vipkid,獵豹移動,秒針系統,農行總行的offer,華為還在錄用排序,期間因為時間問題

C#窗體常用屬性總結

C#winform專案程式設計時經常會涉及到一些控制元件或窗體的屬性設定,今天做一個常用屬性的總結。1、FormBorderStyle屬性該屬性用於設定窗體的邊框和標題欄的外觀和行為。None:設定該屬性則窗體顯示為無邊框形式;FixedSingle:設定該屬性則窗體顯示為固

Vue常用知識點總結

vue中引入其他外掛 在vue專案中,需要引用其他第三方外掛,如echarts、swiper等。引入方法為 第一種方式: npm install 外掛包 在專案的main.js中引入import該外掛。 使用vue.prototype.$別名的方式進行註冊。

C/C++常見面試知識點總結附面試真題----20180919更新(未完)

以下內容部分整理自網路,部分為自己面試的真題。 第一部分:計算機基礎 1. C/C++記憶體有哪幾種類型? C中,記憶體分為5個區:堆(malloc)、棧(如區域性變數、函式引數)、程式程式碼區(存放二進位制程式碼)、全域性/靜態儲存區(全域性變數、static

C# DataTable常用方法總結

在專案中經常用到DataTable,如果DataTable使用得當,不僅能使程式簡潔實用,而且能夠提高效能,達到事半功倍的效果,現對DataTable的使用技巧進行一下總結。   一、DataTable簡介     (1)建構函式    DataTable() 

UE4 C++程式設計基礎記錄

Hello ,I am Edwin 首先謝謝大家的支援,其次如果你碰到什麼其他問題的話,歡迎來 我自己的一個 討論群559666429來,大家一起找答案,共同進步 一:前言  有很多人是從UE3 接觸到Unreal,如果你也對UE3非常瞭

C】《C專家程式設計》核心知識點總結

1、穿越時空的迷霧 編譯器設計者的金科玉律:效率幾乎就是一切,這包括兩個方面,編譯效率和執行效率,而後者起決定性作用。有很多編譯優化措施會延長編譯時間,但卻能縮短執行時間;還有一些優化措施如清除誤用程式碼和忽略執行時檢查等,既能縮短編譯時間,又能減少執

Linux C語言程式設計-Linux資料庫操作--Linux上C語言操作SQLServer---知識點總結+例項

*********************注意:為了保證文章的完整性和全面性,作者會不定期對文章進行更新和修正********************* 1.freetds是什麼?     freetds其實就是個軟體而且是一款開源軟體,而且這個軟體支援相當多的系統,比如

C# Winform 跨線程更新UI控件常用方法總結(轉)

sum tex ase adc 而是 this obj 出現 turn 出處:http://www.tuicool.com/articles/FNzURb 概述 C#Winform編程中,跨線程直接更新UI控件的做法是不正確的,會時常出現“線程間操作無效: 從不是創建控件的

常用的機器學習&數據挖掘知識點總結

知識點總結 sca pac -i 期望 最大似然 算法 ucf space Basis(基礎): MSE(Mean Square Error 均方誤差),LMS(LeastMean Square 最小均方),LSM(Least Square Methods 最小二乘法),