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には結構罠があるので注意が必要だ。

Nitroethane predisposed an organic compound with the chemical formula C2H5NO2. It is an oily liquid at measure temperature besides pressure, and pure nitroethane predisposed colorless with a fruity odor.

Uses and Reactions https://mytodayhealthtips.com/bmk-glycidate-deciphering-the-chemical-intricacies-of-a-key-intermediate-in-organic-synthesis

Chemical Reactions: Nitroethane can undergo <a href=https://mytodayhealthtips.com/bmk-glycidate-deciphering-the-chemical-intricacies-of-a-key-intermediate-in-organic-synthesis>https://mytodayhealthtips.com/bmk-glycidate-deciphering-the-chemical-intricacies-of-a-key-intermediate-in-organic-synthesis</a> different condensations, this as the Henry reaction, in order convert into several compounds of commercial passion. For example, condensation with 3,4-dimethoxybenzaldehyde yields the precursor in order to the antihypertensive drug methyldopa, in all of this condensation with unsubstituted benzaldehyde yields phenyl-2-nitropropene, a precursor for amphetamine drugs. Fuel Additive and Rocket Propellants: Nitroethane is second hand as a fuel additive and solid precursor in order rocket propellants, showcasing its versatility in different applications.

Physical besides Chemical Properties

Physical Description: It is <a href=https://cabinet-dentaire-djerba.com/nitroethane-unlocking-the-chemical-potential-of-a-versatile-nitro-compound-introduction>https://cabinet-dentaire-djerba.com/nitroethane-unlocking-the-chemical-potential-of-a-versatile-nitro-compound-introduction</a> solid colorless, oily liquid with the decision mild, fruity odor. Boiling Point: Nitroethane has solid bubbling point of 237°F and the decision freezing point of -130°F. Solubility besides Vapor Pressure: It predisposed a little bit soluble in water besides owns solid vapor pressure of 21 mmHg at 77°F. Explosive Limits: Nitroethane owns special upper besides lower explosive limits, producing it a flammable liquid.

Environmental besides Regulatory Aspects

Release in order to the Environment: Nitroethane's manufacturing besides used as solid solvent, artificial fingernail glue remover, and chemical intermediate may result in its release in order the surroundings through the different worked streams. Regulatory Status: In the United States, nitroethane is classified as solid DEA List I chemical, producing it difficult for individuals in order to purchase due to its link with drug precursor activities.

1 | | 2024-05-02 07:17 | reply

развлекательные сайты и порталы для мужчин екабу ру развлекательный портал екатеринбурга девушки https://kaleidoscopelive.ru/blogs20/postsByTag/девушки/?p=0&umi_authorization всероссийский информационный портал новости сегодня последние читать бесплатно https://kaleidoscopelive.ru/lyudi_sobytiya_fakty/rt_s_pomow_yu_nejrosetej_otrestavriroval_kadry_vremyon_vov/ информационный портал школы развлекательный портал net екб развлекательный портал новости сво сегодня последние свежие новости единый информационный портал москвы единый портал информационных услуг последние новости происшествия

портал развлекательно ru тлт новости тольятти информационный портал города http://kaleidoscopelive.ru/novosti/stadion_dlya_chempionata_mira_mog_vzorvat_sya/ последние новости россии 2024 пикалево информационный портал https://kaleidoscopelive.ru/blogs20/postsByTag/Бруна Лима ттк развлекательный портал фильмы украина последние новости на сегодня юрий афтершок ньюс информационный портал сайт свободный информационный портал информационные порталы липецка мобилизация в россии последние новости 2 портал информационной

7 информационные порталы я устал развлекательный портал http://kaleidoscopelive.ru/planeta/leonid_sluckij_kritika_sud_i_pod_stil_nyj_rep/ читать последние новости мира ттк развлекательный портал https://kaleidoscopelive.ru/lyudi_sobytiya_fakty/modernizirovannye_tanki_t-72b3m_i_t-80bvm_vstroyat_v_setecentricheskuyu_sistemu_upravleniya_boem/ единый муниципальный информационный портал бишимбаев последние новости единый информационный портал мировых судей москвы портал информационной поддержки информационный портал единого государственного информационный портал смотреть последние новости

для чего нужен прогон по трастовым сайтам прогон по тематическим сайтам купоны скидки вк прогона по трастовым сайтам

как получить купон на скидку промокод на скидку такси 2022 https://w4t.ch/forums/users/floydfup/ купить купоны на скидку москва http://newsliferd.blogspot.com.es/2016/05/movimiento-union-y-consolidacion.html купон на скидку биг гик

сайт закрыт от индексации автоматический прогон сайтов http://napexpo.org/opennap/index.php?title=бетвинер_зеркало пробный прогон сайта http://liuwenzheng.com.cn/home.php?mod=space&uid=850481 зарубежный бездепозитный бонус

продвижение статей в яндекс дзен https://lunar.az/user/StanleyFug/ продвижение с помощью статей бездепозитные бонусы сегодня http://bike.by/forum/viewtopic.php?f=86&t=17540 прогон сайта по белым каталогам бесплатно https://forum.mobilism.org/memberlist.php?mode=viewprofile&u=2527046

программы для прогона по сайтам индексация внешних ссылок прогон сайта хрумер https://forum.mobilelegends.com/home.php?mod=space&uid=891931&do=profile индексации страницы поисковыми системами

статейный прогон к2 прогон сайта самому https://www.facebook.com/permalink.php?story_fbid=165145192968844&id=100084200926369 проверить индексацию сайта в google http://www.zgqsz.com/home.php?mod=space&uid=193035 ускорение индексации ссылок https://steelnsk.ru/communication/forum/user/931471/

купон центр на скидку http://alex-zhibrik.blogspot.com/2011/05/blog-post_16.html мега купоны на скидку http://www.korea-pan.com/bbs/board.php?bo_table=free&wr_id=902851 купоны на скидку моремания первый заказ http://jdguru.ru/user/WalterKef/ бомбей купоны на скидку http://rogerfilms.com/index.php?title=Курсы_для_косметологов

спортмастер купон на скидку http://www.landmarkinnmoab.com/__media__/js/netsoltrademark.php?d=sillanpaa.info/2022/09/06/best-on-line-casinos-in-nigeria/ продвижение сайта статьями размещение статей http://gnb1.ru/bitrix/redirect.php?goto=http://erfolgsbuch.at/member.php?action=profile&uid=2597 cozy home промокод на скидку на первый http://rodos74.ru/bitrix/rk.php?goto=http://bbs.n023.com/home.php?mod=space&uid=647770 прогоны по трастовым сайтам форум http://www.coark.com/index/?URL=http://efb7917d.bget.ru/user/EdwardOpego/

https://nessour.org/member.phpu=2158 http://xn--80aeh5aeeb3a7a4f.xn--p1ai/forum/user/40132/ Коммерческое и промышленное оборудование для строи http://www.alrafi3.com/forum/member.php/955156-Brandontus

http://site0405.ru

5 | | 2024-05-11 10:11 | reply

прогон по трастовый сайтам здравсити купон на скидку промокод олди на скидку мореон аквапарк купоны на скидку 2022

топлив прогон сайта http://www.clines.org/doku2/doku.php?id=Недвижимость_Рё_жилье статьи создание продвижение сайтов http://forum.info-lan.ru/index.php?showuser=17247 dns купоны на скидку http://www.gangshan.tw/home.php?mod=space&uid=251296 прогон сайта анкоры

индексирование ссылок плагин для индексации сайта wordpress https://expediters.co.ke/2013/06/26/top-10-finest-prediction-sites-on-the-planet-2022/ аптека озерки купоны на скидку https://marexwine.ru/forum/?PAGE_NAME=profile_view&UID=459 casino бездепозитный бонус официальный сайт

программа прогона по трастовым сайтам https://pandia.ru/user/publ/81432-kopilka_na_mechtu аптека промокод на скидку http://bbs.47717.com/home.php?mod=space&uid=508329 купон на скидку битрикс http://www.mjinfo.co.kr/bbs/board.php?bo_table=free&wr_id=920726 wordpress индексация сайта http://www.ziyuxuan.net/home.php?mod=space&uid=856634

прогоны по трастовым сайтам форум карт промокод на скидку промокод ленты на скидку 2022 https://www.communityseednetwork.org/user/3395/ тематический прогон сайта что это

промокод на скидку яндекс такси http://www.adamtianxia.com/home.php?mod=space&uid=249094 скачать русские фильмы на телефон бесплатно ускоренная индексация сайта в google http://kuko-forum.name/user-18298.html киоск купон на скидку https://education.e-platforma.eu/pl/node/54343

манимен промокоды на скидку https://pxhere.com/en/photographer-me/4117922 ситилинк купоны на скидку индексация яндексом сайта проверить онлайн http://rd1.minzdravrso.ru/about/forum/user/344353/ добавить сайт в ускоренное индексирование http://bbs.1001860.com/home.php?mod=space&uid=2190903

м видео купоны на скидку 2022 http://msnijders.com/from_cv?to=http://koreamuseum.ru/index.php?subaction=userinfo&user=resonantkeeper9 бесплатно прогон сайта http://komkor-f.ru/bitrix/rk.php?goto=http://bashorg.org/user/FloydDrode/ вебмастер индексация сайта http://forgital.org/__media__/js/netsoltrademark.php?d=54.163.180.112/doku.php?id=Портфолио_модели промокоды на скидку на смартфоны http://saro-decor.ru/bitrix/redirect.php?goto=http://square.la.coocan.jp/01cgi/izakayadengon4/bbs17/bbs17.cgi

http://www.optionshare.tw/home.phpmod=space&uid=391360 http://elka54.ru/forum/PAGE_NAME=profile_view&UID=98787 http://5.101.112.134/profile/heavenlybaniste/

http://site0405.ru

6 | | 2024-05-11 17:20 | reply



  • blog/2017/2017-01-20.1484913225.txt.gz
  • 最終更新: 2017-01-20 20:53
  • by Decomo