Forum: Compiler & IDEs Modultests mit scanf


von Josef Zimmermann (Gast)


Angehängte Dateien:

Lesenswert?

Hallo allerseits,

zur Zeit habe ich leider keine Zielhardware, muss aber ein relativ
komplexes Modul testen. Daher habe ich mir ein mtest_main.c mit einer
Mainloop geschrieben, um in diesem Rahmen meine Module auszuführen und
testen zu können. Per getc() lese ich einzelne Zeichen ein und führe
dann die enspechenden Funktionen aus. Auf dem Zielsystem sind ausserdem
nur rudimentäre Testfunktionen vorhanden.

Bisher habe ich mich um die Eingabe zusätzlicher Parameter herum
gedrückt, weil meine ersten Versuche mit scanf() nicht besonders
überzeugend waren. Schön wäre es, wenn ich eine Lösung finden würde die
beliebige Parameter zulassen würde.

Beispiel:

test: a <cr>
<... response ...>
test: e 1fffffff 34 <CR>
<... response ...>
etc.

Mein Ziel wäre quasi ein Testframe für Modultests auf dem
Entwicklungssystem um die Funktion des Codes zu prüfen. Denkbar wäre
aber auch, wenn man ein CLIB verwenden kann, Tests per RS232 und
Terminal auf dem Zielsystem auszuführen.

Hat jemand ein Idee?

Meine Umgebung ist:
- Zielsystem ARM7 (per ARM Compiler)
- Entwicklungssystem: Debian/Linux, Anjuta, gnu tools, gnuc.

Ich denke mir, diese Problemstellung ist nicht neu. Vermutlich gibt es
bereits einen brauchbaren Lösungsansatz oder sogar einen einfachen
generic Testrahmen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Statt scanf bietet sich IMHO die Kombination aus fgets und sscanf an.

fgets liest eine komplette Zeile ein (terminiert durch CR),
sscanf kann -nach inhaltlicher Prüfung- auf diese eingelesene Zeile
losgelassen werden.

fgets sollte statt gets verwendet werden, da gets die Länge des
übergebenen Puffers nicht überprüfen kann und so ein schöner Kandidat
für Speicherprobleme (buffer overflow) ist.

von mthomas (Gast)


Lesenswert?

Der primitive "Kommando-Interpreter" aus meiner MCP-Testsoftware mag
vielleicht inspirieren, Nichts dolles aber funktioniert "gut genug".
http://www.siwawi.arubi.uni-kl.de/avr_projects/can/index.html
("Version 0.9"-Archiv)

von Josef Zimmermann (Gast)


Lesenswert?

Hallo allerseits,

zunächst einmal vielen Dank für die Anregungen. Ich ziehe in diesem
Fall die Möglichkeiten der LIBC und stdio vor, weil diese in der Regel
für alle Plattformen sofort verfügbar sind. Auf dem Zielsystem kostet
das natürlich zusätzlich Platz und Laufzeit. In diesem Fall wäre dann
der Lösungsansatz aus dem MCP-Projekt eine brauchbarer Weg. Allerdings
ohne die Möglichkeiten (den Luxus) per printf() formatierte Ausgaben
verwenden zu können.

Mit sscanf() laufe ich vermutlich in die selben Probleme wir mit
scanf(), weil ich unterschiedlich formatierte Eingabestrings verwenden
möchte. Eventuell kann ich die ersten Zeichen auswerten und dann eine
passendes sscanf() auf den String anwenden.
Ausserdem kann man prüfen ob die korrekte Anzahl an Argumenten
übergeben wurde.

int anzahl = 0;

if( cmd_strg[0] = 'm')
{
   anzahl = sscanf( ch, "%s %x %x\n", arg1, var1, var2);
   ...
}
else if( cmd_strg[0] = 'n')
{
   anzahl = sscanf( ch, "%s %s\n", arg1, arg2);
   ...
}

Danke für die Hinweise.

Josef


PS. Wenn die Funktion steht, werde ich sie hier posten.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Mit sscanf() laufe ich vermutlich in die selben Probleme wir mit
> scanf(), weil ich unterschiedlich formatierte Eingabestrings
> verwenden möchte.

Nein, scanf() direkt auf der Eingabe ist wirklich was anderes.  Ich
hatte das mal bisschen probiert, als ich die scanf-Bibliothek für
avr-libc geschrieben habe, das will man wohl nicht wirklich benutzen.

fgets() + sscanf() ist oft genug wirklich besser handhabbar.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.