In einem früheren Beitrag schrieb ich Verwenden wir den Typ std :: map für eine klare Codierung.
Wenn Sie mehr als eine bestimmte Menge eingebetteter Umgebungen haben (z. B. Board wie Raspberry Pi oder Zynq), können Sie g ++ verwenden, und die Verwendung von STL sollte kein Problem darstellen. Und Sie können Programme mit STL-Containern schreiben. Ich denke, dass STL aktiv verwendet werden sollte, um eine Version zu erstellen, die bei der Entwicklung auf einem PC korrekt funktioniert (ich mache mir Sorgen über die Implementierung von C ++ einiger kommerzieller Compiler und STL, die diesen Compiler verwendet Ich denke, die Situation ist anders als früher, als ich mir Sorgen um die Implementierung von machte. Damals hörte ich, dass ich gebeten wurde, den mit STL geschriebenen Code in Nicht-STL-Code umzuschreiben.) .. Die externen Spezifikationen von STL sind klar und es ist für mehrere Mitglieder einfach, ein gemeinsames Verständnis zu teilen. So sehr ich die Verwendung von STL genossen habe, vermeide ich den Aufwand, die Spezifikationen ausreichend zu klären und die Algorithmen anderer Teile zu testen.
Wenn es sich bei der endgültigen Implementierung um einen PC handelt, kann dieser als STL belassen werden. In einigen eingebetteten Umgebungen besteht die Möglichkeit, ihn als STL zu belassen. In diesem Artikel empfehle ich für diejenigen, die STL für ihre endgültige Implementierung immer noch nicht verwenden können, die Verwendung von STL bei der Entwicklung von Code, der auf der PC-Version ordnungsgemäß funktioniert, indem gezeigt wird, dass die C ++ - Quelle automatisch generiert werden kann. Es ist etwas zu tun.
Das folgende Python-Skript liest die Zuordnungsdaten von std :: map <std :: string, int> in der Datei withMap.cpp und generiert eine Folge von if () else if () -Anweisungen ohne Verwendung von STL. ist.
intoElseif.py
# -*- coding: utf-8 -*-
def parseMap(name):
u"""
std::map<std::string, int>Lesen Sie atmomicNumbers.
Lesen Sie den Kartenschlüssel und den Wert und weisen Sie sie dem Python-Wörterbuch zu.
"""
d = {}
for line in open(name, "rt"):
oline = line.strip().replace(",", " ")
if len(oline) > 1 and oline[-1] == ",":
oline = oline[:-1]
f = oline.split()
if len(f) == 4 and f[0] == "{":
d[int(f[2])] = f[1]
return d
if __name__ == "__main__":
u"""
C basierend auf dem gelesenen Wörterbuch/C++Generieren Sie eine Sprache, wenn sonst if-Anweisung.
"""
d = parseMap(name="withMap.cpp")
keys = d.keys()
keys.sort()
k = keys[0]
print """if(strcmp(instr, %s) == 0){
r = %s;
}""" % (d[k], k),
for i in range(1, len(keys)):
k = keys[i]
print """else if(strcmp(instr, %s) == 0){
r = %s;
}""" % (d[k], k),
C ++ - Datei mit Daten vom Typ std :: map der Eingabedaten
withMap.cpp
#include <iostream>
#include <string>
#include <map>
/**Kartentyp-Container, der der Ordnungszahl aus dem Elementsymbol entspricht
*Die Initialisierung erfolgt zeitgleich mit der Deklaration.
*(Nur bis zu Ne im zweiten Zyklus wird beschrieben.)
*/
std::map<std::string, int> atmomicNumbers = {
{ "H", 1 },
{ "He", 2 },
{ "Li", 3 },
{ "Be", 4 },
{ "B", 5 },
{ "C", 6 },
{ "N", 7 },
{ "O", 8 },
{ "F", 9 },
{ "Ne", 10 }
};
int main(int argc, char* argv[]){
std::string symbol = "Be";
std::cout << symbol << " " << atmomicNumbers[symbol] << std::endl;
}
Ausführungsergebnis
generated.cpp
if(strcmp(instr, "H") == 0){
r = 1;
} else if(strcmp(instr, "He") == 0){
r = 2;
} else if(strcmp(instr, "Li") == 0){
r = 3;
} else if(strcmp(instr, "Be") == 0){
r = 4;
} else if(strcmp(instr, "B") == 0){
r = 5;
} else if(strcmp(instr, "C") == 0){
r = 6;
} else if(strcmp(instr, "N") == 0){
r = 7;
} else if(strcmp(instr, "O") == 0){
r = 8;
} else if(strcmp(instr, "F") == 0){
r = 9;
} else if(strcmp(instr, "Ne") == 0){
r = 10;
}
Auf diese Weise ist es einfach, einen Teil des Programms automatisch aus dem regulären Teil der Daten zu generieren. Daher bestehen wir darauf, den Zustand des Programms mithilfe eines klaren Datenformats sicherzustellen.
Wenn Sie ein Programm mit std :: map schreiben, wirkt sich eine Erhöhung der Daten aus
{ "Ne", 10 }
Sie müssen lediglich die folgenden Zeilen hinzufügen, sodass der Code nicht mehr an anderer Stelle geändert werden muss.
Ich denke, dass es zuerst darum geht, einen Mechanismus zu sichern, der die ordnungsgemäße Funktion garantiert, und dann die Leistung (Verarbeitungsgeschwindigkeit, Programmgröße) bei der Implementierung sicherzustellen.
Im obigen Beispiel ohne Verwendung von std :: map
python
char* [] atomicSymbols = {
"H", "He",
"Li", "Be", "B", "c", "N", "O", "F", "Ne"
}
Es ist auch möglich, mit dem Array zu verarbeiten. Hier verwenden wir jedoch den Typ "std :: map <std :: string, int>", um die Verwendung einer Standardbibliothek für die Logik vorzuschlagen, die Schlüssel mit Werten verknüpft.
Das Generieren von Teilen eines Programms mithilfe einer Skriptsprache wird von einigen seit langem verwendet. Beim Schreiben vieler ähnlicher Inhalte, bei denen nur die Daten ersetzt wurden, wurde automatisch ein Teil des Programms basierend auf den Daten generiert. Die Daten werden häufig aktualisiert, sodass es möglicherweise nicht möglich ist, sie einmal von Hand zu schreiben. Ein solcher Ansatz kann für jede Sprache verwendet werden. Beispielsweise verwendete Ratfor, eine FORTRAN-Erweiterungssprache, einen Präprozessor, um die Mängel der FORTRAN-Sprachspezifikation zu verbergen. Ich denke, dass die Verbesserung der Aussichten für die Durchführung der Verarbeitung dazu dient, die Gesundheit des Programms frühzeitig sicherzustellen.
Nachtrag: "Programmiermethode" Kapitel 9 Notation "9.5 Programm zur Beschreibung des Programms" enthält den Namen Basierend auf der Header-Datei, die den Kommentar enthält, wird eine Fehlermeldung generiert. In diesem Buch wird das Perl-Skript automatisch konvertiert. Auf diese Weise kann die Skriptsprache verwendet werden, um die Entwicklung in der C / C ++ - Sprache zu beschleunigen.
python
enum {
Eperm, /* Permission denied */
Eio, /* I/O error */
Efile, /* File does not exist */
Emem, /* Memory limit reached */
Espace, /* Out of file space */
Egreg /* It's all Greg's fault */
};
Es gibt ein Beispiel für das Generieren der folgenden Deklaration aus.
python
char *errs[] = {
"Permission denied", /* Eperm */
"I/O error", /* Eio */
"File does not exist", /* Efile */
"Memory limit reached", /* Emem */
"Out of file space", /* Espace */
"It's all Greg's fault", /* Egreg */
};
Recommended Posts