Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1729 • Страница 85 из 87<  1 ... 82  83  84  85  86  87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 24.06.2008
dims276 писал(а):
парни подскажите пожалуйста.Какие из прототипов синтаксически правеильны в с++ ?

a) void foo(int x,int y=5 ,int); // не правильный: аргумент со значением по дефолту не последний
b)void foo(int,int,int,int y=5); // правильный
c)void foo(int x;int y=5 );; // что за точка с запятой?
d)void foo(int x,y=5 ); // не правильный: тип y не определен
e)void foo(int x,int y= x); // не правильный: значение по дефолту задано некорректно


dims276 писал(а):
$a = '12345';
$a[$a[1]] = '2';
echo $a;
ответ выведет 12245 ?


Это пообще не в тему, поскольку PHP.
Но, насколько я помню, в PHP индексы, также как и в C, с нуля. Поэтому $a[1] это символ 2; $a[2] (третий элемент) было 3, а после присваивания стало 2.



Партнер
 

Junior
Статус: Не в сети
Регистрация: 06.02.2015
Фото: 0
Здравствуйте коллеги. У меня возник интересный и довольно необычный вопрос, прошу помочь менее знающему человеку.

Пришлось из-за "определенных" рамок слезть с visual studio и связаться с mingw. Установка пошла хорошо. Написав часть необходимого кода, решил "просто посмотреть" что есть в этом mingw.

Запустив mingw installation manager решил посмотреть, что есть в настройках и нажал на кнопку Settings.

Что случилось дальше меня очень сильно удивило. А если конкретно то НИЧЕГО и не произошло. Настроек не появилось. Поклацав ещё на эту кнопку пару раз. Я решил чисто из интереса, поставить мингв на другой пк (где кстати установлена ХР). Результат тот же.

Загоревшись целью узнать почему эта кнопку не работает,я провел, почти всё свободное время в поисках на просторах интернета.
В результате я ничего так и не нашел!

Помогите мне докопаться до истины и узнать от чего же эта собака в виде настроек в mingw не работает!!!
(Прилагаю скриншот менеджера где собственно и есть эти настройки, которые не работают)


У вас нет необходимых прав для просмотра вложений в этом сообщении.


 

Member
Статус: Не в сети
Регистрация: 29.11.2008
Откуда: Санкт-Петербург
Фото: 8
Мужики, только начал учить язык, пока всё ясно только проблема с инкрементом и декрементом, а именно ++а и а++ :D :
Пример:
int var =1;
int a=0;
a = ++var + 1 + ++var*2;


Подскажите логику подсчета, плиз. Я сам насчитал а=7. Правильный ответ 10 (похоже в MS Visual Studio). Сам кодю в Code Blocks, там компилятор minGW (gnu gcc compiler), а он просчитал ответ равный 9. Выбирал в настройках компилятора: visual C++ 2005/2008/2010 - результат тоже 9. Что за нафиг?

_________________
Freedom is not free. Rights are not Gifts from Government!
Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения


 

Member
Статус: Не в сети
Регистрация: 01.05.2007
Откуда: Тель-Авив
Фото: 1
ReXaN писал(а):
a = ++var + 1 + ++var*2;

Поскольку выражение ++var фигурирует в формуле дважды, результат вычисления официально признан не определенным.
Так что компилятор волен хоть -42 вернуть в ответ на такое. :crazy:

++var - var увеличивается на единицу ДО использования
var++ - var увеличивается ПОСЛЕ

Например (1):
int var = 0;
if (++var == 1)
printf("var дейстаительно равен 1 и мы напечатали эту строку")

Например (2):
int var = 0;
if (var++ == 0)
printf("тут var опять равен единице, но мы сюда тем не менее попали");

А вообще, не уверен - ставь скобки!


 

Member
Статус: Не в сети
Регистрация: 29.11.2008
Откуда: Санкт-Петербург
Фото: 8
Herod писал(а):
Поскольку выражение ++var фигурирует в формуле дважды, результат вычисления официально признан не определенным.

Там такая задачка была. Просто я не разобрался с приоритетами в задачке, а оно вообще вон как... Учтем :?: .

Herod писал(а):
++var - var увеличивается на единицу ДО использования
var++ - var увеличивается ПОСЛЕ

Это я понял т.к. приоритет операции ++х выше чем х++

Herod писал(а):
if (++var == 1)

А если ++var == 0, то получим 0? Т.е. сначала будет увеличение на 1, потом приведение к равно 0?
А если var++ == 0, то сначала приравнивание к 0, а потом увеличение на 1?

_________________
Freedom is not free. Rights are not Gifts from Government!
Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения


 

Member
Статус: Не в сети
Регистрация: 01.05.2007
Откуда: Тель-Авив
Фото: 1
ReXaN
Если ++var то он сначала увеличит var, а потом будет использовать (в примере - сравнивать) что получилось
Если var++ то он сначала использует var (сравнит с нулем) и увеличит когда закончит пользоваться.

Типа, еще пример:
int var, a, b;
var = 0;
a = ++var;
var = 0;
b = var++;
В результате у нас получится a = 1, b = 0, var = 1

Ну и чтобы два раза не вставать:
http://lurkmore.to/%2B%2Bi_%2B_%2B%2Bi


 

Member
Статус: Не в сети
Регистрация: 29.11.2008
Откуда: Санкт-Петербург
Фото: 8
Herod, благодарю за разъяснение :beer: .
Herod писал(а):
Ну и чтобы два раза не вставать:
http://lurkmore.to/%2B%2Bi_%2B_%2B%2Bi

В РФ "лурка" забанена :pleasantry: . Зашел через тор :D .

_________________
Freedom is not free. Rights are not Gifts from Government!
Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения


 

Junior
Статус: Не в сети
Регистрация: 20.07.2016
Откуда: Эспоо,Финляндия
Herod писал(а):
Поскольку выражение ++var фигурирует в формуле дважды, результат вычисления официально признан не определенным.

Это не правда. В приведенном выражении правильный ответ — 9. Нерпавда потому, что согласно пункту 4.1 параграфа 5 стандарта С++ (начиная с 98) поведение является неопределенным в том случае, когда lvalue изменяется более, чем 1 раз между sequence points. Здесь это не так, так как все сайд эффекты преинкремента завершаются прежде, чем начинается вычисление следующего преинкремента.

Цитата:
a = ++var + 1 + ++var*2

Порядок действий будет следующим
1)++var - запишет в var 2 и вернет 2. Промежуточное выражение примет вид: 2 + 1 + ++var*2
2)++var - запишет в var 3 и вернет 3. Промежуточное выражение примет вид: 2 + 1 + 3*2 = 9

Если изменить заданное выражение следующим образом, то результат вычислений окажется неопределенным:
var++ + 1 + ++var*2

или так:
var = ++var + 1 + ++var*2 — результат снова неопределен


 

Member
Статус: Не в сети
Регистрация: 29.11.2008
Откуда: Санкт-Петербург
Фото: 8
lexer42152, почитав материал по ссылке выше, правильный ответ может быть и 10.
т.к.
lexer42152 писал(а):
1)++var - запишет в var 2 и вернет 2. Промежуточное выражение примет вид: 2 + 1 + ++var*2
2)++var - запишет в var 3 и вернет 3. Промежуточное выражение примет вид: 2 + 1 + 3*2 = 9

3) окончательное выражение примет вид: 3 + 1 + 3*2 = 10
Первая 3 будет из-за того, что все var могут перезаписаться в 3 после шага 2) ;)

Но я понял, что всё это называется неопределенным поведением и автору задачки не следовало, на мой взгляд, давать её в начале изучения языка, хотя прикольно вышло :D

_________________
Freedom is not free. Rights are not Gifts from Government!
Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения


 

Junior
Статус: Не в сети
Регистрация: 20.07.2016
Откуда: Эспоо,Финляндия
ReXaN писал(а):
Первая 3 будет из-за того, что все var могут перезаписаться в 3 после шага 2) ;)

нет, не могут по определению приоритета операций, т.к. операции вычисляются слева направо и ++var - это rvalue, а не lvalue. Неопределенное поведение возникает в случае, когда один и тот же lvalue обновлется более одного раза между двумя точками следования.
Выражение ++var + <что-нибудь> определяет точку следования, т.к. все сайд-эффекты ++var завершаются до выполнения операции "+". То же самое с ++var*2. Вот если вы один из преинкременов замените на постинкремент или же присваивать все будете не переменной а, а переменной var, то действительно будет неопределенное поведение. Это довольно тонкий момент и нужно хорошо читать стандарт, чтобы хорошо понимать, что же такое "точка следования". Это часто одно выражение, но не всегда! Задача поставлена корректно, а вот ответ был дан неправильный. В любом случае, это слишком тонкий момент для начинающего.


 

Member
Статус: Не в сети
Регистрация: 29.11.2008
Откуда: Санкт-Петербург
Фото: 8
lexer42152 писал(а):
т.к. операции вычисляются слева направо и ++var - это rvalue, а не lvalue. Неопределенное поведение возникает в случае, когда один и тот же lvalue обновлется более одного раза между двумя точками следования.

Всё, я понял! :beer:
Просто внимательнее мне надо быть, в примере неопределенного поведения на "лурке" тоже было i=5; i = ++i + ++i, а не, например, var = ++i + ++i :oops: .
Поэтому условие той задачки выше все же получается правильное, но тогда похоже, что компилятор MS Visual Studio (и версия явно была не Express) намудрил с правильным ответом в 10 :crazy: .

_________________
Freedom is not free. Rights are not Gifts from Government!
Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения


 

Junior
Статус: Не в сети
Регистрация: 20.07.2016
Откуда: Эспоо,Финляндия
ReXaN писал(а):
Всё, я понял! :beer:

Я только что сверился со Стандартом. Судя по всему преинкремент и постинкремент не определяются как точки следования, т.е. я ввел вас в заблуждение, простите :fingal: Даже в начальной формулировке будет undefined bahavior. Видимо, у GCC есть расширение, которое позволяет придавать значение "осмысленным" случаям, как в вашей формулировке, поэтому он и выдает 9.


 

Member
Статус: Не в сети
Регистрация: 15.07.2008
Функция на выходе даёт результат в бинарном виде типа "00011011". Нужно разбить его на два куска и модифицировать ими два других байта. Типа так: 00011011 -> ххх11ххх + 000хх011 (х - без изменений).
Чё мне вообще гуглить?


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
wandal, звучит как чистые "бинарные операции", но объяснено так, что не понятно почти что ничего. Функция возвращает строку? Какие два других байта, откуда они берутся, они часть результата или что? Этот пример в конце явно требует дополнительных пояснений. Я из интереса попробовал этот текст скинуть 2-м знакомым программистам, они тоже ничего не поняли


 

Member
Статус: Не в сети
Регистрация: 15.07.2008
Industrialice
Код:
unsigned char digit(int a)        // это преобразует digit в бинарный вид           
{
   switch (a)
   {
    case 0 : return 0b11000000;
    case 1 : return 0b11111001;
    case 2 : return 0b10100100;
    case 3 : return 0b10110000;
    case 4 : return 0b10011001;
    case 5 : return 0b10010010;
    case 6 : return 0b10000010;
    case 7 : return 0b11111000;
    case 8 : return 0b10000000;
    case 9 : return 0b10010000;
   }
}
      PORTB = digit(value%10);  // это переводит value в бинарный вид и отправляет байты 7,6,5,4,3,2,1,0 на порт


Нужно как-то переделать последнюю строку. Чтобы было типа так:

Код:
      PORTB = digit(value%10????? как?);  // отправить байты 7,6,5 и 2,1,0 на порт
      PORTC = digit(value%10????? как?);  // отправить байты 4 и 3 на другой порт


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


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
wandal такого оператора в С/С++ не существует, что вам нужно, как я понимаю, это скомбинировать новое значение с существующим и отправить результат на порт
Допустим, приёмник PORTC содержит какое-то значение, 8 бит, вы хотите поменять только биты 4 и 3 в нём - для этого нужно взять текущее значение, взять из него биты {7,6,5,2,1,0} и скомбинировать его с тем, что вы получили от digit, взяв из него биты {4,3}, затем результат отправить на PORTC
Если именно это нужно, то это просто
Возможно, с чем вы работаете, позволяет указывать, какие биты использовать - но непосредственно к С/С++ это уже отношения не имеет. Сам язык этого не позволяет. Можете только менять значение битов с 0 на 1 или наоборот


 

Member
Статус: Не в сети
Регистрация: 15.07.2008
Industrialice Похоже, это то что надо. Спасибо!
Код:
Типа такого:
DATA_MASK) | (DataByte >> 4); //example
portLCD = portLCD & (˜LCD_DATA_MASK) | (DataByte


 

Member
Статус: Не в сети
Регистрация: 29.11.2008
Откуда: Санкт-Петербург
Фото: 8
Подскажите толковую книжку по программированию для windows, создания оконных приложений, плиз.
Я так понял, что через windows.h можно создать окна в простом IDE, например в Code::Block, в котором я учусь кодить :D .

"Кьют" платный, может есть аналоги не хуже?

_________________
Freedom is not free. Rights are not Gifts from Government!
Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
ReXaN, если не собираетесь на своём приложении зарабатывать, Qt должен быть бесплатен. А вообще это болезненный вопрос для С++, язык для создания гуя не слишком подходит, из библиотек, Qt, пожалуй, самый лучший вариант из существующих, но назвать его качественным при всём желании нельзя. Нативный гуй из windows.h, WinAPI, это привет из 80-х, смысл на него время тратить? Разве что если совсем что-то простенькое нужно и нет планов создания чего-либо сложнее. Далее, из того, что сам Microsoft предоставляет, MFC, сущий кошмар, к текущему моменту почти что забытый, проходить мимо и не оглядываться
Лучше вообще определиться, насколько сложные планируются приложения, нужна ли кроссплатформенность. Какие-то мелкие библиотеки для С++ должны подойти, если требуется что-то простое, в другом случае, для windows лучше присмотреться к C# & WPF


 

Member
Статус: Не в сети
Регистрация: 29.11.2008
Откуда: Санкт-Петербург
Фото: 8
Industrialice, как всё сложно...
Я пока просто изучаю язык, вот и интересно что и как лучше. MFC в интернете помоему все не хвалят. Есть ещё GTK, WxWidgets, FoxToolkit, которые тоже особо не расхваливают.
А так хотел бы написать программку в виде таблицы в несколько колонок и с кучей строк, но с приятным графическим оформлением. Ну ещё хотелось бы создать простенькую игру :D какой-нибудь платформер.

ПС: Хотел изучить С++, а потом JavaScript.

_________________
Freedom is not free. Rights are not Gifts from Government!
Настоящая сила идет не столько от боевых навыков, сколько от достоинства и самоуважения


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1729 • Страница 85 из 87<  1 ... 82  83  84  85  86  87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  



Лаборатория














Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan