Expression must have constant value.

Expression must have constant value.
RU
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:56
0

Witam,

Od niedawna próbuje uporać się z jednym błędem w moim kodzie.
Funkcja:

Kopiuj
  bool readPacket(const FileStreamPtr& fin){
    try{
        if (!fin){
          stdext::throw_exception("Error: FileStreamPtr not found");
          return false;
        }

        uint8_t packetCode = fin->getU8();
        if (packetCode != 255){
          stdext::throw_exception(stdext::format("Error: FileStreamPtr packetCode = %d", packetCode));
          return false;
        }

        id = fin->getU32();
        time = fin->getU32();
        int16_t msgSize = fin->getU16();
        uint8 data[msgSize];
        fin->read(&data[0], msgSize);
        msg = OutputMessagePtr(new OutputMessage);
        msg->addBuffer(msgSize, &data[0]);


    }catch(stdext::exception& e) {
      g_logger.error(stdext::format("Error in readFrame: %s", e.what()));
      return false;
    }

    return true;
  }

  OutputMessagePtr getMsg() { return msg; }
  uint32_t getTime() { return time; }
  uint32_t getId() { return id; }

  OutputMessagePtr msg;
  uint32_t time = 0;
  uint32_t id = 0;
};

Bład w linijce:

Kopiuj
uint8 data[msgSize];
Kopiuj
Expression must have a constant value.

title

edytowany 4x, ostatnio: flowCRANE
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Szczecin
5

Wielkość tablicy musi być stałą kompilacji. Jak ma być dynamiczna to użyj std::vector.


RU
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:56
0

Dodałem cos takiego do filestream.h

Kopiuj
std::vector<int16_t> msgSize;

Nadal to samo.

edytowany 1x, ostatnio: flowCRANE
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Szczecin
1

Użyj std::vector zamiast tablicy...


RU
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:56
0

Możesz pokazać jak ma to wyglądać?

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:20 minut
1

Tablica ma nazwę data, a nie msgSize. Wywaliłeś nie to co trzeba.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
RU
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:56
0

Coś takiego?

Kopiuj
int16_t msgSize = fin->getU16();
std::vector<int> msgSize;
fin->read(0, msgSize);
msg = OutputMessagePtr(new OutputMessage);
msg->addBuffer(msgSize, 0);
edytowany 2x, ostatnio: flowCRANE
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:20 minut
1

Chodziło o to, byś tablicę o nazwie data zamienił na wektor o nazwie data, a nie msgSize.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Szczecin
1
Kopiuj
        int16_t msgSize = fin->getU16();
        std::vector<uint8> data(msgSize);

RU
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:56
0

Mam nadzieje ze dobrze zrozumialem:

Kopiuj
int16_t msgSize = fin->getU16();
std::vector<uint8_t> data;
fin->read(&data[0], msgSize);
msg = OutputMessagePtr(new OutputMessage);
msg->addBuffer(msgSize, &data[0]);

Jak coś się nie zgadza to daj znać. W visualu ten kody wygląda na poprawny.

edytowany 1x, ostatnio: flowCRANE
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Szczecin
1

Nie jest poprawny, bo data ma wielkość 0. Użyj mojego kodu.


edytowany 1x, ostatnio: kq
RU
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:56
0

Dzieki, coś kompilacja nie idzie nie moge ogarnąc dlaczego.

Kopiuj
		uint16_t msgSize = fin->getU16();
		std::vector<uint8> data(msgSize);
        fin->read(&data[0], msgSize);
        msg = OutputMessagePtr(new OutputMessage);
        msg->addBuffer(msgSize, &data[0]);

Kopiuj
void addBuffer(uint16 length, uint8* bytes);
std::string getBuffer() { return std::string((char*)m_buffer + m_headerPos, m_messageSize); }
Kopiuj
error LNK2001: unresolved external symbol "public: void __thiscall OutputMessage::addBuffer(unsigned short,unsigned char *)" (?addBuffer@OutputMessage@@QAEXGPAE@Z)
edytowany 3x, ostatnio: ruth
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Szczecin
0

void addBuffer(uint16 length, uint8* bytes); to funkcja wolna
void __thiscall OutputMessage::addBuffer(unsigned short,unsigned char *) to funkcja klasy (niestatyczna). Jak chcesz zdefiniować funkcję klasy, to zdefiniuj funkcję klasy, a nie wolną.


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.