AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-6197439

sdbbs's questions

Martin Hope
sdbbs
Asked: 2025-02-25 10:53:42 +0800 CST

用户程序导致故障后恢复 bash 中的终端 ANSI 颜色行为?

  • 5

我在 Windows 10 上的 MINGW64 下使用。几年前bash我自己编译了一个版本,它对我来说工作得很好 - 但最近我注意到它完全破坏了终端中的 ANSI 着色:wcalc

终端截图

...也就是说,不会得到以下带有颜色的提示:

user@DESKTOP-PC 2025-02-25|03:41:27 MINGW64 ~
$ 

...我得到的是一堆乱码,而不是提示(尝试运行后wcalc 2+2):

←[?2004h←]0;~
←[32muser@DESKTOP-PC ←[36m2025-02-25|03:41:56←[0m ←[35mMINGW64←[0m ←[33m~←[0m
←[1m$←[0m

您可能会在屏幕截图中注意到,运行该reset命令(通常可以解决我所有的终端行为问题)无助于恢复正确的行为。

当我处于这种状态时,有人知道我可以使用什么命令来恢复终端正确的 ANSI 颜色字符行为吗(目前我别无选择,只能关闭并重新启动该终端)


编辑:我发现问题在于msys-2.0.dll在同一个文件夹中有一个旧的和几个其他的wcalc.exe;这些旧的 DLL 显然与较新的 DLL 冲突 - 所以对我来说,整体解决方案只是从文件夹中删除旧的 DLL wcalc,然后将新的 DLL 从 MSYS2 复制/bin到那里。

但是,如果知道是否可以通过命令从上面描述的混乱的终端颜色情况中恢复过来,那还是很好的;所以我希望有人可以回答这个问题。

bash
  • 1 个回答
  • 32 Views
Martin Hope
sdbbs
Asked: 2025-02-19 23:59:02 +0800 CST

强制 CMake 在 CMakeLists.txt 中的任意点生成构建文件(Makefile)?

  • 5

CMakeLists.txt我的raspberrypi/pico-sdk项目中有此代码片段,我有条件地调用该pico_sdk_init()函数(即宏):

# ...

if(myCONDITION STREQUAL "Something")

  message("*** BEFORE pico_sdk_init() ***")
  pico_sdk_init()
  
  message("*** BEFORE return() ***")
  return() # exit for debug
  
  # other CMake conditional code commands continue here ...
  
endif() # myCONDITION STREQUAL "Something"

# ...

因此,我mkdir build && cd build在项目目录中执行CMakeLists.txt,然后运行cmake​​- 在这种情况下,我得到如下输出:

$ cmake ../ -DCMAKE_BUILD_TYPE=Debug -G "MSYS Makefiles"
...
*** BEFORE pico_sdk_init() ***
Build type is Debug
...
Using PICO_EXAMPLES_PATH from environment ...
*** BEFORE return() ***
-- Configuring done
-- Generating done
-- Build files have been written to: C:/path/to/myproject/build

在此之后,如果我从子文件夹检查./build,我会在Makefile那里(以及一大堆其他位置)看到:

$ find . -name Makefile
./Makefile
./pico-sdk/docs/Makefile
./pico-sdk/Makefile
./pico-sdk/src/common/boot_picobin_headers/Makefile
...
./pico-sdk/src/rp2_common/tinyusb/Makefile
./pico-sdk/tools/Makefile

...对于子文件Makefile夹./build,我有以下目标:

$ make #press [TAB] here
all                                              default_target
bs2_default/fast                                 depend
bs2_default_bin/fast                             edit_cache/fast
bs2_default_library/fast                         help
clean/fast                                       pioasmBuild/fast
cmake_check_build_system                         preinstall/fast
cmake_force                                      rebuild_cache/fast
cyw43_driver_picow_cyw43_bus_pio_spi_pio_h/fast

make pioasmBuild因此,我现在可以运行,并且它将构建良好:

$ make pioasmBuild
Scanning dependencies of target pioasmBuild
[ 12%] Creating directories for 'pioasmBuild'
[ 25%] No download step for 'pioasmBuild'
...
Scanning dependencies of target pioasm
[100%] Built target pioasm
[ 87%] Performing install step for 'pioasmBuild'
[100%] Built target pioasm
Install the project...
-- Install configuration: "Release"
[100%] Completed 'pioasmBuild'
[100%] Built target pioasmBuild

$ find . -name pioasm.exe
./pioasm/pioasm.exe
./pioasm-install/pioasm/pioasm.exe

伟大的。

现在,假设我不想使用return()- 退出调试,但是相反,在那时,我想运行等效的make pioasmBuild:因此从那时起,pioasm.exe可用于“其他 CMake 条件代码命令”;为此,我将代码片段重写为:

# ...

if(myCONDITION STREQUAL "Something")

  message("*** BEFORE pico_sdk_init() ***")
  pico_sdk_init()
  
  
  execute_process(
    # this command, the equivalent of `make pioasmBuild`, fails with "Error: could not load cache"
    COMMAND ${CMAKE_COMMAND} --build . --target pioasmBuild
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  )
  
  message("*** NOT anymore BEFORE return() ***")
  #return() # exit for debug
  
  # other CMake conditional code commands continue here ...
  
endif() # myCONDITION STREQUAL "Something"

# ...

正如评论所暗示的那样,make pioasmBuild此时的等效操作失败 -在子目录rm -rf *中清理之后./build,这是我在cmake输出中得到的内容:

$ cmake ../ -DCMAKE_BUILD_TYPE=Debug -G "MSYS Makefiles"
...
*** BEFORE pico_sdk_init() ***
Build type is Debug
...
Using PICO_EXAMPLES_PATH from environment ...
Error: could not load cache
*** NOT anymore BEFORE return() ***
... other CMake conditional code commands continue here ...

所以,据我所知,Error: could not load cache发生这种情况是因为此时子文件夹Makefile尚未创建!./build

事实上,据我目前对这个过程的理解:在前面的案例中,Makefile中的那个的创建是由提前退出本身触发的!./buildreturn()

所以我的问题是 - 是否有一种规范的方法可以强制 CMake 在CMakeLists.txt文件中的这个(或任意)点完成配置、生成和写入构建文件(使用此时可用的任何数据;并且至少在这种情况下,如前所述,该点有足够的数据来生成一个正常运行的Makefile) - 而不强制进程cmake在此时退出CMakeLists.txt,而是继续执行剩余的命令(包括可能Makefile直接从 CMake 在先前/早期生成的中构建目标)?

(当然,在这种“早期生成”的情况下,当CMakeLists.txt达到其原本“自然”的结尾时,所有Makefiles 和相关的构建文件都将被覆盖,可能会出现例如更多的目标,这是由于执行文件剩余部分而产生的更多数据)

cmake
  • 1 个回答
  • 13 Views
Martin Hope
sdbbs
Asked: 2024-11-15 21:22:40 +0800 CST

在 PyQt5 中通过右键单击从本机文件资源管理器中的 QFileDialog 打开文件?

  • 6

在 Firefox 中,如果我下载文件,则会有一个文件夹图标“在文件夹中显示”:

Firefox 在文件夹中显示

...单击后,将打开下载目录中的本机操作系统文件资源管理器,并选择目标下载文件:

在本机文件资源管理器中打开的文件夹中显示

我想要相同类型的功能 - 除了我希望它在 PyQt5 应用程序中,当打开 QFileDialog 时,在选择目标文件时激活的右键单击上下文菜单中选择一个操作;例如使用 PyQt5 示例(如下),我可以得到这个 Qt5 对话框:

Qt5 QFileDialog

...因此,当我右键单击目标文件(如图所示test.txt)时,我希望在上下文菜单中添加“在文件夹中显示”操作,当选择该操作时,我希望在包含目标文件的目录中打开本机文件资源管理器,并选择目标文件 - 就像 Firefox 所做的那样。

我如何在 PyQt5 中做到这一点?

示例代码:

# started from https://pythonspot.com/pyqt5-file-dialog/
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QInputDialog, QLineEdit, QFileDialog
from PyQt5.QtGui import QIcon

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 file dialogs - pythonspot.com'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 480
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.openFileNameDialog()

        self.show()

    def openFileNameDialog(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getOpenFileName(self,"QFileDialog.getOpenFileName()", "","Text Files (*.txt)", options=options)
        if fileName:
            print(fileName)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
python
  • 2 个回答
  • 40 Views
Martin Hope
sdbbs
Asked: 2024-10-11 11:31:13 +0800 CST

Perfetto 时长中的三个数字代表什么意思?

  • 5

我刚刚开始通过 Python 的 viztracer 研究 Perfetto,我注意到切片的“当前选择”给出了这种输出:

perfetto 当前选择

具体来说,它指出:

持续时间 53ms 926us 800ns

这三个数字代表什么?我尝试在网上搜索,但没有找到任何解释……

53 毫秒确实对应于可视化中的切片/事件的宽度,但是 926 微秒和 800 纳秒是做什么用的呢?

perfetto
  • 1 个回答
  • 9 Views
Martin Hope
sdbbs
Asked: 2024-08-13 02:16:41 +0800 CST

PyQt5 在 QGridLayout 中动态将小部件扩展为两列?

  • 6

下面的示例是我根据Pyqt5 网格扩展小部件中的答案修改的,其开头如下:

启动 GUI 示例

然后,当您单击“列封面”按钮时,第一个标签“第 0 行,第 0 列”(以红色勾勒出)会在 QGridLayout 的两列上展开 - 但是,我得到了这样的信息:

单击后的示例 GUI

因此,为了使轮廓标签居中,似乎考虑了两个网格列的宽度,这很好 - 但是,轮廓标签并没有扩展以占据两列的总宽度。

单击“列覆盖”按钮时,如何让标签扩展宽度并占据网格布局中两列的空间?即,我希望在程序启动后第一次单击按钮后获得此信息(在图像编辑器中编辑,框大约是我认为轮廓下方两个标签的边界框的并集​​)。

期望结果 GUI

请注意,我知道我可以通过操纵来做到这一点.setFixedWidth-MainUi.label但是,我正在寻找某种设置,其中标签会自动扩展以填充可用宽度,具体取决于它是放置在 QGridLayout 的一列还是两列中。

代码:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWidgets

#rom example import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(191, 136)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 2)
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 3, 0, 1, 1)
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setObjectName("label_4")
        self.gridLayout.addWidget(self.label_4, 2, 1, 1, 1)
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setObjectName("label_5")
        self.gridLayout.addWidget(self.label_5, 3, 1, 1, 1)
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setObjectName("label_6")
        self.gridLayout.addWidget(self.label_6, 1, 1, 1, 1)
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
        self.label.setStyleSheet("border: 1px solid; border-color:red;")

        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Column Cover"))
        self.label_3.setText(_translate("MainWindow", "Row 2, Column 0"))
        self.label_4.setText(_translate("MainWindow", "Row 1, Column 1"))
        self.label_5.setText(_translate("MainWindow", "Row 2, Column 1"))
        self.label_6.setText(_translate("MainWindow", "Row 0, Column 1"))
        self.label.setText(_translate("MainWindow", "Row 0, Column 0"))
        self.label_2.setText(_translate("MainWindow", "Row 1 ,Column 0 "))


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        QWidget.__init__(self, parent)
        self.MainUi = Ui_MainWindow()
        self.MainUi.setupUi(self)

        self.MainUi.pushButton.setCheckable(True)                           # +++ True
        self.MainUi.pushButton.clicked.connect(self.expand_row)


    def expand_row(self, state):                                            # +++ state
        if state:
            self.MainUi.label_6.hide()
            self.MainUi.gridLayout.addWidget(self.MainUi.label, 1, 0, 1, 2, Qt.AlignHCenter) #  ...2, 1)
        else:
            self.MainUi.gridLayout.addWidget(self.MainUi.label, 1, 0, 1, 1) #  ...1, 1)
            self.MainUi.label_6.show()

#        self.MainUi.gridLayout.setRowStretch(0,1)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    MainWindow = MainWindow()
    MainWindow.setWindowTitle('Example')
    MainWindow.show()
    sys.exit(app.exec_())
python
  • 1 个回答
  • 16 Views
Martin Hope
sdbbs
Asked: 2024-03-09 00:38:25 +0800 CST

Pandas 数据帧纯文本 to_string 输出中的列名称的长文本拆分/换行?

  • 8

考虑这个例子:

import pandas as pd

df = pd.DataFrame({
  "LIDSA": [0, 1, 2, 3],
  "CAE": [3, 5, 7, 9],
  "FILA": [1, 2, 3, 4], # 2 is default, so table idx 1 is default
  "VUAMA": [0.5, 1.0, 1.5, 2.0],
})
df_colnames = { # https://stackoverflow.com/q/48243818
  "LIDSA": "Lorem ipsum dolor sit amet",
  "CAE": "Consectetur adipiscing elit",
  "FILA": "Fusce imperdiet libero arcu",
  "VUAMA": "Vitae ultricies augue molestie ac",
}

# "Pandas autodetects the size of your terminal window if you set pd.options.display.width = 0" https://stackoverflow.com/q/11707586
with pd.option_context('display.max_rows', None, 'display.max_columns', None, 'display.width', 0, 'max_colwidth', 20, 'display.float_format', "{:.2f}".format):
  df_str = df.rename(df_colnames,axis=1).to_string()

print(df_str)

终端标准输出的结果是 111 个字符宽:

   Lorem ipsum dolor sit amet  Consectetur adipiscing elit  Fusce imperdiet libero arcu  Vitae ultricies augue
 molestie ac
0                           0                            3                            1
        0.50
1                           1                            5                            2
        1.00
2                           2                            7                            3
        1.50
3                           3                            9                            4
        2.00

因此,只有最后一列被换行(相应地,它的值也被换行)。我希望每个长列名称在 20 个字符处进行换行/换行,然后相应地输出值,如下所示:

   Lorem ipsum dolor      Consectetur  Fusce imperdiet    Vitae ultricies
            sit amet  adipiscing elit      libero arcu  augue molestie ac
0                  0                3                1               0.50
1                  1                5                2               1.00
2                  2                7                3               1.50
3                  3                9                4               2.00

我以为'max_colwidth', 20会这样做,但显然事实并非如此。

我什至尝试在长列名称中添加显式换行符,但它们只是呈现为\n,并且列名称仍然在一行中(如pandas 列名称中的换行符中所述)

那么,是否可以在 Pandas 中对长列名进行“自动换行”/“换行”以实现纯文本字符串输出?

python
  • 2 个回答
  • 47 Views
Martin Hope
sdbbs
Asked: 2023-09-04 03:22:39 +0800 CST

可以从另一个组件启动并等待表单组件的 PerformClick 吗?

  • 5

我很难找到是否可以从另一个元素对 C# 表单元素执行虚拟单击,并等待其完成后再继续。

作为一个例子(不幸的是不完整),我想做的是

  private async void btn_my_Click(object sender, EventArgs e)
  {
      await Task.Run(() => radio_button_special.PerformClick()); // https://stackoverflow.com/q/14024963

      // once this is done, proceed with rest of processing
      do_rest_of_processing();
  }

当我在“调试运行”中单击按钮时,VS2019 会中断,并显示“InvalidOperationException:跨线程操作无效:从创建它的线程以外的线程访问控制‘radio_button_special’。”

但是,如果我只是在 Visual Studio 调试之外运行 exe,该按钮似乎可以工作(即我可以在应用程序中看到 radio_button_special.PerformClick() 首先完成,然后 do_rest_of_processing() 运行 - 并且我没有得到明确的异常像这样运行,所以它似乎按照我的想象工作)。

但这个异常让我害怕,所以我想摆脱它 - 我已经尝试过像这样的补救措施,我尝试从其他片段构建:

  private async void btn_my_Click(object sender, EventArgs e)
  {
      // first, I want to call the function otherwise called
      // when the radio button is clicked, and wait for it to complete
      radio_button_special.Invoke((MethodInvoker)async delegate
      {
          await Task.Run(() => radio_button_special.PerformClick()); // https://stackoverflow.com/q/14024963
      });
      // once this is done, proceed with rest of processing
      do_rest_of_processing();
  }

现在,这个函数已经在VS2019 IDE中给出了警告:

警告 CS1998:此异步方法缺少“等待”运算符,并将同步运行。考虑使用“await”运算符等待非阻塞 API 调用,或使用“await Task.Run(...)”在后台线程上执行 CPU 密集型工作。

...如果我调试运行该示例,我会得到堆栈跟踪:

System.Reflection.TargetInvocationException
  HResult=0x80131604
  Message=Exception has been thrown by the target of an invocation.
  Source=mscorlib
  StackTrace:
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   ...
   at System.Windows.Forms.Application.Run(Form mainForm)
   at my_test.Program.Main() in D:\work\bbs\BBS_DEV\BAPS_git\my_test\Program.cs:line 28

  This exception was originally thrown at this call stack:
    System.Windows.Forms.Control.Handle.get()
    System.Windows.Forms.Control.InternalHandle.get()
    System.Windows.Forms.Control.Update()
    System.Windows.Forms.ButtonBase.ResetFlagsandPaint()
    System.Windows.Forms.RadioButton.PerformClick()
    my_test.main_form.btn_my_Click.AnonymousMethod__122_1() in main_form.cs
    System.Threading.Tasks.Task.InnerInvoke()
    System.Threading.Tasks.Task.Execute()
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task)
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task)
    ...
    [Call Stack Truncated]

Inner Exception 1:
InvalidOperationException: Cross-thread operation not valid: Control 'radio_button_special' accessed from a thread other than the thread it was created on.

所以,基本上与之前的问题相同。

那么,我如何从另一个表单组件处理程序调用 C# 表单组件处理程序(例如单击)函数,等待它完成,然后调用另一个函数 - 而不会引发异常?

c#
  • 2 个回答
  • 21 Views
Martin Hope
sdbbs
Asked: 2023-09-02 03:00:11 +0800 CST

C# 字符串数组连接到转义字符串(如 ArgumentList)?

  • 4

我不经常使用C#,但是,我需要修改一些代码,其中使用:

  Process new_process = new Process();
  new_process.StartInfo.FileName = "mytool.exe";

现在,我必须拨打电话,但是有一个相当大的命令行选项列表,其中一些包含空格,并且需要引用。

所以,我看到存在这个:https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.argumentlist ?view=net-7.0#system-diagnostics-processstartinfo-argumentlist

...
// or if you prefer collection property initializer syntax:

var info = new System.Diagnostics.ProcessStartInfo("cmd.exe")
{
    ArgumentList = {
        "/c",
        "dir",
        @"C:\Program Files\dotnet"
    }
};

// The corresponding assignment to the Arguments property is:

var info = new System.Diagnostics.ProcessStartInfo("cmd.exe")
{
    Arguments = "/c dir \"C:\\Program Files\\dotnet\""
};

我很想使用 ArgumentList - 问题是,当我在 Visual Studio 上尝试自动完成时new_process.StartInfo.,我只得到Arguments, no ArgumentList; 我认为我正在尝试修改此应用程序,目标是 .NET 4.6 - 上面的页面针对 ArgumentList 进行了说明,它适用于:

.NET 核心 2.1、核心 2.2、核心 3.0、核心 3.1、5、6、7、8

所以,我想我在使用 ArgumentList 方面运气不佳(不是我的应用程序,所以我真的无法做出更改核心版本的决定,如果这确实是问题)。

因此,如果是这种情况,C# 中是否存在某种类,它本质上是字符串的列表/数组容器,并且可能具有“join_quoted”方法或其他方法,以便它将数组元素与空格连接起来,并引用那些需要引用的元素 - 所以对于

  • 输入数组{"/c", "dir", @"C:\Program Files\dotnet"},我可以自动获取
  • 输出连接带引号的字符串,这里是"/c dir \"C:\\Program Files\\dotnet\""

...?

c#
  • 1 个回答
  • 29 Views
Martin Hope
sdbbs
Asked: 2023-08-20 18:38:26 +0800 CST

可以从指针数组中的值初始化指针吗?

  • 6

我基本上想要一个函数列表作为函数指针数组;然后我想管理该数组中的索引变量和接受该数组中的值的指针变量。考虑下面的 C 代码来说明这一点,它可以正常编译:

#include <stdio.h>

void func_01() {
    printf("func_01\n");
}
void func_02() {
    printf("func_02\n");
}
void func_03() {
    printf("func_02\n");
}

enum func_choice_e {
    eFUNC01 = 0,
    eFUNC02 = 1,
    eFUNC03 = 2,
#define _NUM_FUNC_CHOICE 3
    NUM_FUNC_CHOICE = _NUM_FUNC_CHOICE,
};
typedef enum func_choice_e func_choice_t;

void* funcs_ptrs[_NUM_FUNC_CHOICE] = {
    &func_01,
    &func_02,
    &func_03,
};

func_choice_t my_func_choice_idx = eFUNC01;
void* my_func_choice_ptr = &func_01;

int main()
{
    my_func_choice_idx = eFUNC02;
    my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];
    printf("Hello World %p\n", my_func_choice_ptr);

    return 0;
}

如上面的代码所示,在代码中我可以通过索引变量 ( ) 设置指针变量my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];。

但是,我想做类似的事情,也用于初始化 - 最终,我只想初始化数组值并my_func_choice_idx首先手动 - 然后将指针自动初始化为数组中相应的元素my_func_choice_idx;所以代替工作指针初始值设定项:

void* my_func_choice_ptr = &func_01;

...我已经尝试过这些:

//void* my_func_choice_ptr = funcs_ptrs[my_func_choice_idx]; // error: initializer element is not constant
//void* my_func_choice_ptr = funcs_ptrs[eFUNC01]; // error: initializer element is not constant
//void* my_func_choice_ptr = funcs_ptrs[0]; // error: initializer element is not constant

...正如评论中的错误消息所暗示的那样,这些都不起作用。

我有点明白为什么funcs_ptrs[my_func_choice_idx]可能会失败 -my_func_choice_idx毕竟是一个变量 - 但当编译器到达时,它应该已经“知道” ->my_func_choice_ptr = funcs_ptrs[0];的地址、大小和初始值,所以我不明白为什么会这样funcs_ptrs无法设置my_func_choice_ptr为第一个条目funcs_ptrs?!

那么 - 是否有一些语法可以用于初始化,这将允许我将指针变量初始化为数组中条目的给定初始值(类似于my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];在正常代码中工作的赋值)?

arrays
  • 1 个回答
  • 25 Views
Martin Hope
sdbbs
Asked: 2023-08-20 15:31:51 +0800 CST

可以初始化指向类型变量数组的指针吗?

  • 5

我一直在研究c 指向结构数组的指针,并尝试将其应用到我的示例中。

我得到了这个代码片段,它编译得很好:

#include <stdio.h>

enum test_e {
    eONE,
    eTWO,
    eTHREE,
};
typedef enum test_e test_t;

#define NUMITEMS 12
extern test_t my_arr[NUMITEMS];

test_t (*my_arr_ptr)[NUMITEMS];

test_t my_arr[NUMITEMS] = { 0 };


int main()
{
    my_arr_ptr = &my_arr;
    printf("Hello World %p\n", my_arr_ptr);

    return 0;
}

在上面的代码片段中,我们将变量赋值my_arr_ptr给变量的地址my_arr(使用“address of”运算符, & &)。

但是,我想做的是将变量初始化 my_arr_ptr为变量的地址my_arr- 我认为这是可能的,因为在该行之后test_t my_arr[NUMITEMS] = { 0 };编译器应该“知道” 的地址和大小my_arr。

但是,如果我尝试这样做:

#include <stdio.h>

enum test_e {
    eONE,
    eTWO,
    eTHREE,
};
typedef enum test_e test_t;

#define NUMITEMS 12
extern test_t my_arr[NUMITEMS];

test_t (*my_arr_ptr)[NUMITEMS];

test_t my_arr[NUMITEMS] = { 0 };

my_arr_ptr = &my_arr;

int main()
{
    //my_arr_ptr = &my_arr;
    printf("Hello World %p\n", my_arr_ptr);

    return 0;
}

...这失败了:

Compilation failed due to following error(s).

main.c:25:1: warning: data definition has no type or storage class
   25 | my_arr_ptr = &my_arr;
      | ^~~~~~~~~~
main.c:25:1: warning: type defaults to ‘int’ in declaration of ‘my_arr_ptr’ [-Wimplicit-int]
main.c:25:1: error: conflicting types for ‘my_arr_ptr’; have ‘int’
main.c:21:10: note: previous declaration of ‘my_arr_ptr’ with type ‘test_t (*)[12]’ {aka ‘enum test_e (*)[12]’}
   21 | test_t (*my_arr_ptr)[NUMITEMS];
      |          ^~~~~~~~~~
main.c:25:14: warning: initialization of ‘int’ from ‘test_t (*)[12]’ {aka ‘enum test_e (*)[12]’} makes integer from pointer without a cast [-Wint-conversion]
   25 | my_arr_ptr = &my_arr;
      |              ^
main.c:25:14: error: initializer element is not computable at load time
main.c: In function ‘main’:
main.c:30:26: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’ [-Wformat=]
   30 |     printf("Hello World %p\n", my_arr_ptr);
      |                         ~^     ~~~~~~~~~~
      |                          |     |
      |                          |     int
      |                          void *
      |                         %d

据我所知,出现“警告:数据定义没有类型或存储类”:

因为你无法在函数之外执行代码
(为什么我会收到此错误:“数据定义没有类型或存储类”?)

那么,在C中获取“地址”是否被视为“代码”,因此我不能在函数之外使用它?

如果是这样,我为什么可以在下面的代码片段中使用“地址”运算符“外部函数”,它也可以正常编译?:

#include <stdio.h>

void func_one(void) {
    printf("func_one\n");
}

void func_two(void) {
    printf("func_two\n");
}

void* funcs_arr[2] = { &func_one, &func_two  }; 

int main()
{
    printf("Hello World %p\n", funcs_arr[0]);

    return 0;
}
arrays
  • 1 个回答
  • 30 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve