AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-6197439

sdbbs's questions

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

Restaurar o comportamento das cores ANSI do terminal no bash após falha causada pelo programa do usuário?

  • 5

Eu uso basho MINGW64 no Windows 10. Eu mesmo compilei uma versão dele wcalcalguns anos atrás, que costumava funcionar bem para mim - mas recentemente notei que ele quebra completamente a coloração ANSI no terminal:

captura de tela do terminal

... ou seja, em vez de receber o seguinte prompt com cores:

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

... Recebo essa confusão de caracteres, em vez do prompt (depois de tentar executar wcalc 2+2):

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

Você pode notar na captura de tela que executar o resetcomando (que geralmente resolve todos os meus problemas de comportamento do terminal) não ajuda a restaurar o comportamento correto.

Alguém saberia qual comando eu poderia usar para restaurar o comportamento correto dos caracteres de cor ANSI do terminal, quando eu chegar a esse estado (atualmente não tenho outra opção a não ser fechar e reiniciar o terminal)


EDIT: Descobri que o problema era que havia uma DLL antiga msys-2.0.dlle algumas outras na mesma pasta wcalc.exe; essas DLLs antigas aparentemente entravam em conflito com as DLLs mais novas - então a solução geral para mim foi simplesmente remover as DLLs antigas da wcalcpasta e copiar as novas DLLs do MSYS2 /binpara lá.

No entanto, ainda seria bom saber se é possível se recuperar da situação confusa de cores do terminal, conforme descrito acima, com um comando; então espero que alguém possa responder a isso.

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

Forçar o CMake a gerar arquivos de compilação (Makefile) em um ponto arbitrário em CMakeLists.txt?

  • 5

Tenho este trecho no CMakeLists.txtmeu projeto raspberrypi/pico-sdk , onde chamo condicionalmente a pico_sdk_init()função (ou seja, macro):

# ...

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"

# ...

Então, eu faço isso mkdir build && cd buildno diretório do projeto onde ele CMakeLists.txtestá e então executo cmake- neste caso, obtenho uma saída como esta:

$ 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

Depois disso, se eu verificar na ./buildsubpasta, tenho um Makefilelá (e em vários outros locais):

$ 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

... e para a Makefilesubpasta ./build, tenho os seguintes alvos:

$ 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

Então, eu posso executar, digamos, make pioasmBuildneste ponto, e ele será construído corretamente:

$ 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

Ótimo.

Agora, digamos que eu não queira sair para depuração com return()- mas, em vez disso, naquele ponto, eu queira executar o equivalente a make pioasmBuild: então, daquele ponto em diante, pioasm.exeestá disponível para os "outros comandos de código condicional do CMake"; para isso, eu reescrevo meu snippet como:

# ...

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"

# ...

Como o comentário já sugere, o equivalente a make pioasmBuildneste ponto falha - depois de limpar rm -rf *no ./buildsubdiretório, isto é o que obtenho na cmakesaída:

$ 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 ...

Então, até onde posso ver, isso Error: could not load cacheacontece porque, naquele ponto, a Makefilesubpasta ainda não ./buildfoi criada !

Na verdade, pelo que entendi do processo neste momento: a criação disso Makefileem ./build, no caso anterior, foi desencadeada pela return()própria saída antecipada!

Então, minha pergunta é: existe uma maneira canônica de forçar o CMake a ter a configuração, geração e gravação de arquivos de compilação a serem concluídos neste (ou arbitrário) ponto do CMakeLists.txtarquivo (usando quaisquer dados disponíveis naquele ponto; e pelo menos neste caso, como mostrado anteriormente, há dados suficientes naquele ponto para gerar um Makefile) funcional - sem forçar o cmakeprocesso a sair naquele ponto em CMakeLists.txt, mas em vez disso prosseguir com os comandos restantes (incluindo possivelmente a compilação de um destino naquele gerado anteriormente/antecipadamente Makefile, diretamente do CMake)?

(É claro que, em tal caso de "geração inicial", quando o CMakeLists.txtatinge seu fim "natural", todos os Makefiles e arquivos de compilação relacionados seriam simplesmente substituídos, possivelmente com, por exemplo, mais alvos, resultando em mais dados devido à execução do restante do arquivo)

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

Abrir arquivo do QFileDialog no explorador de arquivos nativo por meio de clique com o botão direito no PyQt5?

  • 6

No Firefox, se eu baixar um arquivo, há um ícone de pasta "Mostrar na pasta":

Firefox Mostrar na pasta

... que, quando clicado, abre o explorador de arquivos nativo do sistema operacional no diretório Downloads, com o arquivo de download de destino selecionado:

Mostrar na pasta aberta no Explorador de Arquivos nativo

Eu gostaria do mesmo tipo de funcionalidade - exceto que eu quero isso em um aplicativo PyQt5, quando o QFileDialog é aberto, ao escolher uma ação no menu de contexto do botão direito ativado quando o arquivo de destino é selecionado; por exemplo, com o exemplo do PyQt5 (abaixo), posso obter esta caixa de diálogo do Qt5:

Qt5 QFileDialog

... então, quando clico com o botão direito em um arquivo de destino (como test.txtna imagem), gostaria que uma ação "Mostrar na pasta" fosse adicionada ao menu de contexto e, quando ela fosse escolhida, gostaria que o explorador de arquivos nativo fosse aberto no diretório que contém o arquivo de destino e o arquivo de destino selecionado, como o Firefox faz.

Como posso fazer isso no PyQt5?

Código de exemplo:

# 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 respostas
  • 40 Views
Martin Hope
sdbbs
Asked: 2024-10-11 11:31:13 +0800 CST

O que significam os três números na duração do Perfetto?

  • 5

Estou começando a pesquisar o Perfetto via viztracer para Python e notei que a "Seleção Atual" para uma fatia fornece este tipo de saída:

seleção atual perfeita

Em particular, diz:

Duração 53ms 926us 800ns

O que os três números significam? Tentei pesquisar online, mas não encontrei explicação...

Os 53 ms correspondem à largura da fatia/evento na visualização, mas para que servem os 926us e 800ns?

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

PyQt5 expande dinamicamente o widget para duas colunas no QGridLayout?

  • 6

O exemplo abaixo, que modifiquei a partir da resposta no widget Pyqt5 em grid expansion , começa assim:

exemplo iniciando GUI

Então, quando você clica no botão Column Cover, a ideia é que o primeiro rótulo "Linha 0, Coluna 0" (destacado em vermelho) se expanda em ambas as colunas do QGridLayout - no entanto, eu entendo o seguinte:

exemplo de GUI após clique

Portanto, parece que as larguras de ambas as colunas da grade foram levadas em consideração, para centralizar o rótulo contornado, o que é bom - porém, o rótulo contornado não se expandiu para ocupar a largura combinada de ambas as colunas.

Como posso expandir a largura do rótulo e ocupar o espaço de ambas as colunas no layout de grade, quando o botão "Capa da coluna" é clicado? Ou seja, eu gostaria de obter isso após o primeiro clique no botão após o início do programa (editado no editor de imagens, a caixa é aproximadamente o que eu acho que é a união das caixas delimitadoras de ambos os rótulos abaixo do descrito).

resultado desejado GUI

.setFixedWidthObserve que estou ciente de que provavelmente poderia fazer isso manipulando MainUi.label- no entanto, estou procurando algum tipo de configuração, onde o rótulo se expandiria automaticamente para preencher a largura disponível, dependendo de ser colocado em uma ou duas colunas do QGridLayout.

O código:

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 respostas
  • 16 Views
Martin Hope
sdbbs
Asked: 2024-03-09 00:38:25 +0800 CST

Quebrar/quebrar texto longo de nomes de colunas na saída de texto simples do dataframe do Pandas para_string?

  • 8

Considere este exemplo:

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)

Isso resulta na impressão do terminal stdout, no momento com 111 caracteres de largura:

   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

Portanto, apenas a última coluna foi quebrada (e correspondentemente, os valores para ela). Eu teria preferido que cada nome de coluna longo fosse quebrado por linha/quebrado em palavras com, digamos, 20 caracteres e, em seguida, os valores fossem gerados de forma correspondente, algo como:

   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

Eu pensei 'max_colwidth', 20que faria isso, mas aparentemente não faz.

Eu até tentei adicionar quebras de linha explícitas nos nomes longos das colunas, mas elas são renderizadas como \ne o nome da coluna ainda está em uma linha (conforme observado também em Quebras de linha nos nomes das colunas do pandas )

Então, é possível "quebrar palavras"/"quebra de linha" em nomes de colunas longas no Pandas para saída de string de texto simples?

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

É possível iniciar e aguardar PerformClick de um componente de formulário de outro componente?

  • 5

Estou tendo muita dificuldade em descobrir se é possível realizar um clique virtual em um elemento de formulário C# de outro elemento e aguardar a conclusão antes de continuar.

Por exemplo (infelizmente incompleto), o que estou tentando fazer é o seguinte

  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();
  }

Quando clico no botão na execução de depuração, o VS2019 quebra com "InvalidOperationException: operação entre threads inválida: controle 'radio_button_special' acessado de um thread diferente do thread em que foi criado."

No entanto, se eu apenas executar o exe fora da depuração do Visual Studio, o botão parece funcionar (ou seja, posso ver no aplicativo que radio_button_special.PerformClick() é concluído primeiro e do_rest_of_processing() é executado depois - e não recebo uma exceção explícita funcionando assim, então parece funcionar como eu imaginei).

Mas essa exceção me assusta, então gostaria de me livrar dela - e tentei remediar assim, que tentei construir a partir de outros trechos no SO:

  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();
  }

Agora, essa função já dá um aviso na IDE do VS2019:

aviso CS1998: Este método assíncrono não possui operadores 'await' e será executado de forma síncrona. Considere usar o operador 'await' para aguardar chamadas de API sem bloqueio ou 'await Task.Run(...)' para realizar trabalho vinculado à CPU em um thread em segundo plano.

... e se eu depurar, execute o exemplo, recebo o rastreamento de pilha:

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.

Então, basicamente o mesmo problema de antes.

Então, como eu poderia chamar uma função de manipulador de componente de formulário C # (por exemplo, clique) de outro manipulador de componente de formulário, aguardar a conclusão e, em seguida, chamar outra função - sem gerar uma exceção?

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

Matriz de strings C# junta-se a uma string de escape (como ArgumentList)?

  • 4

Não utilizo C# com frequência, porém, preciso modificar alguns códigos, que utilizam:

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

Agora, tenho que fazer uma chamada, porém com uma lista bastante grande de opções de linha de comando, algumas das quais contêm espaços e precisam ser citadas.

Então, eu vi que existe isto: 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\""
};

Eu adoraria usar ArgumentList - o problema é que, quando tento o preenchimento automático no Visual Studio new_process.StartInfo., recebo apenas Argumentsnão ArgumentList; e acho que este aplicativo que estou tentando modificar tem como alvo o .NET 4.6 - e a página acima diz para ArgumentList, que se aplica a:

.NET Core 2.1, Núcleo 2.2, Núcleo 3.0, Núcleo 3.1, 5, 6, 7, 8

Então, acho que estou sem sorte em termos de uso de ArgumentList aqui (não meu aplicativo, então realmente não posso tomar a decisão de alterar a versão principal, se esse for realmente o problema).

Então, se for esse o caso, existe algum tipo de classe em C# que seria essencialmente um contêiner de lista/matriz para strings, e que pode ter um método "join_quoted" ou algo assim, para que ele una os elementos da matriz com espaços , e cita os elementos que precisam ser citados - então, por

  • um array de entrada {"/c", "dir", @"C:\Program Files\dotnet"}, posso obter automaticamente
  • uma string juntada entre aspas de saída, que aqui seria"/c dir \"C:\\Program Files\\dotnet\""

...?

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

Possível inicializar um ponteiro de um valor na matriz de ponteiros?

  • 6

Basicamente, quero ter uma lista de funções como uma matriz de ponteiros de função; então, gostaria de gerenciar uma variável de índice nessa matriz e uma variável de ponteiro que aceitaria valores dessa matriz. Considere o seguinte código C ilustrando isso, que compila bem:

#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;
}

Como mostra o código acima, dentro do código posso definir a variável de ponteiro por meio da variável de índice ( my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];).

No entanto, gostaria de fazer algo semelhante, também para a inicialização - em última análise, gostaria apenas de inicializar os valores da matriz e my_func_choice_idxmanualmente primeiro - e, em seguida, fazer com que o ponteiro fosse inicializado automaticamente para o elemento my_func_choice_idxth correspondente na matriz; então, em vez do inicializador de ponteiro de trabalho:

void* my_func_choice_ptr = &func_01;

... Eu tentei estes:

//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

... e como as mensagens de erro nos comentários sugerem, nada disso funciona.

Eu meio que entendo por que funcs_ptrs[my_func_choice_idx]pode falhar - my_func_choice_idxafinal, é uma variável - mas quando o compilador chega a my_func_choice_ptr = funcs_ptrs[0];, ele já deve "saber" o endereço, o tamanho e os valores iniciais de funcs_ptrs-> então não vejo por que não pode definir my_func_choice_ptra primeira entrada de funcs_ptrs?!

Então - existe alguma sintaxe que eu possa usar para inicialização, que me permitirá inicializar a variável de ponteiro para um determinado valor inicial de uma entrada na matriz (semelhante à atribuição my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];que funciona no código normal)?

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

Possível inicializar o ponteiro para a matriz de variáveis ​​digitadas?

  • 5

Estive olhando c ponteiro para array de structs e tentando aplicá-lo ao meu exemplo.

Cheguei a este trecho de código, que compila bem:

#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;
}

No trecho acima, temos uma atribuição de my_arr_ptrvariável ao endereço da my_arrvariável (usando o operador "endereço de ", e comercial &).

No entanto, o que eu gostaria de fazer é inicializar a my_arr_ptr variável com o endereço da my_arrvariável - o que eu acho possível, visto que após a linha test_t my_arr[NUMITEMS] = { 0 };o compilador deve "saber" um endereço e tamanho de my_arr.

No entanto, se eu tentar isso:

#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;
}

... isso falha com:

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

Tanto quanto eu posso ver, "aviso: a definição de dados não tem tipo ou classe de armazenamento" ocorre:

porque você não pode executar o código fora das funções
( Por que estou recebendo este erro: "definição de dados não tem tipo ou classe de armazenamento"? )

Então, a obtenção de "endereço de" é considerada "código" em C, então não posso usá-lo fora das funções?

Em caso afirmativo, como posso usar "endereço do" operador "funções externas" no trecho abaixo, que também compila bem?:

#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 respostas
  • 30 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve