[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 3123»
Форум » Программирование и WEB-дизайн » C++ » Вопросы по C++ (Вопросы по C++)
Вопросы по C++
KiLLeR96
Модераторы
Модератор
07.08.12 13:54
Offline
Почему некоректно отображаются русские символы в консоли?
Code

#include "StdAfx.h"
#include <stdio.h>
#include "iostream"    
using namespace std;
#include <locale.h>

int main(){   
   setlocale( LC_ALL,"Russian" );
   unsigned char c;
   cin >> c;
   cout << "Значением "<< c <<" является "<< int(c)<<'\n';
   system("pause");
   return 0;
}

Вот например ввожу в консоли 'л'(входные данные). а консоль отображает:
Отредактировал KiLLeR96 - Вторник, 07.08.12, 13:55
МоДиРатОр)))000)))))

wmysterio
Администраторы
Скриптер
09.08.12 00:20
Offline
KiLLeR96, привет. давно я на консоли не писал. У меня тоже выводил в место русских символов какую то дребедень. Либо какой то знак, либо знак вопроса. Как это исправить не знаю, нужно на форумах смотреть. Там есть примеры, но в большинстве случаев у меня те коды не компилируются.

Dock174
Проверенные
03.02.13 17:53
Offline
KiLLeR96, когда работали в универе в VS 2010, русские символы не корректно отображались на ENG версия, нам спецом ставили Ru версии, чтобы кириллица отображалась норм. Если не помог, жаль)

FOXMAN
Проверенные
03.02.13 18:32
Offline
По моему отображение зависит от кодировки, нужно сменить кодировку в компиляторе.
Всем привет :3

Slivkin-Sergey
Модераторы
12.05.14 11:18
Offline
Раз уж тема называется "Вопросы по С++", то я ей и воспользуюсь. У меня есть несколько вопросов по calling convention. На сайте Майкрософт описаны два таких соглашения:
Цитата
__cdecl

Параметры помещаются в стек в обратном порядке (справа налево)

__stdcall

Параметры помещаются в стек в обратном порядке (справа налево)

Чем они отличаются и отличаются ли вообще?

Ещё один вопрос. Соглашение _clrcall
Цитата
Параметры загружаются в стек выражений CLR по-порядку (слева направо).

Что за такой стек выражений? И чем он отличается от обычного?

А также __thiscall:

Цитата
Параметры помещаются в стек; указатель this хранится в регистре ECX


Что за такой this?
Отредактировал Slivkin-Sergey - Понедельник, 12.05.14, 11:18

BoPoH
Друзья
12.05.14 18:50
Offline
Кажется где-то на SB Forums была тема от Listener'а, где описывалось их использование....
Впрочем, попробую объяснить.

Для начала, наверное, нужно объяснить, что такое стек. А чтобы объяснить, что такое стек, нужно иметь понятие о работе с памятью. Я не знаю, есть ли у тебя какие-то знания об этом. Если их нет, то все дальнейшие объяснения без предисловия будут бесполезны (к тому же, сейчас мне надо уйти, могу описать всё позже).

Slivkin-Sergey
Модераторы
12.05.14 20:18
Offline
Я знаю, что такое стек. Это как "палка, на которую нанизывают данные". Ещё знаю, что на него насаживаются аргументы для функций, и оттуда же функция их собирает. Знаю про pop и push. О работе с памятью представление имею довольно общее (в курсе про размеры типов данных, указателях, массивах указателей и RAM, о принципе выделения сегмента памяти для программы ничего не знаю).
Отредактировал Slivkin-Sergey - Понедельник, 12.05.14, 20:20

BoPoH
Друзья
13.05.14 00:34
Offline
Ну тогда всё будет проще. Указатель на стек хранится в регистре ESP. Регистры - это что-то вроде переменных процессора, всего их несколько (в гугле пробить несложно).
Самые основные, которые следует знать - это ESP и ECX. Остальные используются по-разному. Как я уже сказал, ESP содержит указатель на стек. Так вот, в функцию параметры передаются обычно через стек. По крайней мере, так происходит с cdecl, stdcall а также thiscall (если не считать самого this, который передаётся в регистре ECX). Для этого используется push (о котором, ты, как я понял, знаешь). push помещает параметр на верхушку стека, при этом адрес стека (содержащийся в ESP) увеличивается. Так вот, после того как ты вызываешь функцию, адрес стека нужно вернуть в прежнее значение, как было до того, как ты начал помещать параметры для функции в стек. Скажем у нас есть две функции - f1 и f2. Если функция f2 типа cdecl и ты вызываешь её из функции f1, то после вызова f2 в функции f1 должно произойти возвращение стека к первоначальному состоянию (обычно это sub esp, N; где N - кол-во байт, которое было затрачено на передачу параметров через стек). Если же f2 - stdcall функция, то после неё ничего возвращать в прежнее состояние не нужно. Стек вернётся в прежнее состояние благодаря инструкции retn N в самом конце функции (точнее, там где нужно завершить выполнение функции, не всегда это бывает в самом конце при наличии различных условий), где N - количество байт, затраченных на запись параметров для функции в стек.
Теперь о thiscall. По сути, это тот же самый cdecl, только первым параметром всегда идёт this, который записывается в регистр ECX (на деле разницы нет, в какой момент производить запись, главное - порядок передачи остальных параметров). this - это указатель на объект, к которому применяется данная функция. В C++ существует такое понятие, как "класс" (впрочем, не только в C++). Это уже отдельная тема по сути, по ней много статей в инете, думаю, сможешь найти. Так вот, thiscall используется именно для вызова функций, которые применяются для объекта определённого класса.
Приведу пример. В GTA SA есть класс CVehicle, который описывает структуру средств передвижения (машин, мотоциклов и т.д.). Также у этого класса есть функции, которые применимы только к объектам этого класса. К примеру у нас есть машина и мы хотим узнать её тип. У нас есть функция CVehicle::GetType(). Скажем в переменной avto у нас записан указатель на объект класса CVehicle, т.е. на какое-то средство передвижение. Но, какое именно, мы не знаем. Чтобы узнать его тип, мы можем использовать функцию GetType следующим образом:

Код
int avtoType = avto->GetType();
Таким образом это выглядит на C++. В ассемблерном коде же мы увидим, что в ECX запишется указатель на наше средство передвижения - объект класса CVehicle, а затем произойдёт вызов указанной функции.

Насчёт clrcall я ничего не знаю. По крайней мере я почти нигде не видел о нём упоминания, да и не видел его использования.
Есть ещё fastcall. В этом случае первые два параметра передаются в регистры ECX и EDX, а остальные передаются через стек, как в cdecl. Обычно такие функции используют для создания хуков (подмены) функций типа thiscall.
Вроде всё. Если что непонятно - спрашивай.
Отредактировал BoPoH - Вторник, 13.05.14, 00:37

Slivkin-Sergey
Модераторы
13.05.14 12:34
Offline
Цитата BoPoH ()
В ассемблерном коде же мы увидим, что в ECX запишется указатель на наше средство передвижения - объект класса CVehicle, а затем произойдёт вызов указанной функции.

Зачем же это надо?
Цитата BoPoH ()
возвращение стека к первоначальному состоянию (обычно это sub esp, N; где N - кол-во байт, которое было затрачено на передачу параметров через стек)

То есть, например, после вызова функции с двумя интовскими параметрами должно быть sub esp, 8?

И общий вопрос, зачем помещать параметры в регистр? Наверное я когда-нибудь пойму, как глуп этот вопрос, но я начал изучать ассемблер только 2 недели назад (из желания покопаться в экзешнике одной хорошей игры).

BoPoH
Друзья
13.05.14 16:19
Offline
Я тут кое-что перепутал со стеком, почему-то не обратил на это внимание. При помещении параметров для функции стек при помощи push, адрес стека в ESP уменьшается, а не увеличивается. А для возврата его в первоначальное состояние после вызова функции используется не sub, а add - т.е. прибавление.

Цитата Slivkin-Sergey ()
Зачем же это надо?
Так устроен thiscall. В ECX должен содержаться указатель на объект класса.

Цитата Slivkin-Sergey ()
То есть, например, после вызова функции с двумя интовскими параметрами должно быть sub esp, 8?
Да, только не sub, а add, как я уже указал выше.

Цитата Slivkin-Sergey ()
И общий вопрос, зачем помещать параметры в регистр?
Параметры в регистры помещают только при вызове thiscall и fastcall. Из названия fastcall следует и вывод, почему параметры передают через регистры - это делает работу функции быстрее. Запись значения в регистр происходит быстрее, чем запись значения в стек, т.к. регистры находятся непосредственно в памяти процессора, скорость которой гораздо выше скорости оперативной памяти (в которой хранится стек). Следовательно, любые операции со стеком/памятью будут медленнее операций с регистрами. Конечно, речь идёт о долях миллисекунд, но когда речь идёт о большой программе/игре, в которой происходит выполнение большого кол-ва функций, то, конечно, необходимо оптимизировать программу/игру для улучшения производительности. Конечно, на ассемблере сложные программы и, тем более, игры не пишут, поэтому вся оптимизация обычно ложится на плечи компилятора.
Если ты собрался изучать экзешник игры, то, вероятно, будешь использовать IDA. Если так, то для неё есть хороший плагин HexRays, позволяющий преобразовывать функции на ассемблере в функции на C++. Во многих сборках IDA он присутствует сразу. Чтобы преобразовать функцию, нужно лишь нажать F5, предварительно тыкнув курсором на место нужной тебе функции.
Отредактировал BoPoH - Вторник, 13.05.14, 16:26

Slivkin-Sergey
Модераторы
23.07.14 15:02
Offline
А вообще, никто не знает хорошей литературы по С++? А то я пока обучаюсь по системе "с миру по нитке".

BoPoH
Друзья
24.07.14 00:01
Offline
Цитата Slivkin-Sergey ()
А вообще, никто не знает хорошей литературы по С++? А то я пока обучаюсь по системе "с миру по нитке".

Лично я так и обучался "с миру по нитке". Не могу сказать, хорошо это или плохо, но я лучше понимал, когда у меня был исходный код какого-то приложения, чем читать заумные книжки с заумными фразами.

asdfjke
Пользователи
26.07.14 17:42
Offline
можно ли присвоить адрес сразу всему массиву, а не только конкретному элементу x[0] = *y ... в цикле? или как-то создать массив начинающийся с определенного адреса ?

BoPoH
Друзья
26.07.14 18:27
Offline
Цитата asdfjke ()
можно ли присвоить адрес сразу всему массиву, а не только конкретному элементу x[0] = *y ... в цикле? или как-то создать массив начинающийся с определенного адреса ?

Я ничего не понял. Лучше объясни, что ты хочешь сделать, т.е. для чего тебе это нужно.

Ты хочешь сделать так, чтобы в каждом элементе массива содержалось одно и то же значение? Кроме цикла, вариантов нет, насколько мне известно (если это, конечно, не массив байтов, тогда можно использовать memset).
Отредактировал BoPoH - Суббота, 26.07.14, 18:30

SHooZ
Друзья
28.07.14 18:36
Offline
Цитата Slivkin-Sergey ()
А вообще, никто не знает хорошей литературы по С++? А то я пока обучаюсь по системе "с миру по нитке".
Вот хороший учебник: http://www.ex.ua/383143

Вот сборник алгоритмов: http://www.ex.ua/4810660

Также советую почитать книги и статьи Криса Касперски и Дж. Эриксона.

Вопросы:
1. Что такое Entity?
2. Как в плюсах получить текущие оружие игрока (объект)?
3. Есть ли в СА функции для загрузки моделей как объектов? Или там обязательно каждая модель должна быть объявлена в ide?

Slivkin-Sergey
Модераторы
28.07.14 18:56
Offline
Цитата SHooZ ()
Вот хороший учебник: http://www.ex.ua/383143 Вот сборник алгоритмов: http://www.ex.ua/4810660

Не могу зайти - перекидывает на какое-то хранение информации.

SHooZ
Друзья
28.07.14 20:13
Offline
Цитата Slivkin-Sergey ()
Не могу зайти - перекидывает на какое-то хранение информации.
Упс, да, ты ведь с России...

http://www.cyberforum.ru/cpp-beginners/thread1178191.html
http://forcoder.ru/cpp/c-sbornik-receptov-951

BoPoH
Друзья
29.07.14 02:37
Offline
Цитата SHooZ ()
1. Что такое Entity?

Некая вещь, сущность, объект. В GTA SA есть класс CEntity от которого наследуются многие частоиспользуемые классы (CPed, CVehicle, CObject и т.д.).

Цитата SHooZ ()
2. Как в плюсах получить текущие оружие игрока (объект)?

Смотря что ты подразумеваешь под объектом. Оружие не имеет структуры CObject или CEntity. Там используется RwObject. В структуре CPed можно найти указатель на RwObject текущего оружия по смещению 0x4F4.

Цитата SHooZ ()
3. Есть ли в СА функции для загрузки моделей как объектов? Или там обязательно каждая модель должна быть объявлена в ide?

У каждой модели есть свой ID. Без него не может пройти обработка объекта этой модели. По идее, можно присвоить ID какой-либо модели, но надо искать такую функцию.
Отредактировал BoPoH - Вторник, 29.07.14, 02:38

Slivkin-Sergey
Модераторы
05.11.14 17:45
Offline
Сейчас перелистывал учебник по С++, совершенно спонтанно появилась непонятка. Что будет, если создать класс и поместить в его private часть какую-нибудь функцию?

Код
class Lala{
int privateFunc();
public:
int publicFunc();
};

BoPoH
Друзья
07.11.14 02:03
Offline
Цитата Slivkin-Sergey ()
Что будет, если создать класс и поместить в его private часть какую-нибудь функцию?
Тебе не разрешат вызывать эту функцию вне тела других функций этого класса.
К примеру, ты можешь из Lala::publicFunc() вызвать Lala::privateFunc(). Но если у тебя есть какая-то функция вне класса, к примеру int MyFunc(), то из неё ты не сможешь вызвать Lala::privateFunc(). А Lala::publicFunc() - сможешь.

Форум » Программирование и WEB-дизайн » C++ » Вопросы по C++ (Вопросы по C++)
Страница 1 из 3123»
Поиск: