mikrocontroller.net

Forum: Compiler & IDEs Wickenhäuser: printf innerhalb einer Funktion mit Wert durch Parameter


Autor: Bastian N. (Firma: Privat) (seal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

ich versuche gerade printf innerhalb einer Funktion mit Parameterwert 
für printf zu benutzen.

Die C-Datei von Wickenhäuser enthält folgenden Code:
/**************************************************************************
* PRINTF.C - Standard console
*
* V2.0 2002 (C) www.wickenhaeuser.com
*
* To access own peripherals (i.e. LCDs) modify a own xxx_printf-functions
* as described in the manual
*
***************************************************************************/

#include <stdio.h>
#include <stdarg.h>

// the formater...
extern int _doprnt( void (*iofunc)(unsigned char) reentrant, char* pfmt, va_list(ap));

// PRINTF - that's all! Use _put() for char-output (Note: the 'far' has no effect)
int printf(far char* pfmt, ...){
     va_list(ap);
     va_start(ap,pfmt);
     return _doprnt(_putc, pfmt, ap);
}

// END

Vereinfacht habe ich folgendes probiert:
void p1(const char* c) {
  printf("%c", c);
}

void p2(char* c) {
  printf("%c", c);
}


Beides Mal bekomme ich keine Ausgabe. Hängt das mit dynamischen Speicher 
zusammen, wegen das nicht funktioniert?

Auch: Wie muss der Funktionsaufbau sein, damit es funktioniert?

MfG
Bastian

Autor: Oliver S. (oliverso)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Bastian N. schrieb:
> * To access own peripherals (i.e. LCDs) modify a own
> xxx_printf-functions
> * as described in the manual

Worauf gibst du deinen Text aus?

Zudem hilft manchmal ein Zeilenvorschub am Ende der Augabe.

Oliver

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Bastian N. schrieb:
> void p1(const char* c) {
>   printf("%c", c);
> }
>
> void p2(char* c) {
>   printf("%c", c);
> }

%c ist für einzelne char's, du übergibst aber einen Pointer 
(vernünftige™ Compiler wie der GCC merken das btw) - also entweder mit 
*c dereferenzieren oder mit %s als ganzen String ausgeben.

Autor: Markus F. (mfro)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Bastian N. schrieb:
> Vereinfacht habe ich folgendes probiert:void p1(const char* c) {
>   printf("%c", c);
> }
>
> void p2(char* c) {
>   printf("%c", c);
> }
>
> Beides Mal bekomme ich keine Ausgabe. Hängt das mit dynamischen Speicher
> zusammen, wegen das nicht funktioniert?

Das schaust Du dir besser nochmal an. c ist was? Richtig, ein Pointer. 
Und "%c" ist was? Genau, das Ausgabeformat für ein char.

Paßt irgendwie nicht so recht zusammen.

Das hätte dir allerdings durchaus eine Ausgabe produzieren müssen (bloß 
nicht die, die Du erwartet hättest).

Was macht _putc() genau und wo schickt es seine Ausgabe hin (Manual)?

Autor: Bastian N. (Firma: Privat) (seal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mit %s geht es! Danke :)
Wegen der Verbindung die geht über Serial RS232 mit Hyperterm oder 
Putty.


Wenn wenigstens die Lehrbücher die ich vom B.v.B habe gescheit wären...
... weil der %s Parameter wird darin nicht aufgelistet  :/

Irgendwie kommt mir der ganze Lehrgang den ich da mache ziemlich 
"lieblos" vor.

Autor: krumeltee (Nils S.) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bastian N. schrieb:
> Irgendwie kommt mir der ganze Lehrgang den ich da mache ziemlich
> "lieblos" vor.

Das Gefühl hatte ich auch, als ich die Wickenhäuser IDE vorgesetzt 
bekam. Nicht wegen dieser Software, aber das drumherum und da passt 
dieses Frickelprogramm gut rein. Ich denke das wird sich schon oft so 
abgespielt haben...

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Bastian N. schrieb:
> Wenn wenigstens die Lehrbücher die ich vom B.v.B habe gescheit wären...
> ... weil der %s Parameter wird darin nicht aufgelistet  :/

Du hast "Lehrbücher", die sich mit printf beschäftigen, und nicht %s 
erwähnen? Echt jetzt?

Autor: Bastian N. (Firma: Privat) (seal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
krumeltee (Nils S.) schrieb:
> Bastian N. schrieb:
>> Irgendwie kommt mir der ganze Lehrgang den ich da mache ziemlich
>> "lieblos" vor.
>
> Das Gefühl hatte ich auch, als ich die Wickenhäuser IDE vorgesetzt
> bekam. Nicht wegen dieser Software, aber das drumherum und da passt
> dieses Frickelprogramm gut rein. Ich denke das wird sich schon oft so
> abgespielt haben...

Hallo krumeltee,
kennst du diesen Lehrgang etwa? :)

MfG
Bastian

Autor: Bastian N. (Firma: Privat) (seal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> Bastian N. schrieb:
>> Wenn wenigstens die Lehrbücher die ich vom B.v.B habe gescheit wären...
>> ... weil der %s Parameter wird darin nicht aufgelistet  :/
>
> Du hast "Lehrbücher", die sich mit printf beschäftigen, und nicht %s
> erwähnen? Echt jetzt?

Ernsthaft, sonst wäre mir das %s bestimmt nicht entgangen.
Habe auch nachdem ich den Lösungsvorschlag mit dem %s bekommen habe, um 
sicher zu gehen, ein CTRL+F auf das Lehrbuch losgelassen: 0 Treffer (+ 
von Hand nochmal die Stellen durchgegangen: 00).

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bastian N. schrieb:
> Ernsthaft, sonst wäre mir das %s bestimmt nicht entgangen.

Wenn Du die Dokumentation einer C-Standardfunktion suchst, gib bei 
google einfach

   man funktionsname

ein. "man" steht für den Manual-Befehl unter Unix bzw. Linux. In der 
Regel bekommst Du dann als ersten Treffer das Handbuchkapitel zu der 
gewünschten Funktion. Bei manchen Funktionen bekommst Du Alternativen 
angezeigt, wie z.B. printf(1) und printf(3). Die Zahlen sind 
Kapitelnummern. In der Regel sind für C-Programmierer die Kapitel 3 (und 
manchmal auch 2) interessant. Kapitel 1 kannst Du links liegen lassen.

Allerdings wirst Du auch bemerken, dass die 
Mikrocontroller-Laufzeitumgebungen oft nur einen Bruchteil des Standards 
tatsächlich vollständig implementiert haben. Du wirst daher im Manual 
oft mehr Möglichkeiten finden, als dann tatsächlich mit Deinem 
merkwürdigen Wickenhäuser Compiler/Lib tatsächlich geht.

Aber schaden tut es nicht, ruhig mal die kompletten Möglichkeiten von 
printf() kennenzulernen.

Also: man printf

und Du hast etwas "Vernünftiges" zu lesen ;-)

: Bearbeitet durch Moderator
Autor: Bastian N. (Firma: Privat) (seal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank M. schrieb:

>
> Allerdings wirst Du auch bemerken, dass die
> Mikrocontroller-Laufzeitumgebungen oft nur einen Bruchteil des Standards
> tatsächlich vollständig implementiert haben. Du wirst daher im Manual
> oft mehr Möglichkeiten finden, als dann tatsächlich mit Deinem
> merkwürdigen Wickenhäuser Compiler/Lib tatsächlich geht.
Mir wurde auch angeraten, gerade deswegen nur die Lehrbücher zu 
verwenden.
Es wäre alles enthalten :/

> Aber schaden tut es nicht, ruhig mal die kompletten Möglichkeiten von
> printf() kennenzulernen.
>
> Also: man printf
>
> und Du hast etwas "Vernünftiges" zu lesen ;-)
Werde in Zukunft das doppelt machen. Also nachdem ich eine Funktion 
beschrieben bekommen habe, diese mit der Manpage zu vergleichen.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Frank M. schrieb:
> Also: man

Oder für die digitalen natives Google...

Oliver

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei printf erwartet %s einen Zeiger auf einen Nullterminierten String 
(C-String)

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bastian N. schrieb:
> Mir wurde auch angeraten, gerade deswegen nur die Lehrbücher zu
> verwenden.
> Es wäre alles enthalten :/

Nenn bitte Ross & Reiter: Wie heißen diese "Lehrbücher"?

Autor: Nils S. (kruemeltee) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bastian N. schrieb:
> Hallo krumeltee,
> kennst du diesen Lehrgang etwa?

Diesen wahrscheinlich nicht, aber zwei andere und die waren unter 
aller ...


Die Wickenhäuser IDE war vielleicht mal was ziemlich tolles, aber da 
gibt's mittlerweile deutlich besseres, kostenloses. Ich habe das Gefühl, 
jeder Berufsschulkurs, dessen Lehrer kein/kaum Englisch kann, baut 
darauf auf...

Autor: PittyJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einerseits will der TE keine anderen Unterlagen benutzen. Andererseits 
tippt er einen längeren Post hier im Forum.
Ich habe im Browser oben in das Suchfenster printf (das sind nur 6 
Buchstaben, ) eingeben, und dann 2mal geklickt, und schon hatte ich alle 
Infos zu printf.

Das sollte man heute in den Kursen vermitteln, dass man auch mal bei 
google nachschaut.

Frage an den Rest hier:
Muss man wirklich für einen 8051 einen Wickenhäuser Compiler verwenden?

https://stackoverflow.com/questions/978189/what-is...

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PittyJ schrieb:
> Einerseits will der TE keine anderen Unterlagen benutzen.

Er schrieb, dass ihm davon abgeraten wurde, nicht dass er nicht will. Da 
der vorliegende Compiler offenbar bei weitem nicht den ganzen 
Funktionsumfang von Standard C enthält, klingt das zunächst ja auch 
sinnvoll. Was bringen einem Unterlagen, die was anderes beschreiben, als 
das, was er nutzen muss?

> Andererseits tippt er einen längeren Post hier im Forum.
> Ich habe im Browser oben in das Suchfenster printf (das sind nur 6
> Buchstaben, ) eingeben, und dann 2mal geklickt, und schon hatte ich alle
> Infos zu printf.

Er hat wohl nicht damit gerechnet, dass der ihm vorliegende 
Dokumentation an der Stelle was fehlen würde. Muss man ja erstmal drauf 
kommen.

> Frage an den Rest hier:
> Muss man wirklich für einen 8051 einen Wickenhäuser Compiler verwenden?

Man muss, wenn man einen Kurs macht, der den vorschreibt.

Autor: Bastian N. (Firma: Privat) (seal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke rmagnus,

genau so ist es, danke.

Was noch anzumerken ist: Für den Kurs gibt es eigentlich kein 
equivalents Informationsmaterial. Nur im Elektorforum habe ich da was 
gefunden. Liegt aber größtenteils am Wickenhäuser und der 8051er ist ja 
auch nicht mehr der Jüngste :)

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PittyJ schrieb:
> Muss man wirklich für einen 8051 einen Wickenhäuser Compiler verwenden?

Muss man wirklich im 21. Jahrhundert eine Lehre überhaupt noch auf dem 
8051 basieren lassen?  SDCC ist meines Wissens auch auf dem Stand von 
C89, wäre also in dieser Hinsicht kein besonderer Gewinn.

Dass die Dinger in freier Wildbahn noch eine gewisse Bedeutung haben, 
ist das Eine, aber für eine Ausbildung würde ich die heutzutage gewiss 
nicht mehr nehmen.  Viele Designentscheidungen darin sind 
technologischen Randbedingungen der Ära vor knapp 40 Jahren geschuldet, 
die man mit einem moderneren Controller nicht mehr braucht.  Auch einen 
kleinen ARM kann man problemlos „bare metal“ programmieren, um so 
jenseits irgendwelcher Codegeneratoren der Hersteller auch die 
tieferliegenden Details noch zu verstehen.

Wenn man den 8051 links liegen lässt, gibt es wiederum genügend gute und 
auch freie / kostenlose Compiler und Entwicklungsumgebungen, dass man 
sich nicht mehr mit angestaubten C-Dialekten rumschlagen muss.

: Bearbeitet durch Moderator
Autor: Bastian N. (Firma: Privat) (seal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg W. schrieb:
> PittyJ schrieb:
>> Muss man wirklich für einen 8051 einen Wickenhäuser Compiler verwenden?
>
> Muss man wirklich im 21. Jahrhundert eine Lehre überhaupt noch auf dem
> 8051 basieren lassen?  SDCC ist meines Wissens auch auf dem Stand von
> C89, wäre also in dieser Hinsicht kein besonderer Gewinn.

Ist keine Lehre, sonder ein Studium bei mir, zwecks Weiterbildung.

> Dass die Dinger in freier Wildbahn noch eine gewisse Bedeutung haben,
> ist das Eine, aber für eine Ausbildung würde ich die heutzutage gewiss
> nicht mehr nehmen.  Viele Designentscheidungen darin sind
> technologischen Randbedingungen der Ära vor knapp 40 Jahren geschuldet,
> die man mit einem moderneren Controller nicht mehr braucht.
Ich verstehe auch nicht wirklich, warum der Studiumslehrgang 
Mikrocontroller sich immer noch um 8051er dreht. Außer das es in der 
Industrie noch eingesetzt wird. Die Studiumsunterlagen sind von 2007. 
Konnte man vorher aber nicht wissen, bzw. besser: erahnen, was man vllt. 
vorher abklären müsste. (Bin ja Anfänger und kann ja nicht wirklich 
wissen was da wichtig ist.). Und in der Regel geht man ja auch davon 
aus, das gerade die Kurse, welche nicht gerade "umsonst" sind - einfach 
aktuell und funktional sein sollten.

Bis jetzt finde ich alles zu diesem Thema (8051er) sehr unhandlich und 
ohne eine detaillierte Anleitung/Herstellerbeschreibung lässt sich da 
praktisch nix entwickeln und dauert meines Empfinden nach sehr, sehr 
lange.

Na ja, was will man machen ¯\_(ツ)_/¯

: Bearbeitet durch User
Autor: Bastian N. (Firma: Privat) (seal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> Bastian N. schrieb:
>> Mir wurde auch angeraten, gerade deswegen nur die Lehrbücher zu
>> verwenden.
>> Es wäre alles enthalten :/
>
> Nenn bitte Ross & Reiter: Wie heißen diese "Lehrbücher"?

Ich habe dir hierzu eine Email über die Forensoftware zugesendet.


MfG
Bastian

Autor: Leermeister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das könnte dein neues Lehrbuch sein:
http://www.cplusplus.com/reference/cstdio/printf/?kw=printf

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bastian N. schrieb:
> int printf(far char* pfmt, ...){
>      va_list(ap);
>      va_start(ap,pfmt);
>      return _doprnt(_putc, pfmt, ap);

Da fehlt ein va_end(ap) nach dem _doprnt().

Autor: Philipp Klaus K. (Firma: Albert-Ludwigs-Universität) (pkk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg W. schrieb:
> SDCC ist meines Wissens auch auf dem Stand von
> C89, wäre also in dieser Hinsicht kein besonderer Gewinn.

Bei SDCC gibt es noch ein paar Lücken bei der Standardkompatiblität, 
aber im großen und ganzen kann man auch C11 (oder etwas eingeschränkter 
C99) verwenden.

Philipp

Autor: Bastian N. (Firma: Privat) (seal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> Bastian N. schrieb:
>> int printf(far char* pfmt, ...){
>>      va_list(ap);
>>      va_start(ap,pfmt);
>>      return _doprnt(_putc, pfmt, ap);
>
> Da fehlt ein va_end(ap) nach dem _doprnt().

Das ist der Code für das printf, welches mit dem Wickenhäuser 
mitgeliefert wird. Ich habe da nichts geändert.

Was hat das für Auswirkungen, wenn da ein va_end fehlt?

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bastian N. schrieb:
> Was hat das für Auswirkungen, wenn da ein va_end fehlt?

Das kann man so nicht sagen, denn die Mimik hinter va_* ist einfach
stark von der Implementierung abhängig.  Kann gut sein, dass eine
konkrete Implementierung hinter va_end gar nichts hat, aber portabler
Code darf sich darauf nicht verlassen.

Es ist also einfach schlampig oder gedankenlos dahin geschrieben worden
von demjenigen, der das tat.

Autor: Walter S. (avatar)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Jörg W. schrieb:
> Auch einen
> kleinen ARM kann man problemlos „bare metal“ programmieren

man muss da definitiv mehr Register anfassen bis mal ein Pin wackelt

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter S. schrieb:
> Jörg W. schrieb:
>> Auch einen
>> kleinen ARM kann man problemlos „bare metal“ programmieren
>
> man muss da definitiv mehr Register anfassen bis mal ein Pin wackelt

Ja, und?
#include "sam.h"

void _init(void)
{
}

int
main(void)
{
  // unusable, since PORT is a macro
  // PM->APBBMASK.bit.PORT = 1;
  PM->APBBMASK.reg = 8;

  /* PA19: input with pulldown */
  PORT->Group[0].PINCFG[19].bit.INEN = 1;
  PORT->Group[0].PINCFG[19].bit.PULLEN = 1;
  PORT->Group[0].OUTCLR.bit.OUTCLR = (1 << 19);

  /* PA16: input with pullup */
  PORT->Group[0].PINCFG[16].bit.INEN = 1;
  PORT->Group[0].PINCFG[16].bit.PULLEN = 1;
  PORT->Group[0].OUTSET.bit.OUTSET = (1 << 16);

  /* LED0 on XPlainedPro: PB30, active low */
  PORT->Group[1].DIRSET.bit.DIRSET = (1 << 30);
  PORT->Group[1].OUTSET.bit.OUTSET = (1 << 30);

  for (;;)
    {
      if ((PORT->Group[0].IN.bit.IN & (1 << 19)) != 0)
        {
          /* PA19 pulled high */
          /* turn on LED */
          PORT->Group[1].OUTCLR.bit.OUTCLR = (1 << 30);
          /* wait for button release */
          while ((PORT->Group[0].IN.bit.IN & (1 << 19)) != 0)
            {
            }
        }

      if ((PORT->Group[0].IN.bit.IN & (1 << 16)) == 0)
        {
          /* PA16 pulled low */
          /* turn off LED */
          PORT->Group[1].OUTSET.bit.OUTSET = (1 << 30);
          /* wait for button release */
          while ((PORT->Group[0].IN.bit.IN & (1 << 16)) == 0)
            {
            }
        }
    }

  return 0;
}

Damit hat man eine LED, die durch das Umstecken eines Jumpers ein-
und ausgeschaltet wird (SAMD20 Xplained Pro).

Ich würde das durchaus noch für anfängertauglich finden, auch wenn es
natürlich ein bisschen mehr ist als bei einem AVR.

: Bearbeitet durch Moderator

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.