Форум программистов, компьютерный форум, киберфорум
DirectX
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/27: Рейтинг темы: голосов - 27, средняя оценка - 4.52
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

DirectDraw - DDSURFACEDESC2 | DDSD_LPSURFACE. Рисуются только оттенки белого-чёрного

07.05.2013, 07:45. Показов 5793. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, по книге М.Фленова учусь работать с DirectDraw...

Начальный код содержал поддержку 16 битного режима, естественно, мне его не достаточно и я решил изменив кое какие параметры перейти на 32 битный формат, однако появился ряд проблем:
1. Проблема с цветом - почему то рисуются только оттенки белого-чёрного
2. Проблема с натяжением буффера на поверхность(или возможно что то другое) - почему то поверхность заполняется буффером не полностью, а несколькими "слоями что ли"..

Помогите решить или хотябы понять суть проблем (можно и исправить ошибки). гугл и мсдн по данному вопросу ничего не дал =(

Вот код основного файла:
Глобальные переменные:
C++
1
2
3
4
5
6
7
8
9
// DirectDraw Variables:
IDirectDraw7 *ppiDD;
IDirectDrawSurface7 *primsurf;
IDirectDrawSurface7 *backsurf=NULL;
IDirectDrawSurface7 *buf_surface=NULL;
BOOL bWindowed;
int iWidth, iHeight;
int color=0;
DWORD video_buf[1280][800];
InitInstance:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
iWidth=1280;
   iHeight=800;
   DXDDInit(&ppiDD, &primsurf, &backsurf, hWnd, iWidth, iHeight, 32, &bWindowed);
   
   DDSURFACEDESC2 desc;
   ZeroMemory(&desc, sizeof(desc));
   desc.dwSize = sizeof(desc);
   desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_LPSURFACE | DDSD_PITCH;
   desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
   desc.dwWidth = iWidth;
   desc.dwHeight = iHeight;
   desc.lpSurface = &video_buf;
   desc.lPitch  = iWidth*4;//ширина строки, 4 байта формат(32бит)
   ppiDD->CreateSurface(&desc, &buf_surface, 0);
WndProc:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
case WM_CREATE:
        SetTimer(hWnd,1,250,NULL);
        srand(time(NULL));
        break;
    case WM_TIMER:
        if(color < 555555)
            color = color+50;
        else
        {
            if(color > 50)
                color = color-50;
            else
                color = color+50;
        }
        FillMemory(&video_buf, sizeof(video_buf), color);
        for(int k=50; k<iWidth-50;k++)
        {
            video_buf[k][100] = 65653;
        }
        backsurf->BltFast(0, 0, buf_surface, 0, DDBLTFAST_WAIT);
        primsurf->Flip(NULL, DDFLIP_WAIT);
        break;
case WM_DESTROY:
        if (backsurf) {backsurf->Release();backsurf=0;}
        if (primsurf) {primsurf->Release();primsurf=0;}
        if (ppiDD) {ppiDD->Release();ppiDD=0;}
        PostQuitMessage(0);
        break;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.05.2013, 07:45
Ответы с готовыми решениями:

Количество черного и белого на фото
Как можно посчитать количество черного и белого на картинке в процентах на питоне?

Поменять белого и черного короля местами
На шахматном поле 2 короля( чёрный и белый). Находятся в клетках T(черный) и S(белый). Их называют домом. Нужно за наименьшее число ходов...

Дана стопка писем черного и белого цвета
Дано стопку писем черного и белого цвета. Их размещают на столе следующим образом: первый ставят на стол, второй - под низ стопки, третий -...

35
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
23.03.2014, 16:54
Студворк — интернет-сервис помощи студентам
Izual,
Цитата Сообщение от Дождь Посмотреть сообщение
В общем хер его знает, в каком формате цвета на этой поверхности в этом убогом директе 7-м, так и не понял.
Посмотрел последний вариант. Цвет задается в формате RGB565.
Можно использовать вот такую функцию:
C++
1
2
3
4
DWORD RGB565(unsigned int r, unsigned int g, unsigned int b)
{
    return (((r & 248) << 8)+((g & 252) << 3)+((b & 248) >> 3));
}
Соответственно рисование двух линий, горизонтальной и вертикальной:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
hdc = BeginPaint(hWnd, &ps);
 
int Pitch = (iWidth * 2);
BYTE* dst = (BYTE*)&video_buf;
 
// Вертикальная линия
for(int X = iWidth / 2, Y = 0; Y < iHeight; ++Y)
{
    int iOffset = Y * Pitch + X * 2;
    *(WORD *)(dst + iOffset) = RGB565(0xFF, 0x00, 0x00); // красный
}
// Горизонтальная линия
for(int Y = iHeight / 2, X = 0; X < iWidth; ++X)
{
    int iOffset = Y * Pitch + X * 2;
    *(WORD *)(dst + iOffset) = RGB565(0x00, 0x00, 0xFF); // синий
}
 
backsurf->BltFast(0, 0, buf_surface, 0, DDBLTFAST_WAIT);
primsurf->Flip(NULL, DDFLIP_WAIT);
 
EndPaint(hWnd, &ps);
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
28.03.2014, 02:43  [ТС]
DrOffset, спасибки, с цветом буду позже разбираться. Сейчас более актуален вопрос по данной теме, хоть и дождь вроде бы помог, но сделал это не через "обычный" массив, в через ссылочный, что сильно усложнило понимание кода и его "юзабилити", мне бы ссылочный тип массива привести бы к обычному, как и было в изначальном примере, только с поправкой того что не работало "что то"...

Добавлено через 4 минуты
*к изначальному: в смысле к последней поправке в 10 посте (там код и прикреплённый проэкт)
**так, что то я не догнал, пойду ка я тестить))

Добавлено через 1 час 2 минуты
***затестил, крутяк. тока пришлось в глобальные переправить:
C++
1
2
3
BYTE* dst;
int Pitch;
int iOffset;
и RGB565 функция не сработала... пришлось статичным числом заменить. А так - крутяк, то что надо!
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
28.03.2014, 13:16
Цитата Сообщение от Izual Посмотреть сообщение
тока пришлось в глобальные переправить
Понятно. Если ты как С-код собирал, то надо их надо перенести в начало блока. У меня просто С++ проект был (я твой не использовал, только файлы оттуда взял, т.к. у меня нет нужной Visual Studio).

Цитата Сообщение от Izual Посмотреть сообщение
RGB565 функция не сработала
А что значит не сработала? Ошибку покажи, наверняка ерунда какая-то простая.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
28.03.2014, 13:40  [ТС]
С++ проэкт... В VS2005. Давно заметил что в case WM_PAINT ругается объявляя переменные. (хотя могу ошибаться, может конвертнул проэкт, который был на диске к книге Фленова, а он в Си может был)

Цитата Сообщение от DrOffset Посмотреть сообщение
ерунда какая-то простая
error C3861: 'RGB565': identifier not found
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
28.03.2014, 16:36
Цитата Сообщение от Izual Посмотреть сообщение
error C3861: 'RGB565': identifier not found
Так ты функцию-то (я ее приводил в посте) вставь в тот файл, в начало например.

Добавлено через 2 минуты
Цитата Сообщение от Izual Посмотреть сообщение
Давно заметил что в case WM_PAINT ругается объявляя переменные
А, вон оно что. Ну это правильно ругается. Надо scope сделать вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
switch(a)
{
case 1:
  { // делаем scope
       int a = 1; // можно объявить
  }
  break;
case 2:
  // нет scope 
  int b = 1; //ошибка
  break;
}
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
28.03.2014, 17:19  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
я ее приводил в посте
Что то увлечён был, не заметил, подумал что в DDraw.h (или как там та библиотека называется - не подключена)..
Цитата Сообщение от DrOffset Посмотреть сообщение
Надо scope сделать вот так
Эмм, а фигурные скобки что означают в данном случае?(т.е. разница то какая? в case(switch методе))
*прочитал в вики про scope, но всё же думал что case c break устроены как данный случай, только синтаксисом слов.

Добавлено через 12 минут
**ещё один вопрос сразу:
C++
1
for(int X = iWidth / 2, Y = 0; Y < iHeight; ++Y)
как так с запятой?(ни где ещё не видел)
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
28.03.2014, 18:02
Цитата Сообщение от Izual Посмотреть сообщение
как так с запятой?(ни где ещё не видел)
Вот аналогичный пример (без цикла):
C++
1
int a = 2, b = 3;
Уверен, что встречал уже В цикле тоже самое.
А вообще в С++ есть еще оператор запятая (operator,), его можно перегружать и его суть в том, чтобы последовательно выполнять свои аргументы. Результат всего выражения - результат последнего аргумента. Но вот конкретно в этом случае, в цикле и в моем примере - работает не оператор, а запятая является просто разделителем. Такая вот двойственность.

Цитата Сообщение от Izual Посмотреть сообщение
Эмм, а фигурные скобки что означают в данном случае?
Тоже что и обычно - область видимости.
В switch, его case`ы - это полный аналог меток для goto. Т.е они не создают scope, это просто метки для перехода по условию.
C++
1
2
3
4
5
6
switch(a)
{
case 1: // если а == 1, то попадаем сюда. И если нет break, то выполнение продолжится последовательно
case 2: // при такой записи выведется (2).
     printf("2");
}
Поэтому, чтобы избежать коллизий c временем жизни переменных, внутри switch вообще запретили переменные создавать (т.е. только операции, но не объявление). Зато когда мы сами вносим область видимости (scope), то убираем это ограничение.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
28.03.2014, 20:09  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
последовательно выполнять свои аргументы
Так ведь так и получается, даже в случае с этим:
Цитата Сообщение от DrOffset Посмотреть сообщение
int a = 2, b = 3;
Так что никакой двойственности нет имхо всё логично =)
Цитата Сообщение от DrOffset Посмотреть сообщение
внутри switch вообще запретили переменные создавать
В обычном Си тоже?.. Хотелось бы придерживаться стандарта Си, т.к. он для меня как эталон. (как русский и буквица)
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
28.03.2014, 20:23
Цитата Сообщение от Izual Посмотреть сообщение
В обычном Си тоже?
Так это же оттуда и пошло, вот пример проблемы:
C
1
2
3
4
5
6
7
8
9
10
11
switch (i)
{
   case 0:
     int j; // 'j' имеет неопределенное значение
     j = 0; // 'j' инициализировано нулем, но это выражение 
            // перепрыгивается в случае 'i == 1'
     break;
   case 1:
     ++j;   // 'j' в области видимости switch, но имеет неопределенное значение
     break;
}
Собственно вот из-за таких ситуаций синтаксически это запретили. Когда мы создаем свой scope, то однозначно определяем время жизни объектов в нем:
C
1
2
3
4
5
6
7
8
9
10
11
12
switch (i)
{
   case 0:
     {
         int j; 
         j = 0;
     } 
     break;
   case 1:
     ++j;   // 'j' будет недоступно здесь, поэтому проблемы нет
     break;
}
Добавлено через 1 минуту
Цитата Сообщение от Izual Посмотреть сообщение
Так что никакой двойственности нет имхо всё логично
Двойственность не в поведении, а в том, что в одном случае это оператор, а в другом просто разделитель.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
28.03.2014, 21:19  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
оператор, а в другом просто разделитель
Wiki: конструкция языка программирования, обеспечивающая выполнение определённой команды (набора команд)
Ну разделитель - это синоним данной команды.

По поводу примеров: Т_Т что это за нелепость? Это в корне противоречит самому принципу switch оператора, который можно заменить:
C++
1
2
3
4
5
6
if(i==0)//вместо case 0
{
}
if(i==1)//вместо case 1
{
}
Всё логично, нельзя объявлять переменную в однов условии, а в другом к нему обращяться.
(п.с. естественно пример с if будет работать не так как switch, потому что в моём примере будет 2 раза проверяться суловие, а в case - один раз, заменить на if+else+ещё пары if'ов - будет уже не очень красиво, у меня такое было в коде, когда начинал программу делать, сейчас естественно оптимизировал, т.к. один из принципов хорошего программиста - стиль(ну и+производительность повысилась))
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
28.03.2014, 22:17
Цитата Сообщение от Izual Посмотреть сообщение
По поводу примеров: Т_Т что это за нелепость? Это в корне противоречит самому принципу switch оператора, который можно заменить
И чем это противоречит? Я тебе объяснял почему нельзя переменные обьвлять внутри case без scope. Первый пример - некорректный с точки зрения языка, второй - коректный. В чем нелепость? Ты следишь за нитью разговора-то?
Цитата Сообщение от Izual Посмотреть сообщение
Wiki: конструкция языка программирования, обеспечивающая выполнение определённой команды (набора команд)
Не знаю что ты там за вики смотришь, но гугл на твою цитату выдает оператор ветвления. И он тут абсолютно не при чем, т.к. мы говорим про запятую.

Добавлено через 8 минут
Цитата Сообщение от Izual Посмотреть сообщение
Всё логично, нельзя объявлять переменную в однов условии, а в другом к нему обращяться.
Дружище. Ты демонстрация знаешь что такое? Я тебе показал пример, в котором демонстрируется некоторое поведение. Это не руководство к действию, не пример для подражания, пример может обозначать некорректный код, чтобы указать на проблемы. Если я подписал, что переменная недоступна - это сделано не просто так. А что бы продемонстрировать, что она недоступна. А в случае case без scope (помним, что это просто метка) переменная была бы доступна (если бы так можно было делать). И это приводило бы к проблемам (первый пример), при переходе на метку case 1 мы имели бы доступную переменную, с неопределенным значением. Это - проблема. Поэтому - так нельзя. Все

Добавлено через 19 минут
Цитата Сообщение от Izual Посмотреть сообщение
будет 2 раза проверяться суловие, а в case - один раз
Еще по поводу этого твоего высказывания. Вот тебе пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(int argc, char* argv[])
{
    int a;
    scanf("%d", &a);
 
    switch(a)
    {
    case 1:
        printf("1\n");
        break;
    case 2:
        printf("2\n");
        break;
    case 3:
        printf("3\n");
        break;
    }
 
    return 0;
}
Вот что получается:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
_main:
    push    ebp
    mov ebp, esp
    and esp, -16
    sub esp, 32
    call    ___main
    lea eax, [esp+28]
    mov DWORD PTR [esp+4], eax
    mov DWORD PTR [esp], OFFSET FLAT:LC0
    call    _scanf
    mov eax, DWORD PTR [esp+28]
    cmp eax, 2 ; сравнение раз [case 2]
    je  L6 ; прыжок на метку раз
    cmp eax, 3 ; сравнение два [case 3]
    je  L7 ; прыжок на метку два
        ; здесь у нас как бы else [case 1] по остаточному принципу
    dec eax
    je  L10 ; прыжок на метку три
L4:
    xor eax, eax
    leave
    ret
L10:
    mov DWORD PTR [esp], OFFSET FLAT:LC1
    call    _printf ; printf("1")
    jmp L4 ; break
L7:
    mov DWORD PTR [esp], OFFSET FLAT:LC3
    call    _printf ; printf("3")
    jmp L4 ; break
L6:
    mov DWORD PTR [esp], OFFSET FLAT:LC2
    call    _printf ; printf("2")
    jmp L4 ; break
Все как я сказал. И сравнения минимум два в этом примере. Так что не надо не все то золото, что блестит. Хотя switch потенциально быстрее по другой причине - компилятор может построить таблицу переходов. И обойтись вообще без сравнения. Используя аргумент switch в качестве смещения по этой таблице.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
29.03.2014, 00:52  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
второй - коректный. В чем нелепость?
Ты сам ответил:
Цитата Сообщение от DrOffset Посмотреть сообщение
демонстрируется некоторое поведение
Т.е. то же что я имел ввиду словами:
Цитата Сообщение от DrOffset Посмотреть сообщение
нельзя объявлять переменную в одном условии, а в другом к нему обращяться.
Со scope я уловил, просто ты сказал фразу:
Цитата Сообщение от DrOffset Посмотреть сообщение
Собственно вот из-за таких ситуаций синтаксически это запретили.
Т.е. ну как можно было запретить что то, ежели это ошибки самого программиста, который не понимает что в 2 case переменной j не может существовать в принципе(если она создавалась в 1 case).

Цитата Сообщение от DrOffset Посмотреть сообщение
оператор ветвления
Да, ни туда посмотрел. Ладно, скажу проще, "оператор" - этот тот кто выполняет операции.(логично же) В данном случае присваивание и объявление - тоже операции.

Цитата Сообщение от DrOffset Посмотреть сообщение
Вот тебе пример:
Что это за бред. Мы говорили совершенно о другом - случай когда горе-программист объявляет переменную в if(case 1), а обращяется к ней в else(case 2). То что компилятор не следит за данным действием - не выводя ошибки - это уже другой разговор.(а т.к. должна, ну может и нет, тут дело синтаксиса всё же)

Цитата Сообщение от DrOffset Посмотреть сообщение
Вот что получается:
А что это вообще такое? И куда надо тыкнуть чтоб это появилось?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
29.03.2014, 02:25
Цитата Сообщение от Izual Посмотреть сообщение
Т.е. ну как можно было запретить что то, ежели это ошибки самого программиста, который не понимает что в 2 case переменной j не может существовать в принципе(если она создавалась в 1 case).
Ты не понял. case - это метки. Для меток пофигу что и где создавалось. Они не вносят области видимости:
Вот тебе псевдокод:
C++
1
2
3
4
5
6
7
8
9
10
11
goto mark1;
//...
goto mark2;
//... 
 
mark1:
   int j;
   j = 0;
 
mark2:
   ++j;
Это пример, переложенный из того первоначального примера. И так можно делать. И проблема описанная там, тут всплывает. Из-за того что case это метки внутри switch, потенциально эта же проблема могла появится. И поэтому в switch - это запретили.
Ты спросил почему нельзя, я тебе рассказал. Вот пример, первый и второй.
Цитата Сообщение от Izual Посмотреть сообщение
Ладно, скажу проще, "оператор" - этот тот кто выполняет операции.(логично же)
Логично. Но в том примере нет операций, которые выполняет точка с запятой. По аналогии: точка с запятой, например - не оператор, пробел - не оператор. И запятая вот в этом случае - не оператор. Это синтаксический разделитель, который призван сэкономить написание еще одного int перед b:
C++
1
int a = 2, b = 3;
А вот в этом примере, запятая уже оператор (она выполняет операцию последовательного выполнения своих аргументов и возврата результата):
C++
1
int a = func1(), func2(), 3;
результат выражения, который попадет в переменную - 3. Это тонкость языка, и возможно зря я тебе вообще про нее рассказал, так как вижу у тебя отрицание информации. Возможно тебе просто стоит вернуться к этому попозже.

Цитата Сообщение от Izual Посмотреть сообщение
Мы говорили совершенно о другом - случай когда горе-программист объявляет переменную в if(case 1), а обращяется к ней в else(case 2). То что компилятор не следит за данным действием - не выводя ошибки - это уже другой разговор.(а т.к. должна, ну может и нет, тут дело синтаксиса всё же)
Это ты начал об этом говорить, не поняв о чем говорю я. Прочитай еще раз все сначала. Пока ты не поймешь суть нет смысла дальше разговаривать. Ты сказал:
Цитата Сообщение от Izual Посмотреть сообщение
Давно заметил что в case WM_PAINT ругается объявляя переменные
Я тебе пояснил, что в switch должен быть scope, чтобы это можно было делать.
А ты спросил, работает ли обычный Си также. Я ответил да и привел пример (опасной ситуации), которую мог спровоцировать программист. Чтобы исключить эту ситуацию и был введено ограничение на объявление переменных в switch. А вот после почему-то я услышал что это бред(!) и противоречит смыслу оператора switch, который, как ты сказал, эквивалентен if. Но это не так. Потому что ветки if создают scope, а ветки case - нет. Ветки case - это метки (десятый раз говорю). Такие же метки как в goto (см. пример выше). То есть switch это такое условие с несколькими переходами. Между которыми нет scope. Следовательно, не будь того запрета, потенциальная ошибка приведенная в примерах выше была бы возможна. Вот и все.

Вот один из самых известных примеров, в котором использует тот факт, что case в switch - это метки. Читай внимательно

Цитата Сообщение от Izual Посмотреть сообщение
А что это вообще такое?
Это ассемблерный код, который получается из С++ кода приведенного в том посте. В нем наглядно показано, что switch делает в общем случае столько же сравнений, сколько делает if. А не одно, как ты сказал.
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
29.03.2014, 13:05  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Для меток пофигу что и где создавалось
Значит как я и сказал, это проблема синтаксиса самого языка.(потому и сделали поправку) По поводу GOTO - читал когда то что использование этих вещей - не хорошо, и не использую их вообще.
Цитата Сообщение от DrOffset Посмотреть сообщение
Это синтаксический разделитель
Операция синтаксического разделителя. ~ ~ (напомню вам слово "Простота" - всё гениальное просто! потому не нужно надумывать много лишнего, суть остаётся)
Цитата Сообщение от DrOffset Посмотреть сообщение
выполняет операцию последовательного выполнения своих аргументов
Не комфортно видеть подобное, путаница создаётся - потому опущу что такое вообще возможно. Но в принципе тоже верно, но дабы не путаться - юзать не буду.
Цитата Сообщение от DrOffset Посмотреть сообщение
вернуться к этому попозже
Да наверно, но сейчас я почему завёл эту тему, у меня небольшие проблемы с написанием интерпритации для циклов, потому разбираю подробно возможности циклов.
Цитата Сообщение от DrOffset Посмотреть сообщение
switch, который, как ты сказал, эквивалентен if
Ну по идее должен быть, чтоб не писать кучу ветвлений if/else и внутри опять... У меня есть подобный пример, когда с десяток if'ов друг в друге с else - и это не читабиельно становится. То что в case нет scope в принципе - это уже ( на мой взгляд не этично ).
Цитата Сообщение от DrOffset Посмотреть сообщение
Это ассемблерный код
А как его получить в VS ? =) Я ещё не разобрался с этой отладкой по точкам(и там куча всего вообще в этой VS среде)
Цитата Сообщение от DrOffset Посмотреть сообщение
witch делает в общем случае столько же сравнений, сколько делает if
Хм, ну ладно -буду знать, но зато выглядит более этично, ведь по факту Си это язык связующий ассемблер и человека (ну суть ты думаю понял, я просто забыл как это точно называется).

Добавлено через 4 минуты
Кстати в if тоже нет scope если там одна строчка выполнения =) Ну это же синтаксис языка - тонкости самого языка, так сказать.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
29.03.2014, 13:31
Цитата Сообщение от Izual Посмотреть сообщение
потому не нужно надумывать много лишнего
Это не надумывание. Это просто более детальный уровень понимания информации. В стандарте есть целый приложение по грамматике языка. Там все это расписано. С++ довольно сложен с точки зрения грамматики, отсюда все эти неочевидные нюансы.
Цитата Сообщение от Izual Посмотреть сообщение
То что в case нет scope в принципе - это уже ( на мой взгляд не этично ).
тебе никто не помешает его добавить goto не рекомендуют к использованию именно из-за таких проблем, как выше. А в switch, исторически, метки case родственны меткам goto. В общем я думаю проблема исчерпана. Все факты, которые я приводил, легко проверяются и ты сможешь нагуглить все что нужно, если тебе понадобится.
Цитата Сообщение от Izual Посмотреть сообщение
Да наверно, но сейчас я почему завёл эту тему, у меня небольшие проблемы с написанием интерпритации для циклов
Возможно на первом этапе не стоит гнаться за абсолютно всеми возможностями языка? Еще посоветую, если ты уже ее не читал, вот эту книгу. Я думаю в твоей работе она была бы полезна.

Цитата Сообщение от Izual Посмотреть сообщение
А как его получить в VS ?
Можно из командной строки. В VS есть уже настроенная командная строка с подключенным окружением (кажется в Пуске сидит ярлык).
/Fa[file] name assembly listing file
Например - cl.exe /c /Fa test.cpp

Цитата Сообщение от Izual Посмотреть сообщение
Не комфортно видеть подобное, путаница создаётся
Я за много лет разработки ПО ни разу не пользовался Так что ты ничего не потеряешь. Но знать про это нужно.

Цитата Сообщение от Izual Посмотреть сообщение
Значит как я и сказал, это проблема синтаксиса самого языка
Именно так.

Добавлено через 11 минут
Цитата Сообщение от Izual Посмотреть сообщение
Кстати в if тоже нет scope если там одна строчка выполнения =) Ну это же синтаксис языка - тонкости самого языка, так сказать.
Есть, он ограничен этой одной строчкой.
C++
1
2
3
    if(1)
        int a = 2;
    a++; // ошибка, 'a' недоступна
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
29.03.2014, 13:50  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Возможно на первом этапе не стоит гнаться за абсолютно всеми возможностями языка?
Ну реализовывать я не буду эти запятые, но предвидеть что их нужно будет учесть - уже даст пищу для ума, чтоб потом не переделывать 100500 строк кода) (уже блин наступал на эти грабли, устал, потому интепритатор решил писать, а то это ппц, пишеш пишеш, 10к+ строк, а потом оптимизировать начинаеш и приходится пол программы переписывать)
Вообще хочу в функцию вывести все операторы типа if, for... ну а как ещё интерпритатор написать, если не блоками вывести всё это. =)
Цитата Сообщение от DrOffset Посмотреть сообщение
Я за много лет разработки ПО ни разу не пользовался
Аналогично, есть моя рабочая программа, в которой не пользовался никогда) Но вот раз уж танец тут такой возник, значит юзабилити уже есть, либо предвидеть чтоб избегать такой путаницы.
Цитата Сообщение от DrOffset Посмотреть сообщение
вот эту книгу
Вот тут пока проблемы, в библиотеках подобного не найдёш, а в электронном виде читать - уже чувствую что избыток компа не хорошо на зрении сказывается... Придётся поискать где продаётся)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.03.2014, 13:50

пусть в трех урнах находятся шары черного и белого цвета
пусть в трех урнах находятся шары черного и белого цвета, обозначение Hi-выбрали i-ю урну А-вынули из урны белый шар не А - вынули из урны...

Нахождение вариаций расстановки белого и черного короля на шахматной доске
Во сколько вариантов вы можете установить два короля на шахматной доске(размер доски определяем сами &quot;a&quot; и &quot;b&quot;):...

Рассчитать и вывести вероятности появления очередного белого и черного шаров
Помогите пожалуйста с решением данной задачи: В закрытом ящике находится N белых и M черных шаров. По исходному перечню вынутых шаров...

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

Из урны, в которой 4 шара белого цвета, 2—черного и 3—синего, наудачу извлекается m=4 шаров. Вычислить
Из урны, в которой находится 4 шаров белого цвета, 2—черного и 3—синего, наудачу извлекается m=4 шаров. Вычислить вероятность того, что...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru