Другое > Hard'n'Soft
Програмирование на C++
<< < (21/25) > >>
gepar:

--- Цитата: Mr2 ---А в чём подвох?
--- Конец цитаты ---
Подвох в разделении у борланда на функции и подрограммы  :)
Mr2:

--- Цитата: GManiac от 25 Май 2011, 16:28:31 ---Как ты угадал?  :lol:
--- Конец цитаты ---
Да я смотрю что то ты  мутишь(раздуваешь из мухи слона). Вот я и подумал что то не то. :)

--- Цитата: GManiac от 25 Май 2011, 16:28:31 ---Цель примера была показать, что и там, и там есть гибкость.
--- Конец цитаты ---

Так это и так ястно, если бы был идеальный я.п. то все бы писали на нём.

--- Цитата: GManiac от 25 Май 2011, 16:28:31 ---А в дельфях даже размер не надо указывать, и индекс передаётся индексом, а не указателем (например, начать вычисления с 3-го элемента).
--- Конец цитаты ---
Круто, но в последнее время мне не приходится передавать массив в функцию, я пишу массив в класс и с ним работаю.

--- Цитата: GManiac от 25 Май 2011, 16:28:31 ---Мне, например, бывает удобно написать функцию, берущую array of string, а потом давать ей сразу при вызове динамическое число строк. Чтобы не создавать массив, загонять в него строки, а потом кидать его в функцию. Удобно.

--- Конец цитаты ---
Но это опять же кого что устраивает.

--- Цитата: gepar ---Подвох в разделении у борланда на функции и подрограммы
--- Конец цитаты ---
А в чём разница?  0_0
gepar:
Mr2,точнее функций от подпрограмм что называют там процедурами.  Функции там нужна для одного значения, а процедура для работы с несколькими. Что-то вроде различия между int (int a) и void (int a). При этом их нельзя путать, я поначалу путал помню в паскале, там одна из них (наверное функция) должна обязательно при этом возвращать значение... :)
Mr2:

 :lol:
HardWareMan:

--- Цитата: gepar от 25 Май 2011, 14:29:21 ---HardWareMan,ты щедрый на комментарии  :)  Но если я правильно понял то ты передаёшь не двумерный массив, ты передаёшь что-то вроде указателя.
--- Конец цитаты ---
КЭП. Все дело в том, что какому-то пи@#$у на заре х86 пришло в голову передавать параметры в процедуру или функцию через системный(!) стэк(!!) кода(!!!) вместо простого указателя ВР на кучу, где все, собственно, по факту и лежит. Естественно, туда не влезут все массивы, поэтому на большие структуры передаются указатели. Эту говноидею подхватили все компиляторописаки и вот мы имеет то, что мы имеем (класс сбоя/уязвимости "переполнение буфера", позволяющий исполнить код). Но это все лирика, да.

--- Цитата: gepar от 25 Май 2011, 14:29:21 ---Спецификация же не позволяет создать функцию

--- Код: ---void print(int a[][], int z)
--- Конец кода ---
что в с++ что в делфи. Но логично что это можно обойти и сделать что-то вроде этого
--- Конец цитаты ---
Да, объявить многомерный динамический массив как параметр функции не могу по причине ограничений компилятора (он требует "[Error] Unit1.pas(23): Identifier expected but 'ARRAY' found"). Но никто не мешает идентификатор сделать многомерным массивом, правда? В остальном ты прав, так делают все серьезные программисты, особенно кто пишет под систему и в особенности драйвера: передаем указатель(ли) и размер. Тому, кто работал с WINAPI это знакомо.


--- Цитата: gepar от 25 Май 2011, 16:51:19 ---Mr2,точнее функций от подпрограмм что называют там процедурами.  Функции там нужна для одного значения, а процедура для работы с несколькими. Что-то вроде различия между int (int a) и void (int a). При этом их нельзя путать, я поначалу путал помню в паскале, там одна из них (наверное функция) должна обязательно при этом возвращать значение... :)

--- Конец цитаты ---
Садись, два. Определение функци и процедуры звучит примерно так: функция возвращает в себе результат, а процедура нет. Тем не менее, конструкции типо:
procedure MyProc(var A:dword; const B:word); и function MyFunc(var A:dword; const B:word):boolean; будут одинаково возвращать результат в A (если А будет изменено внутри процедуры или функции), и использовать B как константу. Если var не писать, то подразумевается const. Функция в таком случае удобна тем, что может возвращать булево как признак ошибки. Например:

--- Код: ---var A:string;
    c:integer;

function GetBuf(var A:string;B:byte):boolean;
begin
       GetBuf:=true;
       case B of
         0 : A:='Some 0';
         1 : A:='Some 1';
         else GetBuf:=false;
         end;
end;
      

....
c:=0;
while GetBuf(A,0) do begin
   writeln(A); inc(c);
   end;
...
--- Конец кода ---
gepar:

--- Цитата: HardWareMan ---Садись, два.
--- Конец цитаты ---
Я же написал сразу что точно различия не помню  уже, два года прошло, а я за это время паскаль почти не трогал  :)
gepar:
Оживлю тему: как же в дебагере понаблюдать за состояниями потоков? Я нашёл как следить за переменными, а за потоками как? Иначе мне не видно что я запихнул в поток через putback или другую подобную функцию.

Добавлено позже:
И ещё мааленький вопрос: когда я выбрасываю исключение стандартного класса exception то как его назвать (ну код или текст там) чтобы потом через exception.what() оно выводило этот текст/код? Естественно exception.what()  я уже буду применять к конкретному обьекту класса exception, надеюсь понятно выразился.
gepar:
Только что столкнулся с тем что переменная которую будут возвращать должна быть явно объявлена, притом не в каком-то условии

--- Код: ---int abc(double a)
{
    if (a>0)
     int x=3;
    else
     int x=4;
    return x;
};
--- Конец кода ---
Странно, я раньше думал что с++ даёт больше свободы.

Добавлено позже:
Странно, Дейтел упорно пишет что catch-обработчики double и int бессмысленны и всегда будет использоваться catch-обработчик double (через приведение типа). Но вот моя тестовая программа показала другое

--- Код: ---int main()
{
    int x;
    cin>>x;
    try
    {
        if (x>10)
         throw 5;
        if (x<10)
         throw 2.33;
    }

    catch (double)
    {
        cout<<"Get double";
    }
    catch (int)
    {
        cout<<"Get int";
    }
    return 0;
}


--- Конец кода ---
это как понимать?  o_0
HoRRoR:

--- Цитата ---Только что столкнулся с тем что переменная которую будут возвращать должна быть явно объявлена, притом не в каком-то условии
Странно, я раньше думал что с++ даёт больше свободы.

--- Конец цитаты ---
Советую вернуться в основам и ещё раз внимательно перечитать об областях видимости переменных.


--- Цитата ---это как понимать?
--- Конец цитаты ---
Понимать, что Дейтел не прав.
gepar:

--- Цитата: HoRRoR ---Советую вернуться в основам и ещё раз внимательно перечитать об областях видимости переменных.
--- Конец цитаты ---
Да нет, я об этом:

--- Код: ---int abc(int x)
{
if (x>=0)
 int z=5;
else
 int z=2;
return z;
}
--- Конец кода ---
HoRRoR:
А я, по-твоему, о чём?

Добавлено позже:
http://www.learncpp.com/cpp-tutorial/41-blocks-compound-statements-and-local-variables/
gepar:
HoRRoR,да, я не учёл что переменная всё равно то сразу же удаляется.
gepar:
HoRRoR,вдруг ты не заметил, но знаешь как это сделать зацитирую часть своего сообщения:

--- Цитата: gepar ---как же в дебагере понаблюдать за состояниями потоков? Я нашёл как следить за переменными, а за потоками как? Иначе мне не видно что я запихнул в поток через putback или другую подобную функцию.
--- Конец цитаты ---
Я так и не понял как это сделать, в книгах что-то о дебагере компиляторов упоминают толком лишь о их существовании, но не более.
HoRRoR:
Не знаю, никогда не возникало такой необходимости.
gepar:
HoRRoR,так а какая тогда польза вообще с дебагера помимо того что можно посмотреть что есть на текущем шаге в переменных?
HoRRoR:
Какая польза от компьютера, если он не может варить кофе? Да уже одни точки останова делают отладчик чертовски полезной штукой.
Мне никогда не приходилось отслеживать состояние потоков, мне хватало знания логики работы собственной программы. Можешь почитать про реализацию потоков используемым тобой способом и посмотреть данные переменной, в которой хранится информация о потоке.
MetalliC:
gepar, брекпоинты (безусловные или по условию), вотчи, просмотрщик памяти - что еще надо для полного счастья ?
всякие очень высокоуровневые фичи тут в принципе не возможны, т.к. отладчик это отладчик готового exe-шника а не интерпретатор какой-нибудь.
gepar:
Начал работать с файлами (да, медленно совсем что-то в последнее время изучение с++ продвигалось, вот уже и каникулы пришли, надеюсь теперь время будет появляться на с++ почаще).
От чего идут сокращения в режимах открытия файла? Чтобы легче было запомнить, ну in, out и trunc это понятно и логично, а вот app - дописать файл и ate тоже похожая функция (кстати в чём отличие дописывания в конец файла от открытия и перевода курсора в конец файла?) от каких слов они сокращались?
HoRRoR:
Видимо ты даже не пытаешься искать информацию самостоятельно, сразу пишешь сюда.
Видимо, app - append, ape - append to end. И при чём тут функция? Достаточно было код глянуть:

--- Код: ---/// Seek to end before each write.
static const openmode app = _S_app;

/// Open and seek to end immediately after opening.
static const openmode ate = _S_ate;

--- Конец кода ---
gepar:
HoRRoR,нет, слово app слишком вошло в обиход (в виде сокращения от application) и найти ответ было сложно. Спасибо за ответ.

Добавлено позже:
HoRRoR,а вот разница между ними. В приведённом тобой кусочке одно написано что app добавляет в конец, а ate открывает и сдвигает курсор в конец файла, и дальше будет запись но где же разница? Всё равно если я сделаю в программе file<<information значение  information допишется в конец файла независимо от того открыл ли файл через app или через ate, а где же разница? Наверняка же не просто так их два придумали  :)

Добавлено позже:
И ещё небольшой вопрос почему так:

--- Код: ---    ifstream file;
    file.open("test.txt", ios::in);
    if(!file)
     exit(100500);
    while(file>>c)
     cout<<c;
    file.close();
    return 0;

--- Конец кода ---
Будет выведено всё без переводов строки? Ведь символьная переменная вполне может принимать значение \n так в чём же проблема?  :-\
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии