domanda per gli esperti di #define - pagina 2

 
Oh, mio Dio, i ragazzi non possono vivere senza assorbenti.
 
Nikolai Karetnikov:

Grazie! )

Essenzialmente.

Questo è il punto in cui ho lasciato l'opzione della classe. Anche cose elementari come la parametrizzazione #define si dimenticano rapidamente senza l'uso quotidiano.

Sui nervi.

Dio, come sono sensibili tutti qui; si può fare una domanda senza un'implicazione, senza l'intenzione di offendere o insultare, ma no, da qualche parte nell'anima di un genio non riconosciuto si sente un assillo e un desiderio di affermarsi a spese di un altro dilettante. Non lo incontro sul forum inglese, anche se ci scrivo regolarmente. Sapendo questo, di solito cerco di non reagire a tali osservazioni, ma se Dmitry, vuoi divertirti in una battaglia verbale, ti darò il piacere di immergerti a capofitto nelle tue stesse emanazioni.

Tagliare la mosca, baby.

 
Vladimir Simakov:

Perché non ha mostrato subito questa decisione all'uomo?)

UPD: bezgovna - scritto senza sh..t ))))

Beh, ti piace solo l'idea che io non lo sapessi. Quindi continuate a battervi in un orgasmo della vostra stessa meraviglia.

 
Dmitry Fedoseev:
Oh amico, i ragazzi non possono più vivere senza assorbenti.

Riguardo alle guarnizioni.

Cosa c'è di buono nel singleton? Perché si può memorizzare lo stato, elaborare i log con una logica complessa, ecc., mantenendo tutto conciso nel codice principale. In questo modo si crea una corretta architettura del progetto e il codice stesso diventa più leggibile.

PS. Altrimenti, sì, tutto è a un fan. A molte persone qui nella comunità piace il codice spaghetti con la notazione ungherese, e il masochismo di provare tutti gli ordini e le posizioni (tutti in generale) su ogni tick è grande).

 

Molto tempo fa (molti anni fa) .... C'era già un thread sui migliori log, se era in un thread separato o in un altro thread non ricordo.

Ma è stato fatto in un modo leggermente diverso. Lì hanno cambiato il nome della funzione e vi hanno aggiunto ogni sorta di macro linee di nomi di funzioni e così via... e poi si potrebbe cambiare il gestore al volo

qualcosa come "#definite PRINT prepare; Print".

e la stampa stessa nello stile di

void Print (stringa a; stringa a1="" ;stringa a2=""; ...... // 64 volte. Vorrei poter scrivere semplicemente ...a[]

{

Stampa (La nostra preparazione, argomenti);

}

Il define avrebbe potuto essere gestito come una normale stampa, e cambiando il gestore possiamo scrivere i dati in un file o visualizzarli. Il numero di argomenti può essere qualsiasi (fino a 64) // per coloro che non hanno ancora imparato.

A proposito, questo èin parte quello che chiedeva l'autore))

 
Dmitry Fedoseev:
Ma, sfortunatamente, non farete colpo sui babbei.

Ti piacerebbe?

Scusate, ma per quanto mi ricordo dai tempi in cui si usava ancora l'Assembler, l'estensione delle macro (macro ) è uno strumento che permette di sostituire la sua definizione con il suo codice appena prima della compilazione.

È solo che la programmazione in Assembler è un po' macchinosa e non ci sono subroutine.

Programmare in MQL è un po' più comodo.

Domanda: sarebbe più comodo scrivere una subroutine, o solo il Print("No sheet"); o qualcosa da predefinire nel preprocessore?

 
Алексей Тарабанов:

(1) Ti piacerebbe?

Scusate, ma per quanto mi ricordo dai tempi in cui si usava ancora l'Assembler, l'estensione delle macro (macro ) è uno strumento che permette di sostituire la sua definizione con il suo codice appena prima della compilazione.

(2) Semplicemente, è piuttosto ingombrante programmare in Assembler e non ci sono subroutine.

Programmare in MQL è un po' più comodo.

(3) Domanda: ti sentiresti più a tuo agio a scrivere un sottoprogramma, o solo il Print("No sheet"); o pre-definire qualcosa nel preprocessore?

1) La domanda non è per me.

2) Ci sono delle subroutine in assembler.

3) Sono più tranquillo a non sparare cazzate su domande che non valgono un uovo marcio.

 
Alexandr Andreev:

Molto tempo fa (molti anni fa) .... C'era già un thread sui migliori log, se era in un thread separato o in un altro thread non ricordo.

Ma è stato fatto in un modo leggermente diverso. Lì hanno cambiato il nome della funzione e vi hanno aggiunto ogni sorta di macro linee di nomi di funzioni e così via... e poi si potrebbe cambiare il gestore al volo

qualcosa come "#definite PRINT prepare; Print".

e la stampa stessa nello stile di

void Print (stringa a; stringa a1="" ;stringa a2=""; ...... // 64 volte. Vorrei poter scrivere semplicemente ...a[]

{

Stampa (La nostra preparazione, argomenti);

}

Il define avrebbe potuto essere gestito come una normale stampa, e cambiando il gestore avremmo potuto scrivere i dati in un file o visualizzarli sullo schermo. Il numero di argomenti può essere qualsiasi (fino a 64) // per coloro che non hanno ancora imparato.

A proposito, questo èesattamente quello che chiedeva l'autore))

stringa aN="" e 63 volte - è una furia.

Lasciatemi spiegare:

  1. Una stringa è un oggetto che è un wrapper su un wchar_t*.
  2. Facendo string="" 63 volte, si fa quanto segue: si alloca memoria per 63 oggetti stringa (sullo stack in questo caso), si chiama il costruttore parametrico (63 volte), si alloca un buffer wchar_t* di qualche dimensione nell'heap (proprio lì), i cui primi due byte sono inizializzati con 0x0000 (sì, anche questo succede 63 volte).

Se lo state facendo in questo modo, fate string=NULL, in questo caso risparmierete grandi costi di allocazione di memoria inutile nell'heap.

UPD. No, mi sbaglio, se fatto correttamente, non ci sarà alcuna allocazione di memoria nell'heap.

 
Vladimir Simakov:

stringa aN="" e 63 volte è feroce.

Lasciatemi spiegare:

  1. string è un oggetto che è un wrapper su wchar_t*.
  2. Facendo string="" 63 volte, si fa quanto segue: si alloca memoria per 63 oggetti stringa (sullo stack in questo caso), si chiama il costruttore parametrico (63 volte), si alloca un buffer wchar_t* di qualche dimensione nell'heap (proprio lì), i cui primi due byte sono inizializzati da 0x0000 (sì, anche questo succede 63 volte).

Se lo fate in questo modo, fate string=NULL, in questo caso risparmierete costi importanti di allocazione di memoria inutile nell'heap.

UPD. No, mi sbaglio, se fatto correttamente, non ci sarà allocazione di memoria nell'heap.

Ancora una volta non capisci di cosa stiamo parlando. Alexander scrive di sostituire Print() tramite define (per evitare di strisciare tutto il file e cercare tutte le stampe). Il problema di questo è che Print può avere diversi parametri, anche se nessuno li distingue come parametri - solo una stringa collegata da virgole. Quindi, per fornire una sostituzione della funzione Print standard, avete bisogno di una funzione che accetti 64 parametri opzionali (per corrispondere completamente alla funzione Print()). E avete bisogno di aggiungere alcuni dati prima del log, forse una striscia con una freccia (==>) per una migliore visibilità, forse un numero di linea, una data o un output in un file. Non può importare a nessuno la velocità di questo, perché viene fatto in casi particolarmente complessi di errori di ricerca, e poi rimosso.

 
string _info;
void _Print(string s,string s1="",string s2="",string s3="",string s4="",string s5="",string s6="",string s7="",string s8="")//.....
   {
   string ss;
   StringConcatenate(ss,s,s1,s2,s3,s4,s5,s6,s7,s8);//....
   //Comment(_info,ss);
   Print(_info,ss);
   }
#define Print _info=__FILE__+" line "+__LINE__ +" "+__FUNCSIG__+" Print: "; _Print

void OnStart()
  {
   
   Templ();
  }
  
void Templ()
   {
   Print("Error, a!=",5," and other....",3,4,5);
   Print("a=",5);
   Print("Hi");
   }


Tutti sembrano capire.....

Quindi questo è per coloro che stanno appena iniziando il loro modo....

Possiamo avvolgere tutto in una classe stat e restituire un riferimento, che poi pareggia il resto poiché questo metodo ha un meno quando lavora con if (a!=5) Print(a); non funzionerà, dovreste sempre scrivere if (a!=5) {Print(a);}, nelle classi possiamo correggere questo momento, ma sono troppo pigro)) e in generale, sembra che tutto sia negli archivi della storia

il modo con le classi, inizializzare i nostri dati tramite metodo statico e combinare l'operatore chiamare il nostro print.... allorase (a!=5) Print(a); funzionerà