Errori, bug, domande - pagina 2417

 
Alexey Navoykov:

Sono consapevole che non compila. Sto parlando del controllo della sintassi (che in ME si chiama anche "Compile"), perché l'ho anche specificato tra parentesi in un post precedente. Se si esegue il controllo della sintassi anche nel compilatore C++ (tramite la riga di comando di solito), giura come un tesoro.

Vedi, se non specifichi:

B b;

C++ compila questo codice perfettamente. Quindi la sintassi è corretta. Il problema inizia a livello di creazione dell'oggetto, perché è lì che gli oggetti della classe saranno allocati.

Immaginate un modello che non controllereste mai per vedere se può essere usato in un'intestazione. Cosa dovrebbe fare il compilatore in questo caso? Supponiamo che abbiate bisogno di implementare std:lower per una struttura e che non ci sia un'implementazione in *.h.. Il compilatore può anche non giurare nella fase di controllo.

Potresti specificare come controlli la sintassi per *.h dalla linea di comando per controllare questo codice? È diventato interessante)

 
Andrey Pogoreltsev:

Vedi, se non specifichi:

C++ compila questo codice perfettamente. Allora la sintassi è corretta.

Logica interessante ) E se si rimuove tutto il codice, allora la sintassi è ancora più corretta? Ho citato un codice concreto, non ho detto che la classe B in particolare non sia corretta, può benissimo essere usata per chiamare metodi statici, ecc.

Immaginatevi un modello che non controllerete per l'uso nell'intestazione. Cosa dovrebbe fare il compilatore in questo caso?

Non c'è bisogno di sostituire le nozioni. Un template viene controllato solo quando viene espanso con tipi concreti, è comprensibile.

Potresti specificare come controlli la sintassi per *.h dalla linea di comando per controllare questo codice? Si è fatto interessante)

Qui non posso dirlo, perché non mi sono preoccupato di tali tamburelli, e ho scritto una macro per VS, che compila l'intestazione. A questo scopo passa al volo la modalità di documento corrente a cpp, compila, poi torna indietro. Semplice e di buon gusto.

Non capisco perché non ci sia un'opzione normale per controllare la sintassi dell'intestazione in studio. Sto usando una versione piuttosto vecchia, forse è già disponibile.

 
Alexey Navoykov:

Non capisco perché non ci sia un'opzione normale per controllare la sintassi dell'intestazione in studio.

Ctrl+F7 , questa combinazione è probabilmente disponibile almeno dal 2008 - compilare un file separato
 
TheXpert:
Ctrl+F7 , questa combinazione esiste probabilmente almeno da Studio 2008 - compilare un file separato
Io sto parlando di intestazioni, mentre questa combinazione si riferisce a cpp. Almeno, è così nel mio studio del 2010.
 

Ho esitato a lungo prima di postare, ricontrollando la mia stessa build, ma c'è ancora qualcosa di sbagliato nel tester...

Il test si è letteralmente fermato all'inizio:

Senza cambiare nulla, premo "start" una seconda volta, va alla fine (con una piccola pausa nel punto in cui si è interrotto):

Fatto qualche altro approccio - i risultati sono rigorosamente alternati (uno dopo l'altro, pari/dispari). Fino al punto della "scogliera" i grafici dell'equilibrio sono simili. Di nuovo, non cambio nulla, solo clicco "start"

Questo è molto probabilmente il punto in cui si aggiunge un personaggio in più (perché non tutti e 5 dall'inizio del test?):


Lasciando da parte la questione della disponibilità effettiva di memoria (secondo il task manager, 1,2-1,4GB liberi, cioè corrisponde al rapporto), non può essere che lo stesso test abbia bisogno di quantità diverse di memoria per funzionare? E se il rapporto dice che 400Mb sono sufficienti, potete eseguire tre di questi test su 1.2Gb...

Dati aggiuntivi: test su 5 simboli, per apertura di barra, H1, 2004...oggi. Il corpo ha 7 array doppi con 500 elementi e una piccola struttura-array (memorizza i dati per ogni simbolo, cioè in questo caso 5 x 13), la dimensione è impostata durante l'inizializzazione e non cambia più, cioè non c'è niente che consumi memoria. Il codice è procedurale, semplice, piccolo, senza ricorsione e include librerie.

Funziona su quattro simboli, ma su 6-7-8 ha lo stesso effetto che su 5 simboli - solo una volta. Allo stesso tempo la prima volta dopo aver aggiunto un nuovo personaggio - funziona sempre, la prossima - no, poi funziona di nuovo, ecc.

C'è il sospetto che la memoria non venga rilasciata in modo tempestivo, solo la presenza di un errore legato alla sua scarsità.

Totale di 3 problemi:

  • il test viene eseguito solo una volta (rigorosamente) se non ci sono cambiamenti nelle impostazioni o nel codice
  • c'è abbastanza memoria libera per diversi test (se ci si può fidare del messaggio dopo il superamento dei test), ma appare un errore di memoria insufficiente (a tentativi pari). (400 sono stati utilizzati durante il "successo", 1200 erano liberi quando si è verificato l'errore)
  • alcuni personaggi sono collegati nel mezzo del test, se c'è una storia (si può vedere sul log di sincronizzazione). Segnale di polling su ogni nuova barra di tutti i simboli (in loop)

 
Alexey Navoykov:
Si trattava di intestazioni, e questa combinazione si riferisce a cpp. Almeno nel mio studio del 2010 è così.
sì ( e il tuo modo sembra essere più conveniente che fare un cpp vuoto per l'intestazione
 

Perché è proibito?

void fn(const int&) {}

void start() {
   fn(5);  // parameter passed as reference, variable expected

}
 
Vict:

Perché è proibito?

letterale solo per valore. perché - non lo so, dovete chiedere al team di sviluppo
 
TheXpert:
Questa è la tradizione da tempo immemorabile. letterali solo per valore. perché - non lo so, dovete chiedere agli sviluppatori

Passare un parametro per riferimento implica che c'è una variabile distribuita in memoria.

Le costanti non sono memorizzate da nessuna parte e sono usate direttamente.

 
TheXpert:
Non so perché, dovrò chiedere al team di sviluppo.

Per compiacere i masochisti. Non sono rimasto impressionato dal bilio standard, così ho deciso di scrivere un vettore simile, ma a causa dell'abbondanza di "trucchi", risulta essere un altro sottosviluppo.

void push_back(const T &value);