Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: SaDFromSpb
Дата сообщения: 23.05.2006 13:51
DeviL

Цитата:
к тому, что я сказал - перемещение по многомерным массивам, как по одномерным - ошибка проектирования и обман
Не стоит быть столь категричным . Ясное дело, что если мы создаем многомерный массив, то, как правило, он нам нужен именно в виде многомерного массива. Хотя я могу привести пример из личной практики, когда "фактическая одномерность" многомерного массива оказалась весьма кстати.
Автор: DeviL
Дата сообщения: 23.05.2006 16:58
SaDFromSpb
ну что правда, то правда, но это должен быть крайний случай и специально к нему идти не надо - только если другого выбора нет и не сам себя загнал в угол.
Автор: SaDFromSpb
Дата сообщения: 23.05.2006 20:18
Народ, приведите, пожалуйста, пример как инстанцировать шаблон set своим компаратором. Требуется создать множество (set) из структур, содержащих четыре поля типа int. А то у меня сейчас литературы нет, и в гугле что-то не находися.
Автор: Abs62
Дата сообщения: 23.05.2006 23:22
SaDFromSpb
Насколько я помню, примерно так:

Код: struct IntStruct { //Это исходная структура
int n1,n2,n3,n4;
};

class IntStruct_less { //Компаратор
public:
bool operator()(IntStruct is1,IntStruct is2) const
{
return(is1.n1<is2.n1); //Для сравнения по первому полю
}
};

set<IntStruct,IntStruct_less> ss; //А это искомый set
Автор: WiseAlex
Дата сообщения: 24.05.2006 09:40
Abs62

Цитата:
operator()(IntStruct is1,IntStruct is2) const

желательно делать так

Код: operator()(const IntStruct & is1,const IntStruct & is2) const
Автор: Andy_Solo
Дата сообщения: 24.05.2006 10:07
Подскажите код на C++ для определения имени компьютера в сети?
Автор: SaDFromSpb
Дата сообщения: 24.05.2006 16:26
Abs62, WiseAlex Спасибо. Я пытался сделать не через функтор, а через функцию. В справочнике написано, что параметр шаблона Compare может быть так же указателем на функцию, который мне никак не удается запихнуть.

Andy_Solo В линуксе функция gethostname(char* buffer, int size) из unistd.h. В виндах что-то аналогичное должно быть (может быть, тоже самое).

Автор: RedLord
Дата сообщения: 24.05.2006 17:48
SaDFromSpb


Цитата:
class IntStruct_less { //Компаратор

и еще добавить

class IntStruct_less :std::binary_function<IntStruct, IntStruct, bool> {
Автор: SaDFromSpb
Дата сообщения: 24.05.2006 19:00
RedLord
Не понял. Это для варианта с функтором? Так и без этого работает... Это хороший стиль?
Автор: RedLord
Дата сообщения: 24.05.2006 19:05
SaDFromSpb

И хороший стиль. и функторы для STL должны быть адаптируемыми:


В данном случае это не критично. но вообще посмотри
functional из STL. функторы minus, plus, etc.
Автор: SaDFromSpb
Дата сообщения: 24.05.2006 19:25
Ок.
А можно каким-нибудь образом определить тип функции через typedef?
То есть, к примеру, есть функция bool less(int i1, int i2); У нее же есть какой то тип. Можно ему присвоить собственное имя через typedef?
Автор: RedLord
Дата сообщения: 24.05.2006 19:39
SaDFromSpb

Если я правильно понял:

bool less(int i1, int i2)
{
....
}

int main()
{

typedef bool (*Fn)(int,int);
Fn f = &less;
bool r = (*f)(1,2);

}
Автор: SaDFromSpb
Дата сообщения: 24.05.2006 19:56
RedLord
Да. То что надо.
Автор: Abs62
Дата сообщения: 24.05.2006 21:11
Andy_Solo
А под Windows посмотри функцию GetComputerNameEx.
Автор: SaDFromSpb
Дата сообщения: 25.05.2006 10:02
Интересно, корректно ли разрушается контейнер, если он вмещает указатели на массивы. Ведь по идее он просто вызывает деструктор для каждого элемента. При этом, он не может узнать, что каждый елемент - это на самом деле указатель на массив, то есть нужно вызывать операцию delete[].
Автор: WiseAlex
Дата сообщения: 25.05.2006 10:17
SaDFromSpb

Цитата:
корректно ли разрушается контейнер, если он вмещает указатели на массивы

контейнер не знает нужно вызывать delete или нет.
Если есть необходимость вызывать delete используют или умные указатели (типа boost::shared_ptr) или специальные варианты контейнеров для указателей, которые вызывают delete при удалении элемента
если элемент контейнера массив ситуация аналогична, но потребуется boost::shared_array или контейнер с аналогичной функциональностью
Автор: SaDFromSpb
Дата сообщения: 25.05.2006 13:21
WiseAlex
Хм.. То есть стандартные контейнеры вообще delete не пользуются? Выходит, STL -контейнеры рассчитаны на хранение лишь ссылочных типов... Понятно.

Цитата:
специалmyst варианты контейнеров для указателей
специалmyst - вот это слово не пойму, и где их брать?
Автор: RedLord
Дата сообщения: 25.05.2006 13:44
SaDFromSpb

не ссылок. а значений (объектов)
для STL один из условий объектов:
- дефолтный конструктор
- оператор копирования

также и все функторы в алгоритмы передаются по значению.
P.S. по STL есть хорошая книга Мейерса
Автор: SaDFromSpb
Дата сообщения: 25.05.2006 13:53
RedLord

Цитата:
не ссылок. а значений (объектов)

Я это и имел ввиду (я отредактировал предыдущий пост немного). Ведь, если мы объявляем int i; , то в i хранится ссылка. И если i кинуть в контейнер (myvect.push_back(i)) значение i скопируется в вектор и будет там храниться тоже как ссылка.

Цитата:
по STL есть хорошая книга Мейерса
Не помнишь, как она называется?
Автор: RedLord
Дата сообщения: 25.05.2006 14:01
SaDFromSpb
Эффективное использование STL
Есть у него же
Эффективное использование С++. последнее издание вышло в этом году на русском.

int i = 1; // объявление не ссылки, объявление переменной

int& ri = i; //объявление ссылки на i
int i1 = i; //объявление переменной

разница существенная, тому как:

ri = 2; // i стало равно 2
i1 = 5; // i не изменилось.

при push_back копирование идеть по значению:
int i = 1;
vec.push_beck(i);

vec[0] = 2; // i не изменилось.
прочти Страуструпа - там хорошо описано различие между указателями, ссылками и значениями. у Мейерса тоже вроде есть в Эфф. С++
Герба Саттера "Решение сложных задач на С++"( вроде так) почитай.
Автор: SaDFromSpb
Дата сообщения: 25.05.2006 15:00
RedLord
У нас с тобой просто путанница в понятниях.

Цитата:
ri = 2; // i стало равно 2
i1 = 5; // i не изменилось.


Код: int i = 4;
int& ri = i;
// после этого на уровне кода никакой разницы между ri и i заметить не удастся (если удается - напиши как)
ri = 45;
cout << i << endl; // выводится 45. Проверь.
Автор: RedLord
Дата сообщения: 25.05.2006 15:31
SaDFromSpb

да разницы нет. ее на уровне машинного кода не будет если объявить ri указателем, т.к. большинство компилеров реализуют ссылку через указатель.
Автор: SaDFromSpb
Дата сообщения: 25.05.2006 15:43
RedLord

Цитата:
большинство компилеров реализуют ссылку через указатель
Хм.. не знал, кстати спасибо за ссылки на книжки. "Решение сложных задач на С++" у меня уже есть (купил совсем недавно)
Автор: WiseAlex
Дата сообщения: 25.05.2006 17:30
SaDFromSpb

Цитата:
специалmyst

специальные (puntoswitcher подвел) - посмотри boost вроде были (не факт конечно)
Автор: koderr
Дата сообщения: 27.05.2006 17:37
Как сделать, чтобы функция _itoa из ntdll.dll переводила шестнадцатиричные числа в строку в верхнем регистре? Например, не 1f3d8d89, а 1F3D8D89.
Автор: SaDFromSpb
Дата сообщения: 27.05.2006 17:59
koderr
Так есть же отедльная фукнция для перевода строки в верхний регистр. Почему ей не воспользоваться?
Автор: koderr
Дата сообщения: 27.05.2006 18:24
SaDFromSpb
Некрасиво это - из-за каких-то 8 байт ЦЕЛУЮ функцию вызывать (шестнадцатиричное число - CRC32). Мне нужно вызвать ОДНУ функцию, чтобы перевести число в строку в верхнем регистре. wsprintf не предлагать!
Автор: SaDFromSpb
Дата сообщения: 28.05.2006 00:07
koderr

Цитата:
Некрасиво это - из-за каких-то 8 байт ЦЕЛУЮ функцию вызывать (шестнадцатиричное число - CRC32)
. Времена, когда люди пробелы в конце строк убирали, чтобы компилилось быстрее, прошли. Сейчас больше всего ценится скорость разработки, а не "экономия на спичках" (конечно, если ты не пишешь драйвер или графический движок).
Или у тебя это действие стоит в цикле, повторяющемся столько раз, что эту "некрасивость" можно заметить?
Вобщем, это все оффтопик, про _itoa из ntdll.dll не знаю.
И что значит (шестнадцатеричное число - CRC32) при обсуждении вызова функции?
Автор: 0Vovan0
Дата сообщения: 28.05.2006 02:00
Помогите с задачкой плиз!
Ситуация такая - учусть на прогамера, первый курс, щас веселое время настало.. В общем по програмированию (Си) 17 лаб, здать надо, к каждой есть 30 вариантов, показан пример решения и т.п. Все лабы как лабы, ознакомление - от вывода строчки на экан до указателей. Ничего сложного в принципе нету, разобраться можно. Но с одной лабой, к-я еще и 4 по списку, большая трабла - просто не могу врубиться в суть вопроса, тольком ниче не обьяснили, учитель на практике особо не появляется, все кто уже сдали просто переделали решенный вариант под себя. Надеюсь что вы обьясните в чем суть, и мне так делать не придется.
В общем задание:

Цитата:
Битовые операции

Целью лабораторной работы является получение практических навыков в работе с побитовими логическими операциями и операциями сдвига языка C.

Задание для выполнения
Составить две программы, первая из которых вводит составные части структуры данных, приведенной в Вашем варианте индивидуального задания, и формирует из них заданную упакованную структуру. Вторая программа вводит упакованную структуру как 16-ричное число и выводит значения отдельных ее составных частей.

Вариант &#9575;11

Информация о состоянии устройства в системе ввода-вывода представляется в виде:

#разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение C C C U U U U U E E E E E E 0 B

где: CCC - номер канала
U..U - номер устройства в канале
E..E - код состояния
B - признак занятости устройства

Хотя бы обьясните, чего от меня в этом задании хотят?
Автор: HANDLE
Дата сообщения: 28.05.2006 08:58
0Vovan0

Цитата:
#разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение C C C U U U U U E E E E E E 0 B

где: CCC - номер канала
U..U - номер устройства в канале
E..E - код состояния
B - признак занятости устройства


1 int C, U, E, B; // заданы
int Pack = (B & 1) | ((E & 0x3F)<<2) | ((U & 0x1F)<<8) | ((C & 0x07)<<13);

2 int Pack; // задано
int C = (Pack>>13) & 0x07;
int U = (Pack>>8) & 0x1F;
int E = (Pack>>2) & 0x3F;
int B = Pack & 1;

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.