Вопросы по языку СИ

 
void quicksort(double *a, int *idx, int l, int u)
{
  int i, m, idx_temp;
  double a_temp;

  if (l >= u)
    return;

  m = l;
  for (i=l+1; i<=u; i++)
    {
      if (a[i] < a[l])
        {
          ++m;

          idx_temp = idx[m];
          idx[m] = idx[i];
          idx[i] = idx_temp;

          a_temp = a[m];
          a[m] = a[i];
          a[i] = a_temp;
        }
    }

  idx_temp = idx[l];
  idx[l] = idx[m];
  idx[m] = idx_temp;

  a_temp = a[l];
  a[l] = a[m];
  a[m] = a_temp;

  quicksort(a, idx, l, m-1);
  quicksort(a, idx, m+1, u);
}

как работает такой синтаксис? ф-я внутри себя же? еще и 2 раза

еще, посоветуйте хорошую книгу содержательную и не сильно длинную

у меня есть такая

Б. Керниган, Д. Ритчи

Язык программирования Си

Издание 3-е, исправленное

 

На mql тоже так можно. Не при каждом вызове функции выполняется ее вызов еще два раза - в начале фуцнкции есть return.

Называется рекурсия.

https://ru.wikipedia.org/wiki/Рекурсия

https://habr.com/ru/post/275813/

 
Dmitry Fedoseev:

На mql тоже так можно. Не при каждом вызове функции выполняется ее вызов еще два раза - в начале фуцнкции есть return.

Называется рекурсия.

https://ru.wikipedia.org/wiki/Рекурсия

https://habr.com/ru/post/275813/

спасибо, еще будет много вопросов.. переписываю одну из библиотек на mql, по твоему совету ))

 
Maxim Dmitrievsky:

еще, посоветуйте хорошую книгу содержательную и не сильно длинную

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

я на C# никогда не писал, но под Windows писал программы. Когда решил попробовать свои силы в C#  мне онлайн справка сильно помогла, любые мелкие  вопросы уточнить, я на этом ресурсе читаю короткие статьи, вот и рекурсия С++ коротко описывается 

https://metanit.com/cpp/tutorial/3.6.php

Общий учебник С++ https://metanit.com/cpp/tutorial/  , сомневаюсь, что более сжато найдете информацию чем на этом сайте ;)

C++ | Рекурсивные функции
  • metanit.com
Рекурсивные функции - это функции, которые вызывают сами себя. Например, определим вычисление факториала в виде рекурсивной функции: В функции factorial задано условие, что если число n больше 1, то это число умножается на результат этой же функции, в которую в качестве параметра передается число n-1. То есть происходит рекурсивный спуск. И так...
 
Igor Makanu:

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

я на C# никогда не писал, но под Windows писал программы. Когда решил попробовать свои силы в C#  мне онлайн справка сильно помогла, любые мелкие  вопросы уточнить, я на этом ресурсе читаю короткие статьи, вот и рекурсия С++ коротко описывается 

https://metanit.com/cpp/tutorial/3.6.php

сомневаюсь, что более сжато найдете информацию чем на этом сайте ;)

да просто вьехать в язык, там основная сложность что весь код написан через указатели и goto, еще много лишнего с выделением памяти потом уничтожением

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

 
Maxim Dmitrievsky:

да просто вьехать в язык, там основная сложность что весь код написан через указатели и goto, еще много лишнего с выделением памяти потом уничтожением

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

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


MQL это действительно другой язык


указатели https://metanit.com/cpp/tutorial/4.1.php

C++ | Что такое указатели
  • metanit.com
Указатели представляют собой объекты, значением которых служат адреса других объектов (переменных, констант, указателей) или функций. Как и ссылки, указатели применяются для косвенного доступа к объекту. Однако в отличие от ссылок указатели обладают большими возможностями. Для определения указателя надо указать тип объекта, на который указывает...
 
Igor Makanu:

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


MQL это действительно другой язык


указатели https://metanit.com/cpp/tutorial/4.1.php

Да, спасибо, с указателями уже знаком, и в книжке той есть

сайт удобный, кстати, добавил в избранное

вот хороший курс видеолекций для ленивых есть от с до сpp


 

Вот пример из хедера библиотеки:

создаются структуры с указателями непонятно на что (видимо это массивы которых еще не существует), дальше я так понял объявляются ..ээ.. переменная этой структуры mine_score; с тем же именем?

typedef struct mine_score
{
  int n;      /* number of rows of M */
  int *m;     /* number of cols of M[i] for each i */
  double **M; /* the (equi)characteristic matrix */
} mine_score;

с этим тоже надо будет разобраться

и потом объявляется ф-я, которая будет писать свой результат напрямую в область памяти этой переменной?

mine_score *mine_compute_score(mine_problem *prob, mine_parameter *param);
 
Maxim Dmitrievsky:

Вот пример из хедера библиотеки:

создаются структуры с указателями непонятно на что (видимо это массивы которых еще не существует), дальше я так понял объявляются ..ээ.. переменная этой структуры mine_score; с тем же именем?

с этим тоже надо будет разобраться

и потом объявляется ф-я, которая будет писать свой результат напрямую в область памяти этой переменной?

Да нет, тут объявляется тип данных mine_score, который представляет из себя структуру mine_score.

А функция возвращает указатель на эту структуру, которая будет создана внутри этой функции. Соответственно, назначение функции создать сущность типа min_score и передать владение ею в область видимости вызова функции.

 

Maxim Dmitrievsky:

с этим тоже надо будет разобраться

и потом объявляется ф-я, которая будет писать свой результат напрямую в область памяти этой переменной?

я typedefы давно уже забыл, благо MQL помогают вспоминать эти громоздкие конструкции )), судя по всему это просто объявление типа mine_score, который является структурой и описание структуры было "воткнуто" в обьявление типа ( typedef ) , но могу ошибаться, вот похожий вопрос обсуждался и довольно подробное обьяснение:

http://qaru.site/questions/13054/typedef-struct-vs-struct-definitions


Maxim Dmitrievsky:

и потом объявляется ф-я, которая будет писать свой результат напрямую в область памяти этой переменной?

в С++ за распределение памяти отвечает программист, поэтому если результат ф-ции возвращает указатель mine_score * , то тот кто принимает этот указатель и должен выделить память, т.е. это не переменная а указатель на данные

Определение typedef struct vs struct
  • 2009.11.04
  • user69514
  • qaru.site
Я новичок в программировании на С, но мне было интересно узнать, какая разница между использованием при определении структуры или использованием . Мне кажется, что нет никакой разницы, они достигают той же цели.
 
Igor Makanu:

я typedefы давно уже забыл, благо MQL помогают вспоминать эти громоздкие конструкции )), судя по всему это просто объявление типа mine_score, который является структурой и описание структуры было "воткнуто" в обьявление типа ( typedef ) , но могу ошибаться, вот похожий вопрос обсуждался и довольно подробное обьяснение:

http://qaru.site/questions/13054/typedef-struct-vs-struct-definitions


в С++ за распределение памяти отвечает программист, поэтому если результат ф-ции возвращает указатель mine_score * , то тот кто принимает этот указатель и должен выделить память, т.е. это не переменная а указатель на данные

#include "pch.h"
#include <iostream>

using namespace std;

int* Foo(int i)
{
        int* x = new int(i);
        return x;
}

int main()
{
        int* x = Foo(5);
        cout << *x;
        delete x;
        return 0;
}

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