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

» Обучение и начало програмирования на С++

Автор: Raven Lazy
Дата сообщения: 18.07.2005 22:07
Хочу выучить С++ "с нуля" (раньше Pascal учил) дайте ссылки на книги интересные плз!
Автор: TheChampion
Дата сообщения: 19.07.2005 07:41
Raven Lazy
1. Б. Страуструп, Язык программирования C++
2. А. Пол, Объектно-ориентированное программирование на C++
3. Г. Шилдт, C++. Самоучитель
4. Г. Шилдт, C++: Базовый курс
5. Г. Шилдт, Справочник программиста по C/C++
6. Г. Шилдт, Искусство программирования на C++
7. С. Мейерс, Эффективное использование STL
8. ISO/IEC 14882 Programming Languages: C++

Для начального ознакомления хороши [2]--[4], [1], [5], [8] --- полное описание и самое полное описание, [6], [7] --- описание тонкостей C++ и STL.
Автор: vserd
Дата сообщения: 19.07.2005 11:22
Xarde

Цитата:
Сомневаюсь, что есть сложности с расположением переменных в правильной последовательности.

Я именно об это споткнулся :((((, видно прийдеться написать свой собственный парсер :)

И еще вопросик.
Как можно загрузить стандартные названия кнопок (ОК, ДА, НЕТ, ПОВТОРИТЬ и т.п.)?
Поясню, есть у одного из клиентов программа, которая полностью на английском, но когда запускаю ее на русской винде в диалогах появляются кнопки с русскими наименованиями, когда на португальской, подписи на кнопках по португальски, на английской по английски. Хотя текст в нутри программы по английски.
Вот и хочу сделать так-же в своей программе. Явно нужно загружать их из ресурсов, но вот как подступиться к поиску идентификаторов этих ресурсов я даже не знаю :(((. Заметил такую-же фичу во многих инсталяторах. явно что-то очень простое.
Автор: Xarde
Дата сообщения: 19.07.2005 12:23
vserd

Цитата:
Я именно об это споткнулся (((, видно прийдеться написать свой собственный парсер


Странно. Ты же все равно хотел указывать их номера в строке, куда подставятся значения... По идее, это предполагает, что ты _уже_ знаешь порядок следования своих переменных. Зачем для этого еще и парсер писать?


Цитата:
Как можно загрузить стандартные названия кнопок (ОК, ДА, НЕТ, ПОВТОРИТЬ и т.п.)?

Если тебе нужно для диалога типа MessageDlg, то там они идут, кажется, последним параметром (объединение по ИЛИ констант). Тут есть одно "но" - названия кнопок будут на языке твоей винды (если стоит английская, то вместо "да" будет "yes" и т.д.). Насколько я понял, тебя именно это и интересует.
Если пишешь на Builder, то там версии с пятой, кажется, есть возможность делать многоязычны интерфес. Мне это пока не требовалось, но, вроде бы ничего сложного. В меню Project\Language\Add...
Автор: vserd
Дата сообщения: 19.07.2005 15:35

Цитата:
Странно. Ты же все равно хотел указывать их номера в строке, куда подставятся значения... По идее, это предполагает, что ты _уже_ знаешь порядок следования своих переменных. Зачем для этого еще и парсер писать?


Прочувствуй разницу между

Цитата:
Format('Test string %s:2 , word %s:1', [' passed', 'yes']);
результат будет
'Test string yes , word passed'

и
printf("Test string %s , word %s", " passed", "yes");
Результат
'Test string passed, word yes'
При условии что 'Test string %s:2 , word %s:1' находится в отдельном файле, и грузится на этапе выполнения. Поэтому без парсера никуда. :(


Цитата:
Если тебе нужно для диалога типа MessageDlg, то там они идут, кажется,

MessageDlg это делфийская или VC++?
Для WINAPI MessageBox все понятно, там действительно на языке винды, я этим на Delphi активно пользуюсь, вместо стандатной делфийской реализации в Dialogs. В виденном мною приложении ВСЕ диалоги, которые включают стандартные кнопки написаны на языке винды, и только некоторые нестандартные надписи на кнопках по английски. Вот и интересует как это сделать в своем приложении. Все эти ресурсы храняться в винде, и нет большого смысла их таскать с собой и переводить в каждом языке по своему. Но вот как это можно сделать в какой DLL и какие именно ID этих ресурсов я нигде не встречал инфы ни на Delphi ни на С++.

Автор: Xarde
Дата сообщения: 19.07.2005 15:56
vserd

Цитата:
Цитата:Format('Test string %s:2 , word %s:1', [' passed', 'yes']);
результат будет
'Test string yes , word passed'


и
printf("Test string %s , word %s", " passed", "yes");
Результат
'Test string passed, word yes'
При условии что 'Test string %s:2 , word %s:1' находится в отдельном файле, и грузится на этапе выполнения. Поэтому без парсера никуда.


А почему нельзя сразу написать так:

Цитата:
printf("Test string %s , word %s", "yes", " passed");



Цитата:
MessageDlg это делфийская или VC++?

Подобная функция есть и там, и там - она просто обертывает функцию WinAPI.


Цитата:
Но вот как это можно сделать в какой DLL и какие именно ID этих ресурсов я нигде не встречал инфы ни на Delphi ни на С++.

Я тоже такой инфы не встречал. Большинство стандартных диалогов можно вызвать через WinAPI (придется рыть MSDN) и они будут содержать кнопки с именами на языке винды. Если же ты делаешь свой диалог, то проще определить язык винды и выбирать язык интерфейса программы, подгружая (явно или за счет многоязычности Борланда) строки из ресурсов.
Автор: vserd
Дата сообщения: 19.07.2005 17:45

Цитата:
А почему нельзя сразу написать так:
Цитата:printf("Test string %s , word %s", "yes", " passed");

Ты мой исходный пост читал?
Мне человек написал что для корректного перевода на его язык нужно чтобы переменные были в другом порядке :(((.
В DELPHI это реализовывалось указанием номера аргумента, а где в строке он встречается мне было глубоко пофигу. В C++ не так, там первым пришол, первым ушол. Вот и спрашиваю, может просто моих знаний языка мало. На данный момент это нужно будет писать самому.
Автор: mr_eoi
Дата сообщения: 20.07.2005 00:45
vserd
18:45 19-07-2005
Цитата:
Мне человек написал что для корректного перевода на его язык нужно чтобы переменные были в другом порядке ((.

А кто мешает этому человеку написать фильтр-функцию, вся задача которой сводится к перестановке местами аргументов. Решение, возможно, не очень красивое, но как выход, вероятно, сгодиться.
Автор: vserd
Дата сообщения: 20.07.2005 10:39
mr_eoi
Ты издеваешся???????
Он в программировании ни взуб ногой, но хорошо знает один из языков на который я хочу перевести программу.
Автор: OtD
Дата сообщения: 21.07.2005 22:41
Xarde

Цитата:
Видимо, потому, что часть (если не весь) код C++ на Builder транслируется в машинные команды через Pascal.

По моему, это глубочайшее заблуждение. Вопервых зачем? Вовторых если есть кнопка из С++ в ASM (BC5), то почему нет из С++ в Паскаль.

vserd

Цитата:
На данный момент это нужно будет писать самому.

Да, надо писать, я не встречал.
Сделай аналог Паскаля "Format('Test string %s:2 , word %s:1', [' passed', 'yes']);" для С.
Не забудь исходники сюда бросить ), интересно.


Вопрос
Подскажите, что более привлекательней для использования и кто, как, этим пользуется?

Код:
// Функтор
int (*FUNC)(int i=0);
int f(int i=0) {return i*i;}
// или объект-функция:
class OBFUNC
{
public: int operator()(int i=0) {return i*i;}
};
Автор: yagififk
Дата сообщения: 22.07.2005 05:50
Ой, а можно я тут свой вопрос задам?

Как явно вызвать конструктор?

Код:
class T
{
public:
T(){}
...
};

...

T * t = (T*)malloc(sizeof(T));
t->T(); //нельзя, говорит error C2273: 'function-style cast' : illegal as right side of '->' operator
Автор: TheChampion
Дата сообщения: 22.07.2005 06:11
yagififk
Никак. Если объект создается в стеке, то конструктор вызывается автоматически. Если в куче, то используешь operator new. Если по каким-то причинам тебе необходимо создать объект именно через malloc (вот уж не знаю, зачем), то можно просто скопировать объект.

Код: T t; // В стеке, автоматический неявный конструктор
T* t = new T; // В куче, неявный конструктор вручную
T* t = (T*)malloc(sizeof(T));
*t = T(); // Создание и копирование объекта
Автор: yagififk
Дата сообщения: 22.07.2005 06:33

Цитата:
Если по каким-то причинам тебе необходимо создать объект именно через malloc (вот уж не знаю, зачем)
Да вообщем хочу сделать класс динамических массивов Просто хотел realloc() использовать
Ну чтож спасибо, сделаю так:
T* t = (T*)malloc(sizeof(T));
*t = T(); // Создание и копирование объекта

Добавлено:
Эээээ, люди, так дело не пойдёт А если в операторе присваивания что-нибудь удаляется, а конструктор то я не вызывал Есть ли какое-нибудь другое решение проблемы?

Вообщем была идея такова. Выделить память под то количество элементов которое требуется и вызвать для них конструкторы, плюс выделить память для запасных элементов и вызывать конструкторы по мере добавления новых элементов в массив Ну а если уж выделенная память закончится то использовать realloс
Автор: TheChampion
Дата сообщения: 22.07.2005 11:13
yagififk
А почему бы не использовать operator new[]()?

Код: T* t = new T[100];
//...
delete[] t;
Автор: yagififk
Дата сообщения: 22.07.2005 12:30
Ну я написал выше почему
Оказалось надо перегрузить оператор new

void * operator new (size_t, void *ptr) {return ptr;} //он ничего не делает, просто когда мы будем его использовать, то будет вызываться конструктор, что нам и требовалось
void operator delete(void *, void *){} //чтоб компилятор не матерился

Тогда конструктор можно вызывать так:

T *t;
t = (T*)malloc(sizeof(T)); //выделяем память, но конструктор не вызывается
t = new (t) T(); //в качестве параметра оператора new передаётся указатель куда нужно вызвать конструктор
Автор: TheChampion
Дата сообщения: 22.07.2005 15:12
yagififk
А почему бы не выделить памяти "сколько надо" при помощи operator new[]()? Какая разница --- использовать realloc или связку new[]/delete[] в паре с std::copy()? Все, что нужно --- объявить конструктор по умолчанию, тем более что у тебя он есть.

std::vector реализован именно так: выделяется память при помощи std::vector::reserve(), это параметр capacity. Но кроме него есть еще параметр size, причем в любой момент времени size <= capacity. std::vector::at обеспечивает доступ к элементам вектора в диапазоне [0; size).
Автор: vserd
Дата сообщения: 22.07.2005 15:28
OtD
Как напишу, кину. Просто у меня было стойкое убеждение что на C++ такое должно быть. :((

ALL
вопрос по перечеслениям (enum)
Есть ли возможность определить последнее (верхнее) значение перечисления, и можно -ли использовать их в цикле?
т.е. хочется чего-то тако-го:
enum testEnum{
tefirst, tesecond, teOther
}
for (i=GetFirstEnum(testEnum); GetLastEnum(testEnum); I=+)
{}
где GetFirstEnum, GetLastEnum, возвращают первую и последнее занчение enum.
Или в С++ более правильным является объявление типа такого
enum testEnum{
tefirst, tesecond, teOther, teLast= teOther
}
и в цикле перебирать for (i=tefirst; teLast; I=+)?

В общем я хочу сделать некоторре множество идентификаторов, а потом использовать его для индексирования некотоого массива.

P.S. не бейте ногами если говорю ересь в смысле C++, я его только изучаю :)
Автор: TheChampion
Дата сообщения: 22.07.2005 16:39
vserd
А почему бы не использовать std::set, итераторы и std::map? Просто нет способа перечислить элементы перечисления, но можно их занумеровать:


Код: enum testEnum{teFirst=0, teSecond=1, teThird=2, teLast=3}
for(testEnum e = teFirst; у != teLast; e++);
Автор: Xarde
Дата сообщения: 22.07.2005 23:28
OtD

Цитата:
По моему, это глубочайшее заблуждение.

Но дельфи действительно компилирует быстрее билдера. Заметно быстрее. Факт проверен на разных машинах и разных версиях.

Цитата:
Подскажите, что более привлекательней для использования и кто, как, этим пользуется?

Я бы использовал первый вариант. Почему? Потому что во втором создается некоторое количество ненужного мусора, вроде таблицы виртуальных функций. Причем во втором у тебя есть один объект на функию и для создания такой же (по параметрам вызова и результата) придется писать еще один объект. И наследование не поможет - нет виртуальности operator(). В указанном примере нет. Но можно и поправить.
Автор: yagififk
Дата сообщения: 23.07.2005 06:04
TheChampion, ну я же пока только учусь Тем более двоешник, это задание ещё в мае надо было сдать Спасибо за совет, потом посмотрю разберусь, сейчас пока времени мало
Автор: TheChampion
Дата сообщения: 23.07.2005 08:22
Xarde

Цитата:
Но дельфи действительно компилирует быстрее билдера. Заметно быстрее. Факт проверен на разных машинах и разных версиях.

Вы будете смеяться, господа, но MSVS программы той же функциональности компилирует чуть-чуть медленнее Delphi. Не умеют в Borland писать компиляторы C++.

А g++ 4 версии вообще всех имеет в плане скорости компиляции!
Автор: vserd
Дата сообщения: 23.07.2005 11:34
Xarde

Цитата:
Но дельфи действительно компилирует быстрее билдера. Заметно быстрее. Факт проверен на разных машинах и разных версиях.

Я не знаю как в Builder-е компилируется PAS-код, но по той причине что Builder поддерживает компиляцию Delphi кода не приходится надеятся на быстроту.
Чудес не бывает, за расширенные возможности приходится чем-то жертвовать.
IMHO Даже если используется только C++ компилер выполняет внутренние проверки на PAS, а так как это работа со стороками, на скорость не приходится расчитывать.

TheChampion
Ты сам себе протеворечишь

Цитата:
Просто нет способа перечислить элементы перечисления, но можно их занумеровать:

А вот перечислить элементы множества --- раз плюнуть.

Или это я глючу что enum == множество? :(


Цитата:

Код:enum testEnum{teFirst=0, teSecond=1, teThird=2, teLast=3}

разве enum testEnum{teFirst, teSecond, teThird} не начинается с 0? (вроде в доке сказано что именно так).

я в Delphi могу сделать вот так:

Код:
Type
TTestEnum=(teFirst, teSecond, teThird);
TMyArray= array [Low(TTestEnum)..High(TTestEnum)] of integer ;
Автор: TheChampion
Дата сообщения: 23.07.2005 15:28
vserd

Цитата:
Ты сам себе протеворечишь

Нет, просто я знаю C++.


Цитата:
Или это я глючу что enum == множество?

Как ты думаешь, enum и std::set --- синонимы?


Цитата:
разве enum testEnum{teFirst, teSecond, teThird} не начинается с 0? (вроде в доке сказано что именно так).


Ну да, именно так. Но тебе мало что мешает написать

Код: enum testEnum {teFirst, teSecond = 25, teThird}
Автор: dantess
Дата сообщения: 24.07.2005 21:28
Народ, помогите, плиз - никак не могу разобраться (пишу на perl очень давно), с++ не знаю вообще, но нужно написать програмку для института. Все элементарно, на perl- все бы сделал за 20 минут... а на с++..

Вопрос такой:

Как на Visual C++ (если что- компилятор Microsoft`овский) прочитать из файла (CSV - файл, где все значения разделены запятыми) и запихнуть в многомерный массив...
Автор: TheChampion
Дата сообщения: 25.07.2005 08:23
dantess
Как обычно. Считываешь строки через std::ifstream::getline(), указав в качестве разделителя запятую. Что-то вроде этого:

Код: const int MAX = 1024;
char data[MAX + 1]; // Разделитель!

std::ifstream from("input.dat");
for(;;)
{
from.getline(data, MAX, ','); // Запятая
if(!from)
break;
// Делаем что-то с data
from.getline(data, MAX, ','); // Запятая
// Делаем что-то с data
from.getline(data, MAX, '\n'); // Конец строки
// Делаем что-то с data
}
Автор: vserd
Дата сообщения: 25.07.2005 10:48
TheChampion

Цитата:
Как ты думаешь, enum и std::set --- синонимы?

конечно же нет. Если явно указывать что это std::set воросов не возникает, а если литературно....
Тут видно проблема с переводом. :(. В паскале TTestEnum=(teFirst, teSecond, teThird) обозван Enumerated type в русско-язычной литереатуре "множество". Вот и глючу.



Автор: TheChampion
Дата сообщения: 25.07.2005 11:26
vserd

Цитата:
В паскале TTestEnum=(teFirst, teSecond, teThird) обозван Enumerated type в русско-язычной литереатуре "множество". Вот и глючу.


По-моему в русской версии вирта это называется "перечислимый тип". В паскале ведь это тоже разные вещи! Ты пишешь в духе:


Код: type my_enum = (First, Second, Third);
my_set = set of my_enum;
Автор: WiseAlex
Дата сообщения: 25.07.2005 12:18
vserd
общее замечание по поводу перехода на с++ с других языков:
с++ не является высокоуровневым языком программирования, т.е. не имеет встроенной в язык поддержки строк, множеств, комплексных чисел, ввода/вывода и.т.д. Массивы и перечисления поддерживаются в самом базовом исполнении фактически не предоставляя высокоуровневых операций с ними.
Фактически все высокоуровневые типы и возможности реализуются в виде классов и функций.
Автор: TheChampion
Дата сообщения: 25.07.2005 13:25
WiseAlex

Цитата:
с++ не является высокоуровневым языком программирования, т.е. не имеет встроенной в язык поддержки строк, множеств, комплексных чисел, ввода/вывода и.т.д.

А чем это плохо? На C++ можно писать программы как угодно и для чего угодно. По-моему, лучше иметь маленький язык с большой хорошей библиотекой, чем большой язык с убогими библиотеками и нафиг ненужными возможностями.
Автор: Zingerrr
Дата сообщения: 25.07.2005 13:56
По с++ и другим языкам программирования написано множество книг, но почему-то многие (а может и немногие) с этими книгами не могут достичь цели ... Может у них нехватает упорства или чего-то другова, а может дело и в книгах…

По моему мнению многие книги хотя и неплохо описывают "кирпичики языка", но содержат не интересные (абстрактные) примеры и задачи - поэтому быстро надоедает писать что ни будь типа "Hello world" выполняя задачи и примеры, а написать что ни будь толковое самому знаний(фантазии ...) пока что не хватает.
Эти книги можно сравнивать с простейшим конструктором - автор показывает простые кубики , а дальше делай что хочешь...

Мне кажется многим была интересна книга типа "конструктора lego" -где бы автор вначале книги поставил достаточно сложную но интересную задачу , а потом на протяжение книги показал как ее решить(двумя тремя способами). Раскрыл бы свойства языка, провел бы читателей от разработки алгоритма до написания кода ....

Страницы: 12345678910111213141516171819202122

Предыдущая тема: DELPHI. Счетчик ячеек со значенями, значений ячеек


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