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

edrezen's questions

Martin Hope
edrezen
Asked: 2025-02-24 19:19:38 +0800 CST

Problema com um intervalo personalizado ao usar std::views::join e std::views::enumerate

  • 8

Tenho uma SequencesRangeclasse simples que pode iterar sequências genômicas aleatórias de tamanho fixo.

Quando tento juntar os caracteres de todas as sequências com std::views::join, funciona bem, mas assim que tento canalizar com std::views::enumerate, obtenho uma saída de lixo. Posso verificar se o valgrind não está muito feliz e produz alguns temidosConditional jump or move depends on uninitialised value(s)

#include <string>
#include <iostream>
#include <ranges>

class SequencesRange
{
public:

    struct iterator 
    {
        using iterator_category = std::forward_iterator_tag;
        using value_type        = std::string;
        using difference_type   = long;
        using pointer           = value_type*;
        using reference         = value_type const&;

        iterator (size_t size, size_t nbItems)  : value_(size,' '), nbItems_(nbItems)
        {
            next();
        }

        iterator()                = default;
        iterator(iterator const&) = default;
        iterator(iterator &&    ) = default;

        iterator& operator= (iterator const&) = default;
        iterator& operator= (iterator     &&) = default;

        bool operator!= (const iterator& other) const { return nbItems_ != other.nbItems_; }
        bool operator== (const iterator& other) const { return nbItems_ == other.nbItems_; }

        iterator& operator++ ()    { next();  ++nbItems_;  return *this; }
        iterator  operator++(int)  { iterator tmp = *this;  ++(*this);  return tmp; }

        reference operator* () const { return value_; }

        value_type value_;
        size_t     nbItems_ = 0;
        
        void next()
        {
            static std::array<char,4> letters = {'A','C','G','T'};
            
            for (auto& c : value_)  { c = letters[rand()%letters.size()]; }
        }
    };

public:

    iterator begin() const { return iterator(size,       0); }
    iterator end  () const { return iterator(size, nbItems); }
    
    size_t nbItems = 0;
    size_t size    = 0;
};

int main (int argc, char** argv)
{
    SequencesRange iterable {1, 10};  // one sequence of length 10
 
    for (auto [i,nt] : iterable | std::views::join | std::views::enumerate)
    {
        std::cout << nt;  // got some garbage output here
    }

    // Note that the following is ok:
    //  for (auto nt : iterable | std::views::join)  { std::cout << nt; }
}

Parece um gerenciamento ruim do ciclo de vida do objeto e suspeito que haja algo bobo na estrutura do meu iterador, mas atualmente não consigo ver onde.

Coisa estranha: se eu configurar o iterável com sequências de comprimento>=16, não tenho erro algum. Talvez um efeito colateral da otimização de string curta?

DEMONSTRAÇÃO


ATUALIZAR:

Observe que não tenho problemas com uma versão simplificada da iteratorestrutura usando um sentinela inteiro para a endinstância:

DEMONSTRAÇÃO


ATUALIZAR:

Se eu forçar o iterador a fornecer cópias (por exemplo, value_type operator* () const { return value_; }), ele funciona.

Mas não consigo entender por que cópias são necessárias, iterable | std::views::join | std::views::enumerateembora apenas referências possam ser usadas com iterable | std::views::join.

c++
  • 1 respostas
  • 73 Views
Martin Hope
edrezen
Asked: 2024-10-10 16:00:13 +0800 CST

"Erro de arquivo de classe não suportado" em um projeto Vaadin 14

  • 5

Tenho um projeto antigo do Vaadin14 que costumava funcionar com o Java 1.8.

Atualizei minha distribuição Linux e agora o Java é a versão 21.

O problema agora é que quando tento construir o projeto (com mvn package -Pproduction), recebo o seguinte erro:

[ERROR] Failed to execute goal com.vaadin:vaadin-maven-plugin:14.9.5:build-frontend (default) on project org-cubr-ui-vaadin: Execution default of goal com.vaadin:vaadin-maven-plugin:14.9.5:build-frontend failed: Unsupported class file major version 65 -> [Help 1]

Então instalei o Java 1.8 e o tornei a versão padrão, update-alternatives --config javamas ainda tenho o mesmo erro ao compilar o projeto.

Pergunta 1: Por que o maven não usa a versão java configurada com update-alternatives? Tenho algo para modificar no pom.xmlarquivo ?

Pergunta 2: É possível construir um projeto Vaadin14/maven em uma distribuição recente (quero dizer, com uma versão recente do Java)?


Atualização: ao iniciar o maven com a opção -X, posso ver logo no início que o java 21 é usado.

java
  • 1 respostas
  • 31 Views
Martin Hope
edrezen
Asked: 2024-10-01 20:09:38 +0800 CST

Interpretação de duas cláusulas complexas requer

  • 12

Este post fala sobre um método que conta o número de membros de uma classe:

struct UniversalType { template<typename T> operator T();  };

template<typename T, typename... A0>
consteval auto MemberCounter(auto ...c0) 
{
    if constexpr (requires { T{ {A0{}}..., {UniversalType{}}, c0... }; } == false
               && requires { T{ {A0{}}..., c0..., UniversalType{}   }; } == false )
   {
        return sizeof...(A0) + sizeof...(c0);
    }
    else if constexpr (requires { T{ {A0{}}..., {UniversalType{}}, c0... }; })
    {
        return MemberCounter<T,A0...,UniversalType>(c0...);
    }
    else
    {
        return MemberCounter<T,A0...>(c0...,UniversalType{});
    }
}

using TestType = struct { int x[3]; float y; char z; };
static_assert (MemberCounter<TestType>() == 3);

int main() {}

Em particular, as duas requirescláusulas a seguir me intrigam um pouco, pois misturam chaves simples e duplas:

  1. requires { T{ {A0{}}..., {UniversalType{}}, c0... }; }
  2. requires { T{ {A0{}}..., c0..., UniversalType{} }; }

Pergunta: que tipo de itens eles permitem combinar exatamente?

c++
  • 1 respostas
  • 231 Views
Martin Hope
edrezen
Asked: 2024-06-10 17:36:37 +0800 CST

Configurando opções de compilação com CMake a partir de valores provenientes de um arquivo gerado dinamicamente

  • 5

Quero definir uma opção de compilação -DVAR=xxx. Eu sei que posso fazer isso, target_compile_optionsmas meu problema é que o valor xxxdeve ser gerado dinamicamente e só está disponível como conteúdo de um arquivo txt.

Aqui está minha tentativa:

  1. crie um comando personalizado que gere o arquivo contendo o valor a ser usado
  2. crie um destino personalizado que permita construir o var.txtarquivo
  3. crie uma dependência para ter certeza de que var.txtserá gerado antes da compilação doMyExe

mas não sei como recuperar o valor necessário do arquivo e usá-lo em target_compile_options.

cmake_minimum_required(VERSION 3.13)

project ("MyProject")

add_custom_command (
  OUTPUT  var.txt
  COMMAND echo "123" > var.txt      # just an example here, the real generation is more complex
  COMMENT "Generate variable value"
)

add_executable         (MyExe main.cpp)
target_compile_options (MyExe PUBLIC -DVAR=???)  # how to get the content of "var.txt" for setting VAR ?

add_custom_target (var   ALL DEPENDS var.txt)
add_dependencies  (MyExe  var)

É possível target_compile_optionsusar valores recuperados de um arquivo gerado?

cmake
  • 1 respostas
  • 11 Views
Martin Hope
edrezen
Asked: 2024-06-05 19:47:31 +0800 CST

Recuperando do gcc/clang um valor conhecido em tempo de compilação

  • 6

Considere a seguinte constante de tempo de compilação VALUEdefinida por

struct foo  {  uint32_t a;  };

static constexpr int VALUE = sizeof(foo);

Observe que a forma como o valor é calculado não é importante aqui.

Gostaria de recuperar o próprio valor (4 no exemplo) como resultado da compilação ; em outras palavras, não quero construir um binário e iniciá-lo para obter esse valor.

Sei que essa opção -Epermite parar após o pré-processamento mas nesta fase o valor ainda não é conhecido. Talvez exista alguma opção de compilador que permita isso, mas não sei.

A única maneira que consigo pensar é colocar um static_assert(VALUE==-1)que causará um erro e esperar que a mensagem de erro mantenha o valor; parece que gccpode fazer isso, mas não clang.

Existe uma maneira melhor e não dependente do compilador de obter o valor constante como resultado da própria compilação?

c++
  • 2 respostas
  • 43 Views
Martin Hope
edrezen
Asked: 2024-02-20 22:21:12 +0800 CST

Falha na especialização do modelo ao usar decltype no tipo de modelo

  • 7

Eu defini a seguinte estrutura de modelo:

template<typename T>  struct somestruct {}; 

e agora as seguintes especializações:

template<typename T> struct somestruct <std::vector<T>>                {};  // OK
template<typename T> struct somestruct <decltype(std::vector<T>  {})>  {};  // KO

Porém, a última especialização não compila com o seguinte erro (veja aqui ):

error: template parameters not deducible in partial specialization:

Ingenuamente, diria que as duas especializações não são tão diferentes, como parece dizer o seguinte:

template<typename T> void test ()  
{ 
    static_assert (std::is_same_v<std::vector<T>, decltype(std::vector<T>{})> );
}

Pergunta: qual o motivo técnico que faz o compilador falhar com a segunda especialização? E existe uma maneira de consertar isso (quero dizer, meu código, não o compilador)?

Há um post antigo que parece semelhante, mas talvez coisas/compilador/c++ possam ter mudado.

c++
  • 1 respostas
  • 54 Views
Martin Hope
edrezen
Asked: 2024-02-11 05:33:32 +0800 CST

O std contém características de tipo que transforma uma lista de tipos e agrega cada valor de transformação em uma única expressão?

  • 6

Com a especialização de modelo, é possível codificar características que recebem uma lista de tipos, aplicar uma transformação em cada tipo que retorna um booleano e, em seguida, avaliar uma expressão final que é um andem todos os resultados da transformação:

#include <type_traits>

template<template<typename> class TRANSFO, typename ...ARGS>
struct Eval {};

template<template<typename> class TRANSFO, typename T, typename ...ARGS>
struct Eval<TRANSFO, T, ARGS...>
{
    static constexpr bool value = TRANSFO<T>::value and Eval<TRANSFO,ARGS...>::value;
};

template<template<typename> class TRANSFO>
struct Eval<TRANSFO>
{
    static constexpr bool value = true;
};

int main()
{
    static_assert (Eval<std::is_integral,int,long>::value == true);
    static_assert (Eval<std::is_integral,int,float,long>::value == false);
    static_assert (Eval<std::is_integral,float>::value == false);
}

A pergunta já tem stdtal coisa? Ou é possível escrevê-lo com características existentes em std?

c++
  • 1 respostas
  • 39 Views
Martin Hope
edrezen
Asked: 2024-01-17 18:24:11 +0800 CST

reference_wrapper de uma referência esquerda

  • 5

No código a seguir, tento usar um vetor v1feito de referências de um tipo e um vetor v2feito de uma referência de um tipo:

#include <string>
#include <vector>

int main (int argc, char* argv[])
{
   std::string  object ("foobar");
   std::string& refobj = object;

   std::vector<std::reference_wrapper<decltype(object)>> v1;

   // The following line doesn't compile => error: forming pointer to reference type ‘std::__cxx11::basic_string<char>&
   std::vector<std::reference_wrapper<decltype(refobj)>> v2;
   
   std::vector<std::reference_wrapper<std::remove_reference_t<decltype(refobj)>>> v3;
}

Como esperado, o código é compilado para, v1mas não para v2, o que também deve estar ok, IMHO; nesse caso, o wrapper de referência não deve fazer nada, pois o tipo fornecido já é uma referência.

Observe que posso conseguir o que desejo com o vetor, v3mas o código parece um pouco complicado.

Pergunta : por que o compilador não fica satisfeito durante a compilação v2? Em outras palavras, por que devo primeiro remover a referência de tipo antes de adicionar uma com reference_wrapper?

c++
  • 1 respostas
  • 39 Views
Martin Hope
edrezen
Asked: 2023-11-15 01:02:45 +0800 CST

Sobrecarregar um operador de uma estrutura dentro de uma estrutura de modelo

  • 6

Eu tenho uma estrutura de modelo Fooque define uma estrutura interna Bar.

Agora, gostaria de sobrecarregar o fluxo operator <<para esta struct interna Bar, mas o compilador parece ignorar minha implementação de sobrecarga:

erro: nenhuma correspondência para 'operator<<' (os tipos de operando são 'std::ostream' {também conhecido como 'std::basic_ostream<char>'} e 'Foo<3>::Bar')

Meu código é o seguinte:

#include <iostream>

//////////////////////////////////////////////////////////////////////////////////////////
template<int N>
struct Foo
{
    struct Bar  {};
};

//////////////////////////////////////////////////////////////////////////////////////////
template<int N>
std::ostream& operator<< (std::ostream& os, const typename Foo<N>::Bar& x)
{
    return os;
}

//////////////////////////////////////////////////////////////////////////////////////////
int main (int argc, char** argv)
{
    Foo<3>::Bar x;

    std::cout << x << std::endl;
}

Não consigo ver o erro (talvez óbvio).

Pergunta É possível sobrecarregar um operador de uma estrutura interna que pertence a uma classe template?

c++
  • 2 respostas
  • 61 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