Страницы

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

воскресенье, 31 марта 2019 г.

Как обойти текст при наведении на svg элемент?

Есть следующий код, при наведении на блок у svg должна меняться обводка, но если наводить на текст, который находится над самим svg элементом, то естественно обводка не появляется, пробовал делать вот так:
.accordion_name h2:hover svg { stroke: orange; }
Но это не привело ни к каким результатам, что можно сделать в данной ситуации?
И сразу еще вопрос, я разместил вот этот svg блок относительно родительского блока, мне нужно что бы текст всего был в районе данного треугольника:
Но если текст будет больше, то он выйдет за пределы:
Оно так и должно происходить с моим выполнением задачи, но есть ли способ сделать это правильно: Что бы если текст выходил за пределы треугольника, то треугольник делался больше в ширину, либо другие решения (Пробовал задавать максимальную ширину блоку с текстом, но не помогло).
* { margin: 0; padding: 0; } body { backgoround-color: #ddddd; } .wrapper { margin: 30px; max-width: 600px; } .accordion_item { margin-top: 4px; } .accordion_name { padding: 10px; cursor: pointer; position: relative; } .accordion_name h2 { position: relative; z-index: 3; display: inline-block; } .accordion_name h2:hover svg { stroke: orange; } svg { stroke: transparent; position: absolute; fill: #dddddd; height: 100%; width: 100%; top: 0; left: 0; right: 0; bottom: 0; z-index: 0; transition: 0.2s; } svg:hover { stroke: orange; } .accordion_content { height: 0; overflow: hidden; }

One accordiont line

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sapiente molestias inventore cum. Eligendi ad quae, veritatis nostrum dolores doloremque culpa. Nam sequi omnis fugiat sed. Enim ipsum rerum iure quisquam.

One accordiont line

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sapiente molestias inventore cum. Eligendi ad quae, veritatis nostrum dolores doloremque culpa. Nam sequi omnis fugiat sed. Enim ipsum rerum iure quisquam.

One accordiont line

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sapiente molestias inventore cum. Eligendi ad quae, veritatis nostrum dolores doloremque culpa. Nam sequi omnis fugiat sed. Enim ipsum rerum iure quisquam.


Ответ

Сделайте табы при помощи css:
* { margin: 0; padding: 0; } div { border-bottom: 1px solid #ccc; margin: 20%; cursor: pointer; } span { position: relative; display: table; border: 1px solid #ccc; border-right: none; background: #eee; line-height: 28px; margin-bottom: -1px; padding: 0 30px; } span:before, span:after { content: ''; position: absolute; top: -1px; left: 100%; width: 0; height: 0; border-style: solid; border-width: 30px 0 0 50px; /* Изменяя цифру 50 можно менять угол наклона */ border-color: transparent transparent transparent #ccc; z-index: -1; } span:after { margin-left: -2px; border-color: transparent transparent transparent #eee; } div:hover { border-bottom-color: orange; } div:hover span { border-color: orange; } div:hover span:before { border-color: transparent transparent transparent orange; }

Пунтк 1

Не будет проблем с шириной. Ограничение для текста тоже можно приделать используя overflow: hidden и white-space: nowrap. Можете дорабатывать как захочется.

Объясните на пальцах совместимость библиотек в .Net Core, .Net Framework, .Net Standart

Изучаю .Net. Хочу написать некое серверное приложение (думаю что учеба лучше на реальном примере, нежели писать примитивные hello world). Выбор уходит в сторону .Net Core (микросервис). В проекте нужно будет использовать некоторые библиотеки (далее пример приведу). Из всего прочитанного понял следующее (если что не правильно понял поправьте):
Net Standart - вершина "айсберга" (своего рода типа интерфейс для остальных проектов) Net Core, Net Framework, Xamarin - ниже по иерархии (типа как классы реализующие интерфейс), но могут (и скорее всего так и делают) добавлять свои специфические фичи, характерные для каждого из них. Библиотеки (dll-ки) написанные как классы Net Standart могут использоваться в любом из наследников (Net Core, Net Framework, Xamarin) с полной совместимостью (а если быть точным то смотреть таблицу реализации https://docs.microsoft.com/en-us/dot...tation-support), но не наоборот (т.е. к примеру если библиотека написана как Net Framework dll (со специфическими для Net Framework фичами), то не факт что ее можно использовать в Net Core, потому как он не поддерживает специфические фичи из Net Framework) Каждая последующая версия Net Standart, Net Core, Net Framework, Xamarin включает в себя все фичи из предыдущей версии самой себя + некоторые новые. Т.е. к примеру код написанный под Net Standart 1.3 будет 100% работать в Net Standart 2.0, НО код написанный под Net Standart 2.0 не будет работать в Net Standart 1.3 и выше.
И теперь собственно на реальном примере. Буду использовать .Net Core 2.0 и смотреть совместимость естественно с Net Standart 2.0 и .NETFramework 4.6.1. Выбираю два пакета (библиотеки) на сайте nuget. Первый к примеру Selenium Webdriver https://www.nuget.org/packages/Selenium.WebDriver/ Во вкладке dependencies смотрю что ему надо (я понимаю что все это подтянется автоматом в visual studio, вручную не надо):
.NETFramework 3.5 No dependencies.
.NETFramework 4.0 No dependencies.
.NETFramework 4.5 No dependencies.
.NETStandard 2.0 Newtonsoft.Json (>= 10.0.3)
Как я понимаю ему не нужны никакие зависимости из .NETFramework, но нужна одна зависимость из .NETStandard 2.0. Но для Newtonsoft.Json (>= 10.0.3) тоже нужны зависимости https://www.nuget.org/packages/Newtonsoft.Json/
.NETFramework 2.0 No dependencies.
.NETFramework 3.5 No dependencies.
.NETFramework 4.0 No dependencies.
.NETFramework 4.5 No dependencies.
.NETStandard 1.0 Microsoft.CSharp (>= 4.3.0) NETStandard.Library (>= 1.6.1) System.ComponentModel.TypeConverter (>= 4.3.0) System.Runtime.Serialization.Primitives (>= 4.3.0)
.NETStandard 1.3 Microsoft.CSharp (>= 4.3.0) NETStandard.Library (>= 1.6.1) System.ComponentModel.TypeConverter (>= 4.3.0) System.Runtime.Serialization.Formatters (>= 4.3.0) System.Runtime.Serialization.Primitives (>= 4.3.0) System.Xml.XmlDocument (>= 4.3.0)
.NETStandard 2.0 No dependencies.
Вот тут я немного в ступоре. Если я буду использовать .Net Core 2.0, а он в свою очередь реализует .NETStandard 2.0, то как я понимаю для Newtonsoft.Json уже не нужны зависимости из .NETStandard 1.0 и .NETStandard 1.3, потому как все это уже есть в .NETStandard 2.0.
Т.е. будет ли пакет Selenium.WebDriver совместим с .Net Core в данном случае?
И еще один пример, есть пакет cefSharp: https://www.nuget.org/packages/CefSharp.OffScreen/65.0.0-pre01 Он тянет зависимость CefSharp.Common (= 65.0.0-pre01) Та еще две, но эти последние две не тянут ничего https://www.nuget.org/packages/cef.redist.x64/
This package has no dependencies.
В этом случае ни слова про .NETStandard и .NETFramework. Т.е. как я понимаю они вообще самодостаточные? Т.е. как они будут работать в .Net Core?
Длинный вопрос получился, но надеюсь вы поняли, в чем я хочу разобраться: Как выяснить совместимость пакета с определенной реализацией .NET?


Ответ

Вы немного неправильно читаете раздел "dependencies". Вы читаете его как "поддерживаемые фреймворки, и необходимые части фреймворков". На самом деле это "необходимые дополнительные пакеты, при использовании этого пакета под конкретный фреймворк".
Например:
Как я понимаю ему не нужны никакие зависимости из .NETFramework, но нужна одна зависимость из .NETStandard 2.0.
Это не "одна зависимость из .NETStandard 2.0". Это "другие nuget-пакеты, которые нужны для использования версии Selenium.WebDriver, собранной под .NETStandard 2.0.".
Если ваше приложение собирается под .NETFramework 4.5 - вы можете подключить пакет Selenium.WebDriver, и код из него будет работать сам по себе, без необходимости подключать дополнительные пакеты.
Если ваше приложение собирается под .NETStandard 2.0 (или любую его реализацию, под которую нет более специфической версии, например под .NET Core) - то при подключении Selenium.WebDriver вам придется подключить еще и Newtonsoft.Json.

Вывести тип, использованный в шаблонных параметрах аргумента

Можно ли сделать так, чтобы тип CharT выводился автоматически в C++17?
template void test(std::basic_string_view string) {
} test("hello world"); //ok test("hello world"); //compile error


Ответ

Можно добавить перегрузку:
template void test(CharT const ( & string )[x_array_size]) { return test(std::basic_string_view{string}); }

Что означает данное приведение типа

В статье в по адресу https://ru.cppreference.com/w/cpp/algorithm/transform наткнулся на такое приведение типа:
(int (*)(int))std::toupper
Как правильно прочитать данное приведение типа, и для чего оно нужно.


Ответ

int (*)(int) - указатель ((*)) на функцию от int ((int)), которая возвращает int
int (*)(int) ^ указатель ^ на функцию от int ^ возвращающую int

Как написать regex, не принимающий пустую строку?

Мне нужно, чтобы выражение могло читать: символ -, либо же слово состоящее из букв KQkq. Порядок важен, каждая буква может присутствовать ноль либо один раз. Слово должно состоять минимум из одной буквы.
Я написал такое выражение (-|K?Q?k?q?), но оно, к сожалению принимает и пустую строку. Есть идеи как его можно улучшить?
Строки которые должны приниматься
- KQkq K Q Qk
не должны приниматься
QK QQ // пустая строка qQ


Ответ

Вроде так:
/^(\-|KQ?k?q?|K?Qk?q?|K?Q?kq?|K?Q?k?q)$/g
Проверить можете тут

Как ограничить время работы сценария?

Как ограничить время работы сценария? Например я поставил чтобы через 5 минут программа закрылась, она работает и как только 5 минут пройдет программа закроется. Как это можно реализовать? В windows.


Ответ

Код сценария выполняется в функции run. Функция join ждет указанное количество времени, блокируя дальнейшее выполнение кода в главном потоке. После окончания указанного времени скрипт напечатает в консоль сообщение и закроется.
Параметр daemon=True указывает, что поток при завершении главного потока также завершится:
import threading
def run(): import time
i = 1
# Бесконечный цикл while True: print i i += 1
time.sleep(1)
if __name__ == '__main__': thread = threading.Thread(target=run) thread.daemon = True thread.start() thread.join(5 * 60)
print 'Quit!'

Что значит :: знак в java? [дубликат]

На данный вопрос уже ответили: Что значит оператор ::? 1 ответ Часто вижу :: при определении нового экземпляра, в стримах, иногда в лямда выражениях. Что он значит? Что значит List :: stream?
P.S. И как он называется?


Ответ

Оператор "ссылка на метод" (Method Reference). По сути - сокращенная запись для ссылки на метод из функционального интерфейса при использовании лямбды.
List::stream
является ссылкой на метод stream() из интерфейса List
List> list = Arrays.asList( Arrays.asList(1,2,3), Arrays.asList(4,5,6) ); list.steam() .flatMap(List::stream) .forEach(System.out::println);
приведенный отрывок кода означает: 1. Мы инициализируем поток, в котором будет список чисел (Stream>) 2. с помощью flatMap мы объединяем список чисел в поток чисел (Stream) 3. с помощью forEach и ссылки на метод println для каждого элемента из потока вызывается вывод на экран
Если владеете английским, хорошее объяснение с примерами приведено в этом ответе

Использование регистровых переменных сравнения в циклах Си

Все источники утверждают, что в циклах использование регистровых переменных очень хорошо для производительности. Для меня остаётся не до конца понятен вопрос как компилятор оптимизирует код в том месте, где происходит сравнение индексной переменной i с переменой length.
double array[100ULL];
size_t length = 20ULL;
for(register size_t i = 0ULL; i < length - 1ULL; i++){ array[i] = (double)i; }
В этом примере индексная переменная i - регистровая. Но сравнение внутри for происходит с переменной length, которая НЕ объявлена как регистровая. Помимо прочего перед сравнением происходит математическая операция.
Хочу для себя прояснить пару-тройку моментов:
Будет ли откомпиллированная программа при каждой итерации цикла производить эту математическую операцию (вычитание единицы из меременной length) раз за разом или эта операция будет произведена только один раз перед началом цикла? Догадается ли компилятор оптимизировать переменную length в регстровую? Какой код будет правильнее с точки зрения производительности и однозначности для компилятора: тот, что выше, или нижеприведённый? И есть ли вообще разница для современных компиляторов?
Второй вариант кода, в котором обе сравниваемые переменные регистровые и операция вычитания однозначно производится перед циклом:
double array[100ULL];
register const size_t length = 10ULL - 1ULL;
for(register size_t i = 0ULL; i < length; i++){ array[i] = (double)i; }
Трансляция кода в asm ситуацию не прояснила, поэтому задаю напрямую.


Ответ

Забудьте об этом слове register, оно давно не имеет никакого смысла.
Ответы на вопросы 1-2 зависят от компилятора; наверное, можно найти старый тупой компилятор, который не сумеет выполнить такие простые оптимизации.. А разумный - вообще может использовать какие-нибудь векторные команды процессора или что еще.
Так что ответ на вопрос 3 - нет, такой простой цикл будет оптимизирован любым более-менее разумным компилятором.
Кстати, VC++2017 просто развернул этот цикл в
mov eax, 1 xor ebx, ebx cvtsi2sd xmm1, rbx movsd QWORD PTR array$[rsp], xmm1 xorps xmm1, xmm1 cvtsi2sd xmm1, rax mov eax, 2 cvtsi2sd xmm2, rax mov eax, 3
.....
movsd QWORD PTR array$[rsp+128], xmm2 movsd QWORD PTR array$[rsp+136], xmm1 xorps xmm1, xmm1 cvtsi2sd xmm1, rax movsd QWORD PTR array$[rsp+144], xmm1
ругнувшись при этом на слово register как давно не поддерживаемое... Результат видите сами.
Очень старенький OpenWatcom пошел по циклическому пути -
L$1: cmp eax,13H jae L$2 mov dword ptr 320H[esp],eax xor ecx,ecx add edx,8 mov dword ptr 324H[esp],ecx inc eax fild qword ptr 320H[esp] fstp qword ptr -8[esp+edx] jmp L$1
но, как видите, вычислив 19 сразу, и работая только с регистрами...

C++ - передача массива в функцию

Есть несколько функций, которые принимают в качестве параметра массив целых чисел.
#include
using namespace std;
// нахождение наибольшего целого числа в массиве int FindLargest(int arr[]) { int largest = arr[0]; for (int i = 1; i < arr.size(); i++) { if ( arr[i] > largest) { largest = arr[i]; } }
return largest; }
// содержатся ли в массиве повторяющиеся элементы bool ContainsDuplicates(int arr[]) { for (int i = 0; i < arr.size(); i++) { for(int j = 0; j < arr.size(); j++) { if (i != j) { if (arr[i] == arr[j]) return true; } } }
return false; }
// содержатся ли в массиве повторяющиеся элементы (ver 2.0) bool ContainsDuplicates2(int arr[]) { for (int i = 0; i < (arr.size() - 1); i++) { for (int j = i + 1; j < arr.size(); j++) { if (arr[i] == arr[j]) return true; } }
return false; }
int main() {
}
Компилятор выводит следующие ошибки. Не могу понять в чем они заключаются.
C:\Users\saibo>gcc algorithms.cpp algorithms.cpp: In function 'int FindLargest(int*)': algorithms.cpp:21:26: error: request for member 'max_size' in 'arr', which is of non-class type 'int*' for (int i = 1; i < arr.size(); i++) ^~~~ algorithms.cpp: In function 'bool ContainsDuplicates(int*)': algorithms.cpp:34:26: error: request for member 'max_size' in 'arr', which is of non-class type 'int*' for (int i = 0; i < arr.size(); i++) ^~~~ algorithms.cpp:36:26: error: request for member 'max_size' in 'arr', which is of non-class type 'int*' for(int j = 0; j < arr.size(); j++) ^~~~ algorithms.cpp: In function 'bool ContainsDuplicates2(int*)': algorithms.cpp:50:27: error: request for member 'max_size' in 'arr', which is of non-class type 'int*' for (int i = 0; i < (arr.size() - 1); i++) ^~~~ algorithms.cpp:52:31: error: request for member 'max_size' in 'arr', which is of non-class type 'int*' for (int j = i + 1; j < arr.size(); j++) ^~~~
Может пишу что-то не так. Буду рад подсказке!


Ответ

arr в int FindLargest(int arr[]) - это не массив, а указатель. (При попытке создать параметр-массив, он автоматически превращается в указатель.)
Указатель не знает размер массива, на который указывает. Вам нужно передавать размер массива как отдельный параметр. (Скажем, int FindLargest(int arr[], int size).)
И вообще, может применяться только к классам. Ни массивы, ни указатели не являются классами, так что .size() никак не мог сработать.

Или, можно вообще отказаться от массивов и использовать std::vector. Вот на них .size() работает.

Индикатор процесса загрузки файла

Можно ли сделать индикатор процесса загрузки файла на сервер (отображать процент загруженного файла) без GET запросов в течение загрузки (очень популярный пример в интернете)?


Ответ

Взгляните на библиотеку gwtupload — она очень проста в использовать и прекрасно работает во всех браузерах и ОС, я проверял. Она использует Ajax запросы для расчета прогресса. Кстати SWFUpload не работает в Linux и Mac. Пока что это лучшее решение для GWT.

Javascript - переход по url с открытием новой вкладки

Добрый день. window.location.href = "my.url" Этот код открывает url на этой же страницы, а как сделать чтобы открывалась новая вкладка? Спасибо.


Ответ

используйте метод open window.open('http://example.com');

Сколько цифр в числе

Имеется натуральное число n. Как получить число цифр в этом числе?
int n = 33; int numberDigits = ???


Ответ

Не надо никаких циклов, можно использовать логарифм Math.ceil(Math.log10(x)) Для страховки можно использовать Math.ceil(Math.log10(x + 0.5)) Собственно, проверил и получил такие вот результаты (3 варианта вычисления: логарифм, деление, сдвиг): Логарифм работает за константное время и, согласен, не так уж быстро, как хотелось бы Сдвиг и деление работают линейно от длины числа, причем сдвиг примерно в пять раз быстрее деления. На десятизначных числах на long(это как раз порядка Integer.MAX_VALUE) логарифм так же быстр, как и сдвиг. Вот, теперь можно почти точно сказать, что логарифм следует использовать только для long, и то, лишь с уверенностью, что будут меряться действительно длинные числа, больше десяти знаков. Вот тестилка, можно и самим проверить, кто желает. На вход подается количество итераций. import sun.misc.Perf;
public class IntegerMeter{ static Perf perf = Perf.getPerf(); static long frequency = perf.highResFrequency();
static int countDigits_A(long number){ int result = 0; for(long match = 0L; number > match; ++result) match = (match << 3) + (match << 1) + 9L; return result; } static int countDigits_B(long number){ return (int) Math.ceil(Math.log10(number + 0.5)); } static int countDigits_C(long number){ int result = 0; while(number != 0L){ ++result; number /= 10; } return result; } static int countDigits_A(int number){ int result = 0; for(int match = 0; number > match; ++result) match = (match << 3) + (match << 1) + 9; return result; } static int countDigits_B(int number){ return (int) Math.ceil(Math.log10(number + 0.5)); } static int countDigits_C(int number){ int result = 0; while(number != 0){ ++result; number /= 10; } return result; } private static double test(Runnable runnable, int count){ long begin = perf.highResCounter(); while(count-- > 0) runnable.run(); long end = perf.highResCounter(); return (double)(end - begin) / frequency; } public static void main(String[] args){ final long candidateLong = 5464456734L; final int candidateInt = (int) candidateLong; int count = Integer.parseInt(args[0]); double testLong_A = test(new Runnable(){ public void run(){ countDigits_A(candidateLong); } }, count); double testLong_B = test(new Runnable(){ public void run(){ countDigits_B(candidateLong); } }, count); double testLong_C = test(new Runnable(){ public void run(){ countDigits_C(candidateLong); } }, count); double testInt_A = test(new Runnable(){ public void run(){ countDigits_A(candidateInt); } }, count); double testInt_B = test(new Runnable(){ public void run(){ countDigits_B(candidateInt); } }, count); double testInt_C = test(new Runnable(){ public void run(){ countDigits_C(candidateInt); } }, count); System.out.printf("%.5f\t%.5f\t%.5f
%.5f\t%.5f\t%.5f
", testLong_A, testLong_B, testLong_C, testInt_A, testInt_B, testInt_C); } }

Плюсы и минусы создания сервера на своем компьютере

Не могу найти хорошего хостинга, тот дорогой, а тот не подходит. Решил рискнуть поставить на компьютер сервер, не могли бы вы написать плюсы и минусы этой затеи.


Ответ

Плюсы: Ты сам себе хозяин. Много места для твоих проектов. Минусы: Постоянный шум компьютера. Расходы на электричество. Убиваешь свое железо. Очень затратно. Нужно постоянно мониторить, обслуживать сервер. Постоянный онлайн, нужны средства на оплату трафика (если он не безлимитный) Я бы не советовал заниматься данным мазохизмом, не пожалей пару баксов и возьми себе нормальный хостинг, меньше геморроя будет. Я бы посоветовал jino.ru. В любом случае это обойдется тебе дешевле, чем свой сервер. И я сомневаюсь что ты будешь использовать всю мощь своего сервера.

Подчеркнуть текст Android

Вот такой код, выводит обычный текст, как мне его подчеркнуть линией внизу? или может быть можно выделить в стринг файле?


Ответ

String htmlTaggedString = "Подчеркнутый текст"; Spanned textSpan = android.text.Html.fromHtml(htmlTaggedString); tvTitle.setText(textSpan);

Возможен ли вызов исключения?

Предположим, где-нибудь, в каком-нибудь месте программы (не в начале), у нас есть следующий код: int a = <некое значение>; Но до этого места, скажем, в нашей программе уже было несколько сот других переменных и программа много раз обращалась к динамической памяти. Возможна ли такая ситуация, что в системе закончится память, и вышеприведенный код приведен к выработке необрабатываемого исключения и аварийному завершению программы? Либо же до этого new[] уже успеет вызвать std::bad_alloc и такая ситуация в принципе невозможна? Другими словами, есть ли гарантия отсутствия исключений в данном случае? Собственно говоря, инструкция int a = some_val просто транслируется в ассемблерную команду наподобии mov eax, ds[index]; т.е. по идее исключение быть и не должно, вопрос только в том, резервируется ли сегмент данных полностью до начала работы программы для всех переменных либо же приобретение ресурсов происходит динамически, в ходе работы программы, как в случае с динамической памятью. Получается, чем больше у нас имен переменных, тем больше индексов в программе, по которым происходит обращение, и тем больше должен быть объем резервируемого сегмента данных. Правда все равно остается вопрос, как запрашивается сегмент данных - либо он представляет некую область в коде программы (секцию данных), либо же размер для сегмента данных и его размер будут получены из системной кучи, при запуске программы.


Ответ

Если я правильно понял вопрос, то есть код: func() { ... int a = 22; ... } В таком случае память для переменной a будет размещаться в стеке и "выделяться" при входе в процедуру func. Я пишу "память выделяется" в кавычках, т.к. при входе в func регистр указателя стека просто будет сдвинут (реально уменьшен) на суммарный объем локальных переменных. Т.о. при обращении к a возможно прерывание по переполнению стека. (Еще вероятнее оно произойдет при вызове первой же функции, если стек в func переполнится). Размер выделяемого сегмента данных под стек (он выделяется при порождении процесса) и возможность управления этим размером зависит от ОС и ее настроек. По умолчанию в Windows это 2MB, в Linux около 10MB. Будет ли средой C++ в таком случае вброшено исключение, откровенно говоря, не знаю. Если интересно, можете поиграться с программкой #include #include #include #include #include
void sigh (int s) { write(1,"catch
",6); exit(1); }
main (int ac, char *av[]) { int sz = av[1]? atoi(av[1]): -1;
while (sz < 1) { printf ("Enter size
"); scanf("%d",&sz); }
struct sigaction sa; memset (&sa,0,sizeof(sa)); sa.sa_handler = sigh; #ifdef ALTST sa.sa_flags = SA_ONSTACK; stack_t ss; ss.ss_sp = malloc(ss.ss_size=1000000); ss.ss_flags = 0; sigaltstack(&ss,NULL); #endif sigaction(SIGSEGV,&sa,NULL);
printf ("Try %d (%x) size
",sz,sz); char a[sz];
a[0] = 'a'; printf ("first
");
a[sz-1] = 'z'; printf ("last
");
exit (0); }
avp@avp-ubu1:~/hashcode$ g++ stacksz.c avp@avp-ubu1:~/hashcode$ ./a.out 10400000 Try 10400000 (9eb100) size first last avp@avp-ubu1:~/hashcode$ ./a.out 10500000 Try 10500000 (a037a0) size Ошибка сегментирования avp@avp-ubu1:~/hashcode$ g++ -DALTST stacksz.c avp@avp-ubu1:~/hashcode$ ./a.out 10500000 Try 10500000 (a037a0) size catch avp@avp-ubu1:~/hashcode$ Идея, надеюсь, понятна. Добавьте ловлю исключений и т.п. крестовые штучки. UPDATE Если кому-то интересно, то можно добавить код struct rlimit lim; int rc = getrlimit(RLIMIT_STACK,&lim); printf ("get = %d stsize: %ld (soft) %ld (hard)
", rc, (long)lim.rlim_cur,(long)lim.rlim_max);
int m = av[2]? atoi(av[2]): 1000000; lim.rlim_cur += m; rc = setrlimit(RLIMIT_STACK,&lim); if (rc < 0) perror("setrlimit"); rc = getrlimit(RLIMIT_STACK,&lim); printf ("get2 = %d stsize: %ld (soft) %ld (hard)
", rc, (long)lim.rlim_cur,(long)lim.rlim_max); и посмотреть, как это работает.

Подключить DLL

Пишу десктопное приложение на C#, которая по задумке должна подключать dll, уже будучи скомпилированой и работающей. Как это возможно реализовать? И возможно ли вообще :)


Ответ

Варианты предлагаю такие: Использовать MEF (как в ответе выше) Использовать MAF (как альтернатива, она может выгружать DLL налету) Использовать Prism Создать общую библиотеку с хорошо продуманным интерфейсом и классом (н-р InitPlugin); обязать ваши библиотеки иметь эту библиотеку и обращаться к нужным интерфейсам посредством Reflection Для неуправляемого кода можно использовать очень интересную возможность: дело в том, что когда функция C# с атрибутом ImportDll обращается к библиотеке, она ищет ее в определенных местах (в системной папке и нек других), но если не найдет, то обязательно также посмотрит в CurrentDirectory. Устанавливая Environment.CurrentDirectory на нужные каталоги, можно добиться системы плагинов на неуправляемом уровне. Последний который приходит в голову, это компилить какие-нибудь алгоритмы прямо на лету через CSharp Compiler

что означает знак -> в ООП?

Первый раз сталкиваюсь с ООП, везде вижу -> , что это за знак присваивания или добавления ? Гуглил, не нашел ответа. И еще: $this - означет так как и jQuеry?


Ответ

Оператор малая стрелка -> предназначен в PHP для работы с объектами при объектно-ориентированном программировании - то есть если у вас есть класс someclass и создан объект $obj=new someclass то обращаться к его полям и методам можно как раз с помощью оператора $obj->field
Если вдаваться в саму работу данного оператора то он может как реально вывызвать методы и считывать/изменять свойства объекта - так и работать за счет функции-перенаправления которая будет выполняться определенные дейтсвия с данными справа от оператора ->
Если приводить аналогию с другими языками программирования, то этот оператор похож на оператор "ТОЧКУ" в языках C/C++/C#/Java/JS и некоторых других - а его синтаксис и семантика взяты из языка Perl

1С альтернатива [закрыт]

Доброго времени суток! Подскажите, может кто сталкивался, слышал. Существуют ли в природе, в идеях, забытых разработках, альтернативы платформе 1С. В первую очередь с точки зрения программиста - то есть мощный конструктор хранилищ данных и форм, плюс отчеты. Интересна любая информация, то есть скажем, старое опен-сорс, которое возможно довести до ума пойдет не менее чем промышленное и тиражное. САП - не предлагать))


Ответ

Вспомнился "Дебет Плюс" на базе Eclipse RCP и JS-скриптов.

Чем структурное программирование отличается от процедурного?

Чем структурное программирование отличается от процедурного?


Ответ

Вообще эти термины друг другу не противоречат. Давайте для начала разберемся что есть что. Структурное программирование - это методология, которая позволяет писать программу как набор блоков. Такими блоками являются ветвления, циклы, последовательность операторов, процедуры. На самом деле все имели с этим дело, когда рисовали блок-схему программы. Идея в том, что нам не нужны такие низкоуровневые вещи как инструкция перехода (goto). А понятие процедурного программирования может или быть синонимично императивному программированию (т.е. мы задаем программу как последовательность инструкций), или подразумевать программирование с использованием подпрограмм, т.е. по сути вариант структурного программирования. Так что получается, что нужно смотреть что конкретно подразумевалось в конкретном контексте. Сейчас же, наверное, когда говорят процедурное, то имеют в виду, что речь не об ООП.

Заголовочный файл conio.h

Что за заголовочный файл такой , и для чего он нужен? В K&R такой не описывают. Заранее спасибо.


Ответ

содержит описание нестандартной библиотеки для работы с консолью (clrscr, kbhit и тому подобное). Поставляется, ЕМНИП, со старыми Борландовскими компиляторами. Не пользуйтесь ей, если хотите, чтобы ваш код компилировался на более современных компиляторах. Заметьте, что непосредственная работа с консолью противоречит философии юниксовских утилит, которые должны одинаково хорошо работать как с входными данными, полученными от пользователя, так и с выводом других программ. Поэтому правильная юниксовская утилита должна читать ввод из stdin и выводить его в stdout/stderr, позволяя эффективно использовать перенаправление потоков ввода-вывода.

Освобождение памяти из под динамического массива (с++)

Если динамический массив создается (через new) внутри какого-то блока кода, например, внутри if, то освобождение памяти через delete нужно производить внутри этого же блока? if (count != 0) { int *masPos = new int[count]; int *masNeg = new int[n - count];
//...
delete [] masPos; delete [] masNeg; }


Ответ

Это не имеет принципиального значения. int *masPos = NULL; if (something) { masPos = new int[10]; }
...
if (masPos) { delete [] massPos; } Как правильно заметили выше, нужен только указатель на массив

Проблема с сессией: Cannot send session cache limiter - headers already sent

Изначально когда проектировал сайт, работал с сессиями только на одной странице, где объявлял session_start(); Потом понадобилось распространить эту функцию на весь сайт. Для этого я разместил session_start() в файл config.php, который в свою очередь подключается к каждому файлу php сайта. Вот тут-то и возникли проблемы...
Структура сайта такова (заголовочные файлы):
config.php header.php left.php footer.php
Эти файлы подключаются к каждой странице сайта. А страницы разбиты по категориям в которых нет ошибки сессии:
index.php shopingcart.php contact.php
И файлы в которых ошибка возникает:
faqs.php productdetail.php checkout.php
Как можно побороть ошибку данную?
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at S:\home\localhost\www\web_shop\faqs.php:1) in S:\home\localhost\www\web_shop\config.php on line 2


Ответ

Благодаря помощи, товарища ToRcH565 удалось исправить эту ошибку. Дело было в том, что я писал

Как запретить отправку формы по нажатии кнопки ENTER?

В форме кнопка с онкликом. Нужно запретить отправку формы по нажатии кнопки ENTER. Можно ли это как-то сделать? Или чтобы Enter работал также, как нажатие на кнопку.


Ответ

Ну, например, так: $(document).ready(function() { $(form).keydown(function(event){ if(event.keyCode == 13) { event.preventDefault(); return false; } }); });

Когда обычно нужно использовать делегаты?

Изучаю C#, прошу разъяснить про делегаты - которые предназначены для ситуаций, когда требуется передать методы другим методам в качестве параметров! Но кода это надо? И зачем? Большое спасибо!


Ответ

Реализация обработчиков событий и событийной модели как таковой. Скажем, кликаете на кнопку, и при клике что-то происходит. Чтобы сообщить программе, какое именно "что-то" должно произойти, применяют делегаты LINQ и любые другие элементы функционального программирования в C# - там все основано на делегатах и их "сокращенных" вариантах - лямбда-функциях Они также весьма полезны при реализации многопоточных и асинхронных программ Вообще для реализации коллбэков. Например, функций сортировки. Чтобы сообщить программе, как именно нужно сортировать пользовательские типы данных, в метод сортировки необходимо передать другой метод, позволяющий сравнивать экземпляры сортируемого типа А вообще очень любопытно, по какому источнику вы изучаете язык, что в нем этого не написано?

Как распаковать 7-zip архив?

Как мне распаковать 7-zip архив в указанную папку с заменой файлов, желательно не прибегая к сторонним программам (используя библиотеки)?


Ответ

Я бы все-таки рассмотрел вариант с вызовом внешней программы. Дело в том что это понятно! Любая внешняя программа легко заменяется на другую и для этого достаточно всего двух параметров в конфигурационном файле $7zAppPath, $7zAppParams. Программисту, кроме Вас, будет легче будет понять работу функций callExternalArchivator() ибо там наверняка 5 строк, ну 8 на обработку ошибок и записи в лог-файл. Если же библиотеку, то надо показать какие исходные файлы нужны, а если обновилась библиотека, то что из нее нужно просмотреть внимательно, чтобы новые изменения в либе не сломали текущее. Другими словами, внешняя прога всегда выигрывает перед либой. Не надо усложнять там где этого можно избежать!

Как создать загрузочный диск Ubuntu

Здравствуйте!Насколько сложно или даже насколько возможно создать образ загрузочного диска Ubuntu?Ситуация следующая, мы обычно берем флешку, с помощью Universal-USB-Installer-1.8.6.8 устанавливаем на нее образ Ubuntu, выделяя при этом 4Гб под изменения. Затем ставим все необходимые пакеты и утилиты, после чего используем в качестве загрузочного диска Live с которым собственно и работаем, перенося с одной системы на другую.Но проблемы начинаются на некотором оборудовании, например на ноутбуках с картами ATI. И в силу того, что, видимо, в конфигурации меняется какая-то мелочь (а, может, и не мелочь), флешка перестает запускаться на всех других машинах тоже, после чего образ приходится снова заливать на эту флешку. Так как флешки более не оснащаются переключателем read-only выход найти не можем.Идеальным решением было бы создать из стандартного образа *.iso от Ubuntu наш образ, с нашими пакетами и программами, которые бы загружались как LiveCD (DVD) вместе с загрузкой самой Ubuntu. После чего мы бы записали этот образ на диск и пользовались им, не боясь испортить нашу настроенную систему. Подскажите пожалуйста, как реализовать и вообще возможно ли реализовать данную систему? Посоветуйте, как быть с текущим решением?С Уважением, спасибо.


Ответ

А почему бы не использовать программы аналогичные Ghost - clonezilla. И скопировать образы дисков системы, потом загрузится с загрузочного сд этой программы и залить систему на принимающую машину? это если цель - перенести настроенную систему на другой комп или создать backup-диск...А что мешает использовать UbuntuLiveCD и с него инсталлить систему, либо загружаться?и уж если машины в вашей сети, то создать образ сетевой установки...Форум русскоязычного сообщества Ubuntu, результат поиска ГуглВообще погуглите эту тему - она широко освещена (и не только для Вашего дистра), так что не все так плохо...

Определение типа файла и перенос его в папку в зависимости от типа

В папке имеется несколько файлов. Требуется определить тип каждого файла и в зависимости от этого перенести его в одну из папок: EXE. CPP. H. TXT. Вроде бы формулировка простая, но никак не могу сделать, мыслей нет, помогите, если не трудно. Заранее спасибо.


Ответ

Как мне кажется, нужно копать в сторону функции findfirst() и проверки строки из имени по шаблону с последующей сортировкой и презаписи в другой каталог. Ну и еще, как вариант, написать скрипт на shell и запускать его из приложения. UPD: вот немного кода в котором происходит поиск надо только немного изменить (произвести копирование) #include #include
using namespace std;
int main(){ WIN32_FIND_DATA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE;
// Find the first file in the directory. hFind = FindFirstFile("C:\\*.bin", &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) { printf ("Invalid file handle. Error is %u.
", GetLastError()); } else { printf ("First file name is %s.
", FindFileData.cFileName);
// List all the other files in the directory. while (FindNextFile(hFind, &FindFileData) != 0){ printf ("Next file name is %s.
", FindFileData.cFileName); }
FindClose(hFind); }
return 0; }

Как узнать, есть ли в строке большие буквы?

Как это можно реализовать? Единственная идея, которая сейчас есть, - разбить строку на символы и далее каждый символ проверять на буква ли это, если да, то потом проверять не большая ли. Мне кажется, что это будет как-то не совсем корректно и должны быть более красивые решения, что ли.


Ответ

Регулярные выражения вас спасут. Если вы хотите по букве проверять, нужно использовать к строке с буквой метод str.matches("A-Z"), что даст логическое true, если символ есть большая буква. Немного пошаманив с регулярным выражением, можно написать и для проверки целой строки, но тут надо учитывать все возможные варианты. Проще - побуквенно. Есть ещё вариант - создать вторую строку через: String str2 = str1.toLowerCase(); и потом сравнить строки. Если будет несовпадение - где-то есть большие буквы, но этот вариант подходит, только если нужен сам факт наличия больших букв. Есть оракловая документация по регулярным выражениям, правда, на английском.

List взять уникальные значение

/кошка/1 /кошка/2 /собака/1 /собака/2 /тигр/1
Как сделать чтобы в результирующем списке были только те элементы, у которых значения между /*/ уникальные. результат
/кошка/1 /собака/1 /тигр/1
Есть вариант заюзать Distinct, но он работает по полному соответсвию.
List list = new List(); list.Add(1); list.Add(2); list.Add(3); list.Add(3); list.Add(4); list.Add(4); list.Add(4); List distinct = list.Distinct().ToList();
А как сделать чтобы он брал значение между /*/ и выбрал среди них уникальные. Мне кажется надо использовать lambda выражения.


Ответ

в Distinct можно передать свой "сравниватель на одинаковость" - IEqualityComparer
class PartialComparer : IEqualityComparer { public string GetComparablePart(string s) { return s.Split('/')[1]; } public bool Equals(string x, string y) { return GetComparablePart(x).Equals(GetComparablePart(y)); }
public int GetHashCode(string obj) { return GetComparablePart(obj).GetHashCode(); } }
class Program { static void Main(string[] args) { List list = new List { "/кошка/1", "/кошка/2", "/собака/1", "/собака/2", "/тигр/1" };
// "/кошка/1" // "/собака/1" // "/тигр/1" var result = list.Distinct(new PartialComparer()).ToList(); } }

Некорректная фильтрация строки

Имеется код:
#include #include using namespace std;
int main() { string str = "Hallow, world"; int i = 0; for (i; i < str.length(); i++) { if (str[i] == ',') { str.erase(i); }; }; cout << str; return 0; }
Цикл завершается тогда, когда условие впервые принимает значение "истина", хотя цикл должен продолжаться до конечного символа строки. Почему так происходит?


Ответ

Правильно удалять так:
for (; i < str.length();) { if (str[i] == ',') str.erase(i, 1); else i++; };
Таким образом вы удаляете каждый раз по одному символу. Кроме того, при удалении символы сдвигаются, так что вам нужно перепроверить текущий индекс. Поэтому i++ ушло в else. (Кроме того, в таком виде for можно заменить на while.)
Более идиоматический метод удаления из строки в C++ — использование и идиомы erase/remove:
str.erase(std::remove(str.begin(), str.end(), ','), str.end());
или, если хочется более сложного условия,
str.erase(std::remove_if(str.begin(), str.end(), [](char x){ return x == ','; }), str.end());
(Спасибо @Vlad from Moscow за уточнение!)

ООП - Есть ли смысл писать класс, в котором нет свойств, но есть метод?

Есть ли смысл писать класс, в котором нет свойств, но есть метод? Или же в этом случае достаточно воспользоваться пользовательской функцией?
class Text { public function MultiColor(){ static $a = null; $a ++; return $a; } } echo Text::MultiColor();


Ответ

Давайте разберемся.
Во-первых, сама по себе парадигма ООП не предполагает использование других парадигм. Это не запрет на их совместное использование, однако парадигма сама по себе самодостаточна, хоть и реализуется зачастую не в чистом виде (функции в PHP и Python, примитивы в Java и C#), а частичное замещение прадигмы приведет к уменьшению консистентности (единообразности) кода.
Парадигма ООП включает в объект две составляющие: поведение (методы) и состояние (свойства). В данном случае обсуждается поведение без состояния (что, на самом деле, неправда - $a относится к состоянию, т.к. сохраняется между вызовами), и это действительно немного смущающий момент, однако не позвольте ему обмануть себя. ООП позволяет включить в объекты и поведение, и состояние, но не запрещает исключить что-то из этого из объекта; другими словами, класс, объявляющий функционал без состояния, равно как и объекты, просто переносящие данные (Business Object, Data Transfer Object) - это абсолютно валидные единицы программы.
И, конечно, необходимо сказать пару слов про статику. Сама парадигма не подразумевает существование классов и статических методов. Однако, методам, которые работают без состояния, самое место в статичных - во-первых, им не нужен лишний экземпляр объекта для работы, во-вторых, таким образом подчеркивается отвязанность метода от состояния. Однако будьте осторожны: объявление статичных переменных обычно говорит о том, что пора создавать обычный объект с состоянием; единственный действительно рациональный пример, который я могу привести для сохранения чего-либо в статичной переменной - это логгер в Java. Сам я, правда, ярый противник статики в принципе, но это совсем отдельная тема для разговора.
И, наконец: хорошая парадигма не запрещает пользователю ничего. Она лишь описывает концепты, в рамках которых пользователю должно быть удобно выстроить проект.
Резюмируя: да, использовать методы без состояния - это абсолютно легально, однако опасайтесь переноса в статику того, что должно лежать в обычных методах.

Поиск сборки (алгоритм)

Подскажите оптимальный способ поиска сборки. Например в папке лежит 1k сборок (*.dll) и нужно выбрать например две специальные сборки. Как нужно пометить (атрибуты? вроде медленно будет искать рефлекшеном) специфические сборки, для быстрого поиска в другой программе?
Может есть какой то способ дописать что то в мета-таблцицы сборки что бы очень быстро можно было прочитать и понят эта та сборка, что нужно, или нет?


Ответ

Вы можете воспользоваться библиотекой Mono.Cecil (доступна так же через NuGet) и использовать ее для анализа сборок
Для теста я взял почти все сборки из GAC, скопировал их, чтобы получилось ~1 тысяча сборок, добавил туда несколько экземпляров моих библиотек с искомым атрибутом и выполнил такой код:
var assemblys = Directory.GetFiles("C:\\dlls\\") .Select(AssemblyDefinition.ReadAssembly) .Where(assembly => assembly.CustomAttributes.Any(ca=> ca.AttributeType.Name == "MyCustomAttribute")) .ToList();
Результат он выдал через ~600 миллисекунд (мерил с помощью Stopwatch). Мне кажется, что этого может быть для Вас достаточно.

Как правильно переносить(копировать) элемент одного std::vector в другой

Интересует как быстрее всего копировать или переносить элементы из одного std::vector в другой, раньше для возможности быстрого удаления элементов из контейнера использовал std::list
for( auto it=l.begin(); it!=l.end();) { if ( условие ) it=l.erase(it); else ++it; }
но как оказалось list не слишком быстрый даже в этом, теперь использую нечто вроде
for( auto it=v.begin(); it!=v.end(); ++it) { if ( !условие ) tmpv.emplace_back(*it); } v.swap(tmpv); tmpv.clear();
сначало элементы которые не попали под условие переношу в другой vector, а потом меняю контейнеры местами, но мне кажется что
tmpv.emplace_back(*it);
это не совсем правильно и возможно есть другие функции в std которые позволят переносить(копировать) элемент быстрее чем реализовано у меня


Ответ

А самый простой вариант (оставляет элементы соответствующие cond())
int n = 0; for (int i = 0; i < v.size(); i++) if (condition(v[i])) v[n++] = v[i]; v.resize(n);
не пробовали?

Если порядок обработки и относительное расположение элементов в векторе после нее не важны, то процесс можно ускорить раза в полтора (если затраты на вычисление условия, копирование элемента и обработку удаляемого одинаковы).
Вот примерчик:
#include #include #include #include
#include #include #include
using namespace std;
void act (string s) { cout << s << '
'; }
int main (int ac, char *av[]) { vector v; string s;
while (cin >> s) v.push_back(s); cout << "size: " << v.size() << " capacity: " << v.capacity() << '
'; int n = 0, cntcmp = 0, cntcpy = 0, cntact = 0; if (av[1]) { /* size: 108 capacity: 256 cmp: 120 cpy: 64 act: 140 total: 324 */ n = v.size();
int i = 0, j = v.size() - 1;
while (j >= i) { while (i <= j && isalpha(v[i][0])) { cntcmp++; i++; } if (i > j) break; act(v[i]); cntact++; n--; while (j > i && !isalpha(v[j][0])) { cntcmp++; cntact++; act(v[j--]); n--; } if (j == i) break; v[i++] = v[j--]; cntcpy++; } } else { /* size: 108 capacity: 256 cmp: 248 cpy: 108 act: 140 total: 496 */ for (int i = 0; i < v.size(); i++) { cntcmp++; if (isalpha(v[i][0])) { cntcpy++; v[n++] = v[i]; } else { cntact++; act(v[i]); } } }
v.resize(n);
for (int i = 0; i < n; i++) cout << v[i] << '
';
cerr << "size: " << v.size() << " capacity: " << v.capacity() << '
'; cerr << "cmp: " << cntcmp << " cpy: " << cntcpy << " act: " << cntact << " total: " << cntcmp + cntact + cntcpy << '
'; }
Вот результат
avp@avp-ubu1:hashcode$ g++ c.cpp avp@avp-ubu1:hashcode$ ./a.out < c.cpp | sort >2.txt size: 108 capacity: 256 cmp: 248 cpy: 108 act: 140 total: 496 avp@avp-ubu1:hashcode$ ./a.out 1 < c.cpp | sort >1.txt size: 108 capacity: 256 cmp: 120 cpy: 64 act: 140 total: 324 avp@avp-ubu1:hashcode$ cmp 1.txt 2.txt avp@avp-ubu1:hashcode$
Ну, все эти sort и cmp для того, чтобы убедиться, что оба варианта дают тот же результат.

cURL не работает

Пытаюсь сделать парсер, но не хочет работать, пишет
Object Moved This object may be found here.
Гуглил, но решения не удалось найти. Что за метод защиты стоит, что запрещает парсить данные с данного сайта ?
$url = 'http://elibrary.ru/titles.asp';
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6'); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($ch, CURLOPT_REFERER, $url); $content = curl_exec($ch); curl_close($ch); echo $content;


Ответ

Суть проблемы в следующем: целевой сайт выставляет cookie для идентификации пользователя и отдает код 302 Moved Temporarily + заголовок Location. Это что-то вроде защиты от простеньких парсеров, не способных работать с cookie.
Если говорить о вашем коде, то опция CURLOPT_FOLLOWLOCATION выставленная в false (или 0), запрещает переходы по ссылкам из Location. Поэтому вы видите в ответе:
Object moved
Выставление CURLOPT_FOLLOWLOCATION в true (или 1) не помогает в вашем случае потому, что curl по умолчанию все еще не работает с cookie. А чтобы работал, достаточно указать:
curl_setopt($ch, CURLOPT_COOKIEFILE, '');
Пустая строка в качестве значения, указывает curl, что cookie должны быть использованы, однако без сохранения в файловую систему (см. http://php.net/manual/ru/function.curl-setopt.php).
Таким образом, работающий код может выглядеть так:
$url = 'http://elibrary.ru/titles.asp';
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6');. curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_COOKIEFILE, ''); $content = curl_exec($ch); curl_close($ch);
echo($content);

Как изменять выведенный текст в консоли посредством cout?

Есть простая программа производящая долгие вычисления. Хотелось бы на каждой итерации цикла выводить ее номер (ну или текщий процент выполнения) в консоль, при этом желательно изменяя только последнюю строку. Например вывод
Start Function result 45123 Testing ... Comleted 45%
Так вот по ходу надо бы изменять только строку Comleted 45% а остальное не трогать. Вывод осуществляю через cout. Как такое сделать?


Ответ

Вот пример кода. sleep исключительно для того, что бы создать задержку.
#include #include // для sleep int main() { for (int i = 0; i < 100; i+=10) { std::cout << "
Completed " << i << "% " << std::flush; sleep(1); }
std::cout << "
Done " << std::endl; return 0; }
std::flush нужен, так как стандартные потоки любят буферизировать ввод-вывод (закомментируйте и посмотрите на результат).
переводит вывод в начало строки, не переходя на новую строку. Пара пробелов после процента нужна, так как строка не очищается и нужно затирать пробелами "хвост".