1 Востаннє редагувалося М18х00 (11.02.2018 23:29:44)

Тема: lvalue required as left operand

Доброго всім часу доби! Ось помилка, мабуть компілятор, напевно, не може скоріше всього працювати з покажчиком, напевно не знає мабуть з яким кроком додавати або якось так. Абсолютно не зміркую, як його красиво й гарно перевантажити, або що взагалі в цьому випадку дописати, щоб гарно і красиво.?

// spec1_the_operator_new_function1.cpp
#include <malloc.h>
#include <memory.h>
#include <stdio.h>

class Blanks
{
public:
    Blanks(){}
    void *operator new( size_t stAllocateBlock, char chInit );
    void *Blanks::operator new( size_t stAllocateBlock, char chInit[] );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
    void *pvTemp = malloc( stAllocateBlock );
    if( pvTemp != 0 )
        memset( pvTemp, chInit, stAllocateBlock );
    return pvTemp;
}


void *Blanks::operator new( size_t stAllocateBlock, char chInit[] )
{
    void *pvTemp = malloc( stAllocateBlock );
    if( pvTemp == 0 ) return pvTemp;
    memset( pvTemp, 0, stAllocateBlock );
    while ( chInit && stAllocateBlock )
    {
        stAllocateBlock--;  pvTemp++ = chInit++;// .cpp|29|error: lvalue required as left operand of assignment
    }        
    return pvTemp;  
}
// For discrete objects of type Blanks, the global operator new function
// is hidden. Therefore, the following code allocates an object of type
// Blanks and initializes it to 0xa5
int main()
{
   Blanks *a5 = new(0xa5) Blanks;
   printf("Pamjat v adresi = %d.\n" ,a5);
   //printf("V adresi zaljagae = %d.\n" ,((int)(*a5));
   Blanks *tsupakabra = new(0xAF5, "tsupakabra") Blanks;
   printf("Pamjat v adresi = %s.\n" , (*char) tsupakabra);
   return 0;
}

2

Re: lvalue required as left operand

А хто буде вказівники розіменовувати? Керніган з Рітчі?

Подякували: М18х001

3

Re: lvalue required as left operand

Ах, отож!!!!

4

Re: lvalue required as left operand

Дякую!!! Ото ж так!

Далі  .cpp|29|error: 'void*' is not a pointer-to-object type|

5 Востаннє редагувалося М18х00 (11.02.2018 23:43:41)

Re: lvalue required as left operand

*(char[])pvTemp++ = *chInit++;

Ось так

6 Востаннє редагувалося М18х00 (12.02.2018 00:01:54)

Re: lvalue required as left operand

Лаєься..

||=== Build: Debug in spec1_the_operator_new_function1 (compiler: GNU GCC Compiler) ===|
.cpp|11|warning: extra qualification 'Blanks::' on member 'operator new' [-fpermissive]|
.cpp|29|warning: ISO C++ forbids incrementing a pointer of type 'void*' [-Wpointer-arith]|
.cpp|29|warning: ISO C++ forbids casting to an array type 'char []' [-fpermissive]|
.cpp||In function 'int main()':|
.cpp|39|warning: format '%d' expects argument of type 'int', but argument 2 has type 'Blanks*' [-Wformat=]|
.cpp|41|error: no matching function for call to 'Blanks::operator new(sizetype, int, const char [11])'|
.cpp|41|note: candidates are:|
.cpp|13|note: static void* Blanks::operator new(size_t, char)|
.cpp|13|note:   candidate expects 2 arguments, 3 provided|
.cpp|22|note: static void* Blanks::operator new(size_t, char*)|
.cpp|22|note:   candidate expects 2 arguments, 3 provided|
.cpp|42|error: expected primary-expression before 'char'|
.cpp|42|error: expected ')' before 'char'|
.cpp|41|warning: unused variable 'tsupakabra' [-Wunused-variable]|
||=== Build failed: 3 error(s), 5 warning(s) (0 minute(s), 1 second(s)) ===|


Де третій аргумент? Чім компілятор дививсь?

7

Re: lvalue required as left operand

В оголошенні функції

void *Blanks::operator new( size_t stAllocateBlock, char chInit[] );

другий параметр являє собою покажчик на char, бо в цьому випадку відбувається розкладання (decay) масиву. Тобто насправді функція має сигнатуру:

void *Blanks::operator new( size_t stAllocateBlock, char * chInit );

Наскільки я знаю в C++ не можна оголосити функцію в яку передається по значенню масив, такі масиви "розкладаються" на вказівник на перший елемент. Передати масив можна тільки по посиланню щось типу char & (chInit[N]) чи якось так. Але при цьому розмір масива N має бути відомий на етапі компіляції.

8 Востаннє редагувалося koala (12.02.2018 09:15:09)

Re: lvalue required as left operand

  1. Ви не вказали, що саме намагаєтеся зробити, а без цього "гарно і красиво" буде взагалі викинути весь ваш код і залишити один std::cout<<"Hello world".

  2. Якщо хочете виводити вказівники, як числа - перетворюйте їх на числа або використовуйте специфікатор для вказівників (%p).

  3. Взагалі-то в C++ радять використовувати cout, а не printf.

  4. Стрічкові літерали ("tsupakabra") в сучасних версіях C++ мають тип const char * (незмінні), їх не можна пхати до функції, що приймає просто char *.