问题列表 - 第318088页

c 中的字符串并通过 printf 打印字符串

#include <stdio.h>
#include <string.h>

int main()
{
    char s1[]="harry ";
    char s2[]="is a friend of ";
    char s3[]="ravi";
    char s4[20];
    char s5[20];
    strcpy(s4,strcat(s1,s2));
    strcpy(s5,strcat(s4,s3));
    printf("%s", s5);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么我在这里遇到分段错误为什么它不使用 printf 打印..?

我尝试使用 printf 它没有打印,但使用 put 它打印为什么这样?请有人告诉我这有什么问题

c string

-3
推荐指数
1
解决办法
136
查看次数

如何有效地传达 gRPC 服务中的操作降级情况?

我目前正在致力于增强 gRPC 服务和客户端之间通信的稳健性和清晰度,特别是围绕操作降级的概念。在许多情况下,操作可能会部分成功或遇到客户应注意的非关键问题,而不必将这些问题视为彻底失败。

标准 gRPC 响应通常包括成功响应或错误,但对于成功但带有警告的操作存在灰色区域(例如,有关接近配额限制的警告、有关优化的信息性消息或不会停止操作的小问题) 。

是否有一个行业标准来解释我们如何构建 gRPC 响应,以跨服务标准化且可供客户操作的方式包含这些“降级”详细信息?

我建议的解决方案: 我正在考虑在 protobuf 定义中引入 DegradationDetail 消息,该消息可以封装操作期间遇到的任何降级的严重性和详细信息。下面是它的草图:

message DegradationDetail {
  string message = 1; // Human-readable message describing the degradation.
  DegradationSeverity severity = 2; // The severity of the degradation.
  repeated string affected_features = 3; // Specific features or components affected, if applicable.
}

enum DegradationSeverity {
  INFO = 0; // Informational message, operation successful.
  WARNING = 1; // Warning, operation successful but might require attention.
  ERROR = 2; // Error …
Run Code Online (Sandbox Code Playgroud)

api-design grpc

6
推荐指数
1
解决办法
172
查看次数

限制未使用的泛型会导致编译错误

我不明白为什么限制未使用的泛型会导致编译错误。为什么会这样编译:

#[derive(PartialEq)]
struct B;

fn is_eq<T>(b: B, c: B) -> bool 
// where
//     B: PartialEq<T>,
{
    b == c
}
Run Code Online (Sandbox Code Playgroud)

但取消注释 where 子句会导致此编译错误:

error[E0308]: mismatched types
 --> src/lib.rs:9:10
  |
4 | fn is_eq<T>(b: B, c: B) -> bool
  |          - this type parameter
...
8 |     b == c
  |          ^ expected type parameter `T`, found `B`
  |
  = note: expected type parameter `T`
                     found struct `B`
Run Code Online (Sandbox Code Playgroud)

进行==显式编译,即PartialEq::<B>::eq(&b, &c)- 尽管编译器不应该清楚地使用此实现吗?奇怪的是,将输入参数更改为 &B 并使用==编译。很高兴知道为什么会出现错误以及这里发生了什么。

rust

6
推荐指数
1
解决办法
95
查看次数

任何范围视图适配器类型(来自“std::views”)是否依赖于堆分配?

我知道至少大多数Ranges 视图类型不需要任何堆分配。例如,您可以在堆栈上获取一个 C 数组并通过管道将其通过,std::views::take(42)而不会导致任何堆分配。

但我知道有很多模糊的视图适配器,例如,,,views::join每年都会有更多的视图适配器出现,仅仅因为今天大多数视图适配器显然不分配(在常见情况下)并不意味着所有视图适配器永远不会分配。views::istreamviews::chunk_by

通过类比:我知道大多数标准库算法不需要任何堆分配。例如,您可以在堆栈上获取一个 C 数组,并且std::ranges::partition不会引起任何堆分配。但有一些算法(std::inplace_mergestd::stable_sortstd::stable_partition;及其std::ranges对应算法)确实执行运行时堆分配。我们已经有一个 SO 问题跟踪哪些算法堆分配。

因此,我要求一个最新的答案(甚至可能在将来维护/更新):在任何主要 STL 供应商的实现上,是否有任何std::views::适配器需要堆分配?如果有,是哪些以及为什么?

c++ stl standard-library c++20 c++26

5
推荐指数
1
解决办法
110
查看次数

当通过 base:: 限定时,`[.factor` 会引发 NextMethod 错误

请解释为什么会发生/不会发生以下错误:

ff = factor(1:3)
`[.factor`(ff) # okay
base::`[.factor`(ff)  # Error in NextMethod("[") : 'NextMethod' called from an anonymous function
f = `[.factor`; f(ff) # Error in NextMethod("[") : wrong value for .Method
Run Code Online (Sandbox Code Playgroud)

oop r

6
推荐指数
1
解决办法
68
查看次数

使用 geom_sf 跨越日期变更线时地图上的闭合边界

我正在尝试制作一个罗宾逊投影图,该地图以经度 0 为中心,并且穿过 180\xc2\xb0 线的两侧。

\n

我的代码如下:

\n
library("rnaturalearthdata")\nworld <- ne_countries(scale = "medium", returnclass = "sf")\nrobinson = "+proj=robin +lon_0=-90 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs"\ntransformed = st_transform(world, robinson)\nggplot(data=transformed) + geom_sf(fill = "gray", colour = "black")+theme_bw()\n
Run Code Online (Sandbox Code Playgroud)\n

这会生成此地图,该地图的方向正确,但所有分割边界都是“由内而外”并环绕整个地图。

\n

在此输入图像描述

\n

9 年前就有这个相关问题,但我希望通过最近的软件包更新,有一个不太复杂的解决方案,这将使我们能够使用而不geom_point()需要额外的转换来绘制纬度/经度数据点。

\n

编辑#2:L. Tyrone 的解决方案对我来说非常有用。要使用此方法绘制点,您必须将它们从数据框转换为具有相同坐标参考系统的 sf 对象,否则纬度/经度将被解释为米,并且最终与 0,0 无法区分:

\n
# Transform with fake data...\nfakedata=data.frame(lat=c(-10,-20,80),lon=c(45,-100,120),tag=c("indian","tropical","arctic"))\ntranspoint = st_as_sf(fakedata,coords=c("lon","lat"),crs=4326)\ndtran = st_transform(transpoint,robinson)\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您可以通过将特殊geometry=stat=声明添加到geom_point或 来绘制它们geom_text_repel

\n
geom_point(data=dtran,aes(geometry=geometry,color=tag),stat="sf_coordinates") +\ngeom_text_repel(data=dtran,aes(geometry=geometry,label=tag),stat="sf_coordinates")\n
Run Code Online (Sandbox Code Playgroud)\n

最终结果:\n …

maps r coordinate-systems ggplot2 geom-sf

4
推荐指数
1
解决办法
83
查看次数

为什么自由函数可以工作,但 lambda 中的等效函数却无法编译?

以下get函数将使用可变参数返回一个字符串数组。它还通过简单地转换整数来处理提供整数的情况。我提供了这个转换函数的两个版本,一个是 lambda,另一个是自由函数。

请有人解释一下为什么使用 lambda 无法编译,而看似相同的自由函数却可以正常工作。需要进行哪些更改才能使 lambda 案例发挥作用?

#include <iostream>
#include <string>
#include <vector>
#include <ranges>
#include <format>
#include <array>
#include <type_traits>

// free function converter
template <typename KEY>
auto convert_to_string_view(const KEY& key)
{
    if constexpr (std::is_integral_v<KEY> && !std::is_same_v<KEY, bool>)
        return std::to_string(key);
    else
        return key;
}

// make an array out of varargs
template <typename T, typename... Args>
inline std::array<std::common_type_t<Args...>, sizeof...(Args)>
 make_array_from_vars(const Args&... args)
    requires (std::is_constructible_v<std::common_type_t<Args...>, Args> && ...)
{
    return { args... };
}



template<typename... KEYS>
auto get(KEYS... …
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++23

0
推荐指数
1
解决办法
91
查看次数

Win32 宽字符串对齐要求

我将 GUI 代码中的问题缩小到SetWindowTextW(HWND, wchar_t *)如果新窗口标题未与两个字节对齐则默默失败。在本例中,SetWindowText()返回1( success ) 但不设置新文本。

\n

MSVC 上的自然对齐wchar_t是 2 个字节,所以这绝对是我的错误。但为了确保我尝试找到 Win32 字符串的对齐规则。

\n

我没有找到官方文档,只是一个旧的新闻组帖子提到了 Open Watcom 编译器\xc2\xa0\xe2\x80\x93的错误报告,该报告声称Windows NT 上的 Win32 和 COM 实际上需要4 字节对齐!虽然这对我来说似乎很奇怪,但我注意到 MSVC 确实将每个wchar_t文字对齐到四个字节,而不是两个。实际上,您可以wchar_t通过 使 MSVC 更密集地打包常量字符串alignas(2)。Win32 中的堆粒度也 >=8 字节。

\n

如果 Win32 需要对宽字符字符串进行四字节对齐(如源声明),并且 API 调用在错误的数据对齐上默默失败(如SetWindowText()1 字节对齐),我感觉遇到了很大的麻烦。

\n

有没有官方文档说明 Win32/COM 中宽字符串的明确对齐要求?是两个字节还是四个字节?

\n
\n

重现问题的代码:

\n
#include <Windows.h>\n#include <CommCtrl.h>\n#include <cassert>\n\nint main() {\n\n  auto …
Run Code Online (Sandbox Code Playgroud)

c++ winapi abi memory-alignment

6
推荐指数
1
解决办法
294
查看次数

为什么 C++ 中的堆栈内存使用量是在编译时确定的?

在得知 VLA(可变长度数组)与 C++ 不兼容后,我第一次开始研究这个兔子洞。这是因为可变长度的数组在编译时不会有一个常量的大小,而 C++ 编译器需要它来计算程序将要分配的堆栈帧的大小运行。我知道这种在编译时知道这样的事情的愿望就是禁止 VLA 数组的原因(以及其他原因)。

但是,为什么需要在编译时知道这样的事情(要分配的堆栈帧的大小)?为什么不能确定堆栈所需的所有内存,然后在运行时分配?我听说它解释说,在编译时确定堆栈帧的大小对于避免堆栈溢出异常很有用,因为您提前确切地知道给定函数调用需要多少内存。如果我们允许堆栈上有一个 VLA,其大小由运行时用户输入确定,他们可以输入一个巨大的数字,例如 100000000000,然后我们会得到堆栈溢出异常。禁止使用 VLA 可以让我们避免做类似的事情(或者至少我是这么理解的)。

这就是向我解释的,但我仍然不明白为什么这意味着一切都必须在编译时确定。例如,alloca可以通过简单地移动堆栈指针来在运行时在堆栈上进行分配。为什么不能在运行时为函数中的每个新局部变量在内部完成此操作,以便我们可以拥有 VLA 而不是立即分配整个堆栈帧?我觉得答案应该是“很明显,所以你最终不会尝试分配比你拥有的更多的内存并导致堆栈溢出异常!”,但无论你采用什么技术,这不是一个风险吗?我可以尝试在运行时在堆上声明我的可变长度数组,但是如果我尝试分配比可用内存更多的内存怎么办?在这种情况下,我遇到了同样的问题,由于用户输入而占用了超出我所能承受的内存,并且在编译时计算程序的内存使用量无法拯救我。

那么,在编译时这样做仅仅是为了提高效率吗?如果是的话,是什么让它更有效率?难道我们只是提前计算需要为函数调用分配多少内存,而不是在运行时计算,从而在每次调用函数时节省几微秒的时间?

c++ stack-overflow alloca compile-time variable-length-array

2
推荐指数
1
解决办法
184
查看次数

为什么 is_regular_file 对于符号链接报告为 true

为什么报告is_regular_file中的那个函数std::filesystem对于符号链接来说是正确的?我查看了该调用的文档,但找不到原因,并且 cppreference 上的示例表现出相同的行为。

举个例子,如果我们看一下二进制文件pidof;它作为符号链接存在/usr/sbin/pidof并正确标记为符号链接,如下所示stat

[@rhel9 ~]$ stat /usr/sbin/pidof 
  File: /usr/sbin/pidof -> /usr/bin/pidof
  Size: 14          Blocks: 0          IO Block: 4096   symbolic link
Device: fd00h/64768d    Inode: 34952482    Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:bin_t:s0
Access: 2024-02-05 15:46:24.124158991 +0000
Modify: 2023-01-28 09:40:21.000000000 +0000
Change: 2023-05-09 17:34:59.432002380 +0100
 Birth: 2023-05-09 17:34:59.432002380 +0100
Run Code Online (Sandbox Code Playgroud)

如果我们点击链接并运行stat它:

[@rhel9 ~]$ stat /usr/bin/pidof 
  File: /usr/bin/pidof
  Size: 23760       Blocks: 48         IO Block: …
Run Code Online (Sandbox Code Playgroud)

c++ symlink std-filesystem

5
推荐指数
1
解决办法
139
查看次数