Forum: Mikrocontroller und Digitale Elektronik Ist es legitim #include zu "missbrauchen" ?


von Ralph S. (jjflash)


Lesenswert?

Grundsätzlich eine Frage ans Forum:

Ausgangslage:

Es werden zu Unterweisende (die niemals zuvor eine Programmiersprache, 
geschweige denn C oder C++ angefasst) in die einfachsten Grundlagen von 
AVR Programmierung mit C eingeführt.

Nun habe ich relative Schwierigkeiten, am Anfang den Zusammenhang 
zwischen Präprozessor, Compiler und Linker zu erklären.

Wird der Präprozessor noch mit dem Erklärungsmodell eines "suchen und 
ersetzens" verstanden ist das mit dem Linker schon etwas "schwieriger" 
und grundsätzlich wird hinterfragt warum man ÜBERHAUPT etwas aus seinem 
Quellprogramm "auslagert".

Damit die ersten Schritte auch mit Lernerfolgen gekrönt werden können, 
laß ich beim Erklären (mit dem Hinweis darauf, dass diese Methode bei 
größeren Programmen auf ihre Grenzen und Schwierigkeiten stößt) den 
Linker einfach weg (bzw. das Erklären desselbigen und die zu 
Unterweisenden verwenden nur ein Script bei dem durch ein Menü gesagt 
werden kann, ob es Gleitkommazahlen und printf für Gleitkommazahlen 
hinzufügen soll).

Ein Aufteilen (und ich weiß dass das eigentlich eine Todsünde in C ist) 
von Funktionalitäten geschieht dann "einfach" dadurch, dass eine Datei 
(immerhin schön unterteilt in Defines, Prototypen und danach die 
Funktionen) erstellt wird die mittels eines:

#include "meinefunktion.c"

eingebunden wird.

Hier ist "meinefunktion.c" KEINE kompilierbare Datei, sondern schlicht 
so angeordnet, als wäre sie in der Hauptdatei geschrieben.

Das hat beim Erklären den Vorteil, dass ich anfänglich nur minimal mit 
einem Programmgerüst anfangen muß, erste Dinge in der "main" zeigen kann 
und um die vielen Dinge drumherum erst später eingehen werde.

Es sei  noch mal angemerkt, dass das Zusammenspiel zwischen 
Compilevorgang und Linkvorgang zu einem späteren Zeitpunkt gezeigt wird.

Ist sowas legitim oder sträuben sich da dann doch zu arg die Haare ?

Gruß,
Ralph

von Peter II (Gast)


Lesenswert?

Ralph S. schrieb:
> Ist sowas legitim oder sträuben sich da dann doch zu arg die Haare ?

warum sollte man dann überhaupt mit dem Aufteilen anfangen? Lass doch am 
Anfang alles in einer Datei. Dann braucht man den linker auch nicht 
wirklich aufzurufen sondern kann direkt das binary erzeugen.

Wenn es dann an der Zeit ist, das das Projekt größer wird dann erklärt 
man es gleich richtig.

von Joachim B. (jar)


Lesenswert?

Ralph S. schrieb:
> Ist sowas legitim oder sträuben sich da dann doch zu arg die Haare ?

man tut was man muss....

im AVR Studio ist es ein leiches die meinefunktion.c ins Projekt zu 
legen.

in der Arduino IDE 1,05 geht das nicht so leicht, ich nutze eben 
#include "meinefunktion.c"

von Marek W. (ma_wa)


Lesenswert?

Mach dir doch nicht so einen Kopf und fange klein an.

Also das ganze C-Programm kommt in eine Datei und oben sind die 
notwendigen Systemlib mit Include eingebunden.

Dann kannst du ihnen für den Anfang ein Makefile bereits stellen oder du 
lässt sie gcc zum compilieren und linken von Hand ausführen. Mögen deine 
Teilnehmer lästig finden, aber das übt und lässt sie sich später mit 
Freude auf eigene Makefiles stürzen.

Eigene Libs oder aufgeteilten Code würde ich da erst einführen, wenn du 
Arbeitsgruppen bilden möchtest, um die Aufgaben in den Arbeitsgruppen 
schön aufzuteilen. Aber ich denke, mit den Grundlagen von C und der 
Bedienung des AVR sind die in den ersten Tagen gut ausgelastet.

von Joe F. (easylife)


Lesenswert?

mir sträuben sich nicht nur die haare, mir steigt die zornesröte ins 
gesicht!!! erkläre die funktion des präprozessors korrekt, oder 
unterlasse das "unterrichten" ganz. einen bullshit wie 'include "bla.c"
 zu verzapfen ist sträflich. mit so einem müll muss man sich hier im 
forum schon genug rumärgern.

von Ralph S. (jjflash)


Lesenswert?

Marek Walther schrieb:
> Dann kannst du ihnen für den Anfang ein Makefile bereits

Im Moment mach ich das auch so ...

Marek Walther schrieb:
> Aber ich denke, mit den Grundlagen von C und der
> Bedienung des AVR sind die in den ersten Tagen gut ausgelastet

... genau das ist der Grund, warum ich den Linkvorgang erst einmal 
weglassen mag !

Joe F. schrieb:
> mir sträuben sich nicht nur die haare, mir steigt die zornesröte ins
> gesicht!!!

smile, mir sträuben sich nur die Haare (ohne Zornesröte) und genau 
deshalb frag ich hier ja auch nach.
Die ersten Versuche, den Linker zu erklären schlug fehl, weil die Gruppe 
schlicht erst einmal zuhören muß und die relativ schnell "abschalten".

Die Vorgänge haben da schlicht noch nichts mit dem AVR zu tun (und 
leider kommt immer die Frage, wann man etwas sehen kann. Es reicht ihnen 
scheinbar nicht, wenn man ihnen einfach ein Programm vorführt, welches 
funktioniert).

---------------------------------

Nur mal so: bisher hab ich den Linker erklärt, aber es dauerte immer, 
bis die selbst etwas zustande gebracht haben.

Meine Vorgehensweise bisher war:

- zeigen eines Programms wie es auf dem AVR läuft
- zeigen der Dateinamen welche daran beteiligt sind
- erklären dass ein compilieren KEIN lauffähiges Programm erzeugt, 
sondern
  eine linkbare Datei

- (das schwierige jetzt): Kommandozeilenparameter von AVR-GCC
- kompilieren aller einzelnen Dateien
- linken
- elf2hex
- upload

----------------------------------

jetzt ... bin ich eben auf der Suche nach einem besseren Konzept um eben
schneller ein Erfolgserlebnis vermitteln zu können !

von grundschüler (Gast)


Lesenswert?

Ralph S. schrieb:
> #include "meinefunktion.c"

Es geht doch nicht um einen Ritus zur Verehrung des C-Gottes. Wenn das 
Bedürfnis nach Änderungen besteht, kann man ein Computerprogramm 
anpassen.

Wenn du die Konventionen einhalten willst, definier dir einen neuen 
Dateityp, z.B.:
> #include "meine_unterfunktion.sub"

wenn nicht, nimm
> #include "meinefunktion.h"
Grotten-C, vereinfacht aber den Umgang mit C erheblich, da der 
Programmaufbau hierarchisch ist.

schlecht ist nur:
> #include "meinefunktion.c"
weil damit die Datei - bei manchen Compilern - selbständig und 
unkotrolliert - compiliert wird. Das führt bei der Verwendung von 
globalen Variablen zu völlig unnötigen Problemen, die Anfänger weder 
verstehen noch interessieren.

von Stefan F. (Gast)


Lesenswert?

Ich denke nicht, dass #include nur dazu genutzt werden darf, Header 
Dateien einzubinden. Das ist lediglich der gewöhnliche Anwendungfall.

Ich habe zum Beispiel einen Codegenerator, der Binärrdateien einliest 
und daraus Ketten von hexadezimalzahlen generiert und als Plain-Text 
Datei ablegt.

Diese binde ich mitten im Source Code mit #include ein, um daraus Arrays 
zu machen. Klappt prima und ich sehe keinen grund, warum man das nicht 
machen sollte.

Ich habe nichts gegen Ausnahmen, solange der Programmcode gut lesbar 
bleibt. Man sollte es nur nicht übertreiben.

von Pete K. (pete77)


Lesenswert?

Include von .c Dateien hat nur wirklich nichts mit C-Programmierung zu 
tun.

Wie wäre es, Dein Halbwissen mit der Lektüre eines guten Buches zu 
ergänzen:
http://www.amazon.de/Programmieren-C-Reference-Manual-deutscher-Sprache/dp/3446154973

Das Geld sollte es Dir Wert sein.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ralph S. schrieb:
> Damit die ersten Schritte auch mit Lernerfolgen gekrönt werden können,
> laß ich beim Erklären (mit dem Hinweis darauf, dass diese Methode bei
> größeren Programmen auf ihre Grenzen und Schwierigkeiten stößt) den
> Linker einfach weg
Das ist, wie wenn du beim Erklären der Funktionsweise eines KFZ-Antriebs 
einfach das Getriebe weglässt. Man kann sich zwar schon vorstellen, dass 
das geht, aber man kommt schnell drauf, dass "irgendwas fehlt".

> Nun habe ich relative Schwierigkeiten, am Anfang den Zusammenhang
> zwischen Präprozessor, Compiler und Linker zu erklären.
Mir fehlt hier der wichtige und oft unsichtbare Zwischenschritt 
"Assembler". Denn man kann sich den vom Compiler erzeugten Code ja 
durchaus mal anzeigen lassen und bewerten...

> Es sei  noch mal angemerkt, dass das Zusammenspiel zwischen
> Compilevorgang und Linkvorgang zu einem späteren Zeitpunkt gezeigt wird.
>
> Ist sowas legitim oder sträuben sich da dann doch zu arg die Haare ?
Es ist ein unnötiger umständlicher Umweg.
Warum machst du nicht zu Beginn einfach nur solche Projekte, die ein 
"Aufteilen" oder "Einbinden" überhaupt nicht brauchen?

von Cyblord -. (cyblord)


Lesenswert?

grundschüler schrieb:
> Ralph S. schrieb:
>> #include "meinefunktion.c"
>
> Es geht doch nicht um einen Ritus zur Verehrung des C-Gottes. Wenn das
> Bedürfnis nach Änderungen besteht, kann man ein Computerprogramm
> anpassen.

Nein es geht um die Vermittlung einer elementaren Grundlage: Trennung 
von Interface und Implementierung. Das ist kein sinnloser Ritus, sondern 
solche grundlegenden Konzepte sind meist das einzige was noch zwischen 
uns und der (Code-)Hölle steht.

Anfängern etwas anderes beizubringen ist töricht.

von Karl H. (kbuchegg)


Lesenswert?

Ralph S. schrieb:

> Nur mal so: bisher hab ich den Linker erklärt, aber es dauerte immer,
> bis die selbst etwas zustande gebracht haben.

es reicht für den Anfang völlig, wenn sie wissen, dass es ihn gibt.
Mehr brauchen sie bei den ersten Projekten nicht wissen.

Den Linker braucht man, damit all die vorgefertigten Funktionen mit zum 
Programm dazukommen, die in der sog. Runtime Library zusammengefasst 
werden. Also die Implementierungen für Sinus; die String Funktionen; die 
ganzen Funktionen, die Arithmetik abhandlen; printf; .....

der Vorgang
1
       Source Code (zb a.c)       Source Code (zb b.c)
2
           |                           | 
3
           v                           v
4
     +--------------+          +--------------+
5
     | Preprozessor |          | Preprozessor | <---- Header Files (zb. a.h)
6
     +--------------+          +--------------+
7
           |                           |
8
           v                           v
9
       Zwischencode                Zwischencode
10
           |                           |
11
           v                           v
12
     +--------------+          +--------------+
13
     | eigentlicher |          | eigentlicher |
14
     | Compiler     |          | Compiler     |
15
     +--------------+          +--------------+
16
           |                           |
17
           v                           v
18
      Object Code                  Object Code 
19
           |                           |
20
           +----------+  +-------------+
21
                      |  |
22
                      v  v
23
                +---------------+
24
                | Linker        | <------ System Libraries (zb. fertige Implementierung
25
                +---------------+             für sqrt oder printf
26
                       |
27
                       v
28
                fertiges Program

sollte so schwer nicht zu erklären sein bzw. nicht viel Zeit in der 
Durchbesprechung verschlingen.

Mehr brauchen sie am Anfang nicht wissen.
Insbesondere alle Aufrufparameter braucht man am Anfang wirklich nicht 
kennen. Die wichtisten reichen völlig.

Wichtig ist, dass sie das Konzept verstanden haben. Wenn sie am Anfang 
mit von dir vorgegebenen makefiles arbeiten, dann ist das völlig ok. 
Gerade am Anfang hat man in der AVR Programmierung Programme, die 
kleiner als 1, maximal 2 Bildschirmseiten sind. Dazu braucht man nicht 
mehrere Compile-Pfade. Aber den Linker einfach wegzulassen ist keine 
gute Idee. Zumindest konzeptionell sollte man schon wissen, dass es 
diesen Schritt gibt und was dort passiert. Wenn sie wissen, dass dort 
die unabhängig voneinander compilierten Einzelteile, zusammen mit den 
bereits fertig übersetzen Teilen aus der Runtime-Library zusammengeführt 
werden, dann genügt das völlig.
Schreib in dem Diagramm noch die typisch benutzten Command Line 
Argumente dazu, und dann sollte eigentlich jeder in der Lage sein, mit 
einem Ausdruck dieses Diagramms an der Seite ein einzelnes C-File 
korrekt bis zum fertig Programm durch den Prozess durchzuschleusen.

: Bearbeitet durch User
von Steffen R. (steffen_rose)


Lesenswert?

Man sollte Anfängern nicht erklären, was technisch alles geht.
Aus meiner Sicht sollte man von Anfang an auf das übliche Vorgehen 
beschränken und so von Anfang an auf ein ordentlichen Programmierstil 
hinarbeiten.

Immerhin schauen Anfänger häufig in fremden Code und sollen sich dort 
auch zurechtfinden.

von Andreas D. (rackandboneman)


Lesenswert?

Wenn es Code für sehr kleine Maschinen (sagen wir PIC16 oder 8051) ist 
macht es doch durchaus Sinn alles aus dem Präprozessor rauszuholen, 
nicht nur über #include sondern vor allem auch über #define/#ifdef- wenn 
man da mit Bibliotheken arbeitet stopft man sich nur den 
Programmspeicher und viele Zyklen mit totem Code von Funktionen zu bei 
denen bestimmte Parameter eigentlich IMMER letztendlich aus einer 
Konstanten übergeben werden und daher eigentlich Konfiguration und keine 
Parameter sind.
Vorsicht ist aber geboten wenn man mit Makros Makros definiert ... da 
benehmen sich zB ein älterer sdcc-Präprozessor oder der gnu-cpp in 
Details sehr unterschiedlich....

Rausfinden ob irgendwas "selbständig und unkontrolliert" kompiliert wird 
ist sehr einfach - einfach dafür sorgen dass der Inhalt der inkludierten 
Datei ohne den Kontext des #include-Statements syntaktisch ungültig ist, 
zB in dem man eine Kontrollstruktur über beide Dateien aufteilt ;)
Oder aber man schreibt sein Makefile oder Buildskript so dass die 
Quelldatei auf jeden Fall erstmal durch den cpp gedreht wird!

von Mark B. (markbrandis)


Lesenswert?

Steffen Rose schrieb:
> Immerhin schauen Anfänger häufig in fremden Code

Jeder Programmierer schaut häufig in fremdem Code.

von Nelson Manns (Gast)


Lesenswert?

>Es werden zu Unterweisende (die niemals zuvor eine Programmiersprache,
>geschweige denn C oder C++ angefasst) in die einfachsten Grundlagen von
>AVR Programmierung mit C eingeführt.

Meiner Meinung nach geht es am Anfang darum, Hürden abzubauen. Stichwort 
ist "implizites" und "explizites" Lernen. Den Ablauf von Editor, 
Präprozessor, Make, Linker etc. zu erklären ist ganz klar explitites 
lernen und führt auf den ersten Metern bei den Zuhörern nur zu der Frage 
"Und wozu?" Sie können nicht einordnen, was sie hören und so 
verschwindet es bei vielen gleich im Nirvana.

Ich würde es für besser halten ein paar einfache "Hands-On" Beispiele zu 
machen.
DDR'n' und PORT'n' setzten und leuchten lassen.
Vielleicht was fertiges nur verändern.
Dann blinken lassen.
Dann mal von nem einfachen 8 Bit Timer Datenblatt lesen lassen.
Dann mittels Timer blinken lassen.

Wenn dann ein erster aha Effekt da ist, würde ich hinter die Kulissen 
schauen. Das Gehirn lernt bei völlig neuen Bereichen erstmal besser 
Implizit.  Jedes Sprachbuch fängt mit "Ich bin..." "Ich komme aus..." 
an, ohne gleich Grammatik zu erklären.

von Georg W. (gaestle)


Lesenswert?

Wissensvermittlung oder Abschreckung und Verunsicherung? Falls letzteres 
das Ziel ist, dann ist es sinnvoll mit den ganzen Details anzufangen, 
vorzugsweise noch alles auf Händen und Knien auf der Kommandozeile 
erledigen lassen. Sonst reicht für den Anfang das Wissen, das es das 
alles gibt aber momentan die Standardeinstellungen und eine einzige 
C-Datei reichen. Lieber zuerst einige einfache Aufgaben durcharbeiten 
lassen und dabei auf einen sauberen Stil (Lesbarkeit, vernünftige 
Kommentierung usw.) achten.

von Andreas D. (rackandboneman)


Lesenswert?

"Man sollte Anfängern nicht erklären, was technisch alles geht."

Doch. Zumindest sollte man niemals sagen "es geht nicht" wenn es 
technisch geht, das ist dann Unwissensvermittlung.

von Locator (Gast)


Lesenswert?

Ähhmmm, ihr wisst aber, dass der Linker mehr macht, als nur die OBJ 
zusammen zu packen?

Wie kommen wohl die absoluten Adressen in das Maschinen Programm?

Ohne Linker geht es nicht!

von Jay (Gast)


Lesenswert?

Wenn das Ziel ist irgendwann man schlechte Programmierer zu haben, dann 
ist #include "meincode.c" eine richtig gute Idee. Aber sowas von richtig 
gut ...

Alternativ, wenn einem sonst nichts einfällt, und man nicht weiß was man 
da eigentlich unterrichtet, kann man einfach die ersten Abschnitte aus 
dem ersten Kapitel aus dem K&R präsentieren. Die sind einfach gehalten, 
dass sollte auch den Lehrenden nicht überfordern.

von Andreas D. (rackandboneman)


Lesenswert?

@Jay ein guter C-Programmierer wird einsehen dass manche in einer "void 
main()"-Umgebung sehr sinnvolle Vorgehensweise in einem portablen 
Programm das oberhalb eines Betriebssystems laufen soll nichts zu suchen 
hat und vice versa.

von Rudolph (Gast)


Lesenswert?

Präprozessor? Compiler? Linker? AVR?

Im Studio nen leeres Projekt anlegen und auf den Build Knopf drücken und 
unten kommt das Compilat raus.

Klingt irgendwie dumm aber wir haben 2015 und nicht 1995.

Klar kann man erklären, was es mit den #include Zeilen auf sich hat die 
per Default mit eingefügt werden.
Aber interessant ist das nur am Rande - für den Einstieg.

Wichtig ist doch erstmal, dass das "Hello World" klappt und man 
vermittelt, was man mit dem neuen Spielzeug alles so anstellen kann.
Und schrittweise wie man das geschickter macht.

GCC habe ich zuletzt von der Kommandozeile auf meinem Amiga benutzt, 
zwar OS4 und PPC aber dennoch Jahre her, da bestand meine Anwendung auch 
aus 18 Modulen mit zusammen über 20k Zeilen Quelltext und nem Haufen .h 
Dateien dazu.
Da machte es dann auch noch ein wenig "Sinn", in welcher Reihenfolge man 
im Makefile die Objekte zusammengepuzzelt hat um die resultierende 
Binär-Datei zu optimieren.

Für die AVRs habe ich noch nie ein Makefile schreiben müssen und 
normalerweise habe ich auch nur eine Objekt-Datei, vielleicht mal zwei.

Auf dem Weg zum Techniker hatte ich nen Kurs Software-Entwicklung, 
soweit ich mich erinnern kann hat der Dozent nichtmal erwähnt, dass es 
sowas wie einen Linker gibt und auch der Prä-Prozessor war eher nicht 
interessant.
Wichtiger war ihm die Elemente der Sprache C richtig rüber zu bringen 
und was man damit anfangen kann.

von Peter II (Gast)


Lesenswert?

Rudolph schrieb:
> Im Studio nen leeres Projekt anlegen und auf den Build Knopf drücken und
> unten kommt das Compilat raus.

und dann stehen die Leute dumm da wenn es eine Fehlermeldung gibt 
(Symbol nicht gefunden) und verstehen nicht was sie falsch gemacht 
haben.

Jeder C Entwickler sollte von Hand ein Programm bauen können, wenn er 
das verstanden hat darf er es auch mit der IDE machen.

von Bernhard D. (pc1401)


Lesenswert?

Besonders "spaßig" ist das Debuggen bzw. Verändern von Programmen mit 
solchen #include "xxx.c" Konstrukten. Wenn man da mal 20 und mehr 
Quelldateien hat, wird das Ganze zum unentwirrbaren Mikado.

Ich durfte mich vor einiger Zeit mal mit so etwas herumschlagen, solch 
ein Paket fasse ich nicht mal mehr mit der Kneifzange an.

von Michael (Gast)


Lesenswert?

Hallo,

ich halte das Einbinden von *.c-Dateien per Include auch für sinnlos, 
besonders um die Elemente des Compilers, Linkers, ... zu erklären.

Peter II schrieb:
> und dann stehen die Leute dumm da wenn es eine Fehlermeldung gibt
> (Symbol nicht gefunden) und verstehen nicht was sie falsch gemacht
> haben.
>
> Jeder C Entwickler sollte von Hand ein Programm bauen können, wenn er
> das verstanden hat darf er es auch mit der IDE machen.

Jop, das sollte evtl. so sein, jedoch nicht als erster Schritt. Erstmal 
die Sprache selber mit ihren Fallstricken, dann der Weg über Hand. Wenn 
überhaupt.

Soll heißen die Standard-Includes werden eben angesprochen als "hier 
wird eins zu eins der Code aus dem File übernommen, den braucht das 
Programm um die verwendeten Funktionen und Variablen zu definieren", 
ansonsten geht es ans "Hello world" und wen interessiert hier erstmal 
der Linker?

Besonders weil einmal gelerntes schwer wieder zu verlernen ist. Die 
machen das dann weiterhin so, auch wenn du später dann sagst: "das ist 
aber eigentlich schlechter Stil, hier werden nur Header-Files 
eingebunden"

Fazit: Lass es!

von Karl H. (kbuchegg)


Lesenswert?

Michael schrieb:

> Besonders weil einmal gelerntes schwer wieder zu verlernen ist.

Genau so ist es.

Das und die Unterscheidung welche Fehlermeldungen vom Compiler und 
welche vom Linker kommen und warum.

So ganz kommt man also um die Funktionsweise eines Linkers nicht rum, 
auch wenn am Anfang eine ganz einfache simple Erklärung reicht. Sonst 
kann man eine Fehlermeldung "undefined reference" einfach nicht richtig 
deuten. Hat man nur ein Source Code File, dann kann man sich noch 
retten. Aber spätestens wenn dann irgendwann doch mehrere C-Files im 
Spiel sind, muss man zumindest prinzipiell wissen, wo so eine 
Fehlermeldung aus welchem Grund entsteht.

von Rudolph (Gast)


Lesenswert?

Karl Heinz schrieb:
> Aber spätestens wenn dann irgendwann doch mehrere C-Files im
> Spiel sind, muss man zumindest prinzipiell wissen, wo so eine
> Fehlermeldung aus welchem Grund entsteht.

Das ist richtig, aber wenn man an dem Punkt ankommt ist es ja nicht zu 
spät noch was neues zu lernen.

Und auch eine neue Fehler-Meldung schraubt den Kopf nicht ab.

Komisch, in meinem alten Kernighan/Ritchie steht "Linker" nicht mal im 
Inhaltsverzeichnis.
Und der C-Preprozessor taucht in Kapitel 4.11 ab Seite 86 auf.

von Michael (Gast)


Lesenswert?

Rudolph schrieb:
> Karl Heinz schrieb:
>> Aber spätestens wenn dann irgendwann doch mehrere C-Files im
>> Spiel sind, muss man zumindest prinzipiell wissen, wo so eine
>> Fehlermeldung aus welchem Grund entsteht.
>
> Das ist richtig, aber wenn man an dem Punkt ankommt ist es ja nicht zu
> spät noch was neues zu lernen.
>
> Und auch eine neue Fehler-Meldung schraubt den Kopf nicht ab.
>
> Komisch, in meinem alten Kernighan/Ritchie steht "Linker" nicht mal im
> Inhaltsverzeichnis.
> Und der C-Preprozessor taucht in Kapitel 4.11 ab Seite 86 auf.

Weil man bis dahin locker ohne Präprozessor und noch viel viel länger 
ohne Wissen über einen Linker auskommt.
Und "was neues" zu lernen ist das eine, was "umzulernen" das andere - 
wenn ich mich zurückerinnere, wie das war, als wir das gelernt hatten...
Etwas falsches wird auch zu Demo- oder Vereinfachungszwecken nicht 
richtiger, auch wenn es vielleicht funktioniert.
Ich denke dass die meisten Programme bis hin übers Tutorial hinaus (und 
ein Unterricht mit den Grundlagen wird ws. nur ein ähnliches Stoffgebiet 
abdecken?), kommt ohne den Linker aus und sollte sich mit den 
wesentlichen Dingen bei der Programmierung selber beschäftigen, nicht 
mit dem Weg, der dahintersteht. (Kommandozeile höchstens in einem 
Aufbaukurs!!!)

AVR Studio auf, Projekt aufsetzen und "Übertragen" drücken kann auch 
schwer genug für einen Anfänger sein, siehe diverse Threads dazu)

LG

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Rudolph schrieb:
> Komisch, in meinem alten Kernighan/Ritchie steht "Linker" nicht mal im
> Inhaltsverzeichnis.
Die Jungs beschreiben ja auch die Sprache C mit ihren Syntaxelementen.
Sie sagen aber nicht, wie man den Code compiliert und aus dem Compilat 
eine irgendwie irgendworauf ausführbare Datei machen könnte...

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Guten Morgen,

ich hatte gestern eine Unterrichtseinheit gehalten und den "richtigen" 
Weg mit Compilieren UND linken am Beispiel einer (vorgefertigten) 
seriellen Minilibrary, Header und bedingter Compilierung durch 
Präprozessor (Auswahl der Registernamen in Abhängigkeit des gewählten 
Controllers).

Es hat die ganze Einheit benötigt bis das gesessen hat.

Aaaaaber, ich werde eure Kommentare und Anmerkungen beherzigen und bei 
der Einführung es eben doch MIT Präprozessor und Linker machen.

By the way:

Das ganze geschieht NICHT mit dem Atmelstudio, es läuft unter Linux, 
noch mit Geany und damit die Vorgänge "deutlich" werden, wird der Aufruf 
von AVR-GCC auf der Konsole von Hand eingegeben (mit einer Liste, welche 
Parameter AVR-GCC besitzt).

Auch die zu Unterweisenden waren der Meinung, dass, wenn man schon mal 
etwas nach einer bestimmten Methode hinbekommen hat, es so sein kann, 
dass man zu faul ist, es anschließend "richtig" zu machen.

Am zweiten Beispiel war der Vorteil der "richtigen" Methode deutlich 
geworden:

- Hauptprogramm bindet Library "coldisplay" zum Ansprechen eines 
Farbdisplays ein
- eine weitere Library kann eine PCX Grafik darstellen und benötigt 
hierfür eine Funktion "putpixel" die auch in "coldisplay" vorhanden ist.

Hier konnte sehr gut demonstriert werden, WARUM im Header KEINE 
Variablen deklariert werden dürfen, was ein

extern uint16_t rgb565;

ist und was passiert, wenn man bspw "coldisplay" nicht hinzulinkt, und 
dass ein "undefined reference" letztlich ein fehlender Code oder 
fehlende Variable ist und der Linker deswegen keine Adresse zu selbigem 
hat.

Die zur Unterrichtung entstehende TUI - IDE ist hierfür nun geändert 
(siehe Bilder). Es kann nun ein einzelner Übersetzungsvorgang gestartet 
werden oder ein "Compile & Link".

Die Linkeroptionen bietet die Möglichkeit, Dateien, die dazugelinkt 
werden sollen anzugeben. Hier wird es dann so sein: ist eine C-Datei 
angegeben wird diese logischerweise vor dem Linken übersetzt, ist eine 
o-Datei angegeben wird diese "einfach nur" hinzugelinkt !

---------------------------------------------------------------

An vorherige (bisweilen auch höchst bissige und abfällige) Kommentare:
Mir ist sehr bewußt, dass ich bestimmt nicht ALLES weiß, aber ich denke
schon dass ich genug weiß um jemand anderem C-Programmierung 
beizubringen. Ob man das nun Halbwissen nennen soll weiß ich nicht.

"Witzig" finde ich, dass es von einigen Forumsmitgliedern
schon mal grundsätzlich "abfällige" und vor allen Dingen beleidigende
und persönlich beleidigende Kommentare gibt (von Mitgliedern, die wenn 
man liest, wohl fachlich extrem qualifiziert sind, menschlich aber 
absolut versagen). Ich finde so etwas unglaublich (und vor allem extrem 
unhöflich). Deshalb gilt hier mein besonderer Dank denen, die hier 
sachlich Kommentare angebracht haben und die vor allen Dingen verstanden 
haben, dass es in der Frage darum ging, wie man dieses Thema rüberbringt 
und nicht, wie etwas "RICHTIG" gemacht wird.

Für mich ist die Frage, ob man aus didaktischen Gründen ein "#include 
blafasel.c" verwenden darf mit einem klaren "NEIN" beantwortet und ich
werde das so auch nicht unterrichten, sondern eben weiterhin MIT einer
normalen und richtigen "#include dateiname.h"

Dieses wird hierfür in Zukunft sogar als aller erstes gezeigt werden, 
noch bevor eine einzige Zeile codiert wird, um Aufzuzeigen aus welchen 
Teilen ein fertiges Programm besteht.

Beim Kapitel "call by reference" und dem Umgang mit den Pointern erhoffe 
ich mir, dass dort das Erklären einfacher sein (in Bezug auf übergeben 
einer Adresse)!

---------------------------------------------------------------

Smile, mir ist bewußt, dass auch dieses Vorgehen manchen aufstoßen wird.

Einfach nur irgendwo "klicken" und dann kommt der "Code" heraus finde 
ich im übrigen nicht richtig und deswegen wird die Kommandozeile auch 
noch eine Weile bestehen bleiben.

Grundsätzlich wird es darauf hinauslaufen, das ganze prinzipiell OHNE 
X-Unterstützung zu bewerkstelligen und eine speziell zum Unterricht 
passende IDE verwendet werden wird.

von Nelson Manns (Gast)


Lesenswert?

Hallo,

mich interessiert aus Neugier welcher "Art" deine zu Unterweisenden 
sind. Habe nicht vor, dir Tips zu geben.
Ich frage mit dem Hintergrund, wie ich es im Studium erlebt habe. Da war 
Der Sprung für einige wohl recht weit, dass da ein schwarzes Ding mit 
Pins liegt wo ein Programm drauf läuft. Mir war das nicht neu, weil ich 
schon vor dem Studium in Eigenregie mit C-Control und dann mit Atmel 
Megas hantiert habe. Da dann ganz klassisch, wie der Bastler das macht. 
Blink-Blink und was juckt mich der Linker...

von Ralph S. (jjflash)


Lesenswert?

Die zu unterweisenden sind Auszubildende im Beruf:

- Elektroniker für Geräte und Systeme
- Physiklaborant

und aus privater Initiative Real- und Gymnasialschüler 10. Klasse (die 
sich für Elektronik interessieren) ... in einer Art "AG".

Kennzeichnend ist, dass alle niemals irgendetwas getan haben in Richtung 
Microprozessoren.

Die Azubis Elektroniker wissen, was Widerstände, Kondensatoren und 
Transistoren sind, sie kennen Wechselstromwiderstände und 
Zeigerdiagramme.

Außerdem kennen sie Grundwissen Operationsverstärker und logische 
digitale Verknüpfungen.

---------------------------------

Aber wie bereits erwähnt werde ich nun die grundsätzlichen Zusammenhänge 
und das Zusammenspiel von Präprozessor, Compiler und Linker als 
allererstes machen !

von Ralph S. (jjflash)


Lesenswert?

PS: als "Spielzeug" (nach dem Steckbrett) gibt es das hier auf dem ihre 
Programme und Versuche laufen:

http://www.mikrocontroller.net/attachment/244662/atmelboard_kl.jpg

von Steffen R. (steffen_rose)


Lesenswert?

Andy D. schrieb:
> > "Man sollte Anfängern nicht erklären, was technisch alles geht."
>
> Doch. Zumindest sollte man niemals sagen "es geht nicht" wenn es
> technisch geht, das ist dann Unwissensvermittlung.

Einen Anfänger nicht mit Details zu überfrachten, die er mangels 
Zusammenhang noch garnicht versteht ist etwas anderes als etwas falsches 
zu vermitteln.

Auf entsprechende Rückfrage kann man schon sagen, das vieles geht, aber 
die Erklärung erst später folgt.

von Ralph S. (jjflash)


Lesenswert?

Smile, ich hab mich ja bekehren lassen und werde das nicht tun ...

und habe eigens dafür in der zu verwendenden Entwicklungsumgebung die 
Linkeroptionen doch eingefügt.

Sie bekommen gesagt:

- niemals Definitionen im Header

außerdem:

#infdef inmyheader
  #define inmyheader

// Prototypen und bla bla

#endif

und sie müssen nur noch auf "additional files to link" damit diese 
Dateien
später hinzugelinkt werden (hier werden dann, so es eine Quelldatei ist 
diese
vor dem linken automatisch und immer erst übersetzt. Ist sie bereits 
übersetzt
wird sie nur hinzugelinkt).

Wenn das alles dann sitzt, lernen sie die Kommandozeilenparameter.

Ich denke, damit werden doch wohl alle auch einverstanden sein !

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.