Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1073
от 10.07.2008, 05:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 461, Экспертов: 2
В номере:Вопросов: 10, Ответов: 17

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 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;
}

---------
Теперь к нашим ответам осталось лишь найти вопросы
Ответ отправил: Баранов Владимир aka C4tnt (статус: 4-ый класс)
Ответ отправлен: 07.06.2008, 22:10

Отвечает: 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];

На выполнение программы не влияет.
---------
Теперь к нашим ответам осталось лишь найти вопросы
Ответ отправил: Баранов Владимир aka C4tnt (статус: 4-ый класс)
Ответ отправлен: 07.06.2008, 22:28

Отвечает: Терсков Сергей
Здравствуйте, Sashka!
Для компилятора действительно нет никакой разницы между этими формами записи. Здесь уже играет роль вопрос стиля написания кода. Наиболее часто используется вторая форма записи, т.е.
int **mas = new int*[i];
Например, в книге Алана Голуба - "Правила программирования на С и С++" используется именно такой стиль.
Ответ отправил: Терсков Сергей (статус: Специалист)
Ответ отправлен: 09.06.2008, 02:42


Вопрос № 139.533
Объясните как (если это взможно) создать массив из 3-х указателей, нулевой и второй (крайние) из которых указывают на такие же массивы, а первый (средний) указывает на int. Я попробовал поэксперементировать с типом void, но у меня ничего не вышло.
Отправлен: 08.06.2008, 14:07
Вопрос задал: Юрий Анатольевич (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Хватов Сергей
Здравствуйте, Юрий Анатольевич!

Вообще-то для таких случаев (хранения разнородных данных) есть структуры
Еще лучше использовать классы.
А для организации списков - 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


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 4.99 RC 5.0 от 08.07.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное