ソースの表示以前のリビジョンバックリンク全て展開する/折り畳む文書の先頭へ Share via Share via... Twitter LinkedIn Facebook Pinterest Telegram WhatsApp Yammer Reddit Teams最近の変更Send via e-Mail印刷パーマリンク × « FreeBSD 11-STABLEでVirtualBox復活(`・ω・´) portsnapにautoなるコマンドが実装されてた » FName::GetPlainANSIString()で正しい文字列が取れない事がある お急ぎのあなたのために、まずは結論。FNameが保持する文字列が必要な時はToString()で生成したFStringを使うべし。GetPlainANSIString()とGetPlainWIDEString()を使うとハマるから止めといた方がいい。 Unreal Engine 4の軽量文字列クラスFName(公式リファレンス)のGetPlainANSIString関数/GetPlainWIDEString関数で取得できる文字列ポインタには、そのFNameインスタンスが本来持っている文字列の一部しか入っていない事がある。恐らく仕様。以下が実証コード。 TArray<FName> Names; Names.Add(FName(TEXT("Hoge_"))); Names.Add(FName(TEXT("Hoge_0000"))); Names.Add(FName(TEXT("Hoge_0001"))); Names.Add(FName(TEXT("Hoge_10"))); Names.Add(FName(TEXT("Hoge_1200"))); Names.Add(FName(TEXT("Hoge_1300"))); Names.Add(FName(TEXT("Hoge_9999"))); Names.Add(FName(TEXT("Hoge9999"))); for (const auto& Name : Names) { UE_LOG(LogWindows, Log, TEXT("◆%s"), *Name.ToString()); UE_LOG(LogWindows, Log, TEXT(" PlainAnsiString=%s (%p)"), *FString(Name.GetPlainANSIString()), Name.GetPlainANSIString()); UE_LOG(LogWindows, Log, TEXT(" [FNameEntry]")); UE_LOG(LogWindows, Log, TEXT(" ComparisonIndex=%d"), Name.GetComparisonIndex()); UE_LOG(LogWindows, Log, TEXT(" [ComparisonEntry]")); UE_LOG(LogWindows, Log, TEXT(" Address=%p"), Name.GetComparisonNameEntry()); UE_LOG(LogWindows, Log, TEXT(" isWide=%d"), Name.GetComparisonNameEntry()->IsWide()); UE_LOG(LogWindows, Log, TEXT(" DisplayIndex=%d"), Name.GetDisplayIndex()); UE_LOG(LogWindows, Log, TEXT(" [DisplayEntry]")); UE_LOG(LogWindows, Log, TEXT(" Address=%p"), Name.GetDisplayNameEntry()); UE_LOG(LogWindows, Log, TEXT(" isWide=%d"), Name.GetDisplayNameEntry()->IsWide()); UE_LOG(LogWindows, Log, TEXT(" Number=%d"), Name.GetNumber()); } 実行結果を見ると、Hoge_10, Hoge_1200, Hoge_1300, Hoge_999で見事に同一のPlainAnsiStringが返ってきているのが分かる(★の部分) LogWindows: ◆Hoge_ LogWindows: PlainAnsiString=Hoge_ (000000021299B988) LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029720 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B978 LogWindows: isWide=0 LogWindows: DisplayIndex=1029720 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B978 LogWindows: isWide=0 LogWindows: Number=0 LogWindows: ◆Hoge_0000 LogWindows: PlainAnsiString=Hoge_0000 (000000021299B9A0) LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029721 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B990 LogWindows: isWide=0 LogWindows: DisplayIndex=1029721 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B990 LogWindows: isWide=0 LogWindows: Number=0 LogWindows: ◆Hoge_0001 LogWindows: PlainAnsiString=Hoge_0001 (000000021299B9C0) LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029722 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B9B0 LogWindows: isWide=0 LogWindows: DisplayIndex=1029722 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B9B0 LogWindows: isWide=0 LogWindows: Number=0 LogWindows: ◆Hoge_10 LogWindows: PlainAnsiString=Hoge (000000021299B9E0)…★ LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029723 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: DisplayIndex=1029723 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: Number=11 LogWindows: ◆Hoge_1200 LogWindows: PlainAnsiString=Hoge (000000021299B9E0)…★ LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029723 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: DisplayIndex=1029723 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: Number=1201 LogWindows: ◆Hoge_1300 LogWindows: PlainAnsiString=Hoge (000000021299B9E0)…★ LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029723 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: DisplayIndex=1029723 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: Number=1301 LogWindows: ◆Hoge_9999 LogWindows: PlainAnsiString=Hoge (000000021299B9E0)…★ LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029723 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: DisplayIndex=1029723 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: Number=10000 LogWindows: ◆Hoge9999 LogWindows: PlainAnsiString=Hoge9999 (000000021299B9F8) LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029724 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B9E8 LogWindows: isWide=0 LogWindows: DisplayIndex=1029724 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B9E8 LogWindows: isWide=0 LogWindows: Number=0 FNameはハッシュ付き文字列として実装されている。文字列はFNameの共用領域に格納され、各FNameインスタンスはその文字列格納領域へのインデックス=ハッシュを保持してる。FNameの同士の比較は互いのハッシュの比較、つまり整数の比較に還元されるため、通常の文字列比較より速いって仕掛けなんですな。 ただ、このハッシュ生成方法がちょっと曲者で、文字列がアンダースコア+ゼロ詰めされていない数値で終わっていたら、その部分を除いた文字列を共用領域に格納し、数値は各FNameインスタンスで保持するという方法なのだ。割と最近のバージョンアンプで変わったらしい(知人曰く4.12あたりで変わった気がすると)。なかなか破壊的な変更をしてくださりやがるな!言葉だと分かりにくいので図を作ってみた。 図を踏まえつつ改めて実行結果を見てみると、条件に合致するHoge_10, Hoge_1200, Hoge_1300, Hoge_999の中身が、その通りになっている事がお分かりいただけよう。Numberが実際の数値+1されているのは、これまた仕様で、数値分割条件を満たさないFNameインスタンス(Number == 0)との区別の為っぽい。 UE4では生成されたオブジェクトのインスタンスに対し、オブジェクト名+連番の名前を自動付与するため、大規模な開発になるとFName文字列ストアの肥大化が無視できなくなり、保持方法を変更したのだと思われる。 こんな格納の仕方で大丈夫なの!?と思うが、ふつーにFNameを使う分には何の問題もない。や、正確には大丈夫じゃなかったからこの記事書いてる訳だけど、文字列の生ポインタ取ってこねくり回すような事をしなければ大丈夫。FName文字列に対して低レベルな操作を行いたい時は、ToString()関数で生成したFStringに対して行う事をオススメする。エンジンのコードを見てもらうと分かるが、ComparisonIndexの文字列にアンダースコアと数値をくっつけて元の文字列を復元してやがるので(笑) ちなみに、実行結果内のDisplayIndexというのは、名前の通り表示用の文字列へのインデックス。簡単に言えば、FName生成時に与えられた文字列のインデックスである。FNameは基本的にcase-preserving(内部的には大文字小文字を区別するが対外的には区別せずに扱う)なので、比較用と表示用で別々の文字列を持つ必要がある訳だ。知らずに使ってると、これも地味にハマりポイントかも。 FName abc(TEXT("abc")); FName ABC(TEXT("ABC")); UE_LOG(LogWindows, Log, TEXT("%s %s %s"), *abc.ToString(), (abc == ABC ? TEXT("==") : TEXT("!=")), *ABC.ToString()); 念のため上記コードで確認したら、LogWindows: abc == ABCとなった。 掘ってみるとFNameには結構罠があるので注意が必要だ。 Comments Читать далее <a href=https://tripscans90.cc>трип скан вход</a> 1 | Davidgriet | 2026-07-05 01:57 | reply интернет https://ap.progunsupply.com/ 2 | FrancisAbids | 2026-07-08 08:20 | reply Doy la bienvenida a todos los companeros de ruleta ! El portal casinossinlicenciaenespana-weld.vercel.app actualiza semanalmente su ranking de operadores recomendados basГЎndose en pruebas reales. <a href=http://casinossinlicenciaenespana-weld.vercel.app/>casinossinlicenciaenespana-weld.vercel.app</a> Cada casino es evaluado por un equipo que verifica personalmente los tiempos de retiro, la calidad del soporte y la equidad de los juegos. Esta metodologГa rigurosa garantiza recomendaciones fiables y actualizadas. La transparencia en los tГ©rminos y condiciones es un sello distintivo de los casinos online sin licencia mГЎs reputados del mercado. Las reglas de los bonos, los requisitos de apuesta y las polГticas de retiro estГЎn detalladas con total claridad. Leer y comprender estas condiciones antes de registrarse es siempre una decisiГіn inteligente. Los mejores casinos sin registro disponibles ahora - https://casinossinlicenciaenespana-weld.vercel.app/ Espero que disfrutes de increibles botes! casinossinlicenciaenespana-weld 3 | Williamnoipt | 2026-07-16 00:40 | reply Doy la bienvenida a todos los amantes de la privacidad digital ! La secciГіn de casino en vivo de un casino online sin verificaciГіn rivaliza con las mejores del sector regulado. <a href=https://casinosinverificacion-hub.vercel.app/>casino online sin verificaciГіn</a> Mesas de blackjack, ruleta, baccarat y game shows operan las veinticuatro horas con crupieres profesionales. La calidad del streaming en alta definiciГіn crea una atmГіsfera inmersiva y realista. La interacciГіn con el crupier y otros jugadores aГ±ade la dimensiГіn social que muchos usuarios valoran. Las tragamonedas con mecГЎnicas innovadoras son la categorГa estrella en un casino cripto sin verificaciГіn actualizado. TГtulos con sistemas Megaways, compra de bonos, jackpots progresivos y funciones de multiplicador atraen a miles de jugadores. Los estudios de desarrollo lanzan novedades semanalmente manteniendo el catГЎlogo siempre fresco y atractivo. La competencia entre proveedores impulsa una calidad que beneficia directamente al usuario final. Casino sin verificaciГіn con retiros mГЎs rГЎpidos - http://casinosinverificacion-hub.vercel.app/# Espero que encuentres las mejores oportunidades ! casino sin verificaciГіn de identidad 4 | Jasonsal | 2026-07-18 02:12 | reply Doy la bienvenida a todos los exploradores de casinos sin limites! Los casinos con licencia europea ofrecen una selecciГіn de mГ©todos de pago adaptada al mercado continental sin restricciones arbitrarias. <a href=http://casinosonlineeuropeos-blush.vercel.app/>casinosonlineeuropeos-blush</a> Tarjetas bancarias, monederos electrГіnicos como Skrill y Neteller, transferencias SEPA y criptomonedas estГЎn disponibles simultГЎneamente. Los depГіsitos se acreditan de forma instantГЎnea y los retiros se procesan en plazos notablemente inferiores a los del mercado nacional. El mercado de los casinos con licencia europea continГєa expandiГ©ndose con nuevas plataformas que elevan los estГЎndares de calidad constantemente. La competencia entre operadores beneficia directamente al jugador que encuentra mejores bonos, mГЎs juegos y retiros mГЎs rГЎpidos. Consultar recursos como casinosonlineeuropeos-blush antes de registrarse asegura elegir siempre la opciГіn mГЎs ventajosa disponible. 5 razones para probar plataformas de casino europeas - https://casinosonlineeuropeos-blush.vercel.app/ Espero que encuentres las mejores partidas ! casinos con licencia europea 5 | DouglasJoife | 2026-07-18 02:27 | reply Name E-Mail Website 人間の証明として、ボックス内の全ての文字を入力してください。 この項目は空のままにして下さい:PreviewComment blog/2017/2017-01-20.txt 最終更新: 2017-01-24 11:13by Decomo