Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вопросник новичка


Автор: Rickert 11.10.2007, 05:26
Я предлогаю закрепить эту тему где-нибудь на видно месте и чтобы люди, которые только начали изучать язык и не могут пока осилить "hello world" или не понимают почему теперь iostream.h указывается  без *.h - отписывали свои вопросы тут. Согласитесь - большая часть таких людей не пользуется поиском, и создаёт темы с элементарными вопросами и начинается перепалка с модераторами / ругань / баны / обиды / сопли намотанные на кулак и всё такое прочее smile 
А тут без злости так сказать будем отвечать на их вопросы smile 

Автор: tdebugger 11.10.2007, 08:29
У меня такой вопрос - почему теперь iostream.h указывается  без *.h, я серьезно, раньше я как-то не обращал на это внимания, а раз тут такое дело, не грех и спросить.... 

Автор: DjoNIK 11.10.2007, 08:32
По стандарту *.h - Си-шный стиль, в то время как в С++ - либо *.hpp, либо вообще без расширения.

Автор: MAKCim 11.10.2007, 08:35
DjoNIK
а разве стандартом оговорены расширения файлов?  smile 

Автор: DjoNIK 11.10.2007, 08:46
MAKCim, не по стандарту компилятора, конечно, это в принципе невозможно smile
По одному из принятых стандартов (по-крайней мере я так читал у авторитетного источника)

Автор: Rickert 11.10.2007, 08:56
Вроде по последнему стандарту принято, что заголовочные файлы не должны иметь расширения.
Правда чем это обусловлено - не ясно.

Автор: FiMa1 11.10.2007, 09:25
Copy/Paste (Шилдт Г. Самоучитель С++):
Новые заголовки в программах на C++
Как вам должно быть известно из опыта программирования на С, при использовании библиотечной функции в программу необходимо включить заголовочный файл. Это делается с помощью инструкции #include. Например, при написании программ на языке С заголовочным файлом для функций ввода/вывода является файл stdio.h, который включается в программу с помощью следующей инструкции:
Код
# include <stdio.h>

Здесь stdio.h — это имя файла, который используется функциями ввода/вывода, и предыдущая инструкция заставляет компилятор включить указанный файл в вашу программу.
В первые несколько лет после появления C++ в нем использовался тот же стиль оформления заголовков, что и в С. Для совместимости с прежними программами в языке Standard C++ этот стиль по-прежнему поддерживается. Тем не менее при работе с библиотекой Standard C++ в соответствии с новым стилем вместо имен заголовочных файлов указываются стандартные идентификаторы, по которым компилятор находит требуемые файлы. Новые заголовки C++ являются абстракциями, гарантирующими объявление соответствующих прототипов и определений библиотеки языка Standard C++.
Поскольку новые заголовки не являются именами файлов, для них не нужно указывать расширение .h, а только имя заголовка в угловых скобках. Ниже представлены несколько заголовков, поддерживаемых в языке Standard C++:
Код
<iostream>
<fstream>
<vector>
<string>

Такие заголовки по-прежнему включаются в программу с помощью инструкции #include. Единственным отличием является то, что новые заголовки совершенно не обязательно являются именами файлов.
Поскольку С++ содержит всю библиотеку функций С, по-прежнему поддерживается стандартный стиль оформления заголовочных файлов библиотеки С. Таким образом, такие заголовочные файлы, как stdio.h и ctype.h все еще доступны. Однако Standard C++ также определяет заголовки нового стиля, которые можно указывать вместо этих заголовочных файлов. В соответствии с версией C++ к стандартным заголовкам С просто добавляется префикс с и удаляется расширение .h. Например, заголовок math.h заменяется новым заголовком C++ <cmath>, а заголовок string.h — заголовком
<cstring>. Хотя в настоящее время при работе с функциями библиотеки С допускается включать в программы заголовочные файлы в соответствии со стилем С, такой подход не одобряется стандартом языка Standard C++. (То есть, он не рекомендуется.) По этой причине во всех имеющихся в книге инструкциях #include используется новый стиль написания заголовков программ. Если ваш компилятор для функций библиотеки С не поддерживает заголовки нового стиля, просто замените их заголовками в стиле С.
Поскольку заголовки нового стиля появились в C++ совсем недавно, во многих и многих прежних программах вы их не найдете. В этих программах в соответствии со стилем С в заголовках указаны имена файлов. Ниже представлен традиционный способ включения в программу заголовка для функций ввода/вывода:
Код
#include <iostream.h>

Эта инструкция заставляет компилятор включить в программу заголовочный файл iostream.h. Как правило, в заголовках прежнего стиля вместе с расширением .h используется то же имя, что и в соответствующих им новых заголовках.
Как уже отмечалось, все компиляторы C++ поддерживают заголовки старого стиля. Тем не менее такие заголовки объявлены устаревшими и не рекомендуются. Именно поэтому в книге вы их больше не встретите.
! Несмотря на повсеместное распространение в программах заголовков старого стиля, они считаются устаревшими.

Библиотека <iostream.h>не является частью стандарта языка. С другой стороны библиотека <iostream> входит в стандарт. Библиотека <iostream> реализована в виде объектно-ориентированной иерархии классов, поддерживает как основные так и расширенные (unicode) символы. С другой стороны <iostream.h> ограничена исключительно символами char (символы ASCII). Кроме того, целесообразно использовать <iostream>, если, разумеется, ваш компилятор поддерживает это, т.к. все компоненты <iostream> находятся в пространстве имен (namespace) std, в то время, как компоненты <iostream.h> располагаются в глобальном пространстве.
Есть три основных механизма использования библиотеки <iostream>:
  •  Использование подробного описания посредством операция явного задания (scope-resolution operator):
    Код
    std::cout << "Hello World!" << std::endl;
  •  Использование объявления для каждого члена namespace, который вы хотите использовать, к примеру:
    Код
    using std::cout;
    using std::endl;
    cout << "Hello World!" << endl;
  •  Использование директивы, которая предоставляет все пространство имен внутри вашей локальной области видимости (namespace):
    Код
    int main() {
    using namespace std;
    cout << "Hello World!" << endl;
    return EXIT_SUCCESS;
    }
Итак, если вам в программе необходимо использовать какой-то компонент <iostream> только один или два раз, то используйте правило 1, иначе, если ваша программа довольно интенсивно использует возможности <iostream>, то более удобным будет использовать правило 3.

Автор: FiMa1 11.10.2007, 10:23
Какой компилятор выбрать?
http://forum.vingrad.ru/forum/topic-49632.html
Какую книгу выбрать?
http://forum.vingrad.ru/books/topic-48036/view-all.html
Что такое: STL, MFC, ATL, API, WinAPI, .Net, VCL?
http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%B0%D1%8F_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2
http://ru.wikipedia.org/wiki/MFC
http://en.wikipedia.org/wiki/Active_Template_Library
http://ru.wikipedia.org/wiki/API
http://ru.wikipedia.org/wiki/WinAPI
http://ru.wikipedia.org/wiki/.Net
http://ru.wikipedia.org/wiki/VCL

Итог: да и воздастся ищущему...

ДРУЗЬЯ, ПРЕДЛАГАЮ ИЗБЕГАТЬ ВОСТОРЖЕННЫХ И БЛАГОДАРСТВЕННЫХ РЕПЛИК В ДАННОМ ТРЕДЕ, ДАБЫ НЕ ПЕРЕГРУЖАТЬ ЕГО ЛИШНЕЙ ИНФОРМАЦИЕЙ, ЕСЛИ ТРЕД ДЕЙСТВИТЕЛЬНО РЕШЕНО ЗАКРЕПИТЬ! СПАСИБО И БЕЗ ОБИД smile ! ВМЕСТО ЭТОГО ПРЕДЛАГАЙТЕ ВАРИАНТЫ НАИБОЛЕЕ ЧАСТО ЗАДАВАЕМЫХ ВОПРОСОВ ОТ НОВИЧКОВ.

Автор: tdebugger 11.10.2007, 11:36
Спасибо за бурную реакцию, однако появились вопросы по некоторым нюансам, как получу доступ к IDE, проверю, уточню и выскажу...  

Автор: mrbrooks 11.10.2007, 12:05
to FiMa1 будте справедливы  киньте ссылку еще на VCL!

Автор: chelser 11.10.2007, 12:39
ценная информация
спасибо

Автор: FiMa1 11.10.2007, 15:18
В чем отличие ссылки от указателя? Как использовать ссылки?
В C++ есть элемент, родственный указателю — это ссылка (reference). Ссылка является скрытым указателем и во всех случаях, и для любых целей ее можно употреблять просто как еще одно имя переменной.
Ссылку допустимо использовать тремя способами:
  • Ссылку можно передать в функцию. 
  • Ссылку можно возвратить из функции. 
  • Можно создать независимую ссылку.
ПЕРЕДАЧА ПАРАМЕТРОВ В ФУНКЦИИ ПОСРЕДСТВОМ ССЫЛОК
Наиболее распостраненное применение ссылки — передача ее в качестве параметра функции. Что бы понять, что такое параметр-ссылка и как это работает, рассмотрим программу, в которой параметром является указатель, а не ссылка:
Код
#include <iostream>

// использование параметра-указателя
void foo(int *p)
{
    *p = 100; // занесение числа 100 в аргумент,
              // на который указывает указатель p
}

int main()
{
    int i = 0;
    std::cout << "Initial value of i is: " << i << '\n';
    foo(&i); // передать адрес переменной i в функцию foo
    std::cout << "New value of i is: " << i << '\n';
    
    return 0;
}

Здесь функция foo() загружает целое значение 100 по адресу, который обозначен указателем p. В данной программе функция foo() вызывается из функции main() с адресом переменной i, по которому она располагается в памяти. Таким образом, после выполнения функции foo() переменная i будет содержать число 100.
В этой программе показано, как использовать указатель для реализации механизма передачи параметра посредством вызова по ссылке (call by reference). В программах С такой механизм является единственным спосо бом добиться вызова функции по ссылке. 
Запомните в языке Си ссылок нет!
Однако в C++ с помощью параметра-ссылки можно полностью автоматизировать весь процесс. Чтобы узнать, как это сделать, изменим предыдущую программу. В ее новой версии используется параметр-ссылка:
Код
#include <iostream>

// использование параметра-ссылки
void foo(int &r)
{
    r = 100; // теперь знак разыменования '*' для доступа
               // к значению переменной i не требуется!
             // здесь число 100 сразу же заносится в то
             // место в памяти, где хранится значение i
}

int main()
{
    int i = 0;
    std::cout << "Initial value of i is: " << i << '\n';
    foo(i); // передать адрес переменной i в функцию foo
            // заметьте, что оператор взятия адреса '&'
            // теперь не нужен, т.к. параметр функции foo
            // сразу же объявлен как ссылка
    std::cout << "New value of i is: " << i << '\n';
    
    return 0;
}

Проанализируйте эту программу! Во-первых, для объявления параметра-ссылки перед именем переменной ставится знак амперсанда (&). Таким образом, переменная r объявляется параметром функции foo(). Теперь, поскольку переменная r является ссылкой, больше не нужно и даже неверно указывать оператор ‘*’. Вместо него всякий раз, когда переменная п упоминается внутри функции f(), она автоматически трактуется как указатель на аргумент, используемый при вызове функции f(). Это значит, что инструкция
Код
r = 100;

фактически помещает число 100 в переменную, используемую при вызове функции foo(), каковой в данном случае является переменная i. Далее, при вызове функции f() перед аргументом не нужно ставить знак &. Вместо этого, поскольку функция f() объявлена как получающая параметр-ссылку, ей автоматически передается адрес аргумента.
Теперь важно запомнить следующее: значение адреса, на который указывает ссылка, вы изменить не можете (в этом поведение ссылок схоже с поведением константных указателей). Например, если в программе, где используется параметр-ссылка поместить в тело функции foo инструкцию:
Код
r++;

Вместо инкрементирования адреса, как это было бы с использованием указателей эта инструкция инструкция инкрементирует значение переменной (в данном случае это переменная i).
Кроме того, ссылка должна быть инициализирована в месте ее объявления, так если вы напишите где-то в программе, к примеру:
Код
int &r;

то непременно получите ошибку вида “references must be initialized” (в этом можно найти еще одно сходство ссылок с константными указателями).
Параметры-ссылки имеют несколько преимуществ по сравнению с аналогичными (более или менее) альтернативными параметрами-указателями.
Во-первых, с практической точки зрения нет необходимости получать и передавать в функцию адрес аргумента. При использовании параметра ссылки адрес передается автоматически. Во-вторых, по мнению многих программистов, параметры-ссылки предлагают более понятный и элегантный интерфейс, чем механизм указателей. В-третьих, как вы узнаете потом, при передаче объекта функции через ссылку копия объекта не создается. Это уменьшает вероятность ошибок, связанных с построением копии аргумента и вызовом ее деструктора.

ВОЗВРАЩЕНИЕ ПАРАМЕТРОВ ИЗ ФУНКЦИЙ ПОСРЕДСТВОМ ССЫЛОК
Фактически ничего особенного здесь нет, реализуется это также как и в случае с получением параметров посредством ссылок.
Для начала рассмотрим пример с использованием указателей для возврата значений из функций:
Код
#include <iostream>

int *foo() // foo возвращает указатель на целочисленную переменную
{
    static int var = 100;
    return &var; // необходимо использовать оператор
                 // взятия адреса '&' для возврата адреса
}

int main()
{
    int a = *foo() + 1; // необходимо разыменование
                        // посредством '*' для получения
                        // значения var

    return 0;
}

Но функции могут возвращать и ссылки, однако здесь надо быть осторожным! Если возвращение ссылки переменной объявлено в вызываемой функции, переменная должна быть объявлена внутри этой функции как static. В противном случае ссылка адресуется автоматической переменной, которая после завершения функции уничтожается; в таком случае говорят, что переменная «не определена» и поведение программы непредсказуемо.
Так для следующего примера
Код
#include <iostream>

int &foo()
{
    int var = 100;
    return var;
}

int main()
{
    int a = foo() + 1;

    return 0;
}

вы получите следующее предупреждение: “ returning address of local variable or temporary”. Да, результат выполнения такой программы чреват печальными последствиями, если к моменту использования значения переменной var, располагающееся по адресу возвращаемому функцией foo, значение будет перезаписано чем-либо другим.
Таким образом вы должны объявить var так
Код
static int var = 100;

Обратите внимание, что для возврата адреса переменной var из функции также не нужно использовать оператора взятия адреса ‘&’, т.к. функция изначально была объявлена как возвращающая ссылку на переменную целого типа. Соответственно и в main оператора разыменования ‘*’ писать не нужно.

НЕЗАВИСИМЫЕ ССЫЛКИ
Хотя они обычно и не используются, вы можете создавать независимые ссылки (independent reference). Независимая ссылка — это ссылка, которая во всех случаях является просто другим именем переменной. Поскольку ссылкам нельзя присваивать новые значения, независимая ссылка должна быть инициализирована при ее объявлении.
! Большинство программистов чувствует ненужность независимых ссылок, они добавляют неразберихи в программу. Как правило, их следует избегать.
Пример программы с независимой ссылкой:
Код
#include <iostream>
using namespace std;

int main()
{
    int x;
    int &ref = x; // создание независимой ссылки
    x = 10;   // эти две инструкции
    ref = 10; // функционально идентичны
    ref = 100;
    // здесь дважды печатается число 100
    cout << x << ' ' << ref << "\n";
    
    return 0;
}

В этой программе независимая ссылка ref служит другим именем переменной х. С практической точки зрения ref и х идентичны.

В завершении подведем некоторые ограничения, которые распостраняются на ссылки:
  • Нельзя изменить адрес ссылки;
  • Нельзя создавать массивы ссылок;
  • Нельзя ссылаться на битовое поле;
  • Ссылка должна быть инициализирована в момент объявления, до того как она будет использована как член класса, возвращена как значение функции или станет параметром функции.

Автор: zkv 11.10.2007, 15:34
Цитата(Rickert @  11.10.2007,  05:26 Найти цитируемый пост)
Я предлогаю закрепить эту тему где-нибудь на видно месте и чтобы люди, которые только начали изучать язык и не могут пока осилить "hello world" или не понимают почему теперь iostream.h указывается  без *.h - отписывали свои вопросы тут.

таких вопросов ну очень много разных возникнуть может. Толку если все ответы на них в кучу свалить? Если чел поленился книгу почитать, он станет читать километровую тему? Сомневаюсь.
Цитата(Rickert @  11.10.2007,  05:26 Найти цитируемый пост)
Согласитесь - большая часть таких людей не пользуется поиском, и создаёт темы с элементарными вопросами

Для элементарных вопросов есть FAQ. Если чел поленился туда заглянуть, то почему он станет читать эту тему?
Rickert, предложение хорошее, доброе, но только велосипед уже изобретен: http://forum.vingrad.ru/faq/c-c++general-questions.html, http://forum.vingrad.ru/articles/c-c++general-questions.html, http://forum.vingrad.ru/sources/c-c++general-questions.html...

Автор: FiMa1 11.10.2007, 15:45
Цитата(zkv @ 11.10.2007,  15:34)
Если чел поленился книгу почитать, он станет читать километровую тему? Сомневаюсь. Согласитесь - большая часть таких людей не пользуется поиском, и создаёт темы с элементарными вопросами.

Первое что пришло в голову...
Ну и так, если все ж останется:

Чем отличается константный указатель от константного указателя на константу?
Константный указатель- для такого указателя невозможно изменить адрес на который он указывает.
Константный указатель на константу - для такого указателя невозможно изменить ни адрес на который он указывает, ни значение, которое находится по данному адресу в памяти.
Для примера просмотрите приведенный ниже код:
Код
#include <iostream>
using namespace std;

// foo1 принимает константный указатель на целочисленную
// переменную. Не может "перенаправлять" указатель, т.е.
// изменить адрес
void foo1(int *const cnstPnt)
{
    //cnstPnt++; //ERROR: you cannot assign to a variable that is const!
                 // вы не можете получить доступ к переменной, являющейся константой!
    *cnstPnt = *cnstPnt + 1;
    int var = *cnstPnt + 1;
}

// foo1 принимает константный указатель на константу
// целочисленного типа. Не может "перенаправлять" указатель,
// т.е. изменить адрес и не может изменить значение по
// этому адресу
void foo2(int const *const cnstPnt)
{
    //cnstPnt++;     //ERROR: you cannot assign to a variable that is const!
                     // вы не можете получить доступ к переменной, являющейся константой!
    //*cnstPnt += 1; //ERROR: you cannot assign to a variable that is const!
                     // вы не можете получить доступ к переменной, являющейся константой!
    int var = *cnstPnt + 1; // правильно
}

int main()
{
    int var = 10; // обычная переменная
    
    //int *const cnstPnt; //ERROR: const object must be initialized if not extern!
                          // константный объект должен быть инициализирован если
                          // он не внешний!
    int *const cnstPnt = &var; // правильно

    foo1(&var); // не смогут изменить адрес var
    foo2(&var); // не смогут ни адрес var ни его значения

    return 0;
}

Автор: Rickert 11.10.2007, 17:06
zkv, понимаешь, не в обиду будет сказано дзайнеру и админам, но раздел FAQ - незаметен.
Если бы ссылка на него висела в разделе "C/C++ общие вопросы" - то народ бы юзал.
имхо.

Автор: Fazil6 11.10.2007, 18:05
FiMa1, ты серьёзно? 
ты написал много, но честно говоря ценность этого весьма сомнительна... 
Тема отличия указателей и ссылок не раскрыта.
Если уж пишешь о передаче ссылок в функции, то где тема о константных ссылках  и вообще зачем использовать передачу по ссылке и константной ссылке, так что опять незачет.
Не раскрыта тема "Зачем возвращать ссылки из функций". После раскрытия ее становится ясно, что это применяется в конкретных случаяхи и в общем случае возвращать ссылки из функций не подходящее решение.
Если уж советовать возвращать ссылку на static переменную, то нужно следом писать статью о том насколько это некрасиво и чем черевато. 
Цитата

Никогда не возвращайте ссылку, когда должны вернуть объект

Не помню кто сказал


Автор: archimed7592 12.10.2007, 08:29
Давайте, давайте, скопипастити сюда Страуструпа, Шилдта и прочих писателей для новичков... Желательно в полном объёме smile.
Думаю, 90% всех подобных вопросов освещены в http://www.parashift.com/c++-faq-lite/index.html, правда он на английском, что новичка не всегда устраивает... Да с новичками наверное всегда проблемы будут... Ну не знают они обычаев форума, не обучены нэтикету.


Цитата(DjoNIK @  11.10.2007,  08:46 Найти цитируемый пост)
По одному из принятых стандартов (по-крайней мере я так читал у авторитетного источника)

Твои сновидения - это авторитетный источник smile?

Цитата(Rickert @  11.10.2007,  08:56 Найти цитируемый пост)
Вроде по последнему стандарту принято, что заголовочные файлы не должны иметь расширения.
Правда чем это обусловлено - не ясно. 

По последнему(и предпоследнему smile) стандарту принято, что стандартные заголовочные файлы не должны иметьют расширения.
Обусловлено, думаю, тем же, что и зарезервированные идентификаторы - отсутствием коллизий имён файлов.

Автор: tdebugger 12.10.2007, 08:44
Цитата(tdebugger @  11.10.2007,  11:36 Найти цитируемый пост)
однако появились вопросы по некоторым нюансам

так вот
Цитата(FiMa1 @  11.10.2007,  09:25 Найти цитируемый пост)
с новым стилем вместо имен заголовочных файлов указываются стандартные идентификаторы, по которым компилятор находит требуемые файлы. Новые заголовки C++ являются абстракциями

насчет абстракций - файл iostream таковым не является, потому что он СУЩЕСТВУЕТ !
 Короче, мои идеи по этому поводу - "стандартные идентификаторы" будут реализованы в будущем, а сейчас для совместимости используются имена реальных файлов...


Автор: archimed7592 12.10.2007, 08:56
Цитата(tdebugger @  12.10.2007,  08:44 Найти цитируемый пост)
насчет абстракций - файл iostream таковым не является, потому что он СУЩЕСТВУЕТ !

Имеет право не существовать. Это интимное дело конкретной реализации(компилятора) - как и что организовать, чтобы её(реализации) поведение полностью соответствовало Стандарту.

Добавлено через 1 минуту и 16 секунд
Цитата(tdebugger @  12.10.2007,  08:44 Найти цитируемый пост)
"стандартные идентификаторы" будут реализованы в будущем

А зачем smile? Ты примерно представляешь, как устроен компилятор?

Автор: FiMa1 12.10.2007, 11:05
Цитата(Fazil6 @ 11.10.2007,  18:05)
FiMa1, ты серьёзно? 
где тема о константных ссылках  и зачем использовать передачу по ссылке и константной ссылке
Не раскрыта тема "Зачем возвращать ссылки из функций".
Если уж советовать возвращать ссылку на static переменную, то нужно следом писать статью о том насколько это некрасиво и чем черевато.

Отличия указателей от ссылок
  • Ссылка позволяет косвенно манипулировать объектом, точно так же, как это делается с помощью указателя. Однако эта косвенная манипуляция не требует специального синтаксиса, необходимого для указателей.
  • Ссылка должна быть инициализирована при ее объявлении. Хотя, как мы говорили, ссылка очень похожа на указатель, она должна быть инициализирована не адресом объекта, а его значением.
Дополнение: Если мы определяем ссылки в одной инструкции через запятую, перед каждым объектом типа ссылки должен стоять амперсанд (&) – оператор взятия адреса (точно так же, как и для указателей).
Код
// определено два объекта типа int
int ival = 1024, ival2 = 2048;

// определена одна ссылка и один объект
int &rval = ival, rval2 = ival2;

// определен один объект, один указатель и одна ссылка
int inal3 = 1024, *pi = ival3, &ri = ival3;

// определены две ссылки
int &rval3 = ival3, &rval4 = ival2;


Когда следует возвращать ссылки и делать их константными?
Внимательно читаем здесь http://mech.math.msu.su/~vvb/2course/Lect01.html#Const

Когда использовать передачу константных ссылок?
Объект, как правило, передается по константной ссылке для предотвращения его изменения в процессе передачи и обработки получателем. Кроме того такой подход позволяет избежать копирования всех полей объекта класса, как это было бы с передачей его по значению и, следовательно, избежать лишних затрат.
Аналогичную функциональность можно реализовать и с применением константных указателей на константы, но это потребует наличия специального синтаксиса, присущего для указателей.

В общем примерно в том духе. А вообще ДА И ВОЗДАСТСЯ ИЩУЩЕМУ!

Автор: archimed7592 12.10.2007, 11:11
FiMa1, ты сам эти мануалы пишешь smile?

Автор: Fazil6 12.10.2007, 11:26
Цитата(FiMa1 @  12.10.2007,  11:05 Найти цитируемый пост)
Отличия указателей от ссылокСсылка позволяет косвенно манипулировать объектом, точно так же, как это делается с помощью указателя. Однако эта косвенная манипуляция не требует специального синтаксиса, необходимого для указателей.Ссылка должна быть инициализирована при ее объявлении. Хотя, как мы говорили, ссылка очень похожа на указатель, она должна быть инициализирована не адресом объекта, а его значением.

ссылка намного сильнее отличается от указателя чем тебе кажется
http://forum.sources.ru/index.php?showtopic=146010&hl=%D1%D1%DB%CB%CA%C0,and,%D3%CA%C0%C7%C0%D2%C5%CB%DC,and,%D0%C0%C7%CD%C8%D6%C0

Автор: FiMa1 12.10.2007, 11:43
Цитата(archimed7592 @ 12.10.2007,  11:11)
FiMa1, ты сам эти мануалы пишешь smile?

И да и нет.. не люблю/некогда изобретать велосипед, если что-то есть в инете на тему, то анализ найденного, выборка, copy, небольшое редактирование, дополнение и paste. Я ведь к чему и подвожу ДА И ВОЗДАСТСЯ ИЩУЩЕМУ  smile !
Новички, вы просто не льстите себе, в 99,9% случаев вы не нашли новой закономерности/ошибки компилятора.... и, наверняка, вопрос ваш не оригинален, уже не раз поднимался и был решен.
1. Обязательно прочитайте следующее:
http://forum.vingrad.ru/forum/topic-48015.html
http://www.citforum.ru/howto/smart-questions-ru.shtml
2. Обязательно пробуйте искать существующее решение вашего вопроса:
http://forum.vingrad.ru/act-Search/f-92.html
Поисковые системы
3. Никогда не задавайте следующих вопросов:
- Что лучше С или С++ и с чего начать?
- Где взять книги по С/С++ и какие?
- Я новичок в программировании, дайте мне задание...
Ответы для себя и дискуссии на эти вопросы вы сможете найти в любом месте Интернета.
Цитата
ссылка намного сильнее отличается от указателя чем тебе кажется
http://forum.sources.ru/index.php?showtopic=146010&hl=%D1%D1%DB%CB%CA%C0,and,%D3%CA%C0%C7%C0%D2%C5%CB%DC,and,%D0%C0%C7%CD%C8%D6%C0

Fazil6, большое спасибо! Обязательно прочту.

Автор: archimed7592 12.10.2007, 12:38
Цитата(FiMa1 @  12.10.2007,  11:43 Найти цитируемый пост)
И да и нет.. не люблю/некогда изобретать велосипед, если что-то есть в инете на тему, то анализ найденного, выборка, copy, небольшое редактирование, дополнение и paste. Я ведь к чему и подвожу ДА И ВОЗДАСТСЯ ИЩУЩЕМУ  smile !

Ну, во-первых, если копипастишь, то обязательна ссылка на оригинал(ибо не воздастся плагиатчику...), а, во-вторых, из моего опыта общения с тобой мне показалось, что тебе рановато мануалы писать...

Автор: FiMa1 12.10.2007, 12:53
Цитата
Ну, во-первых, если копипастишь, то обязательна ссылка на оригинал(ибо не воздастся плагиатчику...),

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

Ok, молчу  smile 

Автор: mrbrooks 12.10.2007, 13:49
Цитата(archimed7592 @ 12.10.2007,  12:38)
Цитата(FiMa1 @  12.10.2007,  11:43 Найти цитируемый пост)
И да и нет.. не люблю/некогда изобретать велосипед, если что-то есть в инете на тему, то анализ найденного, выборка, copy, небольшое редактирование, дополнение и paste. Я ведь к чему и подвожу ДА И ВОЗДАСТСЯ ИЩУЩЕМУ  smile !

Ну, во-первых, если копипастишь, то обязательна ссылка на оригинал(ибо не воздастся плагиатчику...), а, во-вторых, из моего опыта общения с тобой мне показалось, что тебе рановато мануалы писать...

Э нее батенька вы не правы. Пускай пишет. как никак повторение - мать учения. Если человек хочет писать - пускай пишет. Сто пудово кому то поможет. 
Так что пиши  FiMa1 - если будет время - почитаем - все равно порою на работе делать не фиг smile 

Автор: DreLaZ 12.10.2007, 14:22
Я пользуюсь Borland C++ 4.5 (1991-1994)
в коде программы надо писать <iostream.h> и std  при написании проги не надо.
В книге написано что это старинный компилятор, но где достать новый компиллятор и есть ли большое отличие?

Автор: FiMa1 12.10.2007, 14:34
Цитата(DreLaZ @ 12.10.2007,  14:22)
где достать новый компиллятор и есть ли большое отличие?

DreLaZ, молодец! Твой вопрос действительно оригинален и не поднимался... по крайней мере в данном треде он уже не поднимался целых 17 постов...
http://forum.vingrad.ru/forum/topic-49632.html
ЗЫЖ: для кого пишем  smile ...

Автор: Dronchik 12.10.2007, 14:35
http://www.microsoft.com/downloads/details.aspx?FamilyId=B98A61BA-99B0-40B7-AB6E-5386A2B94217&displaylang=en

Добавлено через 1 минуту и 27 секунд
http://msdn2.microsoft.com/en-us/visualc/aa336402.aspx

Автор: DreLaZ 12.10.2007, 14:53
http://forum.vingrad.ru/forum/topic-49632.html
Эту тему я уже читал. Все подряд качать не в сосотоянии.
Каким компиллятором посоветуете мне пользоваться (чтоб было без .h)?

Автор: zkv 12.10.2007, 15:21
Цитата(DreLaZ @  12.10.2007,  14:53 Найти цитируемый пост)
Каким компиллятором посоветуете мне пользоваться

Microsoft Visual Studio 2005 Express Edition

Автор: FiMa1 12.10.2007, 15:38
Да, вот еще что, не удержался что бы не добавить, дорогие новички, пожалуйста не начинайте учиться программировать с VCL приложений в Borland C++ Builder, т.е. приложений, использующих визуальные компоненты. Начинайте учиться программировать с консольных приложений.
Для BCB 6.0: File->New->Other, выбираем Console Wizard, жмем Ok, в следующем окне выбираем язык исходного кода создаваемой программы (С/С++) и снова Ok.

Автор: DreLaZ 12.10.2007, 15:39
Цитата(zkv @ 12.10.2007,  15:21)
Цитата(DreLaZ @  12.10.2007,  14:53 Найти цитируемый пост)
Каким компиллятором посоветуете мне пользоваться

Microsoft Visual Studio 2005 Express Edition

Кстати, он у меня был. Он также не хочет компилить
Код

#include <iostream>

int main()
{
std::cout << "Hello";
return 0;
}

выдает ошибку
Код

Compiling...
c:\msvc\bin\hello.cpp
c:\msvc\bin\hello.cpp(1) : fatal error C1083: Cannot open include file: 'iostream': No such file or directory

 CL returned error code 2.
HELLO.CPP - 1 error(s), 0 warning(s)

Автор: archimed7592 12.10.2007, 15:49
Цитата(DreLaZ @  12.10.2007,  15:39 Найти цитируемый пост)
Кстати, он у меня был. Он также не хочет компилить

Ну это уже что-то из разряда фантастики smile.
Есть два варианта:
1. Ты ни разу не написал этот код руками(или написал, но после постояно копипастишь его), а в нём, к примеру, может буква "е" к примеру русским написана - попробуй ручками написать smile.
2. У тебя талантище устанавливать компиляторы - толи ты постоянно сам удаляешь этот файл, то ли ещё чего делаешь smile.

Автор: DreLaZ 12.10.2007, 16:06
Кстати, все и всегда пишу своими руками. Проблема решена: на компе стоял MVS 1.52 и MSV 2005.
Пытался компилить в MVS 1.52 smile 

Автор: Rickert 12.10.2007, 16:14
Цитата(DreLaZ @  12.10.2007,  16:06 Найти цитируемый пост)
Кстати, все и всегда пишу своими руками.

Уважаю smile 

Автор: DreLaZ 12.10.2007, 17:18
Установил Microsoft Visual Studio 2005 Express Edition (2,7Gb-наверное нормальной конфигурации).
При запуске проги поставил стандартные настройки с++. Но не могу разобраться в проге. Что выбрать в New (глаза разбегаются при выборе), чтобы написать код программы? 

Автор: archimed7592 12.10.2007, 17:20
Что-то вроде new project->c++->win32->win32 console

Автор: DreLaZ 12.10.2007, 17:42
Я так понял, что Microsoft Visual Studio 2005 Express Edition усовершенствованный С++?
И там "другая номенкулатура".
Я новичек в с++ и прогал тока на borland c++ 4.5

Автор: archimed7592 12.10.2007, 17:47
Цитата(DreLaZ @  12.10.2007,  17:42 Найти цитируемый пост)
Я так понял, что Microsoft Visual Studio 2005 Express Edition усовершенствованный С++?
И там "другая номенкулатура".

Скажем так: любой компилятор вводит свои расширения(ибо стандарт некоторые вещи вообще не оговаривает, к примеру, как создать динамическую библиотеку аля dll/so).
Что ты под номенклатурой понимаешь?

Автор: DreLaZ 12.10.2007, 17:58
Цитата(archimed7592 @ 12.10.2007,  17:47)
Цитата(DreLaZ @  12.10.2007,  17:42 Найти цитируемый пост)
Я так понял, что Microsoft Visual Studio 2005 Express Edition усовершенствованный С++?
И там "другая номенкулатура".

Скажем так: любой компилятор вводит свои расширения(ибо стандарт некоторые вещи вообще не оговаривает, к примеру, как создать динамическую библиотеку аля dll/so).
Что ты под номенклатурой понимаешь?

Ну к примеру написать программу на паскале, чтоб она выводила "Hello" и аналогичную на с++. Один и тот же результат, но разный код. Так и между borland с++ 4,5 и MVS 2005 Express Edition. То чему я научился в с++ я не могу использовать в MVS S 2005 Express Edition. Хотя почитав немного лит-ры по нему можно переучиться. Но стоит ли?
зы может, что я что-то делаю в MVS 2005 Express Edition неправильно. Ведь там много настроек при выборе нового файла.  smile 

Автор: archimed7592 12.10.2007, 18:04
DreLaZ, есть куча отличий в языке, в связи с тем, что VS-8 соответствует стандарту, скажем, на 85%, а BC-4.5, скажем, на 7%(цифры с потолка - это чтобы ты контраст почуствовал).

Ты покажи что у тебя не получается, мы тебе скажем что не так.

Автор: DreLaZ 12.10.2007, 18:22
Начну с простого. Книга меня учила (занимаюсь самообучением), для того чтобы вывести на экран надпись: надо подключить библиотекy iostream описать функцию main и тд.............
т.е. имеем прогу
Код

#include <iostream.h>  //книга гласит, что надо подключать iostream без .h
                                      
int main()
{
cout << "Hello!!!!!"; // книга гласит, что перед cout надо писать std:: 
                                //и только в старинных компиляторах пишется без него, обладателем               
                                //которого(с++ 4,5) являюсь я
return 0;
}

прога компилится без проблем в borland c++ 4.5, а также в visual studio 1.52.
А прога  представленная ниже, которую представляет книга не компилится в этих 2-ух компилляторах.
Код

#include <iostream> 
int main()
{
std::cout << "Hello!!!!!"; 
return 0;
}

В этой же теме мне посоветовали использовать MVS 2005 Express Edition. Но я не могу разобраться в ней и так понял, что к простому с++ она не имеет отношения(код по другому пишется, хотя некоторые моменты похожы). Также как билдер к с++
зы помогите определиться с компиллятором

Автор: archimed7592 12.10.2007, 18:45
Цитата(DreLaZ @  12.10.2007,  18:22 Найти цитируемый пост)
visual studio 1.52

Это что?

Цитата(DreLaZ @  12.10.2007,  18:22 Найти цитируемый пост)
/книга гласит, что надо подключать iostream

Плохая книга, раз не сказали, что нужно подключать ещё и ostream, а то что писать return 0 в main нафик не нужно smile.

Цитата(DreLaZ @  12.10.2007,  18:22 Найти цитируемый пост)
MVS 2005 Express Edition.

File->New->Project...->Visual C++->Win32->Win32 Console Application
В поле Name пишешь имя проекта(test, к примеру).

В появившемся wizard'е жмёшь Next, потом ставишь галочку empty project, потом Finish.
Потом Project->Add New Item...->Visual C++->Code->C++ File(.cpp)
В поле Name пишешь имя файла(main, к примеру).

Открывается редактор. Там пишешь
Код

#include <ostream> 
#include <iostream> 

int main()
{
std::cout << "Hello!!!!!"; 
return 0;
}


Build->Build Solution.
Debug->Start without debugging.

Видишь чёрный экран и надпись Hello World.

Автор: Dronchik 12.10.2007, 18:55
А на Visual C++ 6 всё это пишется так
Код

#include <iostream.h> 

int main()
{
cout << "Hello!!!!!"; 
return 0;
}


Автор: DreLaZ 12.10.2007, 19:02
Большое спасибо!!! Всё получилось.
Цитата

Это что?visual studio 1.52

вообще-то microsoft visual c++ 1.52 (cкачал с инета)
Цитата

Плохая книга, раз не сказали, что нужно подключать ещё и ostream, а то что писать return 0 в main нафик не нужно 

Книга "с++ за 21 день" (для новичка думаю как раз, потом можно посмотреть что-то другое).
Зачем подключать ostream? Согласен, что и return там не нужен.
зы что еще изменилось из стандартов не считая .h и std?

Добавлено через 1 минуту и 10 секунд
Цитата(Dronchik @ 12.10.2007,  18:55)
А на Visual C++ 6 всё это пишется так
Код

#include <iostream.h> 

int main()
{
cout << "Hello!!!!!"; 
return 0;
}


Оно и на Borland c++ 4.5 также пишется.

Автор: archimed7592 12.10.2007, 19:19
Цитата(DreLaZ @  12.10.2007,  19:02 Найти цитируемый пост)
вообще-то microsoft visual c++ 1.52 (cкачал с инета)

Покажи скриншот, а? А лучше ещё и ссылку дай на это чудо smile.

Цитата(DreLaZ @  12.10.2007,  19:02 Найти цитируемый пост)
Зачем подключать ostream?

Да я шутю smile. Ещё не сделали такой компилятор, который при отсутствии ostream ругнулся бы, а когда будут создавать новый супер-пупер компилятор, обязательно задумаются, что есть туева хуча книг в которых описано немного иначе и, самое главное, туева хуча программ, которые просто перестанут компилироваться, так что сделают так, чтобы работало и с iostream(на самом деле, чтобы сделать, чтобы не работало придётся немало потрудиться smile).

Ну фишка в том, что, когда ты пишешь std::cout << blablabla; ты по сути вызываешь std::cout::operator<<(blablabla); или std::operator<<(std::cout, blablabla); (в зависимости от типа blablabla... кстати могут быть и ещё более извращённые случаи).
Так вот, Стандарт оговаривает то, что iostream содержит объявления объекта cout, но не гарантирует того, что этот заголовочный содержит определение класса basic_ostream(экземпляром которого cout и является). Т.о. может сработать ADL и вызваться не тот оператор или вообще может не скомпилировать. Под "может" я подразумеваю имеет право по Стандарту - в реальности всё конечно работает и без ostream.


Цитата(DreLaZ @  12.10.2007,  19:02 Найти цитируемый пост)
Согласен, что и return там не нужен.

А откуда такая согласность smile ?
Ф-ция, возвращающая не void(в данном случае int) должна что-нибудь возвращать, разве нет? smile 
Просто Стандарт явно оговаривает, что, если main ничего не возвращает явно, то компилятор должен неявно вставить туда return 0; smile

Цитата(DreLaZ @  12.10.2007,  19:02 Найти цитируемый пост)
зы что еще изменилось из стандартов не считая .h и std?

Ну, учитывая то, что на момент появления BC-4.5 Стандарта не было вообще, то очень много smile.
Из очень заметного - default int и templates. А так, скорее всего ещё *_cast, mutable, и много чего другого.
Очень многие изменения в тонкостях, которые так просто не заметишь...

Автор: DreLaZ 12.10.2007, 21:37
Цитата

Покажи скриншот, а? А лучше ещё и ссылку дай на это чудо

вот это http://www.vetusware.com/download/Visual%20C++%201.52c/?id=4114

Автор: archimed7592 12.10.2007, 21:40
Да уж... Раритет smile.

Автор: Rickert 13.10.2007, 06:05
archimed7592
Насколько мне известно из книги "С++: стандартная библиотека" от Николая Джосьютиса:
по стандарту принято, чтобы main Описывался след. образом:
Код

int main(int argc, char** argv)
{
  return 0;
}

При успешном завершении - 0.

Автор: tdebugger 13.10.2007, 07:36
Хочу предупредить о такой специфической ошибке - если в среде VS создаете визардом консольный проект, то #include <iostrem> надо прописывать в файле stdafx.h, а не там, где main...  

Автор: archimed7592 13.10.2007, 09:07
tdebugger, не стоит предупреждать о том, чего толком не понимаешь smile.
Если отключены precompiled headers(потом я и показывал на примере empty project), то stdafx.* можно вообще удалить.
Если включены, то единственное условие, которое накладывается на модули трансляции - это, чтобы первым include'ом был stdafx.h - в остальном модули ничем не отличаются.

Rickert, эхх... Если бы ещё все книги правильно писали...

Цитата(IS-3.6.1/2 Main function)
An implementation shall not predefine the main function. This function shall not be overloaded. It shall
have a return type of type int, but otherwise its type is implementation-defined. All implementations
shall allow both of the following definitions of main:

Код

int main() { /* ... */ }

and
Код

int main(int argc, char* argv[]) { /* ... */ }


Цитата(IS-3.6.1/5 Main function)

A return statement in main has the effect of leaving the main function (destroying any objects with automatic
storage duration) and calling exit with the return value as the argument. If control reaches the end
of main without encountering a return statement, the effect is that of executing

Код

return 0;


Автор: Rickert 13.10.2007, 09:37
Ну и где правда?

Автор: iura 13.10.2007, 11:32
как получу доступ к IDE

Автор: tdebugger 13.10.2007, 18:41
Цитата(archimed7592 @  12.10.2007,  08:56 Найти цитируемый пост)
Имеет право не существовать. Это интимное дело конкретной реализации

Согласен.

Цитата(archimed7592 @  12.10.2007,  08:56 Найти цитируемый пост)
А зачем ? Ты примерно представляешь, как устроен компилятор?

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

Цитата(archimed7592 @  13.10.2007,  09:07 Найти цитируемый пост)
tdebugger, не стоит предупреждать о том, чего толком не понимаешь

Ты знаешь - молодец, а http://forum.vingrad.ru/index.php?showtopic=171656&view=findpost&p=1251027 досадные ошибки делают...

Автор: archimed7592 13.10.2007, 19:15
Цитата(Rickert @  13.10.2007,  09:37 Найти цитируемый пост)
Ну и где правда? 

С трёх раз угадаешь? Ну ладно, приведу аналогию:
Есть УК-РФ в котором сказано за убийство человека светит X лет. Есть недописатель недолитературы, который утверждает что за убийство человека в Росии сажают на Y лет. Кто прав?

Скорее всего, как всегда выдрано из контекста и неправильно понято тобой и писатель тут не при чём(Джосатиса не читал, но слышал только хорошие отзывы).


Цитата(iura @  13.10.2007,  11:32 Найти цитируемый пост)
как получу доступ к IDE 

smile.
Ребят, особенно новички: Стандарт ISO/IEC 14882:2003 - это закон. Любой компилятор("IDE") - это всего лишь реализация, которая не всегда соответствует Стандарту и не всегда результат его работы обязан работать "правильно"(j = (i++) + (i++); яркий тому пример).


Цитата(tdebugger @  13.10.2007,  18:41 Найти цитируемый пост)
Да, но это здесь причем. Не говоря  уж о том, что с инклудными файлами работает препроцессор...

Угу, но по стандарту компиляция модуля трансляции - это монолитный процесс, а то что конкретные реализации разбивают его на этапы(препроцессинг, компиляция, сборка) - это, опять же, их интимное дело.
Я имел ввиду то, что делать iostream(и всё стандартную библиотеку) абстракцией - это дороже, чем просто реализовать её "с нуля"(как будто в компиляторе её нет) в неабстрактных файлах, которые "СУЩЕСТВУЮТ", тем более, что Стандарт предоставляет для этого все возможности.


Цитата(tdebugger @  13.10.2007,  18:41 Найти цитируемый пост)
Ты знаешь - молодец, а некоторые досадные ошибки делают... 

Я тебе о том, что совет твой не правильный. Общий совет выглядит так: любой модуль трансляции должен начинаться с #include "stdafx.h", а то что лично ты предпочитаешь запихивать все заголовочные файлы в stdafx(и не писать их в самих модулях) - это плохо, ибо stdafx нужен для precompiled headers, а никак не для всеобщего сборища зависимостей. Не надо учить новичков плохому стилю smile.

Автор: Rickert 14.10.2007, 06:56
archimed7592, сам суди:
user posted image

Автор: archimed7592 14.10.2007, 07:36
Rickert, ну и сравни теперь это с тем что ты сказал
Цитата(Rickert @  13.10.2007,  06:05 Найти цитируемый пост)
archimed7592
Насколько мне известно из книги "С++: стандартная библиотека" от Николая Джосьютиса:
по стандарту принято, чтобы main Описывался след. образом:
    
int main(int argc, char** argv)
{
  return 0;
}

При успешном завершении - 0.

Я ничего общего не вижу smile. Наоборот, как и предполагал - Джосатис, в лучших традициях, описал этот вопрос наиболее полно...

Автор: MAKCim 14.10.2007, 09:44
Цитата(archimed7592 @  13.10.2007,  19:15 Найти цитируемый пост)
j = (i++) + (i++)

если бы стандартизовать порядок вычисления (например слева направо)
то никакой неоднозначности бы не было
1) temp1 = i
2) i = i + 1
3) temp1 = temp1 + i
4) i = i + 1
5) j = temp1
таким образом однозначно раскручивается любой сложности выражение
Цитата

i += ++i - i-- + i++

разворачиваем в 
Цитата

i = i + ++i - i-- + i++

1) temp1 = i
2) i = i + 1
3) temp1 = temp1 + i
4) temp1 = temp1 - i
5) i = i - 1
6) temp1 = temp1 + i
7) i = i + 1
8) i = temp1
Цитата

i *= (i - (-i + ++i - --i) * i) / ++i

разворачивается в
i = i * ((i - (-i + ++i - --i) * i) / ++i)
1) temp1 = i
2) temp2 = i
3) temp3 = -i
4) i = i + 1
5) temp3 = temp3 + i
6) i = i - 1
7) temp3 = temp3 - i
8) temp3 = temp3 * i
9) temp2 = temp2 - temp3
10) i = i + 1
11) temp2 = temp2 / i
12) temp1 = temp1 * temp2
13) i = temp1

Автор: archimed7592 14.10.2007, 10:08
MAKCim, как только договорюсь с ГОСТ'ом о том, чтобы принимать участие в работе WG21, так сразу займусь этим вопросом smile.
Нет, на самом деле, мы же не стандартизируем ничего - есть Стандарт, мы и компилятор ему пытаемся следовать(для того он и нужен - чтобы все были максимально довольны).

И напоследок: ты не задумывался, почему этот порядок не стандартизирован smile?

Автор: MAKCim 14.10.2007, 10:10
Цитата(archimed7592 @  14.10.2007,  10:08 Найти цитируемый пост)
И напоследок: ты не задумывался, почему этот порядок не стандартизирован smile

просвети  smile 
на самом деле не задумывался

Добавлено через 2 минуты и 2 секунды
Цитата(archimed7592 @  14.10.2007,  10:08 Найти цитируемый пост)
Нет, на самом деле, мы же не стандартизируем ничего - есть Стандарт, мы и компилятор ему пытаемся следовать(для того он и нужен - чтобы все были максимально довольны).

я не понимаю, почему стандарт не может обязать производить вычисления в определенном порядке  smile 

Автор: archimed7592 14.10.2007, 10:22
Цитата(MAKCim @  14.10.2007,  10:10 Найти цитируемый пост)
просвети
на самом деле не задумывался

Ты вот так любишь асм, а за что? За скорость smile?
Вот и здесь тоже: оптимизатору даётся свобода действий.

Автор: MAKCim 14.10.2007, 10:31
Цитата(archimed7592 @  14.10.2007,  10:22 Найти цитируемый пост)
Вот и здесь тоже: оптимизатору даётся свобода действий. 

аргумент
тут и не поспоришь  smile 
хотя тут можно включить следующую логику в действия оптимизатора:
1) если какая либо переменная изменяется в правой части выражения 2 и более раз => использовать стандартизованный порядок вычисления для нее, иначе - порядок определяется реализацией
2) переменная изменяется в правой части выражения <=> к ней применяются следующие операторы
а) префиксные и постфиксные ++, --
б) +=, -=, *=, /=, >>=, <<=, %=, &=, |=, ^=

Автор: archimed7592 14.10.2007, 10:40
Макс, жжошь smile.

Код

// module1.cpp

int foo(int &i, int &j)
{
    return (i++) + (j++);
}

// module2.cpp
int foo(int &i, int &j);
void bar()
{
    int i = 2;
    int j = foo(i, i);
}


И какой же порядок использовать? Или может быть Стандарту запретить раздельную компиляцию ;)? Или может обязать компоновщик отслеживать такие связи?

Добавлено через 1 минуту и 54 секунды
Кстати, понятий оптимизатора и его логики в Стандарте нет как таковых smile.

Автор: MAKCim 14.10.2007, 10:52
archimed7592
усилим алгоритм
для ссылок и указателей применяем стандартизованный порядок
Цитата(archimed7592 @  14.10.2007,  10:40 Найти цитируемый пост)
Кстати, понятий оптимизатора и его логики в Стандарте нет как таковых 

мы говорим о порядке вычисления выражения
компилятор должен руководствоваться этим порядком в том числе и для оптимизации
тем самым нам и не надо вводить понятие оптимизатора и его логику в стандарт
в стандарте - порядок вычисления, и все

Автор: Rickert 14.10.2007, 16:27
archimed7592, там указано два варианта.

Автор: archimed7592 14.10.2007, 22:20
Цитата(Rickert @  14.10.2007,  16:27 Найти цитируемый пост)
archimed7592, там указано два варианта. 

Я когда-нибудь утверждал что вариант только один? Скорее ты говорил про один вариант, а я лишь толковал о том, что конкретно в main return не обязателен smile.


MAKCim, это был всего-лишь один маленький пример сразу промелькнувший в голове, а если подумать, думаю таких косяков можно много нарыть smile. Те же указатели(аналогичный пример). Не стоит оно того, короче говоря.
В конце концов: j = ++i + i; - здесь переменная меняется только один раз, но, тем не менее, результат не определён smile.

Автор: Sketch 15.10.2007, 03:43
Совсем уж к чайниким по Си себя не отношу ,не подобная задача завела меня в тупик, надеюсь, кто-нибудь растолкует что к чему smile
Существует ли функция( или алгоритм), в Си( Си++), позволяющая воспринимать строку, введимую с клавиатуры как часть кода программы.
Например, ввод двух любых (по желанию пользователя) математических функций, по которым в дальнейшем ведётся рассчет.  

Автор: DjoNIK 15.10.2007, 07:14
Цитата

Существует ли функция( или алгоритм), в Си( Си++), позволяющая воспринимать строку, введимую с клавиатуры как часть кода программы.

по идее - нет! Ведь данные и код - две вещи, которые разделены в памяти.

Автор: archimed7592 15.10.2007, 08:18
Sketch, нет, не существует. Только если извращаться и компилировать её на лету.

Автор: zkv 15.10.2007, 09:06
а питон может помочь в этом деле? 
сам не знаю о нем ничего, поэтому это именно вопрос, а не совет.

Цитата(archimed7592 @  15.10.2007,  08:18 Найти цитируемый пост)
и компилировать её на лету. 

 smile 

Автор: archimed7592 15.10.2007, 09:15
Цитата(zkv @  15.10.2007,  09:06 Найти цитируемый пост)
а питон может помочь в этом деле? 

Только если Boost.Python smileСам о нём ничего не знаю.


Цитата(zkv @  15.10.2007,  09:06 Найти цитируемый пост)
Цитата(archimed7592 @  15.10.2007,  08:18 Найти цитируемый пост)
и компилировать её на лету. 

smile

AFAICS, имея компилятор нет ничего сложного делать dll'ки на лету. IIRC, у нас один проект именно так и "подгружал" пользовательские ф-ции smile.

Автор: tdebugger 6.11.2007, 20:08
//Здравствуйте, господа.
//Очередной глупый вопрос от новичка:
//фрагмент кода на С, какие в нем присутствуют ошибки? 

int d;
int d;
struct A

    int a;
}
f(c,b)
char b;
{    
    struct A a;
    a.a=10;
    c=a.a;
    return a;
}

Автор: archimed7592 6.11.2007, 20:14
Цитата(tdebugger @  6.11.2007,  20:08 Найти цитируемый пост)
int d;
int d;

Ну, хоть и gcc не воспринимает это как ошибку(не знаю должен ли), но это немного странно - делать две переменные с одним именем.


Цитата(tdebugger @  6.11.2007,  20:08 Найти цитируемый пост)
какие в нем присутствуют ошибки? 

Синтаксических - никаких. Но ф-ция делает какие-то странные действия.

зы. Используй тег code, пожалуйста.

Автор: tdebugger 6.11.2007, 20:33
Пожалуйста
Код

int d;
int d;
struct A

    int a;
}
f(c,b)
char b;
{    
    struct A a;
    a.a=10;
    c=a.a;
    return a;
}

Автор: tdebugger 6.11.2007, 22:18
Цитата(archimed7592 @  6.11.2007,  20:14 Найти цитируемый пост)
Здесь точка с запятой

Возможно, хотя микроскоповский© компилятор без нее ругается...
Цитата(archimed7592 @  6.11.2007,  20:14 Найти цитируемый пост)
 Но ф-ция делает какие-то странные действия.

Не суть важно. Синтаксических ошибок здесь действительно нет(за исключением однострочных комментариев, они, вроде как, в С++ появились), я хотел обратить внимание на определение функции, а конкретнее - на тип возвращаемого значения...
  Меня давно занимал вопрос: почему в С++ после описания типа нужно ставить точку с запятой, хотя в других языках как то и без нее обходятся. И вот неожиданная разгадка - в старом добром С(без плюсов) разрешалось описывать тип там, где указывается тип возвращаемого значения функции(простите за то, что не хватает умных слов для грамотного выражения мыслей), впоследствии от такой возможности в С++ отказались, потому как гибкости не прибавляет, а ошибок - сколько угодно. Вот и пришлось добавить точку с запятой, чтобы избежать двусмысленности. 

...а может я не прав?

Автор: archimed7592 6.11.2007, 22:24
Цитата(tdebugger @  6.11.2007,  22:18 Найти цитируемый пост)
 Меня давно занимал вопрос: почему в С++ после описания типа нужно ставить точку с запятой, хотя в других языках как то и без нее обходятся. И вот неожиданная разгадка - в старом добром С(без плюсов) разрешалось описывать тип там, где указывается тип возвращаемого значения функции(простите за то, что не хватает умных слов для грамотного выражения мыслей), впоследствии от такой возможности в С++ отказались, потому как гибкости не прибавляет, а ошибок - сколько угодно. Вот и пришлось добавить точку с запятой, чтобы избежать двусмысленности. 

С этого нужно было начинать smile.

Цитата(tdebugger @  6.11.2007,  22:18 Найти цитируемый пост)
...а может я не прав? 

Прав - это одно из отличий С++ от С. Об этом, IIRC, даже сказано в D&E(и, соответственно, объяснено почему это было убрано из языка).

Я сначала уже начал было тебе писать про точку с запятой после определения структуры, как вдруг заметил c-style определение ф-ции. Отсюда и вывалилось незавершённое предложение про точку с запятой, которое я забыл удалить перед постингом smile.

Автор: sharp 7.11.2007, 09:55
Здравствуйте. Как можно преобразовать тип double в тип char или string?

Автор: zkv 7.11.2007, 10:06
1. потери весьма вероятны: 
Код

double doubleValue = 1.;
char charValue = static_cast<char>( doubleValue );

может имел ввиду char * ?

2. 
Код

    std::ostringstream ostr;
    ostr<<doubleValue;
    std::string stringValue = ostr.str();

Автор: sharp 7.11.2007, 10:42
Мне нужно именно в массив char-ов перевести. А не в char*

Автор: sharp 8.11.2007, 07:45
Мне нужно перевести в такую единицу измерения, которую сможет вывести в TextBox функция SetDlgItemText.
А с твоим примером zkv, компилятор ругаеться. Говорит что не может перевести из const char* в char.

Автор: sharp 8.11.2007, 12:43
Я например должен сложить числа с дробями записанными пользвателем в текстбокс1 и текстбокс2 и записать сумму в текстбокс3. Я делаю по такому алгоритму: функцией GetDlgItemText присваиваю текстовые значения перемынным. Функцией atof перевожу из char в double. Выполняю необходимые действия. Перевожу обратно в char результат(вот это и не получаеться). Записываю в textbox3 его функцией SetDlgItemText.
 

Автор: zkv 8.11.2007, 16:36
Цитата(sharp @  8.11.2007,  07:45 Найти цитируемый пост)
А с твоим примером zkv, компилятор ругаеться. Говорит что не может перевести из const char* в char. 

в моем примере нигде не фигурирует const char*  smile 

Автор: kurtis 8.11.2007, 16:56
помогите что вклиниваюсь,  но что-то я сильно торможу...
Код

struct asd{
    unsigned int lamps[20];        
    int Null[] = {15,15,15,15,15};     .//ОШИБКА
    unsigned int aaaa;
} STRUCT_FROM_OPAL;

почему в структуре нельзя инициализировать массив???(интересует именно C89 либо C99)

Автор: archimed7592 8.11.2007, 17:11
Цитата(kurtis @  8.11.2007,  16:56 Найти цитируемый пост)
почему в структуре нельзя инициализировать массив???

Ну, примерно потому же, почему нельзя инизиализировать int в typedef'е:
Код

typedef int b = 15;

Автор: sharp 9.11.2007, 18:57
Цитата(zkv @  8.11.2007,  16:36 Найти цитируемый пост)
в моем примере нигде не фигурирует const char*

А почему тогда компилятор выдаёт такую ошибку???
Цитата

"=" can not convert from "char" to "const char*"

Автор: archimed7592 9.11.2007, 19:13
Цитата(sharp @  9.11.2007,  18:57 Найти цитируемый пост)
А почему тогда компилятор выдаёт такую ошибку???

Приведи полностью код и укажи на какую конкретно строку он ругается. Ещё компилятор озвучить неплохо было бы...

Автор: NiCketT 9.11.2007, 19:18
Почему не работает такой кусок кода?
Код

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

 string SS(unsigned int c, const unsigned short int st)
 {
     string s, s1; char buf;
     //переобразовывание чисел в иную систему исчисления
     do {
         sprintf(&buf, "%u", c%st);
         s+=buf; //остаток - рузультат
         c=c/st;
     } while (c!=0);
     //повернуть s;
     for (unsigned int i=s.size(); i>=0; i--) s1+=s[i];

     return s1;
 }


int main()
{
  //тестирование четырехбитного числа
  unsigned int N=16;
  string rez=SS(14, 2);
  cout<<rez;
  /*for (unsigned int n=0; n<N; n++)
    {
       cout.fill('0'); cout.width(4);
       cout<<SS(n, 2);
       cout.fill(' '); cout.width(8);
       cout<<n;
       cout<<(N-n)<<endl;
    } */

   char r;
   cin>>r;
}

Работал (вводил с клавы число, втыкал ее в функцию SS и выводил результат) а тепеь не работает. Пробовал под Борландом, ВижулСтудио и gcc - везде виснит!  smile (

Автор: sharp 9.11.2007, 19:36
Код

double doubleValue = 1.;    
char charValue = static_cast<char>( doubleValue );
SetDlgItemText(hDlg, IDC_EDIT3, charValue); //вот здесь и ругаеться

Компилятор Visual C++ 6

Автор: archimed7592 9.11.2007, 20:11
Цитата(sharp @  9.11.2007,  19:36 Найти цитируемый пост)
SetDlgItemText(hDlg, IDC_EDIT3, charValue); //вот здесь и ругаеться

Насколько я понимаю, в эту ф-цию нужно передавать c-строку, а ты пытаешься передать символ. Как это относится к примеру zkv я не догоняю smile.

Автор: NiCketT 9.11.2007, 21:12
уже разобрался - ошибка была гдето в форе

Автор: archimed7592 9.11.2007, 21:14
Цитата(NiCketT @  9.11.2007,  21:12 Найти цитируемый пост)
уже разобрался - ошибка была гдето в форе 

smile.

Автор: sharp 10.11.2007, 05:48
archimed7592, charValue у меня объявленна как charValue[10];
Попробывал преобразовать в string, выдаёт такие ошибки
Цитата

error C2079: 'ostr' uses undefined class 'basic_ostringstream<char,struct std::char_traits<char>,class std::allocator<char> >'
error C2296: '<<' : illegal, left operand has type 'double'
error C2297: '<<' : illegal, right operand has type 'double'
error C2228: left of '.str' must have class/struct/union type
error C2664: 'SetDlgItemTextA' : cannot convert parameter 3 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' t

Автор: archimed7592 10.11.2007, 10:25
Цитата(sharp @  10.11.2007,  05:48 Найти цитируемый пост)
выдаёт такие ошибки

#include <string>
#include <ostream>
#include <sstream>

Автор: magadan87 10.11.2007, 10:38
такой вот вопрос

Код

#define n = 10

main ()
{
  int mas[n][n]
  //или
  printf ("n=%f", n);
}


получаем ошибку "ошибка: expected expression before '=' token"

Автор: Fazil6 10.11.2007, 10:56
Цитата(magadan87 @  10.11.2007,  10:38 Найти цитируемый пост)
получаем ошибку "ошибка: expected expression before '=' token"

что по твоему define делает?
Код

#define n  10

Автор: magadan87 10.11.2007, 11:21
Цитата(Fazil6 @ 10.11.2007,  10:56)
Цитата(magadan87 @  10.11.2007,  10:38 Найти цитируемый пост)
получаем ошибку "ошибка: expected expression before '=' token"

что по твоему define делает?
Код

#define n  10

Точно! Извиняюсь, невнимателен. ^^

Автор: sharp 10.11.2007, 13:40
archimed7592
Цитата

'SetDlgItemTextA' : cannot convert parameter 3 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' t

1 ошибка не хочет исправляться

Автор: archimed7592 10.11.2007, 13:55
Цитата(sharp @  10.11.2007,  05:48 Найти цитируемый пост)
Попробывал преобразовать в string, выдаёт такие ошибки


Цитата(sharp @  10.11.2007,  13:40 Найти цитируемый пост)
1 ошибка не хочет исправляться 


Господа новички, телепатов здесь нет!
1. Показывайте свой код.
2. Указывайте номер строки на которую ругается компилятор.
3. Указывайте ошибку полностью(дословно).


Добавлено через 1 минуту и 49 секунд
sharp, тебе нужно написать ".c_str()", а вот где - сиди, думай, гадай. Если бы нормально задавал вопросы(показывал бы код и т.д.), то сидеть, думать и гадать не пришлось бы.

Автор: Dronchik 11.11.2007, 08:28
извините. не туда запостил. удалите пожалуйста.

Автор: sharp 11.11.2007, 08:40
archimed7592, извини за мою тупость. Ошибка указывала на 3 строку приведённую мной ранее. Я к  stringValue добавил .c_str() и всё заработало. Спасибо.

Автор: archimed7592 11.11.2007, 08:46
Цитата(sharp @  11.11.2007,  08:40 Найти цитируемый пост)
Ошибка указывала на 3 строку приведённую мной ранее.

Цитата(sharp @  9.11.2007,  19:36 Найти цитируемый пост)
double doubleValue = 1.;    
char charValue = static_cast<char>( doubleValue );
SetDlgItemText(hDlg, IDC_EDIT3, charValue); //вот здесь и ругаеться

В коде, который ты приводил ранее c_str вставить вообще некуда, ибо там string не используется.
Интересно, если увеличить шрифт ещё пунктов на 10, до новичков дойдёт, что телепатия - явление редкое?

Цитата(Dronchik @  11.11.2007,  08:28 Найти цитируемый пост)
извините. не туда запостил. удалите пожалуйста.

Цитата
from    Форум программистов <[email protected]>
to    [email protected],
date    Nov 11, 2007 11:29 AM
subject    Уведомление об ответе в подписанной теме
mailed-by    vingrad.ru
    
archimed7592,

Dronchik ответил в тему "Вопросник новичка", на которую Вы подписаны.

----------------------------------------------------------------------
archimed7592, извини за мою тупость. Ошибка указывалась на 3 строку приведённого мною кода ранее. Я к stringValue добавил .c_str() и всё заработало. Спасибо.
----------------------------------------------------------------------


Dronchik, я чё-то недопонял... У тебя 2 профиля?

Автор: Dronchik 11.11.2007, 08:48
нет вроде

Автор: archimed7592 11.11.2007, 09:13
А почему тогда от твоего имени был написан пост слово в слово повторяющий тот, который чуть позже написал sharp?

Автор: Dronchik 11.11.2007, 09:17
archimed7592, низнаю. ПМ тебе отправил чтобы не оффтопить 

Автор: kurtis 12.11.2007, 15:43
как в функции r_memcpy() определить размер массива lamps, который находится в структуре data_from???

Код


unsigned char mas[] = {11,11,11,11,0xFF,0xFF,55,255};

typedef struct 
{
    unsigned char Perem1[2];                    //1
    unsigned char lamps[6];
}
STRUCT_FROM;

STRUCT_FROM data_from;


void *r_memcpy(void *dst, const void *src, unsigned char n)
{
    int i;
    unsigned char size;
    
    size = sizeof(&dst->lamps);                              //ПРОБЛЕМА ТУТ

    printf("sizeof(LAMPS):%d\n",size);
    
    for( i = n; i >= 0; i--, size--)
    {    
        ((unsigned char*)dst)[i] = ((unsigned char*)src)[i];

        if ( ( ((unsigned char*)dst)[i] == 0xFF) && (size>=0) )
            ((unsigned char*)dst)[i]--;
    }
    
    return dst;
}



int rdIn(unsigned char *mas1, unsigned int _size)

    r_memcpy((unsigned char*)&(data_from), mas1, sizeof(STRUCT_FROM));
//    for(i=0;i<sizeof(data_from.lamps);i++)
//        if(data_from.lamps[i] == 0xFF)
//            data_from.lamps[i]--;   
    return 0;
}

int main()
{
/*
......
*/

rdIn(mas,10);
/*
......
*/

return 0;
}



Автор: DjoNIK 12.11.2007, 16:51
Цитата(kurtis @  12.11.2007,  15:43 Найти цитируемый пост)
size = sizeof(&dst->lamps);                              //ПРОБЛЕМА ТУТ

В size ты записал не размер массива, а размер указателя на первый элемент массива.

Если не ошибаюсь, то размер массива, в общем случае, невозможно определить. Поэтому в функцию всегда передается помимо указателя на сам массив еще и его размер.

PS: Извиняюсь за частое употребление слова массив.

Добавлено через 4 минуты и 46 секунд
Что-то я задумался...
Цитата(kurtis @  12.11.2007,  15:43 Найти цитируемый пост)
определить размер массива lamps

Тебе нужно узнать размерность (сколько элементов) массива или, все же, размер каждого элемента?
Если последнее, то 
Код

size = sizeof(&dst->*(lamps));

Автор: kurtis 12.11.2007, 16:59
мне нужно узнать количество элементов!!!
может я решаю задачу через одно место, но мне нужно все переменные в массиве lamps обработать определенным образом, а другие не трогать!!!т.е. мне нужно как-то обратится к этому массиву в структуре....как это сделать лучшим образом я незнаю....

Автор: Fazil6 12.11.2007, 17:25
Цитата(kurtis @  12.11.2007,  15:43 Найти цитируемый пост)
определить размер массива lamps, который находится в структуре data_from???

Код

STRUCT_FROM *pdst = reinteret_cast<STRUCT_FROM *>(dst);
size = sizeof(pdst->lamps)/sizeof(pdst->lamps[0]);   

Автор: kurtis 12.11.2007, 17:35
Спасибо за интересную идею....

нужно все это оформить на жестком СИ (НЕ СИ++), а то, под что я это пишу, с Си++ не дружит(компилятора нету)!!!!=))))))

Автор: archimed7592 12.11.2007, 18:52
Цитата(Fazil6 @  12.11.2007,  17:25 Найти цитируемый пост)
STRUCT_FROM *pdst = reinteret_cast<STRUCT_FROM *>(dst);

Почему не static_cast?

Автор: Fazil6 12.11.2007, 19:07
Цитата(archimed7592 @  12.11.2007,  18:52 Найти цитируемый пост)
Почему не static_cast

можно и static_cast

Автор: bsa 12.11.2007, 23:53
Цитата(kurtis @ 12.11.2007,  17:35)
Спасибо за интересную идею....

нужно все это оформить на жестком СИ (НЕ СИ++), а то, под что я это пишу, с Си++ не дружит(компилятора нету)!!!!=))))))

STRUCT_FROM *pdst = reinteret_cast<STRUCT_FROM *>(dst);
замени на
STRUCT_FROM *pdst = (STRUCT_FROM *)dst;

Автор: Dims 13.11.2007, 19:58
А что такое эти "паттерны" и как ими пользоваться?

Автор: JackYF 13.11.2007, 20:17
Цитата(Dims @  13.11.2007,  19:58 Найти цитируемый пост)
А что такое эти "паттерны" и как ими пользоваться? 

Фраза откуда выдрана вообще?

Тебя в гугле забанили?

Автор: Fazil6 13.11.2007, 20:17
Цитата(Dims @  13.11.2007,  19:58 Найти цитируемый пост)
А что такое эти "паттерны" и как ими пользоваться?


а что такое эти "словари" всякие да "энциклопедии" и как ими пользваться?

http://ru.wikipedia.org/wiki/Паттерн

Автор: Dims 13.11.2007, 23:18
smile

Ну я, наверное, понимаю в принципе, что это такое. Но никогда не пользовался и не пойму, как практически этим пользоваться. Вроде бы это не библиотеки, а какой-то набор "решений" с классами. Какое преимущество они дают? Разве не проще самому придумать класс? И наоборот, разве паттерн потом не придётся всё равно переиначивать под конкретный случай? Не получится ли так, что зазубривание паттернов и раздумья, какой же из них подойдёт для твоего случая, займёт больше времени, чем просто придумать себе класс?

Выглядит, как систематизация изобретений. Но, как я понимаю, этим пользуются. Значит, наверное, я ошибаюсь. И паттерны это не совсем то, что я думаю и в них есть какая-то польза.

Вот меня недавно спросили "какими паттернами ты пользуешься в работе". А я и не знаю, что ответить. Действительно ли эти паттерны помогают?

Автор: DjoNIK 13.11.2007, 23:33
Цитата(Dims @  13.11.2007,  23:18 Найти цитируемый пост)
Не получится ли так, что зазубривание паттернов и раздумья, какой же из них подойдёт для твоего случая, займёт больше времени, чем просто придумать себе класс?

Если у тебя будет опыть (хотя бы небольшой), то однозначно НЕТ!

Автор: archimed7592 13.11.2007, 23:58
Цитата(Dims @  13.11.2007,  23:18 Найти цитируемый пост)
Какое преимущество они дают?

При разумном применении, получаемые преимущества - это, как минимум: гибкость, расширяемость, простота применения.


Цитата(Dims @  13.11.2007,  23:18 Найти цитируемый пост)
Разве не проще самому придумать класс?

Смотря что понимать под словами "проще". Бывает, что "проще"(меньше напрягая мозг) писать логику прямо в обработчиках событий, но реальная выгода от такой "простоты" весьма сомнительна.


Цитата(Dims @  13.11.2007,  23:18 Найти цитируемый пост)
И наоборот, разве паттерн потом не придётся всё равно переиначивать под конкретный случай?

Цель паттернов - не предоставить универсальную библиотеку, а обобщить основные, часто применяемые проектные решения.


Цитата(Dims @  13.11.2007,  23:18 Найти цитируемый пост)
Не получится ли так, что зазубривание паттернов и раздумья, какой же из них подойдёт для твоего случая, займёт больше времени, чем просто придумать себе класс?

"Зазубривание" вообще, как правило, никогда не оправдывает потраченного времени и редко приносит реальную выгоду.


Цитата(Dims @  13.11.2007,  23:18 Найти цитируемый пост)
Действительно ли эти паттерны помогают?

Да, если они "стекают с кончиков пальцев" ©. В противном случае, появляется вот такое как у тебя недопонимание "а зачем это вообще нужно?", но, со временем и опытом приходит всё.

Автор: Dims 14.11.2007, 01:23
Ну вот, допустим, я хочу приобрести опыт общения с паттернами. Что мне нужно делать? Справочник паттернов какой-то нарыть? И потом, решая практические задачи, пытаться выискивать в этом справочнике нужный паттерн?

Автор: archimed7592 14.11.2007, 01:52
Цитата(Dims @  14.11.2007,  01:23 Найти цитируемый пост)
Что мне нужно делать?

Для начала попытаться понять зачем нужен каждый паттерн. Посидеть, повспоминать то что ты уже делал и подумать, где бы ты какой паттерн мог бы применить. Потом просто продолжать работать, как работал - у тебя само собой будет появляется желание сделать неуклюжую попытку применить тот или иной паттерн. Потом эти попытки станут более "уклюжими" smile. Потом перечитать книгу ещё раз(через месяц, другой).
Сама книга, неустаревающая классика жанра - http://www.ozon.ru/context/detail/id/2457392/.

Могу только пожелать удачи в хорошем(я бы сказал очень правильном) начинании smile.

Автор: VladimirC 14.11.2007, 16:44
А не моглибы вы подсказать,новичку, как сделать так чтобы определенная команда,строка выполнялась только по прошествии определенного  промежутка времени? 

Автор: DjoNIK 14.11.2007, 16:54
Цитата(VladimirC @  14.11.2007,  16:44 Найти цитируемый пост)
А не моглибы вы подсказать,новичку, как сделать так чтобы определенная команда,строка выполнялась только по прошествии определенного  промежутка времени? 

Если ты хочешь, что бы "промежуток времени" был аппаратно независим, то, если я не ошибаюсь, тебе нужно создавать отдельный поток.
Но так как ты новичок, то, возможно, цикл по сетчику тебе поможет.

Автор: VladimirC 14.11.2007, 21:15
а можно немножко поподробнее, как я понял просто сделать одну постоянно повторяющуюся, Х раз, команду? так? а если не сложно можно примерчик? smile  smile , очень долго мучался по этому поводу сам, но внятного у меня ничего не получилось.

Автор: Dims 15.11.2007, 05:20
Ну ты циклы умеешь делать? Операторы for, while, do?

Автор: VladimirC 15.11.2007, 19:27
конечно ,толко что надо вписать в этот цикл? какая команда отвечает за этот счетчик? 

Автор: zkv 15.11.2007, 23:03
десять раз вызвать X();
Код

for( int i = 0; i < 10; ++i )
    X();

Автор: AndrRus 15.11.2007, 23:16
VladimirC, если я правильно понял, то ты хочешь просто оттянуть время в программе? Если да, то самым глупым способом - это можно сделать следующим образом: складывать бесконечно малую величину каким-либо из предложенных тебе циклов, пока она не станет значимой.

Автор: bsa 15.11.2007, 23:48
Цитата(VladimirC @ 14.11.2007,  16:44)
А не моглибы вы подсказать,новичку, как сделать так чтобы определенная команда,строка выполнялась только по прошествии определенного  промежутка времени?

Паузу можно задать определенными командами. Например sleep(unsigned sec) - пауза на sec секунд.
Можно и другими, более точными, но для этого ты должен сказать, что у тебя за ОС и какой компилятор.

Автор: VladimirC 16.11.2007, 19:36
bsa спасибо этого ответа я и ждал) попробую)


Автор: bsa 16.11.2007, 22:29
Цитата(VladimirC @ 16.11.2007,  19:36)
bsa спасибо этого ответа я и ждал) попробую)

Прочти мою подпись и запомни.  smile 

Автор: kurtis 23.11.2007, 14:51
скорее всего это уже где-то было, но все-таки...

В чем смысл объявления функции как static???
Код

static int sprint_dev_config(struct pci_dev *dev, char *buf, int size)


В чем смысл такой вот штуки и что она вообще значит???конктретно смущает слово struct перед функцией!!!
Код

struct pci_dev_info *pci_lookup_dev(unsigned int vendor, unsigned int dev)
{
    int min = 0,
        max = sizeof(dev_info)/sizeof(dev_info[0]) - 1;    

//     .....много разного кода.......

        return & dev_info[ i ];
    }



заранее спасибо!!!=)

Автор: JackYF 23.11.2007, 14:58
Цитата(kurtis @  23.11.2007,  14:51 Найти цитируемый пост)
struct pci_dev_info *

это тип возвращаемого значения функции.

Цитата(kurtis @  23.11.2007,  14:51 Найти цитируемый пост)
static

область видимости функции ограничивается одним модулем.

Автор: archimed7592 23.11.2007, 14:59
kurtis, оба вопроса - пережиток языка Си.
В С++ вместо static используюется namespace {}(анонимное пространство имён), а struct перед именем типа структуры писать не нужно.

Автор: kurtis 23.11.2007, 15:16
спасибо, помогло!!!=))

Автор: Hehe 18.3.2008, 00:26
Проблема:
Код

generic <class T>
public interface class MyInterface
{
   T operator *(T);
};

generic<class T>
where T : MyInterface<T>
public ref class MyClass : MyInterface<MyClass<T>^>
{
public:
   //......
   virtual MyClass<T> ^operator *(MyClass<T> ^A)
   {
       return this;
   }
   void MyMethod(void)
   {
      T a,b,c;
      c = a*b;  //error C2296: '*' : illegal, left operand has type 'T'
                     //error C2297: '*' : illegal, right operand has type 'T'
   }
   //......
};
Что посоветуете? Классы и методы привел чисто систематически. Вернее так, решение-то есть - использовать не MyInterface<T>::operator *, а какую-нибудь функцию. Но как устранить эту ошибку, используя operator* ?

Автор: korian 18.3.2008, 04:07
generic<class T>
where T : MyInterface<T>
это что за конструкция? С++?

я так понимаю надо в объявление функции добавить MyClass<T>

Автор: Hehe 18.3.2008, 04:35
Цитата(korian @  18.3.2008,  04:07 Найти цитируемый пост)
generic<class T>
where T : MyInterface<T>
это что за конструкция? С++?

Да, это конструкция Managed C++. Говорит, что тип T унаследован от MyInterface.
Цитата(korian @  18.3.2008,  04:07 Найти цитируемый пост)
я так понимаю надо в объявление функции добавить MyClass<T>
А вот этот момент попросил бы пояснее.

Надо было, наверно, раньше написать - если использовать вместо operator *, например, operator +, то все будет замечательно.

Автор: Hehe 18.3.2008, 05:43
Ура. Проблема решена.
вместо вызова
Код

a*b
надо использовать 
Код

a->operator *(b)
Я полагаю, что это из-за того, что generic тип несколько особый. В смысле, наверно у него есть свои перегруженные операторы *.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)