Страницы

Поиск по вопросам

суббота, 7 марта 2020 г.

.c_str() возвращает какой-то бред

#cpp #кодировка #visual_cpp #char


День добрый! На C++ считываю данные из файла. В конце имею string, которую мне надо
представить в виде const char*, для чего использую .c_str(). Но возвращает он какой-то
бред (не только с кириллицей проблемы, а вообще с любым текстом). Файл сохранены в
кодировке ANSI. Как можно решить проблему?
Код чтения:

ifstream ifs(path);
if (ifs.is_open())
{
    string s;
    s.assign((istreambuf_iterator(ifs.rdbuf())), istreambuf_iterator());
    cout << s;
    ifs.close();
    return s.c_str();
}
else
    return "";

    


Ответы

Ответ 1



Ну, начнем с того, что вы возвращаете указатель локального объекта, который после вашего return уничтожается, и указатель указывает... куда? Дальше не пояснять?

Объявление и определение функции (порядок размещения)

#cpp #функции


В каждой единице трансляции, объявление функции обязано предшествовать её вызову.
Если это условие выполняется, то порядок размещения определения уже не имеет особого
значения. 

Какой вариант предпочтительней и почему?
(сначала функция объявлена, а затем определена или наоборот)

void someFunction(); // declaration
void someFunction() { cout << "hello" << endl; }

int main()
{
    someFunction(); // function call                
    return 0;
}


или

void someFunction() { cout << "hello" << endl; }
void someFunction(); // declaration

int main()
{
    someFunction(); // function call                
    return 0;
}

    


Ответы

Ответ 1



Какой вариант предпочтительней и почему? (сначала функция объявлена, а затем определена или наоборот) Хотелось бы узнать причину именно такого порядка размещения. Что это? удобство восприятия программы, отдельное положение стандарта языка, код в этом случае быстрее компилируется или есть ещё какая-то причина? Причина та же самая, по которой вообще в язык добавлена возможность объявлять функции без их определения. Представьте что возможности объявить (без определения!) функции нет. И вам надо написать две функции, вызывающие друг друга: void SomeFirstFunction(int n) { cout << n << endl; SomeSecondFunction(n); } void SomeSecondFunction(int n) { if (n > 0) { SomeFirstFunction(n - 1); } } int main() { SomeFirstFunction(5); } Компилятор разбирает файл сверху вниз. Он доходит до строки SomeSecondFunction(n); В этот момент он понятия не имеет, что это за SomeSecondFunction и какие параметры она принимает - она ведь еще не определена. И он падает с ошибкой: In function 'void SomeFirstFunction(int)': error: 'SomeSecondFunction' was not declared in this scope Перестановка местами SomeSecondFunction и SomeFirstFunction, очевидно, не поможет. Поэтому в язык добавлен хак - вы можете сказать компилятору "SomeSecondFunction - это функция вот с такими параметрами, и она будет определена где-то ниже. Или даже не ниже, а вообще в другом файле - вобщем, смело считай это функцией, генерируй код для ее вызова, потом линковщик разберется где эта функция на самом деле лежит". // предупредили компилятор void SomeSecondFunction(int n); void SomeFirstFunction(int n) { cout << n << endl; // компилятор спокойно сгенерировал вызов еще не определенной (но объявленной!) функции SomeSecondFunction(n); } void SomeSecondFunction(int n) { if (n > 0) { SomeFirstFunction(n - 1); } } При этом нет никакого смысла в объявлении SomeFirstFunction после ее определения - компилятор и так знает что это за функция, ему от еще одного объявления уже известного факта лучше не станет. А вот в примерах из вашего вопроса объявление полностью избыточно. Т.е. ни один из этих вариантов не предпочтительней - они оба бессмысленны, т.к. эквивалентны варианту вообще без declaration: void someFunction() { cout << "hello" << endl; } int main() { someFunction(); // function call return 0; }

Ответ 2



Делать "наборот" нет никакого смысла. Потому что определение функции уже включает в себя объявление. Причина, по которой нужно объявлять до ее использования очень проста. Когда компилятор встречает вызов функции, ему нужно коректно передать параметры, а также правильно сформировать их "проталкивание" в стек/регистры. А также и решить, кто будет "подчищать" стек после вызова. Старый си допускал использование функций до их определений/объявлений, но при этом он считал, что все аргументы функции типа int и возвращаемое значение такое же. UPD кратко. Это запрещено стандартом явно 3.2 One definition rule [basic.def.odr] 1 No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template. расширено, но сумбурно В теории, все функции можно разместить так, что бы вызываемые функции были выше (раньше) вызываемых. Это конечно требует дополнительных телодвижений (читать: компиляция будет дольше или нужно ручками все будет расставлять), но возможно. Либо добавлять определение к каждой единице, но это также сильно удлинит компиляцию. Плюс возникает риск того, что в разных единицах компиляции будут разные версии одной и той же функции (из за дефайнов, а это уже весело) либо просто будет дублирование кода, который линковщику ещё и убрать нужно. Поэтому это и запрещено стандартом ( Просто выделение объявлений позволяет делать компиляцию в паралель (или даже на разных машинах). Минимизируется наличие дубликатов функций (inline функции могут дублироваться).

Как положить лямбду в List<Task>

#c_sharp


Есть список задач List. 

Не могу разобраться как правильно положить в него лямбду. 
Таким образом как у меня сейчас отрабатывает неправильно и на консоль выводится только
"one";

Почему вторая таска не отрабатывает?

static void Main()
{
    var tasks = new List();
    tasks.Add(TestMethod("one"));
    tasks.Add(new Task(async () => await TestMethod("two")));
    Task.WhenAll(tasks);

    Console.ReadKey();
}

private static async Task TestMethod(string msg)
{
    Console.WriteLine(msg);
}

    


Ответы

Ответ 1



Все верно. Вы же её создали, но не запустили. Чтобы вторая отработала - запускайте ее с помощью Task.Run(): tasks.Add(Task.Run(async () => await TestMethod("two"))); Тестить!

Помогите советом, как с html и css сделать такие блоки?

#html #css #вёрстка #bootstrap



Все выполняю с помощью bootstrap. 
Нужно выполнить блоки в точности как на прилагаемом изображении.
Самые главные моменты:


чтобы изображение залезало на рамку
чтобы при наведении на блок, внизу появлялась полоса красная.Причем это полоса должна
быть НЕ со скошенными краями, как если бы мы просто изменяли цвет нижнего бордера на
красный.
и чтобы все было адаптивно и не сыпалось при изменении размера экрана.


Возможно есть какой-то простой способ реализации этой штуки. У меня пока все с жуткими
костылями, и сыпется верстка. Испробовал уже самые разные вариации
    


Ответы

Ответ 1



section { box-sizing: content-box; height: 64px; border-bottom: 3px solid transparent; margin: 1em 0; } img { height: 100%; float: left; } div { box-sizing: border-box; height: 100%; overflow: hidden; padding: .5em; border: 3px solid silver; border-left: none; } section:hover { border-color: red; }
Тут какое-то описание
Тут какое-то описание
Тут какое-то описание


Ответ 2



Похоже на то, учитывая, что в при наведении серой рамки нет + появляется тень (судя по скриншоту). section { box-sizing: border-box; height: 64px; border-bottom: 2px solid transparent; margin: 1em 0; } img { height: 100%; float: left; } div { box-sizing: border-box; height: 100%; overflow: hidden; padding: .5em; border: 1px solid #ddd; border-left: none; background-color: #fff; } section:hover { border-color: #7d2d3a; box-shadow: 0 0 6px 3px rgba(0,0,0,.08); } section:hover div { border-color: transparent; }
Куррорт-Аваза
Красивый болгарский курорт Созополь
Hotel Splendid Conference Spa Resort 5* расположен в чудесном курортном местечке – Бечичи на берегу чистейшего Адриатического моря.
А насчёт: Вроде решил. Добавил в div:hover нижняя рамка none. Вроде пока не прыгает ничего, и скос исчез) то лучше использовать селектор: section:hover div чтобы при наведении и на пикчу срабатывало то же самое поведение. Так же можно вместо красного бордера для section сделать изящнее, с анимацией через section:after. Например https://jsfiddle.net/acid_grip/3u3pu41y/

пятница, 6 марта 2020 г.

WPF, DataGrid. Растягивание колонок при появлении свободного места

#c_sharp #wpf #xaml #datagrid


В окне есть DataGrid, при нехватке места для отображения данных появляется скрол,
но если места становится больше чем необходимо появляется пустой столбец. Необходимо
сделать так, чтобы при нехватке места появлялся скрол, но при появлении свободного
места столбцы равномерно растягивались на всю доступную таблице ширину.
Текущий код таблицы:




Вид при нехватке места:


Вид при избытке места:

    


Ответы

Ответ 1



Установите свойство ColumnWidth в *. Это приведет к равномерному растягиванию всех столбцов таблицы. Также в сочетании с этим свойством можете установить каким-то столбцам свою ширину. столбцы 2 и 3 поделят между собой всю свободную ширину, тем самым не будет видно "пустого столбца". UDP: Если таблица имеет фиксированную ширину то, для появления горизонтального скрола, можно сделать так:

cannot access class IDEA

#intellij_idea #access #java


Здравствуйте все, такая есть проблема:

IntelliJ IDEA подсвечивает красным (cannot access) this поле в конструкторе, в то
время, как при компиляции все работает нормально.

Переустанавливал IDEA, JDK, OS, все бестолку. Уже руки опускаются.
Ссылка на скриншот.

Настройки стандартные, IDE тоже. Раньше такого не было.
    


Ответы

Ответ 1



Попробуйте сделать "Invalidate caches" в IDEA.

Как правильно задать тег meta og:image?

#html #css #html5


Подскажите как правильно прописать свойства на тег:
У меня лого 1200*1200, а в facebook 1200x630


      style="max-width:auto;
             height:50% ;">


Правильно ли я прописал? мне нужно чтоб картинка 1200 на 1200 разместилась на 1200x630
    


Ответы

Ответ 1



Любые css для meta неприменимы в принципе, как и для других элементов внутри head. Подготовьте превью для соц.сетей программно.