powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что означает данное выражение на C
32 сообщений из 32, показаны все 2 страниц
Что означает данное выражение на C
    #38974954
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
подскажите пожалуйста что означает данное выражение на C ?

Код: plaintext
1.
2.
3.
4.
#define PARSE_BLOCK_SIZE(w, h) do { 
...
...
} while (0)
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38975010
YesSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StanislavДобрый день!
подскажите пожалуйста что означает данное выражение на C ?

Код: plaintext
1.
2.
3.
4.
#define PARSE_BLOCK_SIZE(w, h) do { 
...
...
} while (0)


do { } while(0)
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38975047
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YesSqlStanislavДобрый день!
подскажите пожалуйста что означает данное выражение на C ?

Код: plaintext
1.
2.
3.
4.
#define PARSE_BLOCK_SIZE(w, h) do { 
...
...
} while (0)


do { } while(0)

Понял, спасибо!
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38976391
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот здесь, помогите пожалуйста, че-то не могу понять что делается?
Код: plaintext
1.
2.
3.
4.
5.
table = &vlc->table[table_index];
    for (i = 0; i < table_size; i++) {
        table[i][1] = 0; 
        table[i][0] = -1;
    }


я вижу 2 варианта:
1. Находим таблицу(table) с индексом (table_index), потом в цикле перебираем ее строки (table[i]) и присваиваем колонкам [1] и [0] значения.
2. получаем строку таблицы vcl.table c индексом (table_index) и потом начиная с этой строки перебираем остальные строки...

1-й вариант вроде бы как логичнее, но второй подходит по контексту остального когда.

Обращаю внимание что это С не С++

За ранее благодарен.
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38976408
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StanislavОбращаю внимание что это С не С++
Пофиг. Работа с трёхмерным массивом vlc->table от этого не зависит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38976417
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovStanislavОбращаю внимание что это С не С++
Пофиг. Работа с трёхмерным массивом vlc->table от этого не зависит.

Все таки 3-мерный получается? т.е. п.1
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38976438
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StanislavВсе таки 3-мерный получается?
Эквивалентный код:
Код: sql
1.
2.
3.
4.
    for (i = 0; i < table_size; i++) {
         vlc->table[table_index][i][1] = 0;
         vlc->table[table_index][i][0] = -1;
     }


выглядит понятнее?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38976445
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
да я вот чего не могу понять

вот 1 часть кода
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  
...
VLC_TYPE (*table)[2];
  ....
 table = &vlc->table[table_index];

    for (i = 0; i < table_size; i++) {
        table[i][1] = 0; //bits
        table[i][0] = -1; //codes
    }


вот 2-я
Код: plaintext
1.
2.
3.
4.
5.
6.
static av_always_inline int webp_get_vlc(GetBitContext *gb, VLC_TYPE (*table)[2])
{
...
    code  = table[index][0];
    n     = table[index][1];
....



В 1-й используется как 3-мерный массив, а во 2-й как 2-мерный...
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38976490
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislavда я вот чего не могу понять
Ты не можешь понять, что любой двумерный массив состоит из пачки одномерных, а трёхмерный,
соответственно, из пачки двумерных?.. Может, тебе воображение потренировать на кубике
Рубика?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38976510
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovStanislavВсе таки 3-мерный получается?
Эквивалентный код:
Код: sql
1.
2.
3.
4.
    for (i = 0; i < table_size; i++) {
         vlc->table[table_index][i][1] = 0;
         vlc->table[table_index][i][0] = -1;
     }


выглядит понятнее?
Врешь.Эквивалентный код:
Код: sql
1.
2.
3.
4.
    for (i = 0; i < table_size; i++) {
         vlc->table[table_index+i][1] = 0;
         vlc->table[table_index+i][0] = -1;
     }
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38976546
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDimitry Sibiryakovпропущено...

Эквивалентный код:
Код: sql
1.
2.
3.
4.
    for (i = 0; i < table_size; i++) {
         vlc->table[table_index][i][1] = 0;
         vlc->table[table_index][i][0] = -1;
     }


выглядит понятнее?
Врешь.Эквивалентный код:
Код: sql
1.
2.
3.
4.
    for (i = 0; i < table_size; i++) {
         vlc->table[table_index+i][1] = 0;
         vlc->table[table_index+i][0] = -1;
     }


В принципе это то, что я описал в п.2. получается все же двумерный массив.
Спасибо!
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38976567
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneВрешь
Может да, может нет. Это зависит от объявлений и физического размещения в памяти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38976947
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovBarloneВрешь
Может да, может нет. Это зависит от объявлений и физического размещения в памяти.
Не зависит. &a[b] эквивалентно a+b, и a[b] эквивалентно *(a+b).
Код: plaintext
1.
table = &vlc->table[table_index];

эквивалентно
Код: plaintext
table = vlc->table + table_index
и дальше
Код: plaintext
table[i]
эквивалентно
Код: plaintext
*(vlc->table + table_index + i)
и также эквивалентно
Код: plaintext
vlc->table[table_index + i]
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38977048
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот еще вопрос? есть выражение
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int i=0
#define COPY(condition)  
{

 for(k=0; k<1000;k++)
{
       if (condition)
      {
           ....
      }
 i++;
}
}
Copy (i>10);


Как макрос будет работать с condition, он сразу примет как булеву переменную, или на каждой итерации будет подставлять
i>10, изменяя при этом значение i ?

Заранее благодарен.
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38977079
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav,

Это не будет работать, макрос криво записан. В многострочных макросах строки должны склеиваться символом \
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38977095
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolfStanislav,

Это не будет работать, макрос криво записан. В многострочных макросах строки должны склеиваться символом \

Да я его в примере не поставил, символ есть, макрос на самом деле работает, я портирую рабочую библиотеку на C#, и вот не понятно как должен работать данный макрос.
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38977104
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav,

макрос просто подставляет текст в скобках вместо слова condition.
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38977106
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolfStanislav,

макрос просто подставляет текст в скобках вместо слова condition.

Понял, спасибо!
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38982080
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот такое выражение, что-то вообще не пойму что делает
Код: plaintext
1.
2.
3.
4.
5.
    
    uint8_t *dec;
    dec = frame->data + 1;
    for (x = 1; x < frame->width; x++, dec++)
        *dec += *(dec - 1);



тип frame->data - (uint8_t *data)
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38982095
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StanislavА вот такое выражение, что-то вообще не пойму что делает
...
тип frame->data - (uint8_t *data)
Код: plaintext
1.
2.
    for (x = 1; x < frame->width; x++)
        frame->data[x] += frame->data[x - 1];
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #38982115
Stanislav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_SlaStanislavА вот такое выражение, что-то вообще не пойму что делает
...
тип frame->data - (uint8_t *data)
Код: plaintext
1.
2.
    for (x = 1; x < frame->width; x++)
        frame->data[x] += frame->data[x - 1];




Спасибо, думал что-то сложнее )
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #39000240
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
griSval,

результат не определён, но, скорее всего, 500.
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #39000267
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
griSvalИ так вопрос что выйдет на консоли при выводе *pn
Может 500, может исключение из-за обращение к несуществующей памяти.
Если перед printf() будут другие malloc(), то может какое-нибудь другое число.

Никогда так не пиши, если не хочешь заниматься поисками глюков в коде, который работал, ты его не трогал, а он работать перестал.
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #39000309
griSval
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RWolfgriSval,

результат не определён, но, скорее всего, 500.

А почему 500 почему не ноль. Для меня это нонсенс память же освобождена почему она сохраняется вот в чем вопрос. Что это за освобождение памяти когда свободная память продолжает быть инициализированой и к ней так же можно обращаться я пробовал так же и с
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
…
int *pn = new int;
*pn = 500;

delete pn;

cout << pn < *pn <<endl;
...


И значение *pn все по прежнему не меняется и продолжает быть инициализированым. Почему?
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #39000335
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
griSvalДля меня это нонсенс
Тогда повторяй школьный курс информатики: устройство компьютера, процессора и прочие
низкоуровневые вещи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #39000337
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
griSvalПочему?
А как по-твоему: почему в ячейке ОЗУ заряд должен самопроизвольно рассасываться только
потому, что к ней больше никто не обращается?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #39000341
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
griSvalА почему 500 почему не ноль.
Потому что никто не обещал обнулять память при освобождении. Что там было, то и осталось.
griSvalДля меня это нонсенс память же освобождена почему она сохраняется вот в чем вопрос.
Это на усмотрение менеджера памяти ОС. Работает так как быстрее: может совсем освободить, а может просто пометить память как свободную и использовать при следующем выделении памяти.
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #39000397
griSval
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovА как по-твоему: почему в ячейке ОЗУ заряд должен самопроизвольно рассасываться только
потому, что к ней больше никто не обращается?

Да хорошо, никто не обращается тогда, еще один вопрос? Если адрес ячейки никуда не девается, указатель все так же на нее ссылается и значение не обнуляется, как понять освободилась память или нет. Ведь точно так же мы можем просто присвоить *pn иное значение не освобождая память. Зачем оно вообще нужно?

З.Ы.: Я в принципе догадываюсь, но просто хочется знать, что другие думают по этому поводу.
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #39000418
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
griSvalкак понять освободилась память или нет.
Вызвал free() или delete (в зависимости от того как выделял) и считай что память освободилась. Для твоей проги этой памяти больше не существует. А то что у тебя есть указатель на эту память, то по-хорошему его на обнулить чтобы гарантированно получить исключение если случайно где-то в коде по нему обратишься.
Код: plaintext
1.
2.
3.
4.
...
free(pn);
pn = NULL;
...


griSvalЗ.Ы.: Я в принципе догадываюсь, но просто хочется знать, что другие думают по этому поводу.
Что-то сомневаюсь что догадываешься.
Читай книжки про организацию виртуальной памяти. Там все расписано. Например: Джеффри Рихтер "Windows для профессионалов"

Запусти и посмотри что будет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	int* p1 = (int*)malloc(sizeof(int));
	*p1 = 123;
	printf("%p %d\n", p1, *p1);
	free(p1);
	int* p2 = (int*)malloc(sizeof(int));
	*p2 = 345;
	printf("%p %d\n", p2, *p2);

У меня такой результат00343198 123
00343198 345
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #39000427
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
griSvalкак понять освободилась память или нет
А как ты вообще себе представляешь "свободное состояние" ячейки ОЗУ, которая может хранить
только нуль и единицу?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #39000656
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор:
Так, все вопросы ТУТ прекратили, нужно задать вопрос -- создавайте новую тему .

Тему закрываю.
...
Рейтинг: 0 / 0
Что означает данное выражение на C
    #39000665
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
griSvalDimitry SibiryakovА как по-твоему: почему в ячейке ОЗУ заряд должен самопроизвольно рассасываться только
потому, что к ней больше никто не обращается?

Да хорошо, никто не обращается тогда, еще один вопрос? Если адрес ячейки никуда не девается, указатель все так же на нее ссылается и значение не обнуляется, как понять освободилась память или нет. Ведь точно так же мы можем просто присвоить *pn иное значение не освобождая память. Зачем оно вообще нужно?

З.Ы.: Я в принципе догадываюсь, но просто хочется знать, что другие думают по этому поводу.

Никак.

Выделенная память -- это граф, каждая ячейка выделенной памяти должна быть достижима из других ячеек путём указания на неё, прямого или косвенного. Корни графа могут начинатся в статической или автоматической памяти.

Но в С/С++ в общем смысле невозможно понять, занята ли какая-то ячейка выделенной памяти чем-то, или свободна.

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

Поэтому главный принцип управления памятью -- при удалении памяти все ссылки на неё должны очищаться.
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что означает данное выражение на C
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]