Вопрос № 139071: Помогите плиз написать прогу...задание: "очередь"...Вопрос № 139130: ребят, помогите с лабой, пожалуйста:
1. Написать программу с помощью функций:
Дано натуральные n, действительные a1... an. найти сумму неповторяющихся зл-тов массива a1... an
2. Написать с помощью ф-ий. Дана целочисленная квадр....Вопрос № 139160: Здравствуйте уважаемые эксперты.
Я пользуюсь Visual Studio 2008, и в своем проекте я подключаю некоторые библиотеки (lib), но для этих библиотек нужны dll.
Dll - ки у меня есть, но их очень много и я не хочу хранить их в одной директории...Вопрос № 139187: Здравствуйте эксперты!
Подскажите плиз почему когда я пытаюсь освободить память из-под переменной functionClassDeviceData при выходе из функции вылезает access violation? И как посмотреть сколько она занимает памяти после создания и перед вы...Вопрос № 139249: Здравствуйте уважаемые эксперты! Помогите пожалуйста. Есть программа написаная на старом-старом редакторе и соответственно компилированая старым компилятором. Зделайте пожалуйста изменения в коде, чтобы можно было компилировать на
VS2005. Спасибо.<br...Вопрос № 139371: Здравствуйте.
1) Как послать широковещательный UDP-пакет с каждого сетевого интерфейса отдельно? Проблема в том, что когда компьютер с 2 сетевыми картами посылает такой пакет, IP-адрес отправителя он ставит одинаковый в обе подсети, проверял сни...Вопрос № 139455: Здравствуйте уважаемые эксперты.Нужна помощ в решении задач.
Задача 1: Создайте класс защищенного массива, в котором реализована проверка выхода за границы массива. Перегрузите операторы: [ ], =, +, -
(Программа написана, при компилировании о...Вопрос № 139490: Здравствуйте! Подскажите пожалуйста:
Допустим при создании двумерного динамического массива, я выделяю память для массива указателей на одномерные массивы:
int** mas = new int*[n];
так вот вопрос:
есть разница ме...Вопрос № 139533: Объясните как (если это взможно) создать массив из 3-х указателей, нулевой и второй (крайние) из которых указывают на такие же массивы, а первый (средний) указывает на int. Я попробовал поэксперементировать с типом void, но у меня ничего не вышло....Вопрос № 139586: Здравствуйте уважаемые эксперты!Прошу помощи с решением задачи на строки.
Задано произвольное слово. Определить, начинается ли оно со слога «ка»....
Вопрос № 139.071
Помогите плиз написать прогу...задание: "очередь"
Отправлен: 04.06.2008, 23:32
Вопрос задал: Nysik
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Shorty
Данная программа создает очередь куда сначало нужно ввести элементы, элементы вводяться пока не будет введен 0.
Затем вводятся числа, число будет добавлено в конец и при этом будет удален 1-й.
числа можно вводить пока не будет введен 0
#include<iostream>
#include<deque>
#include<conio.h>
using namespace std;
void main(void)
{
deque<int> a_deq;
float x, n;
deque<int>::iterator c;
cout<<"Vvedite elementi ocheredi
";
while ( cin>>x, x!=0)
a_deq.push_back(x);
for (c=a_deq.begin(); c!=a_deq.end(); ++c)
{
cout<<"deq="<<*c<<" ";
cout<<endl;
}
cout<<"vvedite element dlya vstavki
";
while (cin>>n, n!=0)
{
a_deq.pop_front();
a_deq.push_back(n);
}
for (c=a_deq.begin(); c!=a_deq.end(); ++c)
{
cout<<"deq="<<*c<<" ";
cout<<endl;
}
getch();
}
Приложение:
Ответ отправила: Shorty (статус: 1-ый класс)
Ответ отправлен: 05.06.2008, 00:11
Отвечает: Терсков Сергей
Здравствуйте, Nysik!
Весьма расплывчатое задание. В приложении вы найдете реализацию шаблонного класса queue (двусторонняя очередь) на базе двусвязного списка. Работа с классом и его методами реализована в виде консольного меню. Компилятор MS VS 2005.
Приложение:
Ответ отправил: Терсков Сергей (статус: Специалист)
Ответ отправлен: 05.06.2008, 05:37
Вопрос № 139.130
ребят, помогите с лабой, пожалуйста:
1. Написать программу с помощью функций:
Дано натуральные n, действительные a1... an. найти сумму неповторяющихся зл-тов массива a1... an
2. Написать с помощью ф-ий. Дана целочисленная квадр.матрица размером n на m. Написать прогу, позволяющую поменять местами элементы, расположенные в верхней и нижней части, ограниченной главной и побочной диагоналями (за исключением элементов на диагоналях)
Отправлен: 05.06.2008, 11:11
Вопрос задал: Анна Евгеньевна Талалаева
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Verena
Здравствуйте, Анна Евгеньевна Талалаева !
Для первой задачи выделяем в функцию нахождение суммы. Чтобы проверить, повторяется ли i-й элемент массива, надо сравнить его со всеми остальными, а если совпадений не будет, то добавить его к сумме. Решение в приложении.
Для второй задачи выделяем в функцию обмен элементов местами. Не бывает квадратных матриц n на m, бывает только одной размерности, иначе матрица, собственно, не будет квадратной. Понятия главной и побочной диагонали имеют смысл только в квадратных матрицах и выражаются простыми формулами. Главная диагональ: элементы на ней имеют индексы i=j, элементы над ней - j > i, под ней - j < i . Побочная диагональ: элементы на ней имеют индексы i+j=n+1, элементы над ней - i+j < n+1, под ней - i+j > n+1 .
Всё это Вы можете проверить опытным путём, и убедитесь, что это так. При таком раскладе разделить матрицу на четверти проще простого: Верхняя: j > i and i+j < n+1 Нижняя: j < i and i+j > n+1
Правую и левую четверти рассматривать не будем, поскольк для задачи это не требуется. Надо заметить, что соответствующий элементу верхней четверти элемент нижней четверти будет иметь тот же самый индекс по столбцу и индекс по строке, выражающийся формулой (n-i-1) (единицу вычитаем из-за того, что индексация в массиве с 0).
Код обеих задач смотрите в приложении. Удачи!
Приложение:
--------- Эта история - не для истории, понимаешь?
Ответ отправила: Verena (статус: Практикант)
Ответ отправлен: 05.06.2008, 15:45
Вопрос № 139.160
Здравствуйте уважаемые эксперты.
Я пользуюсь Visual Studio 2008, и в своем проекте я подключаю некоторые библиотеки (lib), но для этих библиотек нужны dll.
Dll - ки у меня есть, но их очень много и я не хочу хранить их в одной директории с программой. Поэтому хочу собрать все DLL
и поместить их в папку bin (папка будет находиться в той же директории где и exe - шник программы). Так как мне настроить
компилятор, что бы программа искала dll не в текущей директории с исполняемым файлом,а по другому нужному мне адресу????
Заранее благодарен.
Отправлен: 05.06.2008, 14:05
Вопрос задал: XeS (статус: 1-ый класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 4)
Отвечает: Лысков Игорь Витальевич
Здравствуйте, XeS! В самой программе указывается только имя DLL, без пути. Чтобы грузить DLL из другого адреса, можно воспользоваться следующими способами: 1) загружать DLL-ки в программе явно по LoadLibrary 2) поместить в место, откуда система сама найдет. Например, указать путь к папке DLL-ек в переменной окружения PATH
В заключение, даю порядок автоматического поиска DLL 1. Каталог загрузки программы 2. Текущий каталог 3. 32-битный системный каталог (SYSTEM32) 4. 16-битный
системный каталог (SYSTEM) 5. Каталог Windows 6. Каталоги, перечисленные в переменной окружения PATH
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Специалист)
Ответ отправлен: 05.06.2008, 15:56
Вопрос № 139.187
Здравствуйте эксперты!
Подскажите плиз почему когда я пытаюсь освободить память из-под переменной functionClassDeviceData при выходе из функции вылезает access violation? И как посмотреть сколько она занимает памяти после создания и перед выходом из функции?
Заранее спасибо
Приложение:
Отправлен: 05.06.2008, 15:47
Вопрос задал: Муратов Радик Анатольевич
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Муратов Радик Анатольевич!
Смотреть надо в отладчике...
Посмотреть что передается параметром HardwareDeviceInfo.
Для некорректного значения ф-я SetupDiGetInterfaceDeviceDetail выдаст длину
необходимого буфера равной 0.
В результате, запрашиваем буфер нулевой длины и пишем(!) туда
functionClassDeviceData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);
Естественно, это приводит к вылету по free!
Как минимум, перед запросом буфера, надо проверить значение длины буфера на 0
и дать сообщение
По крайней мере, не будет вылетать и даст возможность определить место ошибки
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Специалист)
Ответ отправлен: 06.06.2008, 11:28
Отвечает: kool
Здравствуйте, Муратов Радик Анатольевич!
Возможно надо сделать так:
functionClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc (predictedLength+1);
с этой ошибкой я долго разбирался.
Это связано с тем что при заполнении структуры в нее записывается больше
чем для этого выделено памяти (нули в конце).
Кроме того
strcat(functionClassDeviceData->DevicePath, "\PIPE01");
может залездь в невыделенную память.
Кроме того
после
*pDevName = strdup(functionClassDeviceData->DevicePath);
памяить нужно освободить
free(*pDevName);
Удачи!
--------- I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 06.06.2008, 13:10
Вопрос № 139.249
Здравствуйте уважаемые эксперты! Помогите пожалуйста. Есть программа написаная на старом-старом редакторе и соответственно компилированая старым компилятором. Зделайте пожалуйста изменения в коде, чтобы можно было компилировать на VS2005. Спасибо.
P.S. Я пробовал убирать .h из заголовочного файла ввода-вывода, прописывать пространство имен std, и т.д. но в результате ошибочка. Помогите пожалуйста.
Приложение:
Отправлен: 05.06.2008, 23:59
Вопрос задал: Sashka
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Терсков Сергей
Здравствуйте, Sashka!
Для переделки рабочего кода хватит и тех действий которые вы привели. Но проблема в том, что в коде есть ошибки:
1. Функция void kills()
void kills(){
int j;
float summ,sr_znach;
for (i=0;i
summ=summ+mas[i];} //Здесь происходит попытка присвоения значения неинициализированной переменной
...
2. Функция void poshuk()
if (k=1) cout <<"
perschiy parniy =" <
else cout <<"
parnich nema";
Никакого сравнения не произойдет, т.к. используется оператор присваивания, а не сравнения.
В целом код написан не очень хорошо (мягко сказано). Использование глобальных переменных, стиль написания - вот его главные проблемы.
Немного исправленный код, с переработанным стилем и удаленными ошибками смотрите в приложении. Компилятор MS VS 2005.
Приложение:
Ответ отправил: Терсков Сергей (статус: Специалист)
Ответ отправлен: 06.06.2008, 03:23
Вопрос № 139.371
Здравствуйте.
1) Как послать широковещательный UDP-пакет с каждого сетевого интерфейса отдельно? Проблема в том, что когда компьютер с 2 сетевыми картами посылает такой пакет, IP-адрес отправителя он ставит одинаковый в обе подсети, проверял сниффером. Получается, что в одной из подсетей на запрос невозможно ответить. Поэтому 2 копии программы соединение установить могут не всегда, а только в том случае, если запрос посылается компьютером у которого 1 сетевой интерфейс - в этом случае обр. адрес будет подставлен точно. Код
на всякий случай в приложении. Какие есть решения?
2) Как послать UDP-пакет не только на опред. порт, но и с конкретно заданного порта? Почему в структуре sockaddr нет исходящего порта?
Приложение:
Отправлен: 06.06.2008, 22:06
Вопрос задал: Blackie (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Хватов Сергей
Здравствуйте, Blackie!
Свои параметры (адрес и порт) задаются с помощью bind, куда они и должны передаваться. Если там указать не INADDR_ANY и 0 то указанные значения и будут использоваться.
Кстати, свой порт вы указали, только не проверили прошла ли привязка. Она могла и не пройти, если порт уже к кому-либо привязан или некуда адрес привязать. А адрес не указали, поэтому сокет и привязывается (один раз, по bind()) к произвольному. Посылаются же пакеты в зависимости от адреса получателя в соответствии с таблицей маршрутизации.
Ответ отправил: Хватов Сергей (статус: Практикант)
Ответ отправлен: 07.06.2008, 08:21
Вопрос № 139.455
Здравствуйте уважаемые эксперты.Нужна помощ в решении задач.
Задача 1: Создайте класс защищенного массива, в котором реализована проверка выхода за границы массива. Перегрузите операторы: [ ], =, +, -
(Программа написана, при компилировании ошибок нет, но когда уже введу значения последнего объекта, то выполнение останавливается и выдает ошибку "Debug assertion failed" и перегруженные операции + и - далее не выполняются. см.приложение)
Задача 2: Создайте класс Время, в котором реализованы операции сложения, вычитания, сравнения, ввода и вывод на экран. Возможность конвертации времени из американского формата am (pm): 10:00 pm = 22:00, 12:00 pm =00:00
Приложение:
Отправлен: 07.06.2008, 16:04
Вопрос задал: Белоус Владимир Владимирович
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Баранов Владимир aka C4tnt
Здравствуйте, Белоус Владимир Владимирович!
Все, что я здесь нашёл:
1.
int& mass::operator[](int i){
if (i<0 || i>4){ - видимо должно быть if (i<0 || i>=s){
cout<<"Limits are exceeded
";
exit(1);
}
2.
В операторах сложения и вычитания может получится Access violation если длина массива, который вы прибавляете больше длины массива, к которому прибавляют.
Лучше так:
for (int i = 0; (i<ob.s || i<s); i++){
....
}
3.
Оператор "равно". Проблема та же, но решение другое.
mass mass::operator=(mass ob){
if (ob.s != s) {
delete [] a;
a = new int[ob.s];
s = ob.s
}
for (int i = 0; i<s; i++){
a[i] = ob.a[i];
}
return *this;
}
--------- Теперь к нашим ответам осталось лишь найти вопросы
Отвечает: Lang21
Здравствуйте, Белоус Владимир Владимирович!
К задаче 1.
Ошибка в вашей программе хорошо известна. Её допускают, если функция возвращает объект, а в деструкторе освобождается память, выделенная при создании этого объекта. Решить проблему можно, правильно определив конструктор копий.
Чтобы понять почему это так, рассмотрим, что происходит, когда функция (или оператор) возвращает объект. Возьмём, к примеру ваш оператор сложения.
mass operator+(mass ob)
Чтобы вернуть объект mass, нужно объявить где-то в теле функции переменную соответствующего типа. У вас это
mass temp(ob.s);
При таком объявлении создаётся локальный объект, и в конструкторе выделяется память:
a = new int[s];
Этот объект уничтожается при выходе из функции, при этом будет вызван его деструктор, и память будет освобождена. Соответствующая строчка в деструкторе:
delete [] a;
Функция должна вернуть этот объект, поэтому до его уничтожения делается копия. Эта копия используется для вычисления выражения, в которое входит возвращённое функцией значение, а затем тоже уничтожается. При этом снова вызывается деструктор.
В вашей программе конструктор копий не определён, поэтому при создании копии
используется конструктор копий по умолчанию, который просто копирует указатель на начала массива a. Переменная temp.a, и соответствующая переменная в копии этого массива указывают на одну и ту же область памяти, которая освобождается (!) при выходе из функции. Далее делается попытка использования этой памяти, а потом повторного её уничтожения, что вызывает ошибки исполнения.
Естественно, что в таких случаях в конструкторе копий должна выделяться память:
mass (const mass& m){
s = m.s;
a = new int [s];
for (int i=0; i
}
Добавление такого конструктора решает проблему.
Ваша программа, в которую добавлен конструктор копий и внесены другие небольшие поправки, приведена в приложении. (Программа не будет работать, если закомментировать конструктор копий.)
Примечание.
Проблемы, связанные с разной длиной массивов, конечно тоже возможны (и их наверное нужно решать), но у вас они не проявляются, так как все массивы имеют одну длину, которая определяется переменной size в функции main().
Приложение:
Ответ отправил: Lang21 (статус: Студент)
Ответ отправлен: 08.06.2008, 01:02
Вопрос № 139.490
Здравствуйте! Подскажите пожалуйста:
Допустим при создании двумерного динамического массива, я выделяю память для массива указателей на одномерные массивы:
int** mas = new int*[n];
так вот вопрос:
есть разница между этими строчками?
int** mas = new int*[i];
int **mas = new int*[i];
Отправлен: 07.06.2008, 21:36
Вопрос задал: Sashka
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Баранов Владимир aka C4tnt
Здравствуйте, Sashka!
Разница только в расположении пробела. Поскольку * тоже разделитель, компилятор пробелы не учитывает. У меня работает даже такое: int**mas=new int*[i];
На выполнение программы не влияет.
--------- Теперь к нашим ответам осталось лишь найти вопросы
Отвечает: Терсков Сергей
Здравствуйте, Sashka!
Для компилятора действительно нет никакой разницы между этими формами записи. Здесь уже играет роль вопрос стиля написания кода. Наиболее часто используется вторая форма записи, т.е.
int **mas = new int*[i];
Например, в книге Алана Голуба - "Правила программирования на С и С++" используется именно такой стиль.
Ответ отправил: Терсков Сергей (статус: Специалист)
Ответ отправлен: 09.06.2008, 02:42
Вопрос № 139.533
Объясните как (если это взможно) создать массив из 3-х указателей, нулевой и второй (крайние) из которых указывают на такие же массивы, а первый (средний) указывает на int. Я попробовал поэксперементировать с типом void, но у меня ничего не вышло.
Отвечает: Хватов Сергей
Здравствуйте, Юрий Анатольевич!
Вообще-то для таких случаев (хранения разнородных данных) есть структуры
Еще лучше использовать классы.
А для организации списков - template class, например std::list.
Но раз вам так хочется, то можно использовать и массив из элементов типа void * или подходящий union. Только возни с ним будет гораздо больше.
Приложение:
Ответ отправил: Хватов Сергей (статус: Практикант)
Ответ отправлен: 08.06.2008, 14:35
Отвечает: kool
Здравствуйте, Юрий Анатольевич!
Можно так
struct type{
type *pt1;
int *pint;
type *pt2;
};
type mass[MAX_DIM];
Удачи!
--------- I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 08.06.2008, 20:45
Отвечает: Терсков Сергей
Здравствуйте, Юрий Анатольевич! Ответ эксперта Хватов Сергей достаточно полный. Но в нем не отражены действия для получения значения из массива указатель на который содержат крайние элементы, а это не очень просто. Пример для извлечения данных по указателям void смотрите в приложении. Конечно такие конструкции в реальных приложениях лучше не использовать (как например *((int *)(*(int *)((int)a[0] + sizeof(void *))))), но в целях понимания работы с указателями они очень хорошо походят.
Приложение:
Ответ отправил: Терсков Сергей (статус: Специалист)
Ответ отправлен: 09.06.2008, 03:19
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Юрий Анатольевич!
Человек спрашивал про массивы...
Действительно, подойдут указатели на void (на что угодно)
void * array[3] ;
array[0] = (void*)&array1 ;
array[1] = (void*)2 ;
array[2] = (void*)&array2;
Единственно, придется использовать явные преобразования.
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Специалист)
Ответ отправлен: 09.06.2008, 09:39
Вопрос № 139.586
Здравствуйте уважаемые эксперты!Прошу помощи с решением задачи на строки.
Задано произвольное слово. Определить, начинается ли оно со слога «ка».
Отправлен: 08.06.2008, 19:22
Вопрос задал: Kompas
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Xeladen
Здравствуйте, Kompas!
без использования функций работы со строками
Приложение:
Ответ отправил: Xeladen (статус: 1-ый класс)
Ответ отправлен: 08.06.2008, 19:38