Fehler, Irrtümer, Fragen - Seite 2417

 
Alexey Navoykov:

Ich bin mir bewusst, dass es nicht kompiliert. Ich spreche von der Syntaxprüfung (die in ME auch "Kompilieren" genannt wird), weil ich sie in einem früheren Beitrag sogar in Klammern angegeben habe. Wenn Sie die Syntaxprüfung auch im C++-Compiler ausführen (normalerweise über die Befehlszeile), wird er fluchen wie ein Schatz.

Siehst du, wenn du es nicht angibst:

B b;

C++ kompiliert diesen Code perfekt. Die Syntax ist also korrekt. Das Problem beginnt auf der Ebene der Objekterstellung, denn dort werden die Klassenobjekte zugewiesen.

Stellen Sie sich eine Vorlage vor, bei der Sie nie prüfen würden, ob sie in einer Kopfzeile verwendet werden kann. Was sollte der Compiler in diesem Fall tun? Angenommen, Sie müssen std:lower für eine Struktur implementieren und es gibt keine Implementierung in *.h.. Der Compiler sollte sich auch in der Phase der Prüfung nicht beschweren.

Können Sie angeben, wie Sie die Syntax für *.h von der Befehlszeile aus prüfen, um diesen Code zu überprüfen? Es wurde interessant)

 
Andrey Pogoreltsev:

Siehst du, wenn du es nicht angibst:

C++ kompiliert diesen Code perfekt. Dann ist die Syntax korrekt.

Interessante Logik ) Und wenn Sie den gesamten Code entfernen, ist die Syntax sogar noch korrekter? ) Ich habe einen bestimmten Code zitiert. Ich habe nicht gesagt, dass die Klasse B im Besonderen falsch ist. Sie kann sehr wohl zum Aufruf statischer Methoden usw. verwendet werden.

Stellen Sie sich eine Vorlage vor, die Sie nicht für die Verwendung in der Kopfzeile prüfen werden. Was sollte der Compiler in diesem Fall tun?

Es besteht keine Notwendigkeit, Begriffe zu ersetzen. Eine Vorlage wird nur geprüft, wenn sie mit konkreten Typen erweitert wird, das ist verständlich.

Können Sie angeben, wie Sie die Syntax für *.h von der Befehlszeile aus prüfen, um diesen Code zu überprüfen? Es wurde interessant)

Hier kann ich nichts sagen, denn ich habe mich nicht mit solchen Tambouren herumgeschlagen und ein Makro für VS geschrieben, das den Header kompiliert. Dazu schaltet es on the fly den aktuellen Dokumentmodus auf cpp um, kompiliert und kehrt dann zurück. Einfach und geschmackvoll.

Ich verstehe nicht, warum es keine normale Option zur Überprüfung der Header-Syntax in Studio gibt. Ich benutze eine ziemlich alte Version, vielleicht ist sie bereits verfügbar.

 
Alexey Navoykov:

Ich verstehe nicht, warum es keine normale Option zur Überprüfung der Header-Syntax in Studio gibt.

Strg+F7 , diese Kombination ist wahrscheinlich seit mindestens 2008 verfügbar - kompilieren Sie eine separate Datei
 
TheXpert:
Strg+F7 , diese Kombination gibt es wahrscheinlich mindestens seit Studio 2008 - kompilieren Sie eine separate Datei
Ich spreche von Kopfzeilen, während sich diese Kombination auf cpp bezieht. Zumindest ist es in meinem Studio 2010 so.
 

Ich habe lange gezögert, bevor ich etwas gepostet habe, um meinen eigenen Build zu überprüfen, aber irgendetwas stimmt mit dem Tester nicht...

Der Test wurde buchstäblich am Anfang abgebrochen:

Ohne etwas zu ändern, drücke ich ein zweites Mal auf "Start", geht bis zum Ende (mit einer kleinen Pause an der Stelle, wo es unterbrochen wurde):

Ich habe noch ein paar Versuche gemacht - die Ergebnisse sind streng abwechselnd (nacheinander, gerade/ungerade). Bis zum Punkt "Klippe" sind die Bilanzkurven ähnlich. Auch hier ändere ich nichts, sondern klicke einfach auf "Start".

Dies ist höchstwahrscheinlich der Punkt, an dem ein weiteres Zeichen hinzugefügt wird (warum nicht alle 5 seit Beginn des Tests?):


Abgesehen von der Frage der tatsächlichen Verfügbarkeit von Arbeitsspeicher (laut Task-Manager 1,2-1,4 GB frei, d.h. entspricht dem Bericht), kann es nicht sein, dass derselbe Test unterschiedliche Mengen an Arbeitsspeicher zur Ausführung benötigt? Und wenn der Bericht sagt, dass 400Mb ausreichen, können Sie drei solcher Tests mit 1,2Gb durchführen...

Zusätzliche Daten: Test mit 5 Symbolen, nach Balkeneröffnung, H1, 2004...heute. Der Körper hat 7 Doppel-Arrays mit 500 Elementen und eine kleine Array-Struktur (speichert Daten für jedes Symbol, d.h. in diesem Fall 5 x 13), die Größe wird während der Initialisierung festgelegt und ändert sich nicht mehr, d.h. es gibt nichts, was Speicher verbraucht. Der Code ist prozedural, einfach, klein, ohne Rekursion und Include-Bibliotheken.

Es funktioniert bei vier Symbolen, aber bei 6-7-8 hat es denselben Effekt wie bei 5 Symbolen - nur einmal. Dabei funktioniert das erste Mal nach dem Hinzufügen eines neuen Zeichens - immer, das nächste Mal - nein, dann funktioniert es wieder usw.

Es besteht der Verdacht, dass der Speicher nicht rechtzeitig freigegeben wird, sondern dass lediglich ein Fehler im Zusammenhang mit seiner Knappheit vorliegt.

Insgesamt 3 Probleme:

  • der Test wird nur einmal (streng) durchgeführt , wenn keine Änderungen an den Einstellungen oder am Code vorgenommen werden
  • es ist genügend freier Speicher für mehrere Tests vorhanden (wenn man der Meldung nach erfolgreichem Testdurchlauf trauen kann), aber es erscheint eine Fehlermeldung über unzureichenden Speicherplatz (bei jedem Versuch). (400 wurden bei "Erfolg" verbraucht, 1200 waren frei, als der Fehler auftrat)
  • einige Zeichen werden in der Mitte des Tests verbunden, wenn es einen Verlauf gibt (Sie können ihn im Synchronisierungsprotokoll sehen). Abrufsignal bei jedem neuen Balken aller Symbole (in Schleife)

 
Alexey Navoykov:
Es ging um Kopfzeilen, und diese Kombination bezieht sich auf cpp. Zumindest in meinem Studio 2010 ist das der Fall.
ja ( und Ihr Weg scheint bequemer zu sein als eine leere cpp für den Header zu erstellen
 

Warum ist es verboten?

void fn(const int&) {}

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

}
 
Vict:

Warum ist es verboten?

wörtlich nur nach Wert. Warum - das weiß ich nicht, das müssen Sie das Entwicklungsteam fragen
 
TheXpert:
Dies ist seit jeher Tradition. Literale nur nach Wert. Warum - ich weiß es nicht, das müssen Sie die Entwickler fragen.

DieÜbergabe eines Parameters per Referenz impliziert, dass eine Variable im Speicher verteilt ist.

Konstanten werden nirgends gespeichert und direkt verwendet.

 
TheXpert:
Ich weiß nicht, warum, ich muss das Entwicklungsteam fragen.

Zur Freude der Masochisten. Ich war nicht beeindruckt von der Standard-Bilio, so dass ich beschlossen, einen ähnlichen Vektor zu schreiben, aber wegen der Fülle von "Tricks", es stellt sich heraus, eine weitere Unterentwicklung sein.

void push_back(const T &value);