реклама на сайте
подробности

 
 
> А почему так инициализация
DASM
сообщение Jul 24 2018, 18:43
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



CODE
struct lala
{
char *p;
}
....
lala la = {"the"};
*(la.p) = '1'; // access violation

Чего тут думают керниганы и примкнувшие, не понимаю. Ну вроде же initialyzer list, почему он не создает временный rw объект и не присваивает ему указатель, а вместо этого прямо в лоб на константный инициализатор ссыль кидает. Где в стандартах этого так называемого языка программирования глянуть?
Go to the top of the page
 
+Quote Post
6 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 81)
aaarrr
сообщение Jul 24 2018, 18:46
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Потому что "the" по стандарту константа.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 24 2018, 18:52
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(aaarrr @ Jul 24 2018, 21:46) *
Потому что "the" по стандарту константа.

А указатель на нее?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 24 2018, 18:54
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Jul 24 2018, 21:52) *
А указатель на нее?

Указатель модифицировать можно, а вот содержимое инициализатора - нет:
Цитата
char *p = "abc";
defines p with type ‘‘pointer to char’’ and initializes it to point to an object with type ‘‘array of char’’
with length 4 whose elements are initialized with a character string literal. If an attempt is made to use p to
modify the contents of the array, the behavior is undefined.
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 24 2018, 18:56
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(aaarrr @ Jul 24 2018, 21:46) *
Потому что "the" по стандарту константа.

То есть char a[8] = {1,2}; a[0] = '8' это можно, а первое нельзя?
.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 24 2018, 18:59
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата
Указатель модифицировать можно, а вот содержимое инициализатора - нет

Точно. По указателю на константу ничего не записать.
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 24 2018, 19:00
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(aaarrr @ Jul 24 2018, 21:54) *
Указатель модифицировать можно, а вот содержимое инициализатора - нет:

А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным и при этом гарантированно все обрушить?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 25 2018, 05:16
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(DASM @ Jul 24 2018, 22:00) *
А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным и при этом гарантированно все обрушить?

Согласен. Тоже считаю такое недопустимым поведением компилятора. Какой компилятор кста?
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 07:04
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 24 2018, 21:43) *
CODE
struct lala
{
char *p;
}
....
lala la = {"the"};
*(la.p) = '1'; // access violation

А чего другого вы ожидали?
Грубо влезли в область хранения указателя "p" - вместо адреса реального объекта накидали туда всякого "мусора".
И после этого пытаетесь пользоваться этим "указателем" ... smile3046.gif

К слову. Более современные компиляторы уже ругаются на такие дикости lala la = {"the"}: warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings]


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 25 2018, 07:58
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(DASM @ Jul 24 2018, 22:00) *
А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным

Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jul 25 2018, 09:56
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(DASM @ Jul 24 2018, 22:00) *
А почему никто не сказал, что не надо char * присваивать auto const char *? И все прокатило без явных приведений типа? Почему вообще такой синтаксис умудряется быть спокойно скомпилированным и при этом гарантированно все обрушить?


Потому что это си.
https://stackoverflow.com/questions/2245664...rals-in-c-and-c

Нет, вру. "struct lala ... lala la" - это не си. Это кривой вопрос, т.к. правильный вопрос должен указывать и название компилятора тоже.

Вот, например, компилятор gcc
char * test = "TEST";
../Common/main.cpp:41:16: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
В main.c аналогичный трюк работает без предупреждения.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 10:02
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(esaulenka @ Jul 25 2018, 12:56) *
В main.c аналогичный трюк работает без предупреждения.

Обычный "С" gcc по-умолчанию компилирует в архаичном стандарте "C99", хотя можно заставить его применить более свежие стандарты, например, "C11".


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 25 2018, 10:20
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(XVR @ Jul 25 2018, 10:58) *
Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит.

Да ладно? Про какой компилятор речь? IAR вполне себе тоже "проглатывает" sad.gif(((

В примере:
Код
  static void Func(char *s) { s[1] = 0; }
  static char const t1[] = "test";
  static char const *t2 = "test";
  Func("test");
  Func(t1);
  Func(t2);

негодование компилятора (IAR_7.80) вызывают только последние 2 строчки, но к сожалению никак не Func("test"); sad.gif
Хотя хоть убей - не пойму в чём принципиальная разница между Func("test"); и static char const t1[] = "test"; Func(t1); ?
Language: C++; Dialect: Extended Embedded C++ (default).
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 25 2018, 15:22
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(jcxz @ Jul 25 2018, 08:16) *
Согласен. Тоже считаю такое недопустимым поведением компилятора. Какой компилятор кста?

Gcc дал warning - deprecated (странный варнинг для такого). M$ проглотил даже без warning

Цитата(XVR @ Jul 25 2018, 10:58) *
Потому что С позволяет программисту сделать всё, что он хочет - отстрелить обе ноги и повесится. С++ в этом отношении более строгий, он это не проглотит.

M$ даже не дал warning в С++ 11 режиме
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 15:26
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 25 2018, 18:22) *
M$ даже не дал warning в С++ 11 режиме

Вполне возможно, что у него соотв. ворнинги запрещены через соотв. ключи компиляции самой средой с целью, чтобы "без нытья" собирался откровенный ****-код sm.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 25 2018, 15:30
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Еще интересный вопрос возник. Как вам такая штука
Код
int searchDB (int v)
{
//..............
}
.... main...
searchDB('1234');

Тут gcc дает warning что то там multibyte, точно не помню. Просто интересное применение, раньше как-то не встречал такую идею.

Цитата(Forger @ Jul 25 2018, 18:26) *
Вполне возможно, что у него соотв. ворнинги запрещены через соотв. ключи компиляции самой средой.

По умолчанию? Он ругается на куда более безопасные вещи. Ну ладно, с этим вопросом разобрались вроде
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 15:30
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 25 2018, 18:27) *
Еще интересный вопрос возник. Как вам такая штука
Код
int searchDB (int v)
....
searchDB('1234');

Тут gcc дает warning что то там multibyte, точно не помню. Просто интересное применение, раньше как-то не встречал такую идею.

На известном ресурсе полно подобного "кода". Смысл его тут цитировать?

Код
Он ругается на куда более безопасные вещи
M$ - уже давно не образец для подражания.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 25 2018, 15:31
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 25 2018, 18:30) *
На известном ресурсе полно подобного "кода". Смысл его тут цитировать?

Стоп стоп. Почему Вы считаете это говнокодом и как бы Вы сделали, не городя монстра? По сути из имени получается бесплатно подобие хэша. Иначе варианты начинают хотеть strcmp, или, страшно сказать std::map . А тут бесплатно
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 15:39
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 25 2018, 18:31) *
Стоп стоп. Почему Вы считаете это говнокодом и как бы Вы сделали, не городя монстра?

Разве не очевидно? Функция ожидает int, а получает то, что дадут.
В подобных ситуациях делают ряд функций, каждая из которых работает со своим типом данных.
Либо передается в одну функцию ссылка на определенную структура, где заранее расписаны "детали" поиска и что искать.
Существуют и другие способы, но там уже используются чисто плюсы и их "фишки".

Цитата
По сути из имени получается бесплатно подобие хэша.
Неявно, неочевидно. Со временем развития проекта из-за этого могут возникнуть проблемы, которые найти будет довольно сложно.
Компилятор заругается, если будет не 4 цифры, а больше или int на неком железе окажется равным не 4 байтам. Но ведь это лишь предупреждение... Не дай бог это попадет в библиотеку, где линкер при сборке этого просто не увидит!
А если дать всего 3 цифры, то что получит на входе функция? Лотерею из мусора в стеке?...


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 25 2018, 16:01
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 25 2018, 18:39) *
Разве не очевидно? Функция ожидает int, а получает то, что дадут.
В подобных ситуациях делают ряд функций, каждая из которых работает со своим типом данных.
Либо передается в одну функцию ссылка на определенную структура, где заранее расписаны "детали" поиска и что искать.
Существуют и другие способы, но там уже используются чисто плюсы и их "фишки".

Неявно, неочевидно. Со временем развития проекта из-за этого могут возникнуть проблемы, которые найти будет довольно сложно.
Компилятор заругается, если будет не 4 цифры, а больше или int на неком железе окажется равным не 4 байтам. Но ведь это лишь предупреждение... Не дай бог это попадет в библиотеку, где линкер при сборке этого просто не увидит!
А если дать всего 3 цифры, то что получит на входе функция? Лотерею из мусора в стеке?...

Думаю Вы правы. Просто дали проект, сижу разбираюсь. Многие вещи интересные. Причем 90% кода по всем правилам, что наводит на мысли об опыте автора. А раз применяет такие трюки - может в этом есть смысл? Я то сам пишу удивительно пресный код, таких открытий он не сулит. Но у меня обычно больший overhead, не люблю оптимизировать
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 16:10
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 25 2018, 19:01) *
Просто дали проект, сижу разбираюсь.

Сочувствую sad.gif Доделывать начатое за другими - мало кому по кайфу ...

Цитата
Но у меня обычно больший overhead, не люблю оптимизировать
В таких ситуациях когда флэш очень толстая и камень имеет огромный запас производительности я задаю себе один простой вопрос: "а стоит ли овчинка выделки?" wink.gif



--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 25 2018, 16:19
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(DASM @ Jul 25 2018, 18:31) *
Иначе варианты начинают хотеть strcmp, или, страшно сказать std::map . А тут бесплатно

Нормально делается и без strcmp:
Код
  #define M(x0,x1,x2,x3) ((uint)(u8)(x0) | (uint)(u8)(x1) << 8 | (uint)(u8)(x2) << 16 | (uint)(u8)(x3) << 24)
  searchDB(M('1','2','3','4'))

И выглядит почти так же и о порядке следования байт гадать не приходится.

Цитата(Forger @ Jul 25 2018, 19:10) *
В таких ситуациях когда флэш очень толстая и камень имеет огромный запас производительности я задаю себе один простой вопрос: "а стоит ли овчинка выделки?" wink.gif

Такие ситуации обычно бывают при уровне задач, а ля "а не помигать ка мне светодиодом?". Имхо.
Во всех моих реальных проектах везде в обрез или памяти или быстродействия. А если не в обрез, то значит неправильно выбран МК и надо выбрать подешевле. laughing.gif
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 25 2018, 16:24
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 25 2018, 19:10) *
Сочувствую sad.gif Доделывать начатое за другими - мало кому по кайфу ...

В таких ситуациях когда флэш очень толстая и камень имеет огромный запас производительности я задаю себе один простой вопрос: "а стоит ли овчинка выделки?" wink.gif

Не, сочувствовать не надо. Я во всех чужих программах ищу и нахожу что то новое. Может через месяц я начну переделывать ее, но уже имея в багаже чужие трюки и подходы. Есть плохие места, есть интересные. Знания лишние не бывают.
Операционку он ucos юзал, не в восторге, но работает. Я хотел бы scmRTOS, но это потом. Кстати крутая программистка, которая тоже сидела над этим проектом за нее. Но увы, у девушек редко хорошо с железом,, поэтому с ней расстались. Хотя в плане академического программирования - все красиво и хорошо.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 25 2018, 16:31
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(jcxz @ Jul 25 2018, 19:19) *
Нормально делается и без strcmp:
Код
  #define M(x0,x1,x2,x3) ((uint)(u8)(x0) | (uint)(u8)(x1) << 8 | (uint)(u8)(x2) << 16 | (uint)(u8)(x3) << 24)
  searchDB(M('1','2','3','4'))

Зачем приводить к u8, а потом к uint?
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 16:33
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 25 2018, 19:24) *
Не, сочувствовать не надо. Я во всех чужих программах ищу и нахожу что то новое.

Ну, если цель в этом, то другое дело sm.gif

Цитата
Операционку он ucos юзал, не в восторге, но работает. Я хотел бы scmRTOS, но это потом.

А не все ли равно? Особенно, если камень выбран с достаточным запасом.
К примеру, мои проекты уже давно лишены привязки к конкретной RTOS, менять ось - дело двух минут, хотя такой задачи изначально не ставилось.
Просто, свой код читать всегда проще и чем его больше в соотношении с чужим кодом, тем проще сопровождать такой проект. Имхо!

Цитата
Кстати крутая программистка .... поэтому с ней расстались.
Логично biggrin.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 25 2018, 16:49
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 25 2018, 19:33) *
Ну, если цель в этом

проблема в собеседованиях. Давно были? Я не знаю, почему у проводящих их такие олимпиадные вопросы. По большому счету все что они спрашивают - никогда не надо. Причем язык С очень располагает к трюкам, оные я тоже не люблю. К счастью все это в прошлом, есть хорошая работа, где нужен результат, а не трюкачество
насчет двух минут смены горячитесь, у многих еще и менджер памяти свой, бывают тонкости
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 17:05
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 25 2018, 19:49) *
проблема в собеседованиях. Давно были?

Всегда спрашиваю просто: наличие законченных проектов и куски кода оттуда для примера. Хотя бы это.
Остальные качества выясняются на испыт. сроке ))

Цитата
насчет двух минут смены горячитесь

Да, погорячился sm.gif На самом деле намного меньше: из списка доступных билдов нужно лишь выбрать нужный под нужную ОСь и пересобрать проект ))
Сам код не зависит от оси (простейшая "обертка").
Делалось с целью выяснить, какая ось шустрее и меньше жрет памяти.
Да и потом читать код с нормальными и более понятыми лично мне названиями функций-сервисов RTOS куда проще, чем разбираться со своим же кодом, вооружившись мануалом на ось )))

Цитата
, у многих еще и менджер памяти свой

В известных целях не использую дин. память, хотя свой менеджер есть, на базе известного TLSF.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 25 2018, 17:41
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Ни разу не видел еще готовый проект с кучей доступных билдов под разные ядра. Даже hello world не видел
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 17:45
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 25 2018, 20:41) *
Ни разу не видел еще готовый проект с кучей доступных билдов под разные ядра.

Я тоже. А зачем это вообще делать?



--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 25 2018, 17:48
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 25 2018, 20:45) *
Я тоже. А зачем это вообще делать?

А как понять "из списка доступных билдов нужно лишь выбрать нужный под нужную ОСь и пересобрать проект"? Под ядро я имел в виду ось, ибо эмбеддерские это все же больше ядра просто, иногда с плюшками, не суть
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 17:52
Сообщение #31


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 25 2018, 20:48) *
А как понять "из списка доступных билдов нужно лишь выбрать нужный под нужную ОСь и пересобрать проект"?
Под ядро я имел в виду ось, ибо эмбеддерские это все же больше ядра просто, иногда с плюшками, не суть

Под ядром я понимаю ядро - CPU, т.е. железо.
Под RTOS - я понимаю ОСь, т.е. программную библиотеку, которой по сути является любая ОСь.
Я уже уточнил, что делал разные билды под разные ОСи с целью выяснить, какая ось для меня ловчее. В одном из проектов.
В других проектах поменять ось чуть дольше - для этого нужно к проекту подключить соотв. библиотеку нужной оси (заранее собирается в библиотеку), а ненужную удалить.
Настройки ОСи и сам код не меняются и не зависит от ОСи. Это очень удобно при сопровождении проекта и переносе кусков проекта с одного железа на другое.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 25 2018, 18:15
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 25 2018, 20:52) *
Под ядром я понимаю ядро - CPU, т.е. железо.
Под RTOS - я понимаю ОСь, т.е. программную библиотеку, которой по сути является любая ОСь.
Я уже уточнил, что делал разные билды под разные ОСи с целью выяснить, какая ось для меня ловчее. В одном из проектов.
В других проектах поменять ось чуть дольше - для этого нужно к проекту подключить соотв. библиотеку нужной оси (заранее собирается в библиотеку), а ненужную удалить.
Настройки ОСи и сам код не меняются и не зависит от ОСи. Это очень удобно при сопровождении проекта и переносе кусков проекта с одного железа на другое.

Я вообще о том, что перенести проект из freeRtos под, например, scmRtos это отнюдь не две минуты. Впрочем это ни о чем, как и весь топик. Хотя полезное есть и в нем (топике)
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 18:34
Сообщение #33


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 25 2018, 21:15) *
Я вообще о том, что перенести проект из freeRtos под, например, scmRtos это отнюдь не две минуты.

Да, если он изначально был написан конкретно под freeRTOS.
Я же немного про другое ))

Цитата
Впрочем это ни о чем, как и весь топик.

В этом смысле он почти ничем не отличается от большинства топиков в этом разделе :D


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 25 2018, 18:42
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 25 2018, 21:34) *
В этом смысле он почти ничем не отличается от большинства топиков в этом разделе :D

Ну кто же виноват, что stackoverflow нужный ответ за минуту находится. Просто иногда не находится ничего, потому что не ищешь, а не ищешь потому что даже не знаешь, что такое бывает ))
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 25 2018, 20:30
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(DASM @ Jul 25 2018, 19:24) *
Операционку он ucos юзал, не в восторге, но работает. Я хотел бы scmRTOS, но это потом. Кстати крутая программистка, которая тоже сидела над этим проектом за нее.

Сурово у вас.... За операционку уже сажают! как в 37-ом biggrin.gif

Цитата(Arlleex @ Jul 25 2018, 19:31) *
Зачем приводить к u8, а потом к uint?

Это аналог: (uint)((x) & 255) но выглядит проще.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 25 2018, 20:35
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(jcxz @ Jul 25 2018, 23:30) *
Сурово у вас.... За операционку уже сажают! как в 37-ом biggrin.gif

Раз пошла такая пьянка...
Вот мы тут хихикаем, а отечественные законотворцы начитаются этого и введут запрет на использование иностранных операционок в рамках импортозамещения ...
И будем переписывать, например, freeRTOS по-русски. Вот я уже придумал название: "бесплОС" или "бесплатОС" biggrin.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 26 2018, 02:32
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



БолгенОС уже была..
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 26 2018, 04:49
Сообщение #38


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(jcxz @ Jul 26 2018, 00:30) *
Это аналог: (uint)((x) & 255) но выглядит проще.

Так и подумалось вначале.

Цитата(Forger @ Jul 26 2018, 00:35) *
И будем переписывать, например, freeRTOS по-русски. Вот я уже придумал название: "бесплОС" или "бесплатОС" biggrin.gif

А мы не смеемся. Вот только есть один момент. Законопроекта как такового пока что нет, а вот пути развития уже поставлены - собственно, действительно была поставлена задача разработки отечественного ПО, и начали все с ОСРВ... Пока в рамках международного форума по информационным системам на службе ОПК РФ.
Как назвать? ПонОС - "ПОНятная Операционная Система" biggrin.gif

Цитата(DASM @ Jul 26 2018, 06:32) *
БолгенОС уже была..

Тссс, вдруг он сейчас зарегистрируется и будет кричать "не БолгенОС а Болдженос"?
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 26 2018, 12:42
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(jcxz @ Jul 25 2018, 13:20) *
Да ладно? Про какой компилятор речь? IAR вполне себе тоже "проглатывает" sad.gif(((

В примере:
Код
  static void Func(char *s) { s[1] = 0; }
  Func("test");
Это специальный случай - для него в стандарте сделали хак (иначе не назовёшь), иначе бы разломались практически все С программы (а С++ декларировался как совместимый с С, ха ха).



Цитата(DASM @ Jul 25 2018, 18:30) *
Еще интересный вопрос возник. Как вам такая штука
Код
int searchDB (int v)
{
//..............
}
.... main...
searchDB('1234');

Тут gcc дает warning что то там multibyte, точно не помню. Просто интересное применение, раньше как-то не встречал такую идею.
Нормальная multi byte символьная константа. Описана в стандарте. Единственный её минус (который практически не даёт её применять) - стандарт не описывает endianess этой самой константы, т.е. неизвестно, с какого конца целого числа будут выкладываться символы sad.gif
Если вам всё равно как именно она формируется, то использовать можно.

Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 26 2018, 12:56
Сообщение #40


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(XVR @ Jul 26 2018, 15:42) *
Единственный её минус

В данном случае это - не единственный минус.
В этом достаточно убедится, попытавшись дать не sizeof(int), а меньше символов, например 2 или 3.
Компилятор предупредит соотв. warning, но проект все равно успешно соберется.
Не трудно догадаться, что предсказать результат работы такой функции в этом случае уже никто не сумеет ...


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 26 2018, 13:01
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Forger @ Jul 26 2018, 15:56) *
В данном случае это - не единственный минус.
В этом достаточно убедится, попытавшись дать не sizeof(int), а меньше символов, например 2 или 3.
А в чём проблема? Вариант с одним символом у вас вопросов не вызывает, с 4мя тоже (положим что int - 32 бита). Чем вам 2 или 3 символа не нравятся?
Это же не строка, а символьный литерал.



'ABC' будет 0x414243 или 0x434241 (как карта ляжет). Других вариантов нет.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 26 2018, 13:03
Сообщение #42


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(XVR @ Jul 26 2018, 16:01) *
А в чём проблема?

Что будет в этой переменной int v, которую ожидает функция, если ей дать не '1234', а например '1', '12', '123' ?
Нули или "мусор" из стека? "Стандарт" описывает эти нюансы?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 26 2018, 13:39
Сообщение #43


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Forger @ Jul 26 2018, 16:03) *
Что будет в этой переменной int v, которую ожидает функция, если ей дать не '1234', а например '1', '12', '123' ?
Т.е. вы утверждаете, что запись int v='1'; неправильна? Это что то новое, до сих пор миллионы програмистов ничего неорпеделённого в такой записи не видели.

По вашему вопросу - в v будет 0x31, 0x3132, 0x313233 или 0x31, 0x3231, 0x333231 соотвественно для BE/LE машин.

Цитата
Нули или "мусор" из стека? "Стандарт" описывает эти нюансы?
Никакого мусора 'из стека'. И да, стандарт эти 'нюансы' описывает.

Может вы спутали литеральные константы и строки? Речь шла о '1234' а не о "1234" (второе вообще даст ошибку)

Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 26 2018, 13:47
Сообщение #44


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(XVR @ Jul 26 2018, 16:39) *
Т.е. вы утверждаете, что запись int v='1'; неправильна?

Не утверждаю, а лишь спрашиваю wink.gif

Цитата
Никакого мусора 'из стека'. И да, стандарт эти 'нюансы' описывает.

Ясно, значит, недостающие байты во многобайтовой переменной будут заполнены нулями.
А BE/LE влияет на положение этих неявных нулей в переменной?
С какой стороны будет "обрезана" слишком длинная литеральная константа (например, '12345678' для 4-байтового int) с учетом BE/LE?

Цитата
Может вы спутали литеральные константы и строки?
Не спутал, мне известна разница.

Честно говоря, никогда не использовал подобные неявные инициализации - многобайтовые литеральные константы.
И, судя по всему, правильно делал sm.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 26 2018, 14:20
Сообщение #45


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



"С какой стороны будет "обрезана" слишком длинная литеральная константа" - ни с какой, даст ошибку компиляции
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 26 2018, 14:22
Сообщение #46


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 26 2018, 17:20) *
"С какой стороны будет "обрезана" слишком длинная литеральная константа" - ни с какой, даст ошибку компиляции

В том-то и дело, что с литеральной константой компилятор дает лишь предупреждение (об этом выше уже шла речь).
Это как в int попытаться засунуть слишком длинный hex: int v = 0x123456780912345; - ошибки не будет, но будет соотв. предупреждение
В случае с hex все вполне однозначно - компилятор разместит его именно так, как нужно и читать его будет тоже так, как нужно (в зависимости от BE/LE).
С многобайтными литералами получается, что не все так однозначно и это зависит от BE/LE, о чем уже поделился XVR.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 26 2018, 15:25
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



С литеральными все понятно и вопроса не было бы. Я про мультибайтную, сорри, попутал. Просто вообще ранее с таким не сталкивался
Блин, Вы меня запутали. Вот "например, '12345678' для 4-байтового int) " просто не скомпилируется, я о том
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 26 2018, 15:35
Сообщение #48


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 26 2018, 18:25) *
Вот "например, '12345678' для 4-байтового int) " просто не скомпилируется, я о том

В том-то и дело, что все компилируется, но с warning sm.gif
Без warning будет, если число символов строго совпадает с sizeof() соотв. переменной, куда присваиваем.

У меня лично вопрос остался один: какая часть этой слишком длинной литеральной строки будет обрезана в зависимости от BE/LE - правая или левая?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 26 2018, 16:04
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Ну Майкрософт ошибку дает, видимо кто на что горазд. Я С изучал раз 5, как и ++, после чего забывал все без практики. И каждый раз мир открытий чудных. Причем если С еще придраться не особо, то ++ с последними нововведениями скатился в откровенное черти что.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 26 2018, 16:18
Сообщение #50


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 26 2018, 19:04) *
то ++ с последними нововведениями скатился в откровенное черти что.

Раз пошла такая пьянка, то договаривайте ))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 26 2018, 16:43
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 26 2018, 19:18) *
Раз пошла такая пьянка, то договаривайте ))

да нечитаемо все стало, и реально слишком сложно для изучения. К тому же сегодня словил странный глюк в МS на range based loop, как дома проверю - напишу.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 26 2018, 17:12
Сообщение #52


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 26 2018, 19:43) *
да нечитаемо все стало, и реально слишком сложно для изучения.

Странно ... wacko.gif По мне как раз все наоборот - более свежие стандарты плюсов позволяют наоборот - сделать код проще, меньше текста, лучше читаемость и лучше оптимизация компилятора.
Может M$ идет каким-то своим путем? ..


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 26 2018, 19:40
Сообщение #53


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Forger @ Jul 26 2018, 18:35) *
У меня лично вопрос остался один: какая часть этой слишком длинной литеральной строки будет обрезана в зависимости от BE/LE - правая или левая?
Старшая. Сначала литеральная константа преобразуется в int (с учетом BE/LE), затем этот int будет усечён (если понадобится) по обычному правилу приведения типов.

Стандарт на этот счет весьма неопределен - implementation dependent
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 27 2018, 04:57
Сообщение #54


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 26 2018, 19:18) *
Раз пошла такая пьянка, то договаривайте ))

вот что тут https://msdn.microsoft.com/ru-ru/library/zzw4bwhd.aspx Микрософт имел в виду в
Код
vector <int> v5(5);
    for (auto i : v5) {
        v5[i] = i;
    }

и пишут, что v5 = 0 1 2 3 4 . А он нулевой будет в итоге, i это значения ветора по копии, а никак не индекс
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 27 2018, 05:25
Сообщение #55


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



По логике i тут должен быть int, для этого тут поставлен auto.
Такая конструкция должна правильно работать уже с C++11. Или я что-то не понимаю?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 27 2018, 05:42
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 27 2018, 08:25) *
По логике i тут должен быть int, для этого тут поставлен auto.
Такая конструкция должна правильно работать уже с C++11. Или я что-то не понимаю?

v5[i] = i; - это фигня полная. Выражение for (auto i : v5) пробежит по всему вектору, присваивая i последовательные значения из этого вектора. Это не индекс. Так как вектор создан нулевым, то это будет так :
v5[0] = 0;
v5[0] = 0;
v5[0] = 0;
v5[0] = 0;
v5[0] = 0;
5 раз
Если сделать
Код
    vector <int> v5(5, 10);
    for (auto i : v5) {
        v5[i] = i;
    }

то будет access violation
ибо это v5[10] = 10; 5 раз подряд
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 27 2018, 06:26
Сообщение #57


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(DASM @ Jul 27 2018, 09:42) *
то будет access violation

Именно из-за вот таких приколов и сложностей в понимании лично я не взлюбил C++. Хотя и достаточно вумных книжек прочитал по нему... Со временем понял, что выражение "Веревка достаточной длины, чтобы выстрелить себе в ногу(с)" имеет смысл. Был у нас один сотрудник, который всегда писал программы с применением, возможно, всех фишек C++. В итоге я ничего не понял из листинга (совсем!) даже относительно несложного проекта, а при попытке объяснить код сам программист пришел в замешательство со словами "ну, так делают другие программисты и оно так проще для понимания и удобнее". Жесть. И вот лично я люблю Си, чистый Си. И, возможно, не прочь выучить C++ нормально - но куда угнаться-то? Постоянно что-то новое. Считаю, что язык должен быть строгим в своем синтаксисе и однозначно трактуемым. Бомбануло у меня, помню, тогда, когда нашел штук пять разных способов инициализации членов класса при объявлении объекта... Брр, даже не стану вспоминать. Можете ругать biggrin.gif
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 27 2018, 06:44
Сообщение #58


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 27 2018, 08:42) *
Это не индекс.

По-ходу i - это в данном случае итератор ...

Попытался эти примеры прокомпилить в старом добром keil (компилятор v6).
Примеры собирает, но отлаживать их вообще неудобно: вроде i по окну watch - int, а нифига - это действительно итератор. Пример и правда не работает, как ожидается ((



Честно говоря, не использовал так активно штатные шаблоны (в частности std::vector). До умного for() так и не добрался.
Выяснил, что они могут неявно использовать кучу.
А кучу не использую, в известных целях (речь про обычные МК).

В свое время как-то делал самописный iterator, for_each, умный указатель ... минимально необходимые. Недавно добрался до чудесной штуки - делегаты...
В основном - в академических целях, но потом "проникся" )) Тогда использовал "старые" плюсы.
Но в новых стандартах плюсов они уже есть и готовые (кроме делегатов), но, в очередной раз прихожу к выводу, что они адски "толстые", по крайней мере в применении к обычным МК.

Мне лично из C++11 (для меня нового) пришлись по душе жесткие ограничения при неявном приведении типов - нужно ставить явный static_cast или переписывать код.
Также пригодилась инициализация полей классов прямо в описании класса (например, какие-нить константы), т. е. максимально возможный уход от #define.
const_expr - вообще чудесная штука. Также считаю полезными final и override.... Это пока то, что вспомнил с ходу.

Вполне возможно, что негатив к C++ и его новым фишкам возникает в очень толстых проектах, где работает куча народу и каждый пытается показать другим, что он умеет.
Полагаю, что если жестко ограничить применение тех или иных конструкций и выработав соотв. "правила", то негатива будет меньше wink.gif



--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 27 2018, 07:29
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



i это не итератор, это локальная переменная типа элемента вектора. Сравните
Код
    struct fio
    {
        string f;
        string i;
    };
    vector <fio> names {{ "ivan", "ivanov" }, {"petr", "petrov"}};
    for (auto &r : names)    
        r.i = "sidorov";
    for (auto r : names)
        cout << r.f << " " <<  r.i << endl;
Go to the top of the page
 
+Quote Post
Herz
сообщение Jul 27 2018, 07:37
Сообщение #60


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Господа, пора бы остановиться, а? Очень не хочется превращения темы в очередной холивар.
Понятно, что у любых языков, стандартов и компиляторов полно недостатков. Тем более понятно, что умельцы всегда могут наворотить чудес в коде...
Обсуждать всякие причуды, валя всё в кучу, смысла нет, ИМХО.
Цитата(Arlleex @ Jul 27 2018, 09:26) *
Можете ругать biggrin.gif

Нет, давайте не будем. У всех свои предпочтения, но провоцировать свару не надо. Это предупреждение.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 27 2018, 07:44
Сообщение #61


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 27 2018, 10:29) *
i это не итератор, это локальная переменная типа элемента вектора.

В моем компиляторе - это не просто int. Я это проверил: попытка присвоить содержимое этого i кому-нить еще (я пробовал простой массив int a[5]; ), приводит к копирования некого адреса где-то в ОЗУ, но вовсе не содержимого. Это видно в окне watch.
Да и ходьба по шагам, где происходит обращение к i, кидает во внутренний некий файл iterator, где все это происходит.
Короче, for() в этом компиляторе тут ни разу не for() как это в привычном C или старом C++03, а разворачивается в конструкцию по-сложнее: https://en.cppreference.com/w/cpp/language/range-for (см. раздел Explanation)
По крайней мере, если речь идет про vector или что-то подобное.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 27 2018, 07:53
Сообщение #62


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Это int. Дома посмотрю, почему у Вас сомнения
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 29 2018, 12:15
Сообщение #63


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Проверил, это точно int , собственно и сомнений не было. Итераторы конечно используются для такого for, но тип i - это int
Код
    vector <int> iv (5, 1);
    for (auto i : iv)
    {
        int tmp;
        decltype (i) intger = 0;
        tmp = intger;
        intger = tmp;        
    }


Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 29 2018, 13:11
Сообщение #64


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 29 2018, 15:15) *
Проверил, это точно int , собственно и сомнений не было. Итераторы конечно используются для такого for, но тип i - это int

Попробуйте это i присваивать внутри цикла например в какой нить примитивный массив из int, но для индексации внутри массива НЕ используйте саму i.
Что будет в массиве при выходе из цикла?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 29 2018, 15:32
Сообщение #65


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Цитата(Forger @ Jul 29 2018, 16:11) *
Попробуйте это i присваивать внутри цикла например в какой нить примитивный массив из int, но для индексации внутри массива НЕ используйте саму i.
Что будет в массиве при выходе из цикла?

Код
    vector <int> iv (5, 1);
    int trace[5];
    int ix = 0;
    for (auto i : iv)
    {
        trace[ix++] = i;
    }

trace стал 1,1,1,1,1 что абсолютно верно
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 29 2018, 16:18
Сообщение #66


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Заглумил я тут всех sm.gif
Короче, увеличил кучу, все стало работать правильно! Дело было в том, что куча у меня не используется и на нее выделяется от силы 16 байт. Тут этого было мало.

Ради финальной проверки, инициализирую iv так:
Код
vector <int> iv = {1, 2, 3, 4, 5};
int trace[5];
int ix = 0;
for (auto i : iv)
{
    trace[ix++] = i;
}


И результат соответствующий: trace: 1, 2, 3, 4, 5.

Получается, что все верно: при каждой итерации for (auto i : iv) вызывается оператор копирования из вектора iv, а результат кладется в i, которая все верно - обычная int (проверил через sizeof)
Имхо, это несколько непривычно для восприятия цикла for, ведь "i" тут - вовсе не индекс для перебора внутри вектора, а лишь копия одного из его элементов,
или по-другому - результат, возвращаемый внутренним итератором (в данном цикле создается неявно).

Фактический такой пример будет работать правильно, если iv заранее правильно заполнить:
Код
vector <int> iv = {0, 1, 2, 3, 4};
int trace[5];

for (auto i : iv)
{
    trace[i] = iv[i];
}

Тогда trace: 0, 1, 2, 3, 4

sm.gif


Кстати, с полностью включенной оптимизацией это все выходит довольно компактно и работает шустро (судя по данным из окна disasm)!

зы. Удивило, что даже статическое (или в стеке) создание "банального" vector все равно требует наличия кучи sad.gif
Это как-то странно. Надо бы разобраться....


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 29 2018, 16:44
Сообщение #67


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



"несколько непривычно для восприятия цикла for," зато удобно, например скалярное умножение вектора на 2 :
Код
for (auto& i : iv)
  i *= 2;

хотя в принципе можно и через разыменование итератора.. в общем как сделано так сделано
"если iv заранее правильно заполнить:" мне непонятно как в микрософт попал пример с такой жуткой ошибкой
" vector все равно требует наличия кучи " вектор же динамический, может увеличиваться и уменшаться на ходу. Как это статически или на стеке сделать то?
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 29 2018, 16:59
Сообщение #68


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 29 2018, 19:44) *
мне непонятно как в микрософт попал пример с такой жуткой ошибкой
Значит, ошибок там может быть еще больше ...

Цитата
" vector все равно требует наличия кучи " вектор же динамический, может увеличиваться и уменшаться на ходу. Как это статически или на стеке сделать то?

Это логично при изменении размера вектора (добавляем/удаляем), но ведь не для создания же ... Это-то меня и удивляет wacko.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
DASM
сообщение Jul 29 2018, 17:08
Сообщение #69


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



ничего не понял. Предлагаете делать вектор на стеке, а если понадобится изменить его - быстро перекидывать в кучу?
Go to the top of the page
 
+Quote Post
Forger
сообщение Jul 29 2018, 17:15
Сообщение #70


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(DASM @ Jul 29 2018, 20:08) *
ничего не понял. Предлагаете делать вектор на стеке, а если понадобится изменить его - быстро перекидывать в кучу?

Я про то, где хранится описательная часть вектора. Т.е. некая структура, хранящая, скажем, двусвязный список и другую служебную инфу по вектору.
Короче, логика работы понятна: вектор состоит из двух "кусков": описательная часть вектора, лежит там, где создаем (стек, статика или даже куча).
А сами данные - всегда в куче.
По логике, получается, если вектор пустой, то и нет обращения к куче.
Но даже статическое создание вектора с известным числом элементов все равно использует кучу... Разобрался ))

Гы, лезем в дебри std, а это уже откровенный офф sm.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Aug 3 2018, 16:20
Сообщение #71


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Я дико извиняюсь, но почему обсуждение стандартной библиотеки языка си++ (наиболее базовых вещей из неё) - "откровенный офф" ?

"Откровенный офф" - это пара страниц обсуждения дурацкой опечатки у майкрософта.

А STL прямо вот очень рекомендую посмотреть. Умные люди понаделали велосипедов почти на все случаи жизни.

PS для статического создания массивов есть std::array, ему куча не нужна (но при этом у него нет push()/pop())
PPS в кишках std::vector НЕТУ двусвязного списка (и вообще списка нет). Это один сплошной массив. И да, этот массив создеётся в куче.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 3 2018, 16:47
Сообщение #72


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(esaulenka @ Aug 3 2018, 19:20) *
Я дико извиняюсь, но почему обсуждение стандартной библиотеки языка си++ (наиболее базовых вещей из неё) - "откровенный офф" ?

Эта тема вообще ни разу не про C++ и уж тем более про STL wink.gif
Но тенденция "скатиться к этому" есть почему-то у каждой темы в этом разделе ...

Цитата
"Откровенный офф" - это пара страниц обсуждения дурацкой опечатки у майкрософта.

Это не офф, это - пустой треп cool.gif

Цитата
А STL прямо вот очень рекомендую посмотреть. Умные люди понаделали велосипедов почти на все случаи жизни.

К сожалению, STL довольно толстая библиотека и, если и стоит ее использовать в конкретнтных встраиваемых приложениях, то как можно активнее.
Поэтому пока что у меня лично нет возможности совать ее во все проекты без исключения.
Другая причина - активное использование кучи.
Причем, опасения вызывает даже не сам факт использования кучи (если "правильно ее готовить", то ничего страшного в ней нет),
а то, что STL использует кучу неявно. Можно сказать, непредсказуемо. Поэтому без перегруженных new/delete уж никак не обойтись.
А еще хлеще, что наверняка придется перегружать еще и локальные new/delete ("локальные", это значит - предназначенные для конкретных классов, точный термин не помню).
Например, вместо фрагментируемой кучи использовать более безопасные "пулы" для конкретно взятых классов.
С этой точки зрения Ваша фраза "понаделали велосипедов" может звучать уже иначе wink.gif

Цитата
PS для статического создания массивов есть std::array, ему куча не нужна (но при этом у него нет push()/pop())

Это все понятно ))) Книжки читать умеем )
Но речь зашла именно про vector и почему у меня он так работал. Но к счастью разобрался. Короче, проехали laughing.gif

Цитата
PPS в кишках std::vector НЕТУ двусвязного списка (и вообще списка нет). Это один сплошной массив. И да, этот массив создеётся в куче.

Некая "описательная" часть этого массива все равно требует места для хранения, а точнее хранится именно там в какой области объявили этот vector.
Например, для случая: std::vector <int> v = {0, 1, 2, 3, 4};
sizeof(v) = 12 байт (arm compiler v6)

А уже сами данные вектора хранятся в куче.
Именно это момент вызвал проблемы в моем случае.
Кстати, размер выделенных в куче данных может оказаться даже больше, чем было "запрошено". Таков функционал этого vector - выделяет с неким запасом.

Напомню причину: у меня в текущих и старых проектах куча имеет минимально возможный размер (вроде 8 байт) и в принципе не используется, т.к. не особо-то и нужна.
По-хорошему мне стоит "перегрузить" штатные malloc и free (их используют new/delete) на некие "заглушки-ловушки"...


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
XVR
сообщение Aug 4 2018, 16:38
Сообщение #73


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Forger @ Aug 3 2018, 19:47) *
Другая причина - активное использование кучи.
Причем, опасения вызывает даже не сам факт использования кучи (если "правильно ее готовить", то ничего страшного в ней нет),
а то, что STL использует кучу неявно. Можно сказать, непредсказуемо. Поэтому без перегруженных new/delete уж никак не обойтись.
А еще хлеще, что наверняка придется перегружать еще и локальные new/delete ("локальные", это значит - предназначенные для конкретных классов, точный термин не помню).
Не надо. У всех контейнеров в STL есть шаблонный параметр - аллокатор (и он практически никогда не передаётся, а используется аллокатор по умолчанию - через new/delete и кучу)
Делаете свой аллокатор (с любым местом расположения объектов и алгоритмом алокации) у вуаля - всё управление кучей в ваших руках sm.gif

Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 4 2018, 16:44
Сообщение #74


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(XVR @ Aug 4 2018, 19:38) *
Не надо. У всех контейнеров в STL есть шаблонный параметр - аллокатор

Тем проще ))
Тем не менее, проблем с неявным обращением к куче, т.е. вызовом этого самого аллокатора, увы, все равно не избежать
Фактически, при активном использовании STL, имхо, всегда нужно держать "руку на пульсе": строчить свои аллокаторы на каждый вид объектов...
Повторюсь, что речь в данном случае про встраиваемые системы на обычным МК.
Пока что очкую применять STL в аппаратно-критичных приложениях, а других у меня и нету ))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Aug 5 2018, 10:05
Сообщение #75


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Не стоит забывать что stl который с компилятором не прибит гвоздями. В геймдеве схожие с эмбедедом проблемы и написаны адаптированные под такие проблемы библиотеки. EASTL например, который выглядит намного разумней того что предлагает стандарт и производители компиляторов.
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 5 2018, 15:20
Сообщение #76


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Kabdim @ Aug 5 2018, 13:05) *
EASTL

EASTL как вариант, конечно, хорошо. К тому же он полный опенсорс с необходимыми бенчмарками и соотв. тестами, но есть одно важное НО:
применение STL, судя по всему, требует соотв. экспиренса в наших программных делах. И, судя по всему, весьма немалого!
Тут многие местные "программеры" от банальных плюсов шарахаются, как от вампиры от чеснока, а что уж говорить про STL....
Признаюсь, и я не исключение: например, категорически не применяю heap wacko.gif

А у ж в этом разделе "В помощь начинающему > Программирование" весь этот STL - это как показать самолет изолированному племени аборигенов cranky.gif
Имхо, "демонстрация" STL в реальных проектах зачастую может выглядеть как банальное хвастовство перед коллегами по проекту, а вовсе не по необходимости wink.gif
Провожу аналогию с "голым" С и плюсами - дай плюсы, например, упоротому фанату-указателей-где-надо-и-не-надо, так он и код на плюсах умудрится сделать опасным и напрочь нечитаемым и вообще не поддающимся сопровождению angry.gif
Поэтому я, уверен, что при должном и разумном применении этот самый STL даже в "стоковом" виде имеет место быть, как раз именно по необходимости.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Herz
сообщение Aug 5 2018, 18:53
Сообщение #77


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(Forger @ Aug 5 2018, 18:20) *
применение STL, судя по всему, требует соотв. экспиренса в наших программных делах.

А простого опыта будет недостаточно? Может, в этом собака порылась? Люди опасаются, что с "экспириенсом" у них проблемы, а оно и... "не так страшен черт", если разобраться...
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 5 2018, 19:07
Сообщение #78


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Herz @ Aug 5 2018, 21:53) *
А простого опыта будет не достаточно?
Увы, этого не достаточно ((
Нужно читать очень много чужого кода, очень много.


Цитата
Люди опасаются, что с "экспириенсом" у них проблемы, а оно и... "не так страшен черт", если разобраться...

Научиться просто пользовать STL как раз не сложно - достаточно лишь открыть мануал и засунуть тот же array или vector где-нибудь, где как раз лучше обойтись без этого.
А самое сложное - пользоваться разумно именно той сущностью, которой нужно.
Это примерно то же самое, как вкурить когда и где правильно применять паттерн проектирования: по описанию вроде все понятно, но где какой применить - это уже реальная дилемма.
До сих пор многие паттерны для меня - загадка.

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

Поэтому я уверен, что программист, а точнее - программист-проектировщик - это практически то же самое, что и композитор.
По крайней мере я именно так это воспринимаю: чтобы научится писать музыку, придется изучить и научится исполнять много-много чужой. Одних лишь "мануалов" как читать и писать ноты безусловно тут мало.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Herz
сообщение Aug 5 2018, 19:30
Сообщение #79


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



По сути сказанного я с Вами полностью согласен.
Но если моя шутка юмора оказалась неудачной, то я прямо попрошу от Вас (и собеседников) избегать на русскоязычном форуме такого дикого суржика. Ладно ещё, когда без чужеземного заимствования никак не обойтись. Вот, к примеру, недавно одному из форумчан пришлось изобретать "аллокирование", ибо банальное "выделение" или "резервирование", ясно же, никак не годится... biggrin.gif
Но чем буржуазный "экспириенс" ценнее отечественного опыта - ума не приложу...
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 5 2018, 19:39
Сообщение #80


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Herz @ Aug 5 2018, 22:30) *
то я прямо попрошу от Вас (и собеседников) избегать на русскоязычном форуме такого дикого суржика.
Но чем буржуазный "экспириенс" ценнее отечественного опыта - ума не приложу...

Уже давно английский стал неким не побоюсь этого слова всепланетарным языком, особенно в программировании.
В целом с Вами согласен, но с одной поправкой - вместо слова, например, экспириенс стоит использовать иноземное написание: experience.
А иногда, просто лень искать правильное написание того или иного слова в оригинале sm.gif



--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Herz
сообщение Aug 5 2018, 19:48
Сообщение #81


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Вот именно.
Go to the top of the page
 
+Quote Post
Forger
сообщение Aug 5 2018, 20:06
Сообщение #82


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Herz)
чем буржуазный "экспириенс" ценнее отечественного опыта

Слово experience в данном смысле более точно отражает смысл опыта программиста как такового, чем слово "опыт". Более обще, что-ли.
experience <-> опыт в программировании - это примерно то же самое (в моем понимании), как, например, volvo <-> ВАЗ.
Ничего против ВАЗа как такого я не имею, но, думаю, мысль моя понятна sm.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

6 страниц V   1 2 3 > » 
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 07:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.03161 секунд с 7
ELECTRONIX ©2004-2016