1 Востаннє редагувалося Betterthanyou (02.06.2016 05:41:42)

Тема: WriteConsoleOutputCharacterA, не зрозуміла помилка

Я начебто все правильно написав, ось синтаксис WriteConsoleOutputCharacter

BOOL WINAPI WriteConsoleOutputCharacter(
  _In_  HANDLE  hConsoleOutput,
  _In_  LPCTSTR lpCharacter,
  _In_  DWORD   nLength,
  _In_  COORD   dwWriteCoord,
  _Out_ LPDWORD lpNumberOfCharsWritten
);

Але й в мене після спрацьовування функції виникає якась помилка, чому ?

#include <Windows.h>

void main()
{
    COORD coord;
    coord.X = 5;
    coord.Y = 5;

    WriteConsoleOutputCharacterA(
        GetStdHandle(STD_OUTPUT_HANDLE),
        "ABS",
        4,
        coord,
        NULL
    );
}

http://replace.org.ua/misc.php?action=pun_attachment&amp;item=1299&amp;download=0
if there is a handler for this exception, the program may be safely continued

Post's attachments

Untitled.png 43.33 kb, 76 downloads since 2016-06-02 

2 Востаннє редагувалося ADR (02.06.2016 14:03:26)

Re: WriteConsoleOutputCharacterA, не зрозуміла помилка

Останній параметр позначений як _Out_, а ви його не задали (точніше задали як NULL, а там має бути посилання на буфер типу double word). От воно і пробує писати у невиділену ділянку пам'яті (0x00000000).

Подякували: koala, Betterthanyou, leofun013

3

Re: WriteConsoleOutputCharacterA, не зрозуміла помилка

Так, дійсно в цьому була помилка, дякую
Але чого мені потрібно отримувати кількість написаних символів коли мені це не цікаво.
Все що робить lpNumberOfCharsWritten це вертає довжину nLength, навіть якщо я передам в lpCharacter один символ а в nLength напишу 4 (цифру)

4 Востаннє редагувалося Betterthanyou (02.06.2016 18:17:05)

Re: WriteConsoleOutputCharacterA, не зрозуміла помилка

Я хотів зробити таке....

Код

#include <Windows.h>
#include <time.h>
#include <stdlib.h>

void main()
{
    srand(time(NULL));

    SetConsoleTitleA("Console");

    DWORD lpNumberOfCharsWritten;

    COORD coord;
    
    char ch;

    HANDLE cons = GetStdHandle(STD_OUTPUT_HANDLE);

    while(true)
    {
        coord.X = rand() % 80;
        coord.Y = rand() % 25;

        ch = rand() % 256;

        WriteConsoleOutputCharacterA(
            cons,
            &ch,
            1,
            coord,
            &lpNumberOfCharsWritten
        );

        WORD color_;

        switch (rand() % 5)
        {
        case 1:color_ = FOREGROUND_BLUE; break;
        case 2:color_ = FOREGROUND_GREEN; break;
        case 3:color_ = FOREGROUND_RED; break;
        case 4:color_ = FOREGROUND_INTENSITY; break;
        }

        WriteConsoleOutputAttribute(
            cons,
            &color_,
            1,
            coord,
            &lpNumberOfCharsWritten
        );

        coord.X = rand() % 80;
        coord.Y = rand() % 25;

        ch = ' ';

        WriteConsoleOutputCharacterA(
            cons,
            &ch,
            1,
            coord,
            &lpNumberOfCharsWritten
        );
    }
}


EXEшка




http://s8.hostingkartinok.com/uploads/images/2016/06/a9940255a85f096bd323e242cb1c04d4.png

5 Востаннє редагувалося ADR (03.06.2016 20:52:41)

Re: WriteConsoleOutputCharacterA, не зрозуміла помилка

Betterthanyou написав:

Так, дійсно в цьому була помилка, дякую
Але чого мені потрібно отримувати кількість написаних символів коли мені це не цікаво.
Все що робить lpNumberOfCharsWritten це вертає довжину nLength, навіть якщо я передам в lpCharacter один символ а в nLength напишу 4 (цифру)

Тоді або ігноруйте дану помилку (загорніть в try catch. Але це забере трохи ресурсів, та й взагалі не найкращий варіант), або просто не звертайте увагу на змінну, в якій буде записаний результат)

Подякували: Betterthanyou1

6

Re: WriteConsoleOutputCharacterA, не зрозуміла помилка

Порада ігнорувати помилку - завжди погана. Тут, очевидно, треба робити змінну (і в ідеалі - перевіряти та викидати виключну ситуацію, якщо повернеться не те). А також перевіряти значення, яке повернула функція.

Betterthanyou написав:

Але чого мені потрібно отримувати кількість написаних символів коли мені це не цікаво.

WinAPI - це низькорівневий інтерфейс. Тут, фактично, функція приймає 4 параметри і повертає пару (bool,int), просто bool повертається в узгоджену з мовою позицію, тому не потребує явного створення змінної, а int потребує. Але обидва значення реально повертаються незалежно від вашого бажання, бо такий інтерфейс функції. Хочете високорівневу абстракцію над WinAPI - беріть якийсь фреймворк чи пишіть власну обгортку зі зручним інтерфейсом.

Подякували: leofun011