Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
1

Непонятный вывод

06.07.2011, 22:46. Просмотров 1043. Ответов 29
Метки нет (Все метки)

У меня есть следующий код функции на С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void CursorPosition(HWND hWnd, int xPosition, int yPosition, int xCell, int yCell, int sx, int sy) {
    int oneStepOnX = sx/8;
    int oneStepOnY = sy/8;
 
    TCHAR sumbolsChar[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
    TCHAR sumbolsInt[] = { '1', '2', '3', '4', '5', '6', '7', '8' };
 
    TCHAR intPos;
    TCHAR charPos;
 
    intPos = sumbolsInt[xPosition/oneStepOnX];
    charPos = sumbolsChar[yPosition/oneStepOnY];
 
    TCHAR out[2];
    out[0] = intPos;
    out[1] = charPos;
 
    MessageBox(hWnd, out , _T("Координаты"), MB_OK);
}
В окно сообщений выводит правильные координаты, и потом разные китайские иероглифы. В отладчике видно, что переменные intPos и charPos имеют правильные значения. Но после их занесения в массив out они смешиваются с каким-то мусором. Почему??
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2011, 22:46
Ответы с готовыми решениями:

Непонятный вывод значений синуса
Есть вот такой код: #include <iostream> #include <cmath> using namespace...

Непонятный вывод структуры через функцию
#include <cstdlib> #include <iostream> using namespace std; struct st ...

Непонятный вывод: постфиксные и префиксные инкремент/декремент
Под спойлером весь который можно просто скопипастить и запустить в онлайн...

Непонятный код?
Подскажите, что выполняется в следующем коде и каким образом? int main() { ...

Непонятный Код
К какому языку относится следующий код: use Net::SSH2; my $user =...

29
Mischanja
Всегда не хватает времени
118 / 118 / 20
Регистрация: 15.10.2009
Сообщений: 493
06.07.2011, 22:53 2
C++
1
MessageBox(hWnd, out , _T("Координаты"), MB_OK);
попробуй на англ написать Координаты
0
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
06.07.2011, 22:58  [ТС] 3
Он выводит в самом окне
0
Миниатюры
Непонятный вывод  
Bers
Заблокирован
06.07.2011, 22:58 4
попробуйте сделать вот так:

Цитата Сообщение от zuq Посмотреть сообщение
TCHAR out[3];
out[0] = intPos;
out[1] = charPos;
out[3] = '\0';
0
Mischanja
Всегда не хватает времени
118 / 118 / 20
Регистрация: 15.10.2009
Сообщений: 493
06.07.2011, 22:59 5
кинь проект
0
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
06.07.2011, 23:00  [ТС] 6
Цитата Сообщение от Bers Посмотреть сообщение
попробуйте сделать вот так:
Тогда выводит два нужных символа, и один иероглиф
0
Bers
Заблокирован
06.07.2011, 23:02 7
попробуйте тип char вместо TCHAR
0
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
06.07.2011, 23:03  [ТС] 8
Пробовал - char нельзя засунуть в MessageBox()
0
Bers
Заблокирован
06.07.2011, 23:08 9
Цитата Сообщение от zuq Посмотреть сообщение
робовал - char нельзя засунуть в MessageBox()
Ну я ж как то засовываю:

C++
1
2
3
4
5
6
char out[3];
    out[0] = '1';
    out[1] = '2';
    out[2] = '\0';
 
    MessageBox(NULL, out , "Координаты", MB_OK);
выведет в окошке 12

Добавлено через 36 секунд
на что он ругается, если сделать char ?
0
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
06.07.2011, 23:14  [ТС] 10
Если написать, так как вы предложили
C++
1
2
3
4
5
6
char out[3];
    out[0] = '1';
    out[1] = '2';
    out[2] = '\0';
 
    MessageBox(NULL, out , "Координаты", MB_OK);
Код
1>d:\projects\test_win32\test_win32\test_win32.cpp(253): error C2664: MessageBoxW: невозможно преобразовать параметр 2 из "char [3]" в "LPCWSTR"
1>          Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
TCHAR out[3];
 out[0] = intPos;
 out[1] = charPos;
out[3] = '\0';
 
    MessageBox(hWnd, out , _T("Coordinates"), MB_OK);
}
С таким вариантом вскакивает окно сообщений и после нажатия ОК программа вылетает, ссылаясь на Run-Time Check Failure #2 - Stack around the variable 'out' was corrupted.
0
Bers
Заблокирован
06.07.2011, 23:17 11
странно... вы в какой IDE пишите?

попробуйте вот так:

C++
1
2
3
4
5
6
   char out[3];
    out[0] = '1';
    out[1] = '2';
    out[2] = '\0';
 
    MessageBox(NULL, &out[0] , "Координаты", MB_OK);
0
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
06.07.2011, 23:19  [ТС] 12
Все те-же ошибки
0
Bers
Заблокирован
06.07.2011, 23:19 13
все, я понял. Если вы в студии - нужно поставить в конфигурации флажок "использовать многобайтную кодировку"

И потом спокойно пишите:


C++
1
2
3
4
5
6
    char out[3];
    out[0] = '1';
    out[1] = '2';
    out[2] = '\0';
 
    MessageBox(NULL, out , "Координаты", MB_OK);
1
zuq
95 / 95 / 5
Регистрация: 10.04.2011
Сообщений: 256
06.07.2011, 23:21  [ТС] 14
Да Все работает. Спасибо
0
schdub
Эксперт С++
3039 / 1381 / 421
Регистрация: 19.01.2009
Сообщений: 3,700
Завершенные тесты: 1
06.07.2011, 23:23 15
Цитата Сообщение от Bers Посмотреть сообщение
нужно поставить в конфигурации флажок "использовать многобайтную кодировку"
// ...
char out[3];
Bers, многобайтовая кодировка это wchar_t или ?
0
Bers
Заблокирован
07.07.2011, 00:08 16
Цитата Сообщение от schdub Посмотреть сообщение
Bers, многобайтовая кодировка это wchar_t.
Совершенно по барабану.
Есть нормальный символьный тип данных - char. Есть поддержка многобайтовой кодировки от студии. Больше - ничо не нада. Все работает, как нужно.

Добавлено через 58 секунд
от чара требуется только две вещи:
1. Весить стабильно 1 байт.
2. Уметь хранить русские буквы (здесь IDE помогает).

Больше нафег ничо не нада.

Добавлено через 41 минуту
если кому то очень интересно разобраться с юникодом:

http://wm-help.net/books-online/print-page/59464/59464-13.html
0
easybudda
Модератор
Эксперт CЭксперт С++
10148 / 6055 / 1522
Регистрация: 25.07.2009
Сообщений: 11,476
07.07.2011, 01:16 17
C
1
MessageBoxA(NULL, out , "Координаты", MB_OK);
и можно ничего не менять...
0
Bers
Заблокирован
07.07.2011, 01:42 18
Цитата Сообщение от easybudda Посмотреть сообщение
и можно ничего не менять...
Можно конечно заюзать TCHAR с егошними макросами. только нафег нужно
0
easybudda
Модератор
Эксперт CЭксперт С++
10148 / 6055 / 1522
Регистрация: 25.07.2009
Сообщений: 11,476
07.07.2011, 02:46 19
Цитата Сообщение от Bers Посмотреть сообщение
Можно конечно заюзать TCHAR с егошними макросами.
А чем ANSI версия MessageBox не устроила? Если в планах поддержка Unicode, так лучше её сразу делать, а так MessageBoxA() - самый незамороченный вариант.


 Комментарий модератора 
Bers, и кстати... Пишите по-русски!
Официальным языком форума является русский язык.
...
Избегайте грамматических ошибок при написании сообщений - уважайте себя и других участников форума.
...
Запрещено использовать нецензурные выражения в любом виде, оскорблять других участников форума, умышленно использовать выражения, противоречащие правилам русского языка.
Правила форума
0
Bers
Заблокирован
07.07.2011, 09:46 20
Цитата Сообщение от easybudda Посмотреть сообщение
Bers, и кстати... Пишите по-русски!
А я что, по-английски пишу?
Что-то я вообще не понял комментарий модератора из 19 поста.
0
07.07.2011, 09:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2011, 09:46

Непонятный синтаксис
Вот есть обявление. sp<DataSource> source; sp<DataSource> это что? ...

Непонятный typedef
typedef int (*LPMYDLLFUNC)(int,int); после данного typedef, LPMYDLLFUNC...

Непонятный синтаксис.
В VC 2010 вместо int main(int argc, char *argv) написано int WINAPI...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru