1

(7 відповідей, залишених у C/C++)

Лаєься..

||=== 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)) ===|


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

2

(7 відповідей, залишених у C/C++)

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

Ось так

3

(7 відповідей, залишених у C/C++)

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

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

4

(7 відповідей, залишених у C/C++)

Ах, отож!!!!

5

(7 відповідей, залишених у C/C++)

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

// 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;
}

6

(4 відповідей, залишених у C/C++)

І все-таки. Так чі інакше в цієї прозі міститься щось надзвичайно незрозуміле, якась таємниця.

Прога таки компілюється, тобто нічого поганого начебто немає.

#include <stdio.h>
#include <conio.h>

int main( void )
{
    char string[500];
    printf( "wwedi gets: " );
    gets( string );
    printf( "%s\n", string );
    printf( "wwedi scanf: " );
    scanf( "%s", string, sizeof(string) );
    printf( "%s\n", string );
    printf( "wwedi gets: " );
    gets( string );
    printf( "%s\n", string );
    return 0;
}

gets спочатку добряче працюе, а в кінці просто валить програму. Що може бути не так?
З чого може слідувати що праця gets залежить від попередній роботи функції scanf? Чі як?
Та і що може їх звьязувати? Потік? І що з ним? Ніби то всі симвозли зчітані, потік чистий.
А хоча б й нехай він містить символи, ну зчітає їх в змінну що тут такого. А потік чистий, адже з нього прочитали. Так що?

7

(16 відповідей, залишених у C/C++)

Я очікував що програма буде неодмінно чекати введення ентер. Я не знаю чому але так завжди відбувалося.
Якщо я ввів не один символ а два ( або пять ) підряд, тільки після натискання ентер відбувається enter.

Я міг очікувати, що 1) буде прийнятий один символ а решта загубляться.
2) швидше за все, напевно, один символ буде витягнутий з ,,потоку,,. Наступний по ходу символ буде
витягнутий далі по ходу програми, а в нашому прикладі на другому (наступному) кільці циклу.

А тут відбувається те що я не міг очікувати. Як я далі можу програмувати якщо я не розумію що відбувається?
А я не розумію зовсім.

Спробуйте ввести самі в консоль моєї програми два символи поспіль і ви побачите цей ефект.

8

(16 відповідей, залишених у C/C++)

Гаразд, дуже пізня година, я правда може вже дивлюся і не тямлю.

9

(16 відповідей, залишених у C/C++)

Так, хай навить цикл while нескінчений. Чому, чому std::cout<<ss<<std::endl; не завжди чекає введення чогось? Але ж повинна? Не розумію!

10

(4 відповідей, залишених у C/C++)

Доброго всім часу доби!

#include <stdio.h>
#include <conio.h>

int main( void )
{
    char string[500];
    printf( "wwedi scanf: " );
    scanf( "%s", string, sizeof(string) );
    printf( "%s\n", string );
    printf( "wwedi gets: " );
    gets( string );
    printf( "%s\n", string );
    return 0;
}

Прога навить не виконується до кінця, падає.  Двогодинне гуглення нічого не зясувало. Не пояснило.  Всюди мов Функція gets() зчитує символи з stdin і поміщає їх в масив символів, на який вказує str. Символи зчитуються доти, поки не зустрінеться новий рядок або EOF. Символ «новий рядок» не робиться частиною рядка, а транслюється в нульовий символ, завершиющучий рядок.

У разі успіху gets() повертає str, в іншому випадку вона повертає NULL. У випадку помилки читання вміст масиву, на який вказує str, не визначено.

Дякую за питання! Хотів написати що навить фраза в голову не лізе, та й пізно вже. Але поліз в гугл та яндекс. Буду міркувати.

От з яндексу щось   http://mail.csc.sibsutis.ru/sites/csc.s … %D0%B5.pdf    на росийській

12

(16 відповідей, залишених у C/C++)

Дякую!     for ( ; II == 0; ss ) це я забажав зробити вихід з циклу.

13

(6 відповідей, залишених у C/C++)

Звісно ж. Коли компілюються програми, створюється один виконуючий файл exe. Він і є самою программою.  Так і є. Точніше і не скажеш.

dll я сам ще нікаоли не компілював, але ніби то здається як невелика частина коду потрібного для виконуваного файла .exe. 

install.exe я просто використовую коли треба. Можливо треба теж розібратися..

14

(16 відповідей, залишених у C/C++)

Я майже зовсім не уявляю що воно той потік. Де подивитися джерельні коди?

15

(16 відповідей, залишених у C/C++)

Дякую!     Будь ласка.
Питання в тому, що такої саме поведінки я не чекав. Якщо я вводжу наприклад F і 3,
програма слухняно чекає введення. А якщо FF і 3, то вже йде в нескінченний цикл.
І ні що б 2 рази прокрутитися, її клінить.

Чи можна все так перевантажити - потоки, конструктори і інше, що б програма приймала будь-яке введення?
Я поки не уявляю, як це зробити.

Відстежити роботу потоку відладчиком я теж не бачу як.

#include <iostream>
#include <cstring>
#include <algorithm>

int II=0;

class cls
{
    char c;
    char *cc;
    int i;
  public:
    cls(char C = 0, int I = 0) : c(C), i(I), cc(0)
    {}
    cls(char *CC = 0, int I = 0) : c(0), i(I), cc(CC)
    {}
    friend std::ostream& operator<< (std::ostream &out, cls &obj)
    {
        out<<obj.c<<"  "<<obj.i;
        return out;
    }
    friend std::istream& operator>> (std::istream &in, cls &obj)
    {
        in>> obj.c >> obj.i;
        return in;
    }

    cls& operator()()
    {
        if(0 == strcmp(c,"stop"))
        {
            II = 1;
        }
        return *this;
    }

};




main()

{
  cls s('a',10),ss(' ',0);
  std::cout<<"abc"<<std::endl;
  std::cout<<s<<ss<<std::endl;

  for ( ; II == 0; ss )//_each
  {
     std::cin >> ss;
     std::cout<<ss<<std::endl;
  }

  return 0;
}





||=== Build: Debug in ostream_operator2 (compiler: GNU GCC Compiler) ===|
E:\ZZ\ostream_operator2\ostream_operator2.cpp||In constructor 'cls::cls(char, int)':|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|12|warning: 'cls::i' will be initialized after [-Wreorder]|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|11|warning:   'char* cls::cc' [-Wreorder]|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|14|warning:   when initialized here [-Wreorder]|
E:\ZZ\ostream_operator2\ostream_operator2.cpp||In constructor 'cls::cls(char*, int)':|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|12|warning: 'cls::i' will be initialized after [-Wreorder]|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|11|warning:   'char* cls::cc' [-Wreorder]|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|16|warning:   when initialized here [-Wreorder]|
E:\ZZ\ostream_operator2\ostream_operator2.cpp||In member function 'cls& cls::operator()()':|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|31|warning: invalid conversion from 'char' to 'const char*' [-fpermissive]|
c:\mingw\include\string.h|43|note: initializing argument 1 of 'int strcmp(const char*, const char*)'|
E:\ZZ\ostream_operator2\ostream_operator2.cpp||In function 'int main()':|
E:\ZZ\ostream_operator2\ostream_operator2.cpp|50|warning: for increment expression has no effect [-Wunused-value]|
||=== Build finished: 0 error(s), 8 warning(s) (0 minute(s), 44 second(s)) ===|
||=== Run: Debug in ostream_operator2 (compiler: GNU GCC Compiler) ===|

16

(16 відповідей, залишених у C/C++)

Ось і з'явився баг. Як тільки я вводжу більше однієї літери поспіль програма йде в нескінченний цикл.

#include <iostream>
#include <cstring>
#include <algorithm>

int II=0;

class cls
{
    char c;
    int i;
  public:
    cls(char C = 0, int I = 0) : c(C), i(I)
    {}
    friend std::ostream& operator<< (std::ostream &out, cls &obj)
    {
        out<<obj.c<<"  "<<obj.i;
        return out;
    }
    friend std::istream& operator>> (std::istream &in, cls &obj)
    {
        in>> obj.c >> obj.i;
        return in;
    }

    cls& operator()()
    {
        if(0 == strcmp(c,"stop"))
        {
            II = 1;
        }
        return *this;
    }

};




main()

{
  cls s('a',10),ss(' ',0);
  std::cout<<"abc"<<std::endl;
  std::cout<<s<<ss<<std::endl;

  for ( ; II == 0; ss )//_each
  {
     std::cin >> ss;
     std::cout<<ss<<std::endl;
  }

  return 0;
}

17

(16 відповідей, залишених у C/C++)

Тобто якщо я не плутаю, начебто все таке раніше проходило...

18

(16 відповідей, залишених у C/C++)

Розпишіть. Я можу сам й не побачіти. Буду вдячний.

А що йому в цьому виразі не подобається?

cls& operator()()
    {
        if(0 == strcmp(c,"stop"))
        {
            II = 1;
        }
        return this;
    }

invalid initialization of non-const reference of type 'cls&' from an rvalue of type 'cls*'|

19

(18 відповідей, залишених у C/C++)

Я сам хвилини майже три вчітувався в умову, і строго не впевнений що зрозумів. Загалом може рішення може бути чімось на кшталт цього, дивись сам, я міг написати яку завгодно ахінею, це так, мов може якось так.

#include <stdio.h>
#include <algorithm>
#include <iostream>


#define INT_MIN (-2147483647+1)
#define INT_MAX 2147483647

class Mi_Clas_Analiz_Mas {
    int min_par;
    int max_nepar;

public:
    Mi_Clas_Analiz_Mas() : min_par(INT_MAX),max_nepar(INT_MIN)
    {}
    void operator()(int temp) {
        if (temp%2 == 0) { if (min_par > temp) min_par = temp; } //та мінімуму парних
        else { if (min_par < temp) max_nepar = temp; }
    }
    void pokazi()  { printf(" minimalne parne = %d   , maximalne neparne = %d\n" , min_par, max_nepar); }
    void dobutok() const { printf(" znajdenyj dobutok = %d\n", (max_nepar*min_par)); }
};

int main() {
    Mi_Clas_Analiz_Mas An_1;
    An_1 = forieach(my_masyv, my_masyv+sizeof(my_masyv)/sizeof(my_masyv[0]), An_1);
    An_1.pokazi();
    An_1.dobutok();

return 0;
}

20

(16 відповідей, залишених у C/C++)

Всіх з приходом 2018 року!  Будь ласка, подивіться, повідомлення про помилку я не зрозумію, не зрозумію що не так. Не бачу. А як же треба?

Ось тут

    int operator()
    {
        if(0 == strcmp(c,"stop"))
        {
            II = 1;
            return II;
        }
    }

ostream_operator2.cpp|29|error: declaration of 'operator()' as non-function|

#include <iostream>

class cls
{
    char c;
    int i;
  public:
    cls(char C = 0, int I = 0) : c(C), i(I)
    {}
    friend std::ostream& operator<< (std::ostream &out, cls &obj)
    {
        out<<obj.c<<"  "<<obj.i;
        return out;
    }
    friend std::istream& operator>> (std::istream &in, cls &obj)
    {
        in>> obj.c >> obj.i;
        return in;
    }

    int operator()
    {
        if(0 == strcmp(c,"stop"))
        {
            II = 1;
            return II;
        }
    }

};

int II=0;


main()

{
  cls s('a',10),ss(' ',0);
  std::cout<<"abc"<<std::endl;
  std::cout<<s<<ss<<std::endl;

  foreah ( ; II == 0; ss )
  {
     std::cin >> ss;
     std::cout<<ss<<std::endl;
  }

  return 0;
}