Вопрос,наверное, очень нубский, но хочется все-таки разъяснения. например у меня есть sbyte=-6; Нам нужно произвести сдвиг вправо на 2 разряда. P/S Старшие и знаковые разряды в графах переходов опущены Code: using System; namespace consoleApplication { class Programm { static void Main() { sbyte d = -6; Console.WriteLine(d >> 1);//0110->0011 {Результат соответствует графу и равен -3) Console.WriteLine(d >> 2);//0110->0011->0001; { Результат не соответствует графу и равен -2) } } } Что я не правильно понял об этой операции ?
Code: #include "stdafx.h" #include <time.h> #include <conio.h> #include <stdio.h> #include <iostream> void main() { setlocale(0, "Russian"); const int N = 100; int a[N], n; printf("Enter n< %d", N); scanf_s("%d", &n); printf("\nМассив:\n"); for (int i = 0; i < n; i++) //Генерируем массив случайных чисел в //диапазоне [0..50] и выводим на экран { a = rand() % 51; printf("%d%s", a, " "); int max = a[0]; for (int i = 0; i < 10; ++i) { if (a > max) { max = a[N]; printf("%d%s", max, ""); } } printf("\nСортированный:\n"); bool f; int b; do { f = false; for (int i = 0; i<n - 1; i++)// Просматриваем весь массив if (a>a[i + 1]) { b = a; a = a[i + 1]; a[i + 1] = b; f = true; //Был обмен } } while (f); // Проверяем, был ли хоть один обмен for (int i = 0; i < n; i++) // Выводим на экран отсортированный //массив printf("%d%s", a, " "); _getch(); } Ошибка 1 error C1075: конец файла обнаружен ранее, чем левая фигурная скобка "{" в "c:\users\fiend\desktop\consoleapplication1\consoleapplication1\consoleapplication1.cpp(8)" c:\users\fiend\desktop\consoleapplication1\consoleapplication1\consoleapplication1.cpp 51 вроде все закрыто в чем дело?
Простой выбор. Выбрать наибольший элемент массива и поменять его местами с последним (n–ным) элементом массива. Затем из n–1 первых элементов опять выбрать наибольший и опять поменять его местами с (n–1)–м. И так далее, пока весь массив не будет упорядочен. помогите с задачкой , сколько не пытался он не сортируется
Вопрос по C#, .NET 4.0 Имеется некий класс, который должен быть потоко-безопасным. Класс содержит метод FindSessionIndexByToken, который ищет некое значение в массиве и возвращает его индекс. Code: public int FindSessionIndexByToken(int token) { lock (_lock) { for (int i = 0; i < _sessions.Count; i++) { if (_sessions[i].Token == token) return i; } } return -1; } Вопрос: Если делать индексатор класса на подобии Code: public int this[int token] { get { return FindSessionIndexByToken(token); } } Надо ли пихать lock(_lock) в get, или lock который в методе сделает всю грязную работу ? Надо ли использовать lock в методе который только вызывает FindSessionIndexByToken и возвращает значение ? Есть ли тут подвох ?
Данный lock будет блокировать только эту часть кода, если есть вероятность того что _sessions будет изменен другим потоком в другом месте кода, то есть вероятность возникновения непредвиденного поведения. Блокируйте доступ к _sessions общим глобальным _lock везде, где к нему получают доступ потоки.
Спасибо за ответ, Dev.0x00 ! Возможно, я неверно сформулировал свой вопрос. Переформулирую. Есть ли вероятность возникновения непредвиденного поведения в случае если единственное значение возвращаемое методом a является значение возвращаемое методом b при условии что lock находится в методе b и покрывает всё его "туловище" ? Смотреть http://forum.antichat.ru/threads/90173/page-85threads/90173/page-85#post-3876125
Добрый день. Нужна ваша помощь по C#. Есть задача по автоматической смене номера COM порта. Много и долго гуглил, но нашёл смену через реестр, но возникла проблема с доступам к ветке HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\enum\. Подскажите, есть ли способ программно изменить права на эту ветку или есть ли другой способ по смене номеров COM портов?
Вопрос по c#, .NET 3.0 Правильно ли воплощена поддержка многопоточности ? Знаю что в .NET 4.0 есть целый неймспейс System.Collections.Concurrent. Это не вариант. Code: using System.Collections.Generic; namespace ServerFramework.Shared { /// <summary> /// Thread-safe queue implementation /// </summary> /// <typeparam name="T"></typeparam> public class SafeQueue<T> { private Queue<T> _innerQueue; private bool _unique; private readonly object _lock; public int Count { get { int count = 0; lock (_lock) { count = _innerQueue.Count; } return count; } } public SafeQueue(bool unique) { _lock = new object(); _innerQueue = new Queue<T>(); _unique = unique; } /// <summary> /// Allow non-unique queue elements by default /// </summary> public SafeQueue() : this(false) { } public void Enqueue(T item) { lock(_lock) { if (_unique && _innerQueue.Contains(item) == false) { _innerQueue.Enqueue(item); } } } public bool TryDequeue(out T item) { item = default(T); bool result = false; lock (_lock) { if (_innerQueue.Count > 0) { item = _innerQueue.Dequeue(); result = true; } } return result; } } } Ещё вопрос по "потоко-безопасной" энумерации Collection<T>. Собственно имеется потоко-безопасный класс (обёртка Collection<T>), в котором необходимо реализовать IEnumerable. Как правильно реализовать IEnumerable так чтобы из нескольких потоков можно было крутить foreach в то время как из других идет запись/чтение ? Если делаю через простой копирующий конструктор, выбивает invalid operation (коллекция была изменена). На сколько я понимаю этот код должен создавать временную копию внутренней коллекции и возвращать её энумератор, однако выбивает exception, как и говорилось ранее. Code: public IEnumerator<T> GetEnumerator() { Collection<T> cloned = new Collection<T>(_innerCollection); return cloned.GetEnumerator(); } А в тестовых потоках: Code: foreach(var item in WrapperClassInstance) { //... } Остальные потоки просто добавляют / убирают элементы из коллекции (через обертку, разумеется). В чём тут дело ?
Подскажите по C# есть библиотека SharpPcap. Там есть куча примеров. НО! Там всю информацию выводят в консоль. Подскажите как вывести ее к примеру в ListBox который находиться на форме?! Данные обрабатываются в device_OnPacketArrival. Привожу пример. Code: using System; using System.Collections.Generic; using SharpPcap; using SharpPcap.LibPcap; using SharpPcap.AirPcap; using SharpPcap.WinPcap; namespace Example3 { public class BasicCap { public static void Main(string[] args) { string ver = SharpPcap.Version.VersionString; Console.WriteLine("SharpPcap {0}, Example3.BasicCap.cs", ver); var devices = CaptureDeviceList.Instance; if(devices.Count < 1) { Console.WriteLine("No devices were found on this machine"); return; } Console.WriteLine(); Console.WriteLine("The following devices are available on this machine:"); Console.WriteLine("----------------------------------------------------"); Console.WriteLine(); int i = 0; foreach(var dev in devices) { Console.WriteLine("{0}) {1} {2}", i, dev.Name, dev.Description); i++; } Console.WriteLine(); Console.Write("-- Please choose a device to capture: "); i = int.Parse( Console.ReadLine() ); var device = devices[i]; device.OnPacketArrival += new PacketArrivalEventHandler( device_OnPacketArrival ); int readTimeoutMilliseconds = 1000; if (device is AirPcapDevice) { var airPcap = device as AirPcapDevice; airPcap.Open(SharpPcap.WinPcap.OpenFlags.DataTransferUdp, readTimeoutMilliseconds); } else if(device is WinPcapDevice) { var winPcap = device as WinPcapDevice; winPcap.Open(SharpPcap.WinPcap.OpenFlags.DataTransferUdp | SharpPcap.WinPcap.OpenFlags.NoCaptureLocal, readTimeoutMilliseconds); } else if (device is LibPcapLiveDevice) { var livePcapDevice = device as LibPcapLiveDevice; livePcapDevice.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds); } else { throw new System.InvalidOperationException("unknown device type of " + device.GetType().ToString()); } Console.WriteLine(); Console.WriteLine("-- Listening on {0} {1}, hit 'Enter' to stop...", device.Name, device.Description); device.StartCapture(); Console.ReadLine(); device.StopCapture(); Console.WriteLine("-- Capture stopped."); Console.WriteLine(device.Statistics.ToString()); device.Close(); } private static void device_OnPacketArrival(object sender, CaptureEventArgs e) { // ВОТ ТУТ надо вывести на форму инфо var time = e.Packet.Timeval.Date; var len = e.Packet.Data.Length; Console.WriteLine("{0}:{1}:{2},{3} Len={4}", time.Hour, time.Minute, time.Second, time.Millisecond, len); Console.WriteLine(e.Packet.ToString()); } } }
эм, стало интересно, я что то не правильно понял в вопросе или ListBox.addItem(item) уже не работает?
Вопрос по c#, .NET 4.0 Как лучше всего обработать пакеты получаемые сервером от клиентов ? Имеет ли смысл делать это в нескольких потоках ?