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 / coding / 问题

All perguntas(coding)

Martin Hope
Christian Stadelmann
Asked: 2025-04-09 17:04:56 +0800 CST

Com o Clang ou compiladores similares, é possível transformar apenas alguns avisos em erros?

  • 12

Avisos do compilador geralmente fornecem dicas úteis para erros comuns de programação. Muitas vezes, recomenda-se transformar avisos do compilador em erros (por exemplo, aqui ). Na minha experiência, isso é útil para evitar que avisos sejam ignorados, especialmente em bases de código maiores ou em sistemas de compilação automatizados. No entanto, alguns avisos são úteis como avisos e não podem ser transformados em erros, seja porque podem ser falsos positivos ou porque a base de código não pode ser adaptada imediatamente, mas isso leva algum tempo de transição.

Como solução alternativa, eu poderia compilar o mesmo código duas vezes:

  1. Uma execução com a maioria ou todos os avisos habilitados (por exemplo, -Wextra), mas sem transformá-los em erros (ou seja, sem -Werror)
  2. Uma segunda execução com um conjunto menor de avisos, mas com configurações pedantes (ou seja, com a -Werroropção de linha de comando)

Dessa forma, o projeto de código se beneficiaria de mais avisos do que poderia corrigir atualmente.

Existe uma maneira de fazer isso diretamente, ou seja, com uma única etapa de compilação, não duas?

Li algumas menções à -Wno-error=[name]opção em outra pergunta e ela mal foi mencionada na referência de linha de comando mais recente do clang , mas não tenho detalhes. Caso eles forneçam uma solução para a minha pergunta, você poderia explicar melhor o que ela faz e/ou fornecer um link para onde está documentada?

c++
  • 4 respostas
  • 196 Views
Martin Hope
1uigii
Asked: 2025-04-09 00:01:11 +0800 CST

Não é possível corresponder ao resultado em const fn devido a "o destruidor não pode ser avaliado em tempo de compilação", mesmo quando o valor não é descartado

  • 12

Tentei corresponder a um genérico Result<&mut T, T>dentro de um const fn, mas o compilador não permitiu. Seria necessário remover o valor no final do escopo, o que atualmente não é possível dentro de um const fn.

Trunquei um pouco meu código e finalmente cheguei a este trecho. Ele continua dando o mesmo erro, pelo mesmo motivo, mas não é mais genérico.

struct Dummy;

impl Drop for Dummy {
    fn drop(&mut self) {
        println!("dropped");
    }
}

const fn const_match(result: Result<Dummy, ()>) -> Result<Dummy, ()> {
    match result { //^^^^^^ the destructor for this type cannot be evaluated in constant functions
        Ok(ok) => Ok(ok),
        Err(err) => Err(err),
    }
} // <- value is dropped here

O compilador me dá a seguinte mensagem de erro:

error[E0493]: destructor of `Result<Dummy, ()>` cannot be evaluated at compile-time
  --> <source>:9:22
   |
9  | const fn const_match(result: Result<Dummy, ()>) -> Result<Dummy, ()> {
   |                      ^^^^^^ the destructor for this type cannot be evaluated in constant functions
...
14 | }
   | - value is dropped here

Ao remover consttudo, a compilação fica perfeita, então criei um teste para verificar se o valor realmente é descartado dentro dessa função.

struct Dummy;

impl Drop for Dummy {
    fn drop(&mut self) {
        println!("dropped");
    }
}

fn const_match(result: Result<Dummy, ()>) -> Result<Dummy, ()> {
    match result {
        Ok(ok) => Ok(ok),
        Err(err) => Err(err),
    }
}

fn main() {
    let dummy = const_match(Ok(Dummy));
    let err = const_match(Err(()));

    std::mem::forget(dummy);
}

Aqui está o link do godbolt para um exemplo de código idêntico. Como esperado, ele não produz nenhuma saída, então o destruidor nunca é executado dentro de const_match.

Por que o destruidor precisa ser capaz de ser executado?

rust
  • 1 respostas
  • 80 Views
Martin Hope
Bruce Varley
Asked: 2025-03-29 17:40:50 +0800 CST

A análise de argumentos C++ está incorreta quando o caminho do arquivo executável contém espaços

  • 12

Estou tendo problemas com argumentos em programas de console C++ criados no C++Builder 12 Community Edition.

Se o executável estiver em uma pasta com espaços no nome, por exemplo, "test dir", e eu o invoco de uma sessão de console em uma pasta DIFERENTE, então os argumentos extraídos pelo meu código estão incorretos. Se o caminho do arquivo executável não tiver espaços, tudo funciona bem. Se eu executá-lo dentro do IDE, também está OK. O código criado no Visual Studio 22 também funciona OK.

CPPtest.cpp

#include <iostream.h>

int main(int argc, char* argv[])
{
    cout << "argc: " << argc << "\n"; 
    cout << "argv0: " << argv[0] << "\n"; 
    cout << "argv1: " << argv[1] ; 
    return 0 ;`
}

O executável está localizado em um diretório chamado "Misc projects", CWD é "C:\Junk":

C:\Junk>C:\"Misc projects"\CPPtest 3 8
argc: 2 ## INCORRECT: Should be 3
argv0: c:\Misc projects\CPPtest.exe
argv1: projects\CPPtest 3 8 # INCORRECT should be 8

Código idêntico quando executado dentro do Visual Studio 22 funciona corretamente.

c++
  • 1 respostas
  • 307 Views
Martin Hope
Ashe
Asked: 2025-02-05 13:41:14 +0800 CST

Regex uma string com um espaço entre as palavras

  • 12
import re

texto = "ABC ABC. ABC.png ABC thumb.png"

regex = r"ABC(?!.png)|ABC(?! thumb.png)"

novo = re.sub(regex, "bueno", texto)

print(novo)

Estou tentando substituir a palavra ABC por exceções. Só quero substituí-la se ela não vier depois da palavra ".png" ou "thumb.png". A string seria então "ABC thumb.png"

Eu esperava

bueno bueno. ABC.png ABC thumb.png

Mas a saída é esta

bueno bueno. bueno.png bueno thumb.png

Ele não detecta o espaço e, na verdade, bagunça a primeira condição.

python
  • 4 respostas
  • 451 Views
Martin Hope
Josh Shields
Asked: 2025-01-19 14:55:55 +0800 CST

Por que std::vector<T> v{1, 2, 3} e std::vector<T> v = {1, 2, 3} chamam construtores diferentes, quando T converte implicitamente de int?

  • 12

Pergunta - veja Compiler Explorer

Se eu criar um std::vector<int>e inicializá-lo de duas maneiras, ambas chamarão o std::initializer_listconstrutor.

std::vector<int>  v1{1, 2, 3};     // Calls vector(initializer_list< int >)
std::vector<int>  v2 = {1, 2, 3};  // Calls vector(initializer_list< int >)

Mas se eu usar uma classe que converte implicitamente de int:

struct Imp { Imp(int) {} };

Então o segundo método de inicialização chama o construtor que recebe um par de iteradores.

std::vector<Imp>  v3{1, 2, 3};     // Calls vector(initializer_list< Imp >)
std::vector<Imp>  v4 = {1, 2, 3};  // Calls vector(const int*, const int* ) ???

Isso só acontece usando GCC 14.2 . Ao usar Clang 19.1 ou MSVC 19.40 , ambos v3e v4chamam o initializer_listconstrutor. O nível de otimização não faz diferença

Por que a = {}sintaxe chama vector(const int*, const int*)o GCC?

Investigação adicional

Tentei criar meu próprio modelo de classe que tem ambos os construtores:

template <typename T>
struct Custom {
    Custom(std::initializer_list<T>) {}
    Custom(const int*, const int*)   {}
};

Agora, tanto a sintaxe {}e = {}chamam o initializer_listconstrutor no GCC.

Custom<Imp>       v5{1, 2, 3};     // Calls Custom(initializer_list< Imp >)
Custom<Imp>       v6 = {1, 2, 3};  // Calls Custom(initializer_list< Imp >)


Onde as coisas ficam realmente confusas é se eu me especializo std::vectorpara meu tipo de conversão implícita Imp. Então há três casos:

Caso 1 - Fornecerinitializer_listapenas ctor

template <>
struct std::vector<Imp> {
    vector(initializer_list<Imp>)   {}
};

Resultado - Ambas as sintaxes chamam o ctor fornecido

std::vector<Imp> v7{1, 2, 3};      // Calls vector(initializer_list< Imp >)
std::vector<Imp> v8 = {1, 2, 3};   // Calls vector(initializer_list< Imp >)


Caso 2 - Fornecerconst int*apenas ctor

template <>
struct std::vector<Imp> {
    vector(const int*, const int*)   {}
};

Resultado - Ambas as sintaxes falham na compilação (nenhum ctor correspondente)

std::vector<Imp> v9{1, 2, 3};      // Error - no matching ctor
std::vector<Imp> vA = {1, 2, 3};   // Error - no matching ctor


Caso 3 - Forneça ambos os ctors

template <>
struct std::vector<Imp> {
    vector(initializer_list<Imp>)    {}
    vector(const int*, const int*)   {}
};

Resultado - A{}sintaxe chama oinitializer_listctor, enquanto a= {}sintaxe chama oconst int*ctor

std::vector<Imp> vB{1, 2, 3};      // Calls vector(initializer_list< Imp >)
std::vector<Imp> vC = {1, 2, 3};   // Calls vector(const int*, const int*) ???

É aqui que estou perdido.

No caso 3 , como fornecer o initializer_listconstrutor permite que o const int*construtor seja chamado?

EDITAR

Perguntaram como eu sei qual construtor está sendo chamado. Isso começou quando eu estava olhando quando os construtores copy vs. move são chamados. std::initializer_listnão pode ser movido de. Mas aqui estão alguns exemplos adicionais, com prints.

Exemplo 1 - Usando um tipo autônomo

struct Imp { Imp(int) {} };

template <typename T>
struct Custom {
    Custom(std::initializer_list<T>)    { std::printf("initializer_list<T>\n");    }
    Custom(const int*, const int*)      { std::printf("const int*, const int*\n"); }
};

int main(int argc, char *argv[]) {
    Custom<Imp>     v{1, 2, 3};
    Custom<Imp>     w = {1, 2, 3};

Impressões:

initializer_list<T>
initializer_list<T>

Exemplo 2 - Usando uma especialização std::vector

struct Imp { Imp(int) {} };

template <>
struct std::vector<Imp> {
    vector(initializer_list<Imp>)       { std::printf("initializer_list<T>\n");    }
    vector(const int*, const int*)      { std::printf("const int*, const int*\n"); }
};

int main(int argc, char *argv[]) {
    std::vector<Imp>    v{1, 2, 3};
    std::vector<Imp>    w = {1, 2, 3};

Impressões:

initializer_list<T>
const int*, const int*

A única diferença entre os dois exemplos é que um é uma especialização std:: e o outro não.

Por que isso mudaria qual sobrecarga de ctor é chamada?

c++
  • 1 respostas
  • 387 Views
Martin Hope
Max
Asked: 2025-01-03 05:14:17 +0800 CST

Identificando linhas de quadro de dados em R com pares específicos de valores em duas colunas

  • 12

Gostaria de identificar todas as linhas em um data frame (ou matriz) cujos valores nas colunas 1 e 2 correspondem a um par específico. Por exemplo, se eu tiver uma matriz

testmat=rbind(c(1,1),c(1,2),c(1,4),c(2,1),c(2,4),c(3,4),c(3,10))

Gostaria de identificar as linhas que contêm qualquer um dos seguintes pares, ou seja, todas as linhas que contêm uma combinação de 1,2 ou 2,4 em suas primeira e segunda colunas

of_interest = rbind(c(1,2),c(2,4))

O seguinte não funciona

which(testmat[,1] %in% of_interest[,1] & testmat[,2] %in% of_interest[,2])

porque, como esperado, ele retorna todas as combinações de 1,2 na primeira coluna e 2,4 na segunda (ou seja, linhas 2,3,5 em vez de apenas as linhas 2 e 5, como desejado), de modo que a linha [1,4] é incluída, mesmo que este não seja um dos pares que estou consultando. Deve haver alguma maneira simples de usar which...%in%... para corresponder a pares específicos como este, mas não consegui encontrar um exemplo disso que funcione.

Observe que preciso das posições/números de linhas que correspondem à condição desejada.

  • 4 respostas
  • 166 Views
Martin Hope
Lorenzo Yang
Asked: 2024-12-29 17:20:00 +0800 CST

Por que “var” no Java 11 ignora a restrição de acesso “protected”?

  • 12

Hoje, enquanto trabalhava em um projeto para um curso de “Design Patterns” da faculdade (Java 11 necessário), descobri um problema com a restrição de acesso do modificador de acesso que pode ser ignorado declarando var. Eu sei como var é usado, é apenas um açúcar sintático que deixa a inferência de tipo para o compilador.

Não consigo descobrir que tipo de alias a var realmente é aqui:

  • é "Child.InnerChild"? Isso não seria uma incompatibilidade de tipo?
  • "InnerParent"? Isso não ignora o restritor de acesso protegido?

Aqui está meu código simplificado:

public abstract class Parent {
    protected abstract static class InnerParent {
        public InnerParent self() {
            return this;
        }
    }
}
public class Child extends Parent {
    public static class InnerChild extends InnerParent {}
}
import anotherpackage.Child;

/**
 * Compiling with Java 11:
 */
public class Main {
    public static void main(String[] args) {
        // As we expected a compilation error: The returned static type does not match the expected type
        // Child.InnerChild innerChild = new Child.InnerChild().self();

        // As we expected a compilation error: Parent.InnerParent is package visible (protected)
        // Parent.InnerParent innerChild = new Child.InnerChild().self();

        // Why does it compile and run correctly here?
        // var is just syntactic sugar for the compiler type, it should be a Parent.InnerParent alias here,
        // why is var allowed to transgress the protected access restriction?
        var innerChild = new Child.InnerChild().self(); // perhce' non da' errore ? var e' un alias di cosa ?
        System.out.println(innerChild);
        System.out.println(innerChild.getClass().getName());
    }
}

Também perguntei ao ChatGPT, mas ele não está respondendo tão bem quanto eu gostaria e não tenho certeza se está correto:

Por que varfunciona

  • Tipo inferido : O tipo inferido para var innerChildé Parent.InnerParent.
  • Regras de acesso : como o tipo é inferido e não escrito explicitamente no código, o compilador não impõe restrições de acesso para a variável declarada.

Encontrei um novo problema: por que não consigo acessar getClass()?

Problema não é possível acessar getClass()

No entanto, é possível compilar dessa maneira.

System.out.println(((Object) innerChild).getClass().getName());
// OUTPUT: com.github.lorenzoyang.anotherpackage.Child$InnerChild
java
  • 2 respostas
  • 846 Views
Martin Hope
Fedor
Asked: 2024-12-22 05:32:10 +0800 CST

Copiar a classe base virtual resulta na perda do objeto de propriedade shared_ptr

  • 12

Um colega de trabalho me mostrou este programa:

#include <iostream>
#include <memory>

struct A {
    std::shared_ptr<int> u{ new int };
};

struct B : virtual A {};
struct C : virtual A {};
struct D : B, C {};

int main() {
    D d;
    d = D( d );
    std::cout << d.u;
}

que apesar de inicializar shared_ptrcom new intimprime zero. Demonstração online: https://gcc.godbolt.org/z/n3Kxbc3Pf

Vejo que isso está de alguma forma relacionado à herança de diamante e à classe base virtual comum.

O programa tem algum comportamento indefinido ou está bem formado e o padrão exige a impressão de zero aqui?

c++
  • 1 respostas
  • 119 Views
Martin Hope
TSDrake
Asked: 2024-11-11 20:39:36 +0800 CST

O Git squash faz commits no meio do branch com branches filhos depois disso

  • 12

Tenho o seguinte repositório:

A--B--C--D--E--F--G--H--I--J
                   \
                    K--L--M
main -> J
DEV -> M

Quero compactar os commits entre B e E para que o repositório fique assim:

A--N--F--G--H--I--J
          \
           K--L--M
main -> J
DEV -> M

Tentei fazer um squash interativo, mas o melhor que consegui foi algo assim:

  N--F'-G'-H'-I'-J'
 /  
A--B--C--D--E--F--G--H--I--J
                   \
                    K--L--M
remote/main -> J
main -> J'
DEV -> M

então a ramificação DEV não está anexada onde deveria estar.

Qual é a maneira de fazer isso?

git
  • 1 respostas
  • 147 Views
Martin Hope
RRM
Asked: 2024-11-08 20:24:45 +0800 CST

Tamanho da memória da matriz Java

  • 12

Para aqueles que desejam sinalizar isso como duplicado, esta pergunta não está relacionada a nenhuma das perguntas como:

Como calcular o tamanho da memória de um array Java?

Tamanho de memória de matrizes int[] do sistema Java de 32 bits


Em Java, quando uma matriz de primitivos inté criada:

int[] arr = new int[1000];

A JVM aloca memória para todo o comprimento do array * 4 bytes, ou seja, 4000 bytes após a declaração acima? Não vamos nos preocupar com overheads constantes como cabeçalhos etc.

Meu entendimento é que no caso de tipos numéricos primitivos, por exemplo int, doubleetc., o valor padrão '0' também é um valor válido, portanto precisa de memória. Na verdade, a memória necessária completa deve ser alocada no momento de tais declarações.

Como eu poderia verificar isso?

java
  • 3 respostas
  • 142 Views
Prev
Próximo

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