matlab-struct 相关问题


对高于 7.3 的 matlab 版本使用 Mat_CreateVer

我有一个适用于Windows平台的C++应用程序。此应用程序创建 .mat 文件。目前我们仅支持 4、5 和 7.3 版本的 matlab。我们希望添加对更高版本的 matlab 的支持。 在...


在 ode45() MATLAB 中指定 odeset()

我有以下非线性系统和随附的 ODE: 我在 MATLAB 中的解决方案: % 使用 ODE45 求解 dt = 10^-1; % [秒] T = 100; % [秒] N = 2; % 质量数 X_0 = 零(2*N,1); t_span = [0:d...


C 中的结构填充

我读过有关 C 中结构填充的文章: http://bytes.com/topic/c/answers/543879-what-struct-padding 并在文章后写了这段代码,应该打印出 'struct pad' 的大小,如 16...


为什么在matlab中find返回双精度值

matlab 中的 find 函数返回给定局部参数值为 true 的索引。 因此我想知道为什么返回值(对于索引)是 double 类型而不是 uint32 或 uin...


Matlab if 语句不满足所有条件

抱歉,这很容易成为一个重复的问题,但我相当有信心我还没有找到答案。 使用 fitlm 在 matlab 中进行一些回归分析。我只想看看模型...


Matlab fitlm - 绘制 mdl 并在图中显示 mdl

利用matlab的fitlm制作一些线性模型。根据文档,我可以让它绘制模型,并在命令窗口中显示模型的详细信息。有什么办法可以显示bo...


为什么 MATLAB 中的 find 返回索引为双精度值?

MATLAB 中的 find 函数返回给定逻辑参数计算为 true 的索引。 因此我想知道,为什么返回的索引类型是 double 而不是 uint32 或 uint64 像最大的


Matlab 2021 和 2023 交叉兼容性 [已关闭]

我在两台电脑上工作;一台 Windows 10 笔记本电脑和一台 Windows 7 工作站。 我在工作站上使用 MATLAB 2021a(因为它是与 Windows 7 兼容的最新版本)并且希望...


c++ 中的“struct* struct newStruct(int somedata) { }”语法是什么[重复]

我试图用c++制作一棵树,并遇到了这段代码,这让我很困惑。 结构节点 { 整数数据; 结构节点*左; 结构节点*右; }; // 下面的代码是...


使用matlab Latex解释器时如何将字体更改为times new roman?

我使用matlab绘制的x轴名称图是“归一化时间t/T”,其中“归一化时间”应该是times new roman字体,与我的论文的正常字体相同,t/T应该是



连续打开1000个文本文件

函数从目录中顺序打开大量文件是如何实现的? 我不想写: 文件名 = 'C:\Users\erjan\PycharmProjects\STRUCT\rtv.txt', 'C:\用户\...


使 numpy ndarray 矩阵对称

我有一个70x70的numpy ndarray,主要是对角线。唯一的非对角线值是对角线下方的值。我想让矩阵对称。 作为Matlab世界的新人,我不能...


如何在 Matlab 中绘制 3D 平面?

我想使用从 3 个点计算得出的向量来绘制一个平面,其中: A点 = [0,0,0]; B点=[-10,-20,10]; C点 = [10,20,10]; 平面1 = 交叉(A点-B点,A点-C点) 怎么...


“struct Obj* obj”和“Obj* obj”之间的区别[重复]

结构元素{ 元素() {} int 数据 = NULL; 结构元素*右,*左; }; 或者 结构体元素{ 元素() {} int 数据 = NULL; 元素*右,*左; }; 我正在与


具有一个成员的结构体的大小与该成员的大小相同吗?

鉴于 结构体S{ SomeType single_element_in_the_struct; }; 总是这样吗 sizeof(struct S) == sizeof(SomeType) 或者它可能依赖于实现?


Linux GPIO V2 请求线 ioctl 失败

我正在尝试实现新的linux gpio api。使用 v1 api,我能够确认此代码是否有效: // req 是更大代码的一部分 struct gpiohandle_request lreq; memset(lreq.default_value...


作为 UITextView inputAccessoryView 的 SwiftUI 视图具有不正确的框架

我正在尝试通过 UIHostingController 将 SwiftUI 视图作为附件视图添加到 UITextView 中。以下是我的 UIInputView 配置 struct AccessoryView: View { /* SwiftUI 视图 */ } c...


这种修复插值可以在 Python 中变得更快吗?

根据 Garcia 等人的论文,Matlab (Inpaintn) 中有一个使用离散余弦变换编写的 inpaint 函数来填充多维数据集中的缺失值。等人。 (2012)。我...


在两个具有公共基础的模板类之间安全地转换

考虑以下事项 模板 结构体包装{ T t; }; 模板 struct Variant1:公共包装器< T > { // ... 成员类型、静态成员、非 virt...


如何在Rocket环境中建立数据库连接?

我的 Rocket 应用程序有以下工作数据库连接设置: 主要.rs: #[数据库(“my_db”)] pub struct DbConn(diesel::PgConnection); 火箭.toml: [全局数据库] my_db = { 你...


使用窗函数从 FFT 结果中提取某些频率

我正在尝试使用 MATLAB(R2022b Update 7)并提出一个代码来从 fft 结果中提取某些频率。我有 1 Hz 数据(三天 259200 秒)并且想要转换...


为什么numpy中有些函数是np.ndarray的方法,有些是函数?

这是一个软问题,但我怀疑理解这一点将帮助我(也希望其他人)更好地理解 numpy 的哲学(我最近从 MATLAB 迁移)。 一些有趣的...


在golang中从struct手动创建json对象

我有一个结构可以说 类型 Foo 结构 { 字符串 `json:",omitemtpy" } 我知道我可以使用类似的方法轻松地将其转换为 json json.Marshal(Foo{}) 它会响应...


使用 BlueZ 和 C++ 在 Linux 上运行服务器和在 Windows 上运行客户端时出现蓝牙问题:错误 10051

我正在Linux Ubuntu上运行服务器软件,代码如下: int serverSocket, clientSocket; struct sockaddr_rc serverAddr = {0}, clientAddr={0}; socklen_t clientAddrSize = sizeof(


如何克隆存储装箱特征对象的结构?

我编写了一个具有 Animal 特征和实现该特征的 struct Dog 的程序。它还有一个 AnimalHouse 结构体,将动物存储为特征对象 Box。 特质动物{ 芬...


pthread 使用 pthread_cleanup_push 清理 int/array/struct 类型变量

这可能是一个转储问题,但我对多线程编程不熟悉,并且用谷歌搜索了很多,但找不到有用的信息。假设我有一个线程的启动函数,这...


在 matlab 中注释行的末尾添加文本

我需要将文本添加到我需要为我的任务建模的自由人体图中,但我的教授期望我这样做的方式不起作用,所以我想知道我该如何做到这一点 这是我的代码


如何在Python的for循环中添加布尔表达式而不是在每个elif下粘贴计算行

我正在尝试将 MATLAB 脚本转换为 Python。我有一个工作代码,但它非常笨重,我已将计算行粘贴到每个 if 和 elif 行下方以使其工作。我希望...


如何重命名 zip 文件中的文件而不使用 Matlab 命令解压它

我有一堆 zip 文件夹,我必须提取并读取数据(存储在一个唯一的文件中)。问题是其中一些文件夹由于任何类型的错误而有两个文件(而不是 1),并且具有相同的


在声明结构体对象之前是否可以选择使用 struct 关键字?

要声明类对象,我们需要格式 类名对象名; 声明结构体对象也是同样的方法吗? 喜欢 结构名对象名; 我在这里发现一个结构对象声明为 圣...


如何在 Rust 中指定与 const 泛型参数不同的类型?

我将为坐标创建一个通用类型。它应该能够指定每个轴的基数类型。 起初,我的代码如下所示: 使用 num::Signed; 结构坐标 我将为坐标创建一个通用类型。它应该能够指定每个轴的基数类型。 首先,我的代码如下所示: use num::Signed; struct Coordinate<Index: Signed> { x: Index, y: Index, } 另外,我希望它携带额外的绑定信息来帮助我检查实现中的访问,所以我写了这个。 use num::Signed; struct Coordinate<const Bound: isize, Index: Signed> { x: Index, y: Index, } 但是,即使Signed仅针对i8, ..., isize实现,我也不能简单地将Signed的值与isize进行比较。所以我转向这个: use num::Signed; struct Coordinate<const Bound: Index, Index: Signed> { x: Index, y: Index, } 当然,失败了。我想知道是否有任何可能的解决方案来解决这个问题。 您的第一个版本正朝着正确的方向发展,它只需要更多的特征界限: use num::Signed; #[derive(Debug)] struct Coordinate<const BOUND: isize, Index> where Index: Signed + PartialOrd + NumCast, isize: From<Index>, { x: Index, y: Index, } impl<const BOUND: isize, Index> Coordinate<BOUND, Index> where Index: Signed + PartialOrd + Copy, isize: From<Index>, { pub fn new(x: Index, y: Index) -> Option<Self> { if x >= Index::zero() && y >= Index::zero() && isize::from(x) < BOUND && isize::from(y) < BOUND { Some(Self { x, y }) } else { None } } } fn main() { dbg!(Coordinate::<10, i16>::new(5, 3)); dbg!(Coordinate::<10, i16>::new(5, 11)); } [src\main.rs:32] Coordinate::<10, i16>::new(5, 3) = Some( Coordinate { x: 5, y: 3, }, ) [src\main.rs:33] Coordinate::<10, i16>::new(5, 11) = None


指针和结构:为什么这个 C 代码不起作用?

我不明白为什么下面的代码尽管正确打印了产品名称,但无法正确显示产品编号。你能向我解释一下吗? #包括 我不明白为什么以下代码尽管正确打印了产品名称,但无法正确显示产品编号。你能给我解释一下吗? #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct products { char name_[4]; int number_; } Product; Product* createProduct(char* name, int number) { Product* new_product = malloc(sizeof(Product)); if(new_product == NULL) return NULL; new_product->number_ = number; strcpy(new_product->name_, name); return new_product; } int main() { Product* array[3]; array[0] = createProduct("Product 1", 0xAABBCCDD); array[1] = createProduct("Product 2", 0xFFAA33EE); array[2] = createProduct("Product 3", 0xBBCC7799); for(int i = 0; i < 3; i++) { Product* product = array[i]; printf("%s : 0x%X\n", product->name_, product->number_); free(product); } printf("Are all product numbers displayed correctly?\n"); return 0; } 元素 Product.name_ 可以容纳 3 个字符的字符串(加上 \0),但您传递了 strlen("Product 1") == 9,因此 strcpy() 将导致未定义的行为。考虑使用 strncpy() 或 memcpy() 并确保生成的数组已 \0 终止。


汇编和模板类

我正在开发一个小项目,并尝试将一些硬编码值用于内联汇编。为此,我使用模板。我创建了一个代码片段来显示我所看到的 #包括 我正在开发一个小项目,并尝试将一些硬编码值用于内联汇编。为此,我使用模板。我创建了一个代码片段来显示我所看到的 #include <iostream> template <size_t T> struct MyClass { size_t myValue = T; void doSomething() { size_t value = T; __asm { mov eax, [T] mov [value], eax } std::cout << value << std::endl; } }; int main() { auto o = new MyClass<999>(); o->doSomething(); return 0; } 事实证明,对于汇编代码,它试图使用数据段而不是“直接将数字粘贴到那里” ; 25 : { push ebp mov ebp, esp push ecx ; 26 : auto o = new MyClass<999>(); push 4 call ??2@YAPAXI@Z ; operator new add esp, 4 ; 14 : size_t value = T; mov DWORD PTR _value$2[ebp], 999 ; 000003e7H ; 26 : auto o = new MyClass<999>(); mov DWORD PTR [eax], 0 mov DWORD PTR [eax], 999 ; 000003e7H ; 15 : __asm ; 16 : { ; 17 : mov eax, [T] mov eax, DWORD PTR ds:0 ; 18 : mov [value], eax mov DWORD PTR _value$2[ebp], eax ; 19 : } ; 20 : std::cout << value << std::endl; 我正在使用 Visual Studio 2015。还有其他方法可以实现此目的吗? 啊,多么可爱又扭曲的问题啊! 我尝试使用 T 初始化 constexpr 变量。结果是相同的 - 从内存加载值。宏可用于将文字传递给内联汇编,但它们与模板不能很好地混合。 使用 T 在类中初始化枚举在理论上应该可行(https://msdn.microsoft.com/en-us/library/ydwz5zc6.aspx提到枚举可以在内联汇编中使用),但是在内联汇编使 Visual Studio 2015 编译器崩溃:-)。 似乎有效的是一个函数模板,它使用模板参数声明一个枚举,然后在内联程序集中使用该枚举。如果必须将其放在模板类中,则可以在类中实例化模板函数,如下所示: #include <iostream> template <size_t T> void dosomething() { enum { LOCALENUM = T }; size_t value = 0; __asm { mov eax, LOCALENUM mov[value], eax } std::cout << value << std::endl; } template <size_t T> struct MyClass { size_t myValue = T; void doSomething() { ::dosomething<T>(); } }; int main() { //dosomething<999>(); auto o = new MyClass<999>(); o->doSomething(); return 0; } 这会产生以下汇编代码: auto o = new MyClass<999>(); 001B1015 mov dword ptr [eax],0 001B101B mov dword ptr [eax],3E7h o->doSomething(); 001B1021 mov eax,3E7h <--- Victory! 001B1026 mov dword ptr [ebp-4],eax 001B1029 mov ecx,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (01B2048h)] 001B102F push offset std::endl<char,std::char_traits<char> > (01B1050h) 001B1034 push dword ptr [ebp-4] 001B1037 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (01B2044h)]


使用 libcurl 时出现“SSL CA 证书问题”错误

我使用--openssldir=< path to ssl >/ssl(链接到/etc/ssl)构建了openssl 1.1.1,并使用--with-ssl=< path to openssl >构建了curl 7.76.1。 编译了以下代码: #包括 我使用--openssldir=< path to ssl >/ssl(链接到/etc/ssl)构建了openssl 1.1.1,并使用--with-ssl=< path to openssl >构建了curl 7.76.1。 编译了以下代码: #include <iostream> #include <curl/curl.h> int main() { CURL *curl = curl_easy_init(); if (curl) { struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Accept: */*"); headers = curl_slist_append(headers, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_URL, "https://<address>"); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "<some data>"); curl_easy_perform(curl); curl_slist_free_all(headers) } curl_easy_cleanup(curl); } 当我运行此代码时,出现错误: curl_easy_operation() failed : Problem with the SSL CA cert (path? access rights?) 我在 strace 中看到,它正在尝试打开“/etc/pki/tls/certs/ca-bundle.crt” 但在我的机器(Ubuntu 12 和 Ubuntu 14)中没有文件夹“/etc/pki”。 为什么curl使用“/etc/pki”而不是“/etc/ssl”?我怎样才能强制它使用“/etc/ssl”? 我尝试使用 --without-nss 构建curl,但没有成功。 编辑: 我的解决方案是添加以下代码: ifstream caBundleFile("/etc/pki/tls/certs/ca-bundle.crt"); if (caBundleFile.good()) { curl_easy_setopt(curl, CURLOPT_CAINFO, "/etc/pki/tls/certs/ca-bundle.crt"); caBundleFile.close(); } else { curl_easy_setopt(curl, CURLOPT_CAPATH, "/etc/ssl/certs"); } 有两种流行的存储根证书的格式。第一个适用于 RHEL/Centos 等,第二个适用于 Ubuntu 等发行版。 对于未来的读者,答案是设置curl CA路径 #include <iostream> #include <curl/curl.h> const std::string curlCertPath = "./keys/curl-ca-bundle.crt"; int main() { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/"); curl_easy_setopt(curl, CURLOPT_CAINFO, curlCertPath.c_str()); res = curl_easy_perform(curl); if (res == CURLE_OK) { std::cout << "Curl worked" << std::endl; } else { std::cout << "Error: curl failed: " << curl_easy_strerror(res) << std::endl; } curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; }


在 C# 中将 Task<T> 转换为 Task<object>,无需 T

我有一个充满扩展方法的静态类,其中每个方法都是异步的并返回一些值 - 像这样: 公共静态类 MyContextExtensions{ 公共静态异步任务 我有一个充满扩展方法的静态类,其中每个方法都是异步的并返回一些值 - 像这样: public static class MyContextExtensions{ public static async Task<bool> SomeFunction(this DbContext myContext){ bool output = false; //...doing stuff with myContext return output; } public static async Task<List<string>> SomeOtherFunction(this DbContext myContext){ List<string> output = new List<string>(); //...doing stuff with myContext return output; } } 我的目标是能够从另一个类中的单个方法调用这些方法中的任何一个,并将其结果作为对象返回。它看起来像这样: public class MyHub: Hub{ public async Task<object> InvokeContextExtension(string methodName){ using(var context = new DbContext()){ //This fails because of invalid cast return await (Task<object>)typeof(MyContextExtensions).GetMethod(methodName).Invoke(null, context); } } } 问题是转换失败。我的困境是我无法将任何类型参数传递给“InvokeContextExtension”方法,因为它是 SignalR 中心的一部分并且由 javascript 调用。在某种程度上,我不关心扩展方法的返回类型,因为它只会序列化为 JSON 并发送回 javascript 客户端。但是,我确实必须将 Invoke 返回的值转换为任务才能使用等待运算符。我必须为该“任务”提供一个通用参数,否则它将把返回类型视为 void。因此,这一切都归结为如何成功地将具有通用参数 T 的任务转换为具有对象通用参数的任务,其中 T 表示扩展方法的输出。 您可以分两步完成 - await使用基类执行任务,然后使用反射或dynamic收获结果: using(var context = new DbContext()) { // Get the task Task task = (Task)typeof(MyContextExtensions).GetMethod(methodName).Invoke(null, context); // Make sure it runs to completion await task.ConfigureAwait(false); // Harvest the result return (object)((dynamic)task).Result; } 这是一个完整的运行示例,它将上述通过反射调用 Task 的技术置于上下文中: class MainClass { public static void Main(string[] args) { var t1 = Task.Run(async () => Console.WriteLine(await Bar("Foo1"))); var t2 = Task.Run(async () => Console.WriteLine(await Bar("Foo2"))); Task.WaitAll(t1, t2); } public static async Task<object> Bar(string name) { Task t = (Task)typeof(MainClass).GetMethod(name).Invoke(null, new object[] { "bar" }); await t.ConfigureAwait(false); return (object)((dynamic)t).Result; } public static Task<string> Foo1(string s) { return Task.FromResult("hello"); } public static Task<bool> Foo2(string s) { return Task.FromResult(true); } } 一般来说,要将 Task<T> 转换为 Task<object>,我会简单地采用简单的连续映射: Task<T> yourTaskT; // .... Task<object> yourTaskObject = yourTaskT.ContinueWith(t => (object) t.Result); (文档链接在这里) 但是,您实际的具体需求是 通过反射调用 Task 并获取其(未知类型)结果 。 为此,您可以参考完整的dasblinkenlight的答案,它应该适合您的具体问题。 我想提供一个实现,恕我直言,这是早期答案的最佳组合: 精确的参数处理 无动态调度 通用扩展方法 给你: /// <summary> /// Casts a <see cref="Task"/> to a <see cref="Task{TResult}"/>. /// This method will throw an <see cref="InvalidCastException"/> if the specified task /// returns a value which is not identity-convertible to <typeparamref name="T"/>. /// </summary> public static async Task<T> Cast<T>(this Task task) { if (task == null) throw new ArgumentNullException(nameof(task)); if (!task.GetType().IsGenericType || task.GetType().GetGenericTypeDefinition() != typeof(Task<>)) throw new ArgumentException("An argument of type 'System.Threading.Tasks.Task`1' was expected"); await task.ConfigureAwait(false); object result = task.GetType().GetProperty(nameof(Task<object>.Result)).GetValue(task); return (T)result; } 您不能将 Task<T> 转换为 Task<object>,因为 Task<T> 不是协变的(也不是逆变的)。最简单的解决方案是使用更多反射: var task = (Task) mi.Invoke (obj, null) ; var result = task.GetType ().GetProperty ("Result").GetValue (task) ; 这很慢且效率低下,但如果不经常执行此代码则可用。顺便说一句,如果您要阻塞等待其结果,那么异步 MakeMyClass1 方法有什么用呢? 另一种可能性是为此目的编写一个扩展方法: public static Task<object> Convert<T>(this Task<T> task) { TaskCompletionSource<object> res = new TaskCompletionSource<object>(); return task.ContinueWith(t => { if (t.IsCanceled) { res.TrySetCanceled(); } else if (t.IsFaulted) { res.TrySetException(t.Exception); } else { res.TrySetResult(t.Result); } return res.Task; } , TaskContinuationOptions.ExecuteSynchronously).Unwrap(); } 它是非阻塞解决方案,将保留任务的原始状态/异常。 最有效的方法是自定义等待者: struct TaskCast<TSource, TDestination> where TSource : TDestination { readonly Task<TSource> task; public TaskCast(Task<TSource> task) { this.task = task; } public Awaiter GetAwaiter() => new Awaiter(task); public struct Awaiter : System.Runtime.CompilerServices.INotifyCompletion { System.Runtime.CompilerServices.TaskAwaiter<TSource> awaiter; public Awaiter(Task<TSource> task) { awaiter = task.GetAwaiter(); } public bool IsCompleted => awaiter.IsCompleted; public TDestination GetResult() => awaiter.GetResult(); public void OnCompleted(Action continuation) => awaiter.OnCompleted(continuation); } } 具有以下用法: Task<...> someTask = ...; await TaskCast<..., object>(someTask); 这种方法的局限性在于结果不是 Task<object> 而是一个可等待的对象。 我根据dasblinkenlight的回答做了一个小小的扩展方法: public static class TaskExtension { public async static Task<T> Cast<T>(this Task task) { if (!task.GetType().IsGenericType) throw new InvalidOperationException(); await task.ConfigureAwait(false); // Harvest the result. Ugly but works return (T)((dynamic)task).Result; } } 用途: Task<Foo> task = ... Task<object> = task.Cast<object>(); 这样您就可以将 T 中的 Task<T> 更改为您想要的任何内容。 对于最佳方法,不使用反射和动态丑陋语法,也不传递泛型类型。我将使用两种扩展方法来实现这个目标。 public static async Task<object> CastToObject<T>([NotNull] this Task<T> task) { return await task.ConfigureAwait(false); } public static async Task<TResult> Cast<TResult>([NotNull] this Task<object> task) { return (TResult) await task.ConfigureAwait(false); } 用途: Task<T1> task ... Task<T2> task2 = task.CastToObject().Cast<T2>(); 这是我的第二种方法,但不推荐: public static async Task<TResult> Cast<TSource, TResult>([NotNull] this Task<TSource> task, TResult dummy = default) { return (TResult)(object) await task.ConfigureAwait(false); } 用途: Task<T1> task ... Task<T2> task2 = task.Cast((T2) default); // Or Task<T2> task2 = task.Cast<T1, T2>(); 这是我的第三种方法,但是不推荐:(类似于第二种) public static async Task<TResult> Cast<TSource, TResult>([NotNull] this Task<TSource> task, Type<TResult> type = null) { return (TResult)(object) await task.ConfigureAwait(false); } // Dummy type class public class Type<T> { } public static class TypeExtension { public static Type<T> ToGeneric<T>(this T source) { return new Type<T>(); } } 用途: Task<T1> task ... Task<T2> task2 = task.Cast(typeof(T2).ToGeneric()); // Or Task<T2> task2 = task.Cast<T1, T2>(); 将 await 与动态/反射调用混合使用并不是一个好主意,因为 await 是一条编译器指令,它会围绕调用的方法生成大量代码,并且使用更多反射来“模拟”编译器工作并没有真正的意义,延续、包装等 因为您需要的是在运行时管理代码,然后忘记在编译时工作的 asyc await 语法糖。重写 SomeFunction 和 SomeOtherFunction 而不使用它们,并在运行时创建的您自己的任务中开始操作。您将得到相同的行为,但代码非常清晰。


© www.soinside.com 2019 - 2024. All rights reserved.