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

timmy george's questions

Martin Hope
timmy george
Asked: 2025-04-15 13:01:57 +0800 CST

A chamada ReadFile síncrona sobreposta para ler 1000 bytes de um arquivo de 88 bytes não aciona ERROR_HANDLE_EOF

  • 6

O conteúdo de um arquivo de texto chamado existingfile.txté o seguinte

The First Order Derivative of X2 is
2x. The derivative of sin is cos.
Math is the best

O código abaixo é de um arquivo chamado main.cppque está no mesmo diretório que existingfile.txt O exemplo mostra o processo de

  • abrindo uma alça paraexistingfile.txt
  • obtendo o tamanho deexistingfile.txt
  • lendo 1000 bytes deexistingfile.txt
  • gerando uma matriz de caracteres de 1000 bytes até o primeiro terminador nulo
#include <windows.h>
#include <cstdio>

int main(int, char**){
//Creating Synchronous File Handle
    HANDLE hFile = CreateFileW(
        L"existingfile.txt",
        GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_ALWAYS,
        FILE_FLAG_SEQUENTIAL_SCAN,
        NULL
    );
    if (hFile == INVALID_HANDLE_VALUE) {
        printf("ERROR IN OPENING FILE %lu\n", GetLastError());
        return -1;
    }
    //Obtaining File Size
    {
        ULARGE_INTEGER FileSize;
        FileSize.LowPart = GetFileSize(hFile, &FileSize.HighPart);
        DWORD LastError = GetLastError();
        if (FileSize.LowPart == INVALID_FILE_SIZE && LastError != NO_ERROR){
            printf("FAILED TO OBTAIN FILE SIZE, ERROR %lu\n", LastError);
            return -1;
        }
        printf("FILE SIZE: %llu\n", FileSize.QuadPart);
    }
    //Reading To End Of the File
    {
        OVERLAPPED Overlapped = {};
        Overlapped.Offset = 15;
        Overlapped.OffsetHigh = 0;
        constexpr DWORD NumBytesToRead = 1000;
        char BytesRead[NumBytesToRead + 1] = {0};
        BOOL Successful = ReadFile(hFile, BytesRead, NumBytesToRead, NULL, &Overlapped);
        DWORD LastError = GetLastError();
        if (!Successful){
            if (LastError != ERROR_HANDLE_EOF){
                printf("ERROR IN OVERLAPPED SYNCHRONOUS READ TO EOF, ERROR %lu\n", LastError);
                return -1;
            }
            puts("EOF ENCOUNTERED IN OVERLAPPED SYNCHRONOUS READ TO EOF");
        }
        BytesRead[NumBytesToRead] = 0;
        printf("2: Information Read: '%s'\n", BytesRead); 
    }
    CloseHandle(hFile);
    return 0;
}

A saída que obtenho é

FILE SIZE: 88
2: Information Read: ' Derivative of X2 is
2x. The derivative of sin is cos.
Math is the best'

A saída que eu esperava era

FILE SIZE: 88
EOF ENCOUNTERED IN OVERLAPPED SYNCHRONOUS READ TO EOF
2: Information Read: ' Derivative of X2 is
2x. The derivative of sin is cos.
Math is the best'

porque está declarado na documentação do ReadFile

Considerações para trabalhar com identificadores de arquivo síncronos:

...

Se lpOverlapped não for NULL, quando uma operação de leitura síncrona atingir o final de um arquivo, ReadFile retornará FALSE e GetLastError retornará ERROR_HANDLE_EOF.

Eu ficaria muito grato se alguém pudesse explicar/descobrir a causa do porquê o comportamento esperado mencionado na documentação não está acontecendo.

c++
  • 1 respostas
  • 86 Views
Martin Hope
timmy george
Asked: 2024-12-30 00:47:20 +0800 CST

Como usar std::array.size() como um parâmetro de modelo quando uma classe tem um std::array não constexpr

  • 15

O seguinte é um exemplo de brinquedo

A classe studenttem um std::array<char, 15>chamado namee um inteiro age. Um aluno tem uma função membro chamada encodeque chama uma função de modelo global encodeusando name.size()como parâmetro de modelo.

O código é mostrado abaixo:

//main.cpp
#include <iostream>
#include <array>

template <unsigned long num1>
unsigned long encode(unsigned long num2){
    return num1 + num2;
}


struct student {
    std::array<char, 15> name;
    int age;
    student(const std::array<char, 15>& name, int age):
        name(name),
        age(age)
    {}
    unsigned long encode(){
        return ::encode<name.size()>(age);
    }
};

int main(){
    std::array<char, 15> name = {"Tim"};
    student Tim(name, 17);
    std::cout << Tim.encode();
}

No entanto, isso produz o seguinte erro do compilador

>g++ main.cpp -std=c++11

main.cpp: In member function 'long unsigned int student::encode()':
main.cpp:22:43: error: use of 'this' in a constant expression
   22 |                 return ::encode<name.size()>(age);
      |                                           ^
main.cpp:22:45: error: no matching function for call to 'encode<((student*)this)->student::name.std::array<char, 15>::size()>(int&)'
   22 |                 return ::encode<name.size()>(age);
      |                        ~~~~~~~~~~~~~~~~~~~~~^~~~~
main.cpp:9:15: note: candidate: 'template<long unsigned int num1> long unsigned int encode(long unsigned int)'
    9 | unsigned long encode(unsigned long num2){
      |               ^~~~~~
main.cpp:9:15: note:   template argument deduction/substitution failed:
main.cpp:22:45: error: use of 'this' in a constant expression
   22 |                 return ::encode<name.size()>(age);
      |                        ~~~~~~~~~~~~~~~~~~~~~^~~~~
main.cpp:22:42: note: in template argument for type 'long unsigned int'
   22 |                 return ::encode<name.size()>(age);

É necessário que eu faça isso ::encode<15>(age)para resolver esse problema, porque eu acho que um dos principais benefícios de um std::arrayé poder carregar um tamanho em vez de ter que armazenar o tamanho em alguma variável extra (ou codificar o tamanho).

g++ version: 14.1.0

c++
  • 3 respostas
  • 526 Views
Martin Hope
timmy george
Asked: 2024-12-14 03:10:10 +0800 CST

Por que uma chamada desta função usa NRVO enquanto outra chamada da mesma função não?

  • 10

vectoré uma estrutura com dois membros públicos Xe Y; um construtor parametrizado que imprime integer constructor called; um construtor de cópia que imprime copy constructor called; e um construtor de movimento que imprime move constructor called <== This line is different\n.

A função makeVectorx5y5IfNotZero()retorna o vetor {5, 5}se argfor 0. caso contrário, retorna {2, 2}.

A mainfunção constrói vector Ausando makeVectorx5y5IfNotZero(1)e constrói vector Busando makeVectorx5y5IfNotZero(0).

Aqui está o código:

#include <iostream>

struct vector{
    int X, Y;
    vector(int X, int Y) : X(X), Y(Y){
        printf("integer constructor called\n");
    }
    vector(const vector& other): X(other.X), Y(other.Y){
        printf("copy constructor called\n");
    }
    vector(vector&& other): X(other.X), Y(other.Y){
        printf("move constructor called      <== This line is different\n\n");
    }
};

vector makeVectorx5y5IfNotZero(bool Arg){
    if(Arg){
        vector A(0, 0);
        A.X = 5;
        A.Y = 5;
        return A;
    }
    else {
        vector B(1,1);
        B.X = 2;
        B.Y = 2;
        return B;
    }
}

int main(){
    printf("Making Vector\n");
    vector A = makeVectorx5y5IfNotZero(1);
    printf("Made Vector\n");
    printf("Making Another Vector\n");
    vector B = makeVectorx5y5IfNotZero(0);
    printf("Made Vector\n");
}

A saída deste código é:

Making Vector
integer constructor called
Made Vector
Making Another Vector
integer constructor called
move constructor called      <== This line is different
Made Vector

No entanto, eu esperava o seguinte resultado, por causa do NRVO:

Making Vector
integer constructor called
Made Vector
Making Another Vector
integer constructor called
Made Vector

Por que a variável local Bde makeVectorx5y5IfNotZero()está sendo movida para a variável local Bde main(), em vez de apenas construir uma única variável no mesmo endereço de memória?

Versão do compilador (saída de g++ --version):

g++ (Rev3, Built by MSYS2 project) 14.1.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
c++
  • 1 respostas
  • 121 Views
Martin Hope
timmy george
Asked: 2024-11-17 05:52:02 +0800 CST

Como tornar uma variável oculta em um arquivo de cabeçalho

  • 6

Eu tenho uma estrutura de modelo Distanceque usaconstexpr unsigned char mm2cm = 10

Como Distanceé uma classe de modelo, devo definir mm2cme Distanceem um arquivo de cabeçalho.

Este arquivo de cabeçalho é incluído nos arquivos cpp.

Quero mm2cmque ele fique visível apenas neste arquivo de cabeçalho e não nos arquivos cpp que incluem este cabeçalho, ou seja:

Distância.hpp

constexpr unsigned char mm2cm = 10;

template <int offset>
struct Distance{
    int mm;
    int convToCm() const { return offset + mm2cm * mm; }
};

Principal.cpp

#include "Distance.hpp"
#include <iostream>

int main(){
    //I do not want to be able to use mm2mm outside Distance.hpp, as follows
    std::cout << (int)mm2cm << std::endl; 
    
}

Uma maneira de resolver isso é usar #define mm2cm 10and #undef mm2cmno início e no final do arquivo de cabeçalho (em vez de constexpr unsigned char mm2cm = 10.

No entanto, muitas pessoas desencorajam o uso de macros por razões. Este post lista algumas razões pelas quais ), e este site afirma que:

Em geral, a palavra-chave const é preferida para definir constantes e deve ser usada em vez de #define.

Outra maneira de resolver isso é criar mm2cmmum membro estático privado de Distance.

Entretanto, no problema maior que estou tentando resolver, tenho várias variáveis ​​que quero que fiquem visíveis apenas neste arquivo de cabeçalho, e tornar todas elas membros estáticos privados fará com que minha classe pareça feia (em outras palavras, deve haver uma maneira melhor do que esta solução).

Eu ficaria muito grato se alguém pudesse me fornecer a melhor maneira de garantir mm2cmque ele seja visível somente para Distanceou somente dentro deste arquivo de cabeçalho.


Uma edição anterior deste post usava um parâmetro de modelo de tipo. Isso foi alterado para um parâmetro de modelo não-tipo, já que o problema real que estou tentando resolver usa um parâmetro de modelo não-tipo.

c++
  • 2 respostas
  • 115 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
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve