Domande sul linguaggio SI

 
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);
}

Come funziona questa sintassi? la f-e è dentro se stessa? 2 volte anche

Inoltre, puoi raccomandare un buon libro che sia informativo e non troppo lungo?

Ne ho uno.

Б. Kernighan, D. Ritchie

Il linguaggio di programmazione C.

Edizione 3 rivista

 

Questo è possibile anche in mql. Non ogni volta che una funzione viene chiamata, viene chiamata altre due volte - c'è un ritorno all'inizio della funzione.

Si chiama ricorsione.

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

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

 
Dmitry Fedoseev:

Questo è possibile anche in mql. Non ogni volta che una funzione viene chiamata, viene chiamata altre due volte - c'è un ritorno all'inizio della funzione.

Si chiama ricorsione.

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

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

Sto riscrivendo una delle librerie su mql, seguendo il tuo consiglio ))

 
Maxim Dmitrievsky:

Inoltre, consigliare un buon libro che sia informativo e non troppo lungo.

Ho letto Straustrup all'università, ma non credo che tu abbia bisogno di un libro di testo sui costrutti di base del linguaggio, hai già esperienza di programmazione, non hai bisogno di leggere da zero.

Non ho mai scritto in C#, ma scrivevo programmi per Windows. Quando ho deciso di provare la mia mano in C# l'aiuto online è stato molto utile, ogni piccola domanda è stata chiarita, ho letto brevi articoli su questa risorsa, la ricorsione C++ è descritta brevemente qui

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

Tutorial generale C++https://metanit.com/cpp/tutorial/, dubito che troverai informazioni più concise che su questo sito ;)

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

Ho letto Straustrup all'università, ma non credo che tu abbia bisogno di un libro di testo sui costrutti di base del linguaggio, hai già esperienza di programmazione, non hai bisogno di leggere da zero

Non ho mai scritto in C#, ma scrivevo programmi per Windows. Quando ho deciso di provare la mia mano in C# l'aiuto online è stato molto utile, ogni piccola domanda è stata chiarita, ho letto brevi articoli su questa risorsa, la ricorsione C++ è descritta brevemente qui

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

Dubito che troverete informazioni più concise che su questo sito ;)

La difficoltà principale è che l'intero codice è scritto attraverso puntatori e goto, e c'è molta roba inutile con l'allocazione e la cancellazione della memoria.

Quindi si può affermare che mql e Ci sono linguaggi assolutamente diversi. Anche costrutti semplici come il passaggio di puntatori al posto di array in una funzione non funzionano qui, è molto difficile da riscrivere.

 
Maxim Dmitrievsky:

È facile entrare nel linguaggio, la difficoltà principale è che tutto il codice è scritto attraverso puntatori e goto, c'è un sacco di roba inutile con l'allocazione della memoria e poi la distruzione

Ecco perché è ovvio che mql e CY sono linguaggi assolutamente diversi. Anche costrutti semplici come passare puntatori invece di array in una funzione non funzionano qui, è molto difficile da riscrivere.

Il processore non conosce i nomi degli identificatori (nomi delle variabili), conosce solo gli offset dei dati relativi (collegamenti agli indirizzi di memoria) e i dati referenziati devono essere tipizzati - questo è ciò che fa un puntatore - descrive il tipo di dati e dove i dati sono memorizzati nella memoria


MQL è davvero un linguaggio diverso


puntatorihttps://metanit.com/cpp/tutorial/4.1.php

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

Questo è ciò che è interessante del C++ - lavora con i puntatori, tutta la flessibilità del linguaggio è basata sul lavoro con i puntatori - alias imitazione completa del lavoro con la memoria del processore, il processore non conosce i nomi degli identificatori (nomi di variabili), conosce solo gli offset dei dati relativi (in effetti riferimenti agli indirizzi di memoria) e i dati per riferimento devono essere tipizzati - questo è ciò che fa un puntatore - descrive il tipo di dati e la posizione in cui i dati sono memorizzati nella memoria


MQL è davvero un linguaggio diverso


puntatorihttps://metanit.com/cpp/tutorial/4.1.php

Sì, grazie, ho già familiarità con i puntatori, e il libro ha

Il sito è comodo, a proposito, l'ho aggiunto ai miei preferiti.

ecco un buon corso di video lezioni per i pigri, da c a cp


 

Ecco un esempio dall'intestazione della libreria:

vengono create strutture con puntatori a qualcosa di poco chiaro (apparentemente, sono array che non esistono ancora), allora capisco che viene dichiarata una ...er...variabile di questa strutturamine_score; con lo stesso nome?

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;

dovremo occuparci anche di questo

e poi viene dichiarata una f-i che scriverà il suo risultato direttamente nello spazio di memoria di questa variabile?

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

Ecco un esempio dall'intestazione della libreria:

vengono create strutture con puntatori a qualcosa di poco chiaro (apparentemente, sono array che non esistono ancora), allora capisco che viene dichiarata una ...er...variabile di questa strutturamine_score; con lo stesso nome?

dovremo occuparci anche di questo

e poi dichiariamo una f-che scriverà il suo risultato direttamente nella posizione di memoria di questa variabile?

No, il tipo di dati dichiarato qui è mine_score, che è una struttura mine_score.

E la funzione restituisce un puntatore a questa struttura, che sarà creata all'interno di questa funzione. Di conseguenza, lo scopo della funzione è di creare un'entità di tipo min_score e trasferirne la proprietà all'ambito della chiamata della funzione.

 

Maxim Dmitrievsky:

anche questo dovrà essere affrontato

e poi viene dichiarata una f-i che scriverà il suo risultato direttamente nello spazio di memoria di questa variabile?

Ho dimenticato da tempo i typedef, grazie MQL aiutare a ricordare queste costruzioni ingombranti)), a quanto pare, è solo una dichiarazione di tipomine_score, che è una struttura e la descrizione della struttura è stata "incollata" in dichiarazione di tipo ( typedef ) , ma potrei sbagliarmi, qui è una domanda simile discusso e una spiegazione abbastanza dettagliata:

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


Maxim Dmitrievsky:

e poi dichiarate una f-i che scriverà il suo risultato direttamente nello spazio di memoria di questa variabile?

In C++, il programmatore è responsabile dell'allocazione della memoria, quindi se il risultato di una funzione restituisce un puntatoremine_score*, colui che riceve questo puntatore deve allocare la memoria, cioè non è una variabile ma un puntatore ai dati

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

Ho dimenticato i typedef molto tempo fa, per fortuna MQL aiuta a ricordare quelle costruzioni ingombranti)), apparentemente è solo una dichiarazione di tipomine_score, che è una struttura e la descrizione della struttura è stata "incollata" nella dichiarazione del tipo ( typedef ), ma potrei sbagliarmi, qui c'è una domanda simile discussa e una spiegazione abbastanza dettagliata:

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


In C++, l'allocazione della memoria è responsabilità del programmatore, quindi se il risultato di una funzione restituisce un puntatore amine_score *, chiriceve quel puntatore deve allocare la memoria, cioè non è una variabile ma un puntatore ai dati

#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;
}

Ho allocato la memoria all'interno della funzione e l'ho liberata nell'ambito della variabile a cui ho passato il riferimento.

Motivazione: