871041532 / zstring Goto Github PK
View Code? Open in Web Editor NEWC# string零GC补充方案
C# string零GC补充方案
如果输入0.06,DecimalAccuracy设为2,则原来的只会输出0.6,是不对的,建议修改如下
int mul = (int)Math.Pow(10, DecimalAccuracy); // 2
int number = (int)(value * mul); // gets the number as a whole, e.g. 6
int left_num = number / mul; // left part of the decimal point, e.g. 0
int right_num = number % mul; // right part of the decimal pnt, e.g. 6
int left_digit_count = get_digit_count(left_num); // e.g. 1
int right_digit_count = DecimalAccuracy; // e.g. 2
int total = left_digit_count + right_digit_count + 1; // +1 for '.'
并没有block()方法,但是有Block()方法,这句话是否是笔误?
环境:Unity版本:2020.3.21f1c1, IL2CPP打安卓包
C#崩溃示例写法:
string str = “XXXX”;(任意字符串)
zstring zs = "+‘’ + str ; (这里必崩,第一个必须是任意单字符)
` private static string __intern(string value)
{
int hash = value.GetHashCode();
if (g_intern_table.ContainsKey(hash))
{
return g_intern_table[hash];
}
else
{
string interned = new string(NEW_ALLOC_CHAR, value.Length);
memcpy(interned, value);
g_intern_table.Add(hash, interned);
return interned;
}
}
`
运行环境:Unity2018.3.9f1
Scripting Runtime Version:.NET 4.x Equivalent
部分Log:
Failed running C:\Program Files\Unity2018.3.9f1\Editor\Data\il2cpp/build/il2cpp.exe --convert-to-cpp --emit-null-checks --enable-array-bounds-check --dotnetprofile="unityaot" --compile-cpp --libil2cpp-static --platform="Android" --architecture="ARM64" --configuration="Release" --outputpath="F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\assets\bin\Data\Native\arm64-v8a\libil2cpp.so" --cachedirectory="F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Assets..\Library\il2cpp_android_arm64-v8a/il2cpp_cache" --additional-include-directories="C:\Program Files\Unity2018.3.9f1\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\bdwgc/include" --additional-include-directories="C:\Program Files\Unity2018.3.9f1\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\libil2cpp/include" --tool-chain-path="E:/Workspace/Android/android-ndk-r16b" --map-file-parser="C:\Program Files\Unity2018.3.9f1\Editor\Data\Tools\MapFileParser\MapFileParser.exe" --directory="F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\assets\bin\Data\Managed" --generatedcppdir="F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput"
stdout:
Building libil2cpp.so with AndroidToolChain
Output directory: F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\assets\bin\Data\Native\arm64-v8a
Cache directory: F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Library\il2cpp_android_arm64-v8a\il2cpp_cache
il2cpp.exe didn't catch exception: Unity.IL2CPP.Building.BuilderFailedException: F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31352:5: error: use of undeclared identifier 'Byte8192_t859D083D49C0C1A52B1796E8E2EFFA0BF9A466BA'
*(Byte8192_t859D083D49C0C1A52B1796E8E2EFFA0BF9A466BA )L_4 = ((Byte8192_t859D083D49C0C1A52B1796E8E2EFFA0BF9A466BA *)L_5);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31352:57: error: expected expression
*(Byte8192_t859D083D49C0C1A52B1796E8E2EFFA0BF9A466BA )L_4 = ((Byte8192_t859D083D49C0C1A52B1796E8E2EFFA0BF9A466BA *)L_5);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31389:5: error: use of undeclared identifier 'Byte4096_tBD6CE6ABF553314AC5B27C97D2F9692C61365E5C'
*(Byte4096_tBD6CE6ABF553314AC5B27C97D2F9692C61365E5C )L_13 = ((Byte4096_tBD6CE6ABF553314AC5B27C97D2F9692C61365E5C *)L_14);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31389:57: error: expected expression
*(Byte4096_tBD6CE6ABF553314AC5B27C97D2F9692C61365E5C )L_13 = ((Byte4096_tBD6CE6ABF553314AC5B27C97D2F9692C61365E5C *)L_14);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31416:5: error: use of undeclared identifier 'Byte2048_t3BCFE5D5DF98ECC0B13477DFC6128A0B6C839ABE'
*(Byte2048_t3BCFE5D5DF98ECC0B13477DFC6128A0B6C839ABE )L_20 = ((Byte2048_t3BCFE5D5DF98ECC0B13477DFC6128A0B6C839ABE *)L_21);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31416:57: error: expected expression
*(Byte2048_t3BCFE5D5DF98ECC0B13477DFC6128A0B6C839ABE )L_20 = ((Byte2048_t3BCFE5D5DF98ECC0B13477DFC6128A0B6C839ABE *)L_21);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31443:5: error: use of undeclared identifier 'Byte1024_t0BBBB4EC3D1A9026D36FE8A837171263B47F8301'
*(Byte1024_t0BBBB4EC3D1A9026D36FE8A837171263B47F8301 )L_27 = ((Byte1024_t0BBBB4EC3D1A9026D36FE8A837171263B47F8301 *)L_28);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31443:57: error: expected expression
*(Byte1024_t0BBBB4EC3D1A9026D36FE8A837171263B47F8301 )L_27 = ((Byte1024_t0BBBB4EC3D1A9026D36FE8A837171263B47F8301 *)L_28);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31470:5: error: use of undeclared identifier 'Byte512_t4F4640E213B59685AD82B74250D784210BC5B99C'
*(Byte512_t4F4640E213B59685AD82B74250D784210BC5B99C )L_34 = ((Byte512_t4F4640E213B59685AD82B74250D784210BC5B99C *)L_35);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31470:56: error: expected expression
*(Byte512_t4F4640E213B59685AD82B74250D784210BC5B99C )L_34 = ((Byte512_t4F4640E213B59685AD82B74250D784210BC5B99C *)L_35);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31497:5: error: use of undeclared identifier 'Byte256_t1348DFC1B1E3AE428A9E58A8E5637B8EA3782C69'
*(Byte256_t1348DFC1B1E3AE428A9E58A8E5637B8EA3782C69 )L_41 = ((Byte256_t1348DFC1B1E3AE428A9E58A8E5637B8EA3782C69 *)L_42);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31497:56: error: expected expression
*(Byte256_t1348DFC1B1E3AE428A9E58A8E5637B8EA3782C69 )L_41 = ((Byte256_t1348DFC1B1E3AE428A9E58A8E5637B8EA3782C69 *)L_42);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31524:5: error: use of undeclared identifier 'Byte128_t47693D60AA2F2BD06AB8D0A40E0230876B91E9E4'
*(Byte128_t47693D60AA2F2BD06AB8D0A40E0230876B91E9E4 )L_48 = ((Byte128_t47693D60AA2F2BD06AB8D0A40E0230876B91E9E4 *)L_49);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31524:56: error: expected expression
*(Byte128_t47693D60AA2F2BD06AB8D0A40E0230876B91E9E4 )L_48 = ((Byte128_t47693D60AA2F2BD06AB8D0A40E0230876B91E9E4 *)L_49);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31551:5: error: use of undeclared identifier 'Byte64_t94D3F74EF7C4D4E51931CD696F4678EC94FDFE16'
*(Byte64_t94D3F74EF7C4D4E51931CD696F4678EC94FDFE16 )L_55 = ((Byte64_t94D3F74EF7C4D4E51931CD696F4678EC94FDFE16 *)L_56);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31551:55: error: expected expression
*(Byte64_t94D3F74EF7C4D4E51931CD696F4678EC94FDFE16 )L_55 = ((Byte64_t94D3F74EF7C4D4E51931CD696F4678EC94FDFE16 *)L_56);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31578:5: error: use of undeclared identifier 'Byte32_t75FF90FC74499EFA15159627ADBA12242AC192D0'
*(Byte32_t75FF90FC74499EFA15159627ADBA12242AC192D0 )L_62 = ((Byte32_t75FF90FC74499EFA15159627ADBA12242AC192D0 *)L_63);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31578:55: error: expected expression
*(Byte32_t75FF90FC74499EFA15159627ADBA12242AC192D0 )L_62 = ((Byte32_t75FF90FC74499EFA15159627ADBA12242AC192D0 *)L_63);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31605:5: error: use of undeclared identifier 'Byte16_t8C0FAC8165912C33164D9719DA6BFE12D06DFDEF'
*(Byte16_t8C0FAC8165912C33164D9719DA6BFE12D06DFDEF )L_69 = ((Byte16_t8C0FAC8165912C33164D9719DA6BFE12D06DFDEF *)L_70);
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
Invocation was: Executable: "E:\Workspace\Android\android-ndk-r16b\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++"
Arguments: -DNET_4_0 -DUNITY_AOT -DGC_NOT_DLL -DRUNTIME_IL2CPP -DLINUX -DANDROID -DPLATFORM_ANDROID -D__linux__ -D__STDC_FORMAT_MACROS -DTARGET_ARM64 -I"C:\Program Files\Unity2018.3.9f1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\bdwgc\include" -I"C:\Program Files\Unity2018.3.9f1\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\libil2cpp\include" -I"C:\Program Files\Unity2018.3.9f1\Editor\Data\il2cpp\libil2cpp" -I"C:\Program Files\Unity2018.3.9f1\Editor\Data\il2cpp\external\boehmgc\include" -I"F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput" -I"." -I"E:\Workspace\Android\android-ndk-r16b\sources\cxx-stl\gnu-libstdc++\4.9\include" -I"E:\Workspace\Android\android-ndk-r16b\sources\cxx-stl\gnu-libstdc++\4.9\include\backward" -I"E:\Workspace\Android\android-ndk-r16b\sources\cxx-stl\gnu-libstdc++\4.9\libs\arm64-v8a\include" -c -g -DNDEBUG -funwind-tables -fno-limit-debug-info -fdata-sections -ffunction-sections -Wa,--noexecstack -fno-rtti -std=c++98 -fno-strict-aliasing -fvisibility=hidden -fvisibility-inlines-hidden -fno-strict-overflow -fPIC -Os --sysroot "E:\Workspace\Android\android-ndk-r16b\sysroot" -gcc-toolchain "E:\Workspace\Android\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64" -target aarch64-none-linux-android -isystem "E:\Workspace\Android\android-ndk-r16b\sysroot\usr\include\aarch64-linux-android" -D__ANDROID_API__=21 -march=armv8-a -Wno-unused-value "F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp" -o "F:/My/Unity/Project/TrustFramework/client/Unity/TrustFramework/Library/il2cpp_android_arm64-v8a/il2cpp_cache/1084D6449E9D3B1F950C3DF201B25368.o"
�� Unity.IL2CPP.Building.CppProgramBuilder.BuildAllCppFiles(IEnumerable`1 sourceFilesToCompile, IBuildStatisticsCollector statisticsCollector)
�� Unity.IL2CPP.Building.CppProgramBuilder.Build(IBuildStatistics& statistics)
�� il2cpp.Program.DoRun(String[] args)
�� il2cpp.Program.Run(String[] args)
�� il2cpp.Program.Main(String[] args)
stderr:
δ��������쳣: Unity.IL2CPP.Building.BuilderFailedException: F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31352:5: error: use of undeclared identifier 'Byte8192_t859D083D49C0C1A52B1796E8E2EFFA0BF9A466BA'
*(Byte8192_t859D083D49C0C1A52B1796E8E2EFFA0BF9A466BA )L_4 = ((Byte8192_t859D083D49C0C1A52B1796E8E2EFFA0BF9A466BA *)L_5);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31352:57: error: expected expression
*(Byte8192_t859D083D49C0C1A52B1796E8E2EFFA0BF9A466BA )L_4 = ((Byte8192_t859D083D49C0C1A52B1796E8E2EFFA0BF9A466BA *)L_5);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31389:5: error: use of undeclared identifier 'Byte4096_tBD6CE6ABF553314AC5B27C97D2F9692C61365E5C'
*(Byte4096_tBD6CE6ABF553314AC5B27C97D2F9692C61365E5C )L_13 = ((Byte4096_tBD6CE6ABF553314AC5B27C97D2F9692C61365E5C *)L_14);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31389:57: error: expected expression
*(Byte4096_tBD6CE6ABF553314AC5B27C97D2F9692C61365E5C )L_13 = ((Byte4096_tBD6CE6ABF553314AC5B27C97D2F9692C61365E5C *)L_14);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31416:5: error: use of undeclared identifier 'Byte2048_t3BCFE5D5DF98ECC0B13477DFC6128A0B6C839ABE'
*(Byte2048_t3BCFE5D5DF98ECC0B13477DFC6128A0B6C839ABE )L_20 = ((Byte2048_t3BCFE5D5DF98ECC0B13477DFC6128A0B6C839ABE *)L_21);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31416:57: error: expected expression
*(Byte2048_t3BCFE5D5DF98ECC0B13477DFC6128A0B6C839ABE )L_20 = ((Byte2048_t3BCFE5D5DF98ECC0B13477DFC6128A0B6C839ABE *)L_21);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31443:5: error: use of undeclared identifier 'Byte1024_t0BBBB4EC3D1A9026D36FE8A837171263B47F8301'
*(Byte1024_t0BBBB4EC3D1A9026D36FE8A837171263B47F8301 )L_27 = ((Byte1024_t0BBBB4EC3D1A9026D36FE8A837171263B47F8301 *)L_28);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31443:57: error: expected expression
*(Byte1024_t0BBBB4EC3D1A9026D36FE8A837171263B47F8301 )L_27 = ((Byte1024_t0BBBB4EC3D1A9026D36FE8A837171263B47F8301 *)L_28);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31470:5: error: use of undeclared identifier 'Byte512_t4F4640E213B59685AD82B74250D784210BC5B99C'
*(Byte512_t4F4640E213B59685AD82B74250D784210BC5B99C )L_34 = ((Byte512_t4F4640E213B59685AD82B74250D784210BC5B99C *)L_35);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31470:56: error: expected expression
*(Byte512_t4F4640E213B59685AD82B74250D784210BC5B99C )L_34 = ((Byte512_t4F4640E213B59685AD82B74250D784210BC5B99C *)L_35);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31497:5: error: use of undeclared identifier 'Byte256_t1348DFC1B1E3AE428A9E58A8E5637B8EA3782C69'
*(Byte256_t1348DFC1B1E3AE428A9E58A8E5637B8EA3782C69 )L_41 = ((Byte256_t1348DFC1B1E3AE428A9E58A8E5637B8EA3782C69 *)L_42);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31497:56: error: expected expression
*(Byte256_t1348DFC1B1E3AE428A9E58A8E5637B8EA3782C69 )L_41 = ((Byte256_t1348DFC1B1E3AE428A9E58A8E5637B8EA3782C69 *)L_42);
^
F:\My\Unity\Project\TrustFramework\client\Unity\TrustFramework\Temp\StagingArea\Il2Cpp\il2cppOutput\Bulk_Assembly-CSharp_5.cpp:31524:5: error: use of undeclared identifier 'Byte128_t47693D60AA2F2BD06AB8D0A40E0230876B91E9E4'
*(Byte128_t47693D60AA2F2BD06AB8D0A40E0230876B91E9E4 )L_48 = ((Byte128_t47693D60AA2F2BD06AB8D0A40E0230876B91E9E4 *)L_49);
^
F:\My\Unity
rt,当Format传空字符串作为参数时,会导致抛出越界异常。看上去是下面ptr_result[i++] = arg[k++]的部分,由于arg.Length为0,因此只要进到这里就会由于调用arg[k++]导致异常。
看起来在处理字符串之前先针对arg.Length为0的情况做个处理就可以了。
` for (int i = 0, j = 0, x = 0; ; x++) // x < num_args
{
brace_idx = internal_index_of(input, '{', brace_idx + 3);
if (brace_idx == -1)
{
break;
}
next_input_idx = brace_idx;
int arg_idx = input[brace_idx + 1] - '0';
string arg = g_format_args[arg_idx]._value;
if (brace_idx == -1)
throw new InvalidOperationException("没有发现大括号{ for argument " + arg);
if (brace_idx + 2 >= input.Length || input[brace_idx + 2] != '}')
throw new InvalidOperationException("没有发现大括号} for argument " + arg);
fixed (char* ptr_input = input)
{
fixed (char* ptr_result = res_value)
{
for (int k = 0; i < new_len;)
{
if (j < brace_idx)
{
ptr_result[i++] = ptr_input[j++];
++next_output_idx;
}
else
{
ptr_result[i++] = arg[k++]; // throw exception here if arg.Length == 0
++next_output_idx;
if (k == arg.Length)
{
j += 3;
break;
}
}
}
}
}
}`
int found = 0; 位置是不是有问题 放在for 循环里面
//获取value在input中自start起始下标
private unsafe static int internal_index_of(string input, string value, int start, int count)
{
int input_len = input.Length;
if (start < 0 || start >= input_len)
throw new ArgumentOutOfRangeException("start");
if (count < 0 || start + count > input_len)
throw new ArgumentOutOfRangeException("count=" + count + " start+count=" + (start + count));
if (count == 0)
return -1;
fixed (char* ptr_input = input)
{
fixed (char* ptr_value = value)
{
int found = 0;
int end = start + count;
for (int i = start; i < end; i++)
{
正确的是不是应该是
//获取value在input中自start起始下标
private unsafe static int internal_index_of(string input, string value, int start, int count)
{
int input_len = input.Length;
if (start < 0 || start >= input_len)
throw new ArgumentOutOfRangeException("start");
if (count < 0 || start + count > input_len)
throw new ArgumentOutOfRangeException("count=" + count + " start+count=" + (start + count));
if (count == 0)
return -1;
fixed (char* ptr_input = input)
{
fixed (char* ptr_value = value)
{
int end = start + count;
for (int i = start; i < end; i++)
{
int found = 0;
Unity 设置两个文本 不同字符串, 有可能设置错误:
第一个文本字符串设置“abc” 第二个文本设置“123” (每次设置都在一个block 且 设置完都改变颜色以重置网格显示)
打印时,两个都输出正确的值,
但是会出现 第二个文本显示了"abc"的错误,第二个文本在组件上显示第一个文本的字符串"abc"
即设置给第一个文本的字符串"abc",同时赋值给了第一个文本和第二个文本,感觉像是第二个文本的字符串被引用住了
using(zstring.Block()){ ... }并不适合游戏结构,建议以每帧为一个block进行回收再利用,否则UGUI或者TextMeshPro会造成文字显示不正确
rt,zstring类对象在调用Equals与非空对象比较时会抛空。看起来是由于Equals内会将obj转为zstring类并进行非空判定,但重写的!=运算符号直接尝试获取left与right的value导致的
` public override bool Equals(object obj)
{
if (obj == null)
return ReferenceEquals(this, null);
var gstr = obj as zstring;
if (gstr != null)
return gstr._value == this._value;
var str = obj as string;
if (str != null)
return str == this._value;
return false;
}`
public static bool operator !=(zstring left, zstring right) { return !(left._value == right._value); }
//获取特定长度zstring private static zstring get(int length) { if (g_current_block == null || length <= 0) throw new InvalidOperationException("zstring 操作必须在一个zstring_block块中。");
如代码所示,在获取指定长度的zstring的get方法内,当length<=0时则抛出内容为“zstring 操作必须在一个zstring_block块中。”的异常,这里有两点不是太理解:一是空字符串为何要直接抛异常,二是异常的内容为何会和Block共用
public int LastIndexOf(string value)
{
int idx = -1;
int last_find = -1;
while (true)
{
idx = internal_index_of(this._value, value, idx + value.Length);
last_find = idx;
if (idx == -1 || idx + value.Length >= this._value.Length)
break;
}
return last_find;
}
当internal_index_of() 返回-1时, last_find = idx;会覆盖上次的值,导致最终返回-1,
应该调整至if判断之后:
public int LastIndexOf(string value)
{
int idx = -1;
int last_find = -1;
while (true)
{
idx = internal_index_of(this._value, value, idx + value.Length);
if (idx == -1 || idx + value.Length >= this._value.Length)
break;
last_find = idx;
}
return last_find;
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.