Страницы

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

суббота, 15 февраля 2020 г.

редактирование xml файла в c#

#c_sharp #xml


вот есть у меня список в xml файле, я по нему прохожусь и вывожу в textbox, но что
если нужно добавить/удалить элемент в xml файле? как через код это можно сделать?



  item1
  item2
  item3



xml файл считываю так

XmlDocument doc = new XmlDocument();
doc.Load("list.xml");

    


Ответы

Ответ 1



Изменить XML файл можно так: // Считать файл var doc = new XmlDocument(); doc.Load("My file name"); // Получить первый элемент var node = doc.DocumentElement.ChildNodes[0]; // удалить его doc.DocumentElement.RemoveChild(node); // создать новый элемент var newNode = doc.CreateElement("list"); newNode.InnerText = "item4"; // добавить новый элемент doc.DocumentElement.AppendChild(newNode); // Сохранить в файл doc.Save("my file name");

WPF&MVVM: Библиотека System.Windows.Interactivity больше не доступна?

#c_sharp #wpf #xaml #mvvm


В рамках урока по паттерну MVVM для приложений WPF мне нужно было добавить библиотеку
System.Windows.Interactivity.dll через Reference Manager. Я её там не обнаружил (версия
Visual Studio - 2017). На скриншоте ниже - всё, что есть в результатах поиска, начинающееся
с System.Windows:



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

private RelayCommand doubleCommand;
public RelayCommand DoubleCommand {
    get {
        return doubleCommand ??
        (doubleCommand = new RelayCommand(obj => {
            Phone phone = obj as Phone;
            if (phone != null) {
                Phone phoneCopy = new Phone {
                    Company = phone.Company,
                    Price = phone.Price,
                    Title = phone.Title
                };
                Phones.Insert(0, phoneCopy);
            }
        }));
    }
}


Однако, когда я добавил код XAML, то среда выдала сообщение о том, что в пространстве
имён clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity
не существует Interaction, EventTrigger и InvokeCommandAction:





    






Не знаю, каким образом это связано с библиотекой System.Windows.Interactivity, но
как следует решить данную проблему?
    


Ответы

Ответ 1



Требуемая библиотека является частью Microsoft Expression Blend 4 SDK и не включена в стандартную поставку, но вы всегда можете подключить ее из NuGet Gallery: System.Windows.Interactivity.WPF by Microsoft Пользователи Visual Studio 2017 могут установить Microsoft Blend SDK в систему с помощью Visual Studio Installer, для этого на вкладке "Отдельные компоненты" ("Individual components") в разделе "Пакеты SDK, библиотеки и платформы" ("SDKs, libraries, and frameworks") необходимо установить галочку напротив пункта "Пакет SDK для Microsoft Blend для Visual Studio для платформы .NET" ("Blend for Visual Studio SDK for .NET") и нажать кнопку "Изменить". После этого, библиотека System.Windows.Interactivity станет доступна из Reference Manager в разделе Assemblies/Extensions Также, Blend SDK можно загрузить и установить в систему из центра загрузок Microsoft: 3.5, 4.0

Java типы, допускающие NULL значения

#java #c_sharp #null


Существуют ли в Java что-то вроде типов, допускающих NULL значения? То есть с сервера
приходит, на пример, int, но вместо него может прийти NULL В C#можно это обработать,
используя типы, допускающие, NULL значения. 

int? a = NULL;


Как это следует обрабатывать в Java?
    


Ответы

Ответ 1



В Java ссылка любого класса может принимать значение null. Примитивы же... Целые числа - byte, short, char, int, long Числа с плавающей точкой (иначе дробные) - float, double Логический - boolean ...лишены такой возможности. Если требуется создать ссылку на один из примитивных типов данных, необходимо использовать соответствующий класс-обертку. Также в таких классах есть некоторые полезные методы и константы, например минимальное значение типа int можно узнать использовав константу Integer.MIN_VALUE. Оборачивание примитива в объект называется упаковкой (boxing), а обратный процесс распаковкой (unboxing). (источник) Соответственно для решения вашей задачи необходимо использовать классы-обёртки примитивов: int -> Integer, short -> Short и т.п.

Ответ 2



В java для этого используются классы обертки: wrapper for int: Integer wrapper for double: Double Но будьте внимательно, типы вроде Integer передаются по ссылке, а не по значению.

SQL-Server - Попытка открыть доступ к бд, попытка экспорта бд

#sql_server


Экспорт бд выдает ошибку, что не удалось подключиться к серверу.
Сервер пингуется. Удаленно подключиться к серверу не могу, выдает ошибку входа.

Сервер не в домене, влияет ли это на работу?


    


Ответы

Ответ 1



Проверьте включен ли протокол TCP/IP в Configuration Manager. включите разрешение на подключение через SQL авторизацию. создайте нового пользователя для подключения. Выберете роль public, укажите сопоставление с вашей БД, укажите схему по умолчанию. Добавьте разрешения на подключение и просмотр объектов.

Преобразование строки в выражение

#php


Как преобразовать строку в выражение?

$a = "$c.$b"; // string
$c = "мама";
$b = "папа";

// функция, преобразующая строку в выражение, либо регулярное выражение

echo $a; // выводим "мамапапа";

    


Ответы

Ответ 1



Можно через переменные переменных. Надо будет только в строке $a убрать у переменных доллары $a = 'c.b'; $c = "мама"; $b = "папа"; $temp = explode('.', $a); foreach ($temp as $item) { echo $$item; }

Ответ 2



Автор, если вы хотите получить в ответ строку мамапапа, то достаточно провести конкатенацию строк $c = "мама"; $b = "папа"; $a = $c . $b; echo $a; // выводим "мамапапа"; или так $c = "мама"; $b = "папа"; $a = "$c$b"; echo $a; // выводим "мамапапа"; Если же вы действительно хотите вычислить выражение из строки, то строку следует составить в соответствии с синтаксисом php: $a = '$a = $c . $b;'; // string $c = "мама"; $b = "папа"; // выполняем строку как код php eval($a); echo $a; // выводим "мамапапа"; Но использование функции eval() не рекомендуется из-за возможных проблем с безопасностью выполнения кода.

Ответ 3



echo eval($a); Такой вариант не пойдёт? ссылка

Найти все натуральные числа, которые делятся на каждую из своих цифр

#cpp #алгоритм


Задача - найти все натуральные числа, не превосходящие заданное число N и делящиеся
нацело на каждую из своих цифр
Дошел до такого кода:

#include 
using namespace std;


int main()
{
    int n = 0;
    cout << "Enter n: ";
    cin >> n;
    int n1 = n;

    for (int i = 1; i < n; i++) {
        int length = 0;
        while (n != 0) {                    //Узнаем длину числа
            length++;
            n /= 10;
        }
        int *mas = new int[length];
        while (n1 != 0) {
            mas[i] = n1 % 10;               //добавляем цифры числа в массив
            n1 /= 10;
        }

        bool t = true;

        for (int a = 0; a < length; a++) {
            if (i%mas[a] != 0) {
                t = false;                      //проверяем, делится или нет
            }
        }
        if (t == true) {
            cout << i<< " ";
        }


    }

    return 0;
}


Но всё равно не работает. В чём проблема?
    


Ответы

Ответ 1



Как-то уж очень сложно у вас... bool test(int i) { bool dig[9] = {false}; int k = i; while(k) { int d = k%10; k /= 10; if (d == 0 || dig[d-1]) continue; dig[d-1] = true; if (i%d) return false; } return true; } int main(int argc, const char * argv[]) { int N; cin >> N; for(int i = 1; i <= N; ++i) { if (test(i)) cout << i << endl; } } Это если хочется сэкономить на проверках и не проверять дважды одну и ту же цифру, но для реальных чисел это особой роли не играет, так что сократить можно до bool test(int i) { int k = i; while(k) { int d = k%10; k /= 10; if (d && i%d) return false; } return true; }

Обработка исключений с++

#cpp #исключения #try_catch


Как обработать исключение, которое возникает при попытке инициализировать значение
за  пределами массива, или при чтении из-за его пределов. Пробовал в catch писать "exception
e", но оно не ловит.
    


Ответы

Ответ 1



если это встроенный c++ массив то можно ставить ассерты перед каждым доступом к его элементу - #define array_size 100 int v[array_size]; int i = 100; assert(i >= 0 && i < array_size); // бросит исключение v[i] = 123; если у вас std::vector то как уже сказали в комментариях - воспользоваться функцией членом std::vector::at которая гарантированно бросит исключение при выходе за пределы вектора. std::vector v(5); v.at(5) = 1.0f; // бросит исключение

Ответ 2



На самом деле в случае выхода за границу массива происходит исключение уровня операционной системы, после чего программе присылается сигнал об этом, и она падает (в комментариях меня поправят, если это не так, но общий смысл такой). Корректная реакция на такие сигналы - завершение программы, поскольку они вызываются недопустимыми операциями и после них программа может не находится в консистентном состоянии. Однако, если очень хочется, то можно такую ошибку отловить и продолжить работу (при этом следует очень хорошо понимать зачем и почему понадобилось так делать, поскольку затея эта целиком и полностью не здоровая). В основе обработки таких ошибок лежат функции setjmp и longjmp, позволяющие сохранить состояние программы и вернутся к сохраненному ранее состоянию. Так же нужно отловить сигнал операционной системы, что делается везде по-своему (Для POSIX-систем достаточно обычных обработчиков сигналов, для windows стоит использовать Structured Exception Handling или Vectored Exception Handling). Итак. Регистрируем обработчик (пример для POSIX). struct sigaction act; memset(&act, 0, sizeof(act)); act.sa_handler = signalHandler; sigaction(SIGSEGV, &act, 0); В обработчике сигнала возвращаемся к сохраненному состоянию и передаем не нулевое значение в качестве возвращаемого для setjmp: jmp_buf env; static void signalHandler(int signum) { longjmp(env, 1); } Перед входом в опасный блок сохраняем состояние программы: try { if (setjmp(env)) throw std::runtime_error("Some shit"); // Действия, которые могут уронить программу Ловим брошенное исключение: } catch (std::runtime_error & e) { // Что-то делаем } Как оно работает. Функция setjmp при сохранении возвращает 0 - исключение не кидается. Если дальше происходит ошибка, то longjmp возвращает выполнение к setjmp, которое в этот момент вернет 1 - бросится исключение, которое можно обработать. Данный пример дает лишь общее представление о логике обработки таких ошибок, для использования его на практике, его стоит доработать. Более полное описание чего куда и зачем можно найти тут: Habrahabr: Обработка многократно возникающих SIGSEGV-подобных ошибок