Ich habe in einem Programm von Thomas Pfeiffer http://thomaspfeifer.net/tochterblitz_ausloeser.htm einige C-Zeilen gefunden, die ich nicht deuten kann: #define cbit(_a,_b) _a&=~(1<<_b); #define sbit(_a,_b) _a|=(1<<_b); und weiter unten im Programm dann: sbit(PORTC,0); sbit(DDRD,4); cbit(PORTD,4); Frage: Was machen diese beiden define Statements? Ist es vielleicht so, daß es in C keine Möglichkeit wie z.B. in Bascom gibt, einfach mit: SET Portc.0 und RESET Portc.0 zu arbeiten und er deshalb solche Sachen "selbst anfertigen" mußte? MfG Paul
> sbit(PORTC,0); PORTC |= (1<<0); > sbit(DDRD,4); DDRD |= (1<<4); > cbit(PORTD,4); PORTD &= ~(1<<4); > Frage: Was machen diese beiden define Statements? Definieren Makros (Regeln) für den C-Präprozessor. Der C-Präprozessor macht eine Textersetzung nach den Regeln s.o. > Ist es vielleicht so, daß es in C keine Möglichkeit wie z.B. in > Bascom gibt, einfach mit: > SET Portc.0 und RESET Portc.0 zu arbeiten und er deshalb solche > Sachen "selbst anfertigen" mußte? In manchen aufgebohrten C Toolchains gibt es etwas ähnliches. Im AVR-GCC nicht.
#define cbit(_a,_b) _a&=~(1<<_b); #define sbit(_a,_b) _a|=(1<<_b); und weiter unten im Programm dann: sbit(PORTC,0); sbit(DDRD,4); cbit(PORTD,4); ----------------- PORTC|=(1<<0); DDRD|=(1<<4); PORTD&=~(1<<4); einfach nur ersetzt. erster Wert ist _a und der zweite _b
Paul Baumann schrieb: > Ist es vielleicht so, daß es in C keine Möglichkeit wie z.B. in > Bascom gibt, einfach mit: > SET Portc.0 und RESET Portc.0 zu arbeiten und er deshalb solche > Sachen "selbst anfertigen" mußte? C weiß nichts von Ports. C Compiler gibt es für Computer von simplen µC bis hinauf zu Supercomputern, die globale Klimaprobleme durchrechnen. Und alle sprechen die gleiche Sprache - nämlich C. Denn anders als BASCOM ist C eine genormte Sprache. Mit genormten Elementen und genormten Verhalten (und der einen oder anderen kleinen Erweiterung für Spezialsachen, wenns gar nicht anders geht) Auch dein BASCOM muss ja letztendes bei SET Portc.0 für den µC die entsprechenden Assembler-Anweisungen generieren. Ob du nun SET Portc.0 oder PORTC |= ( 1 << PC0 ); schreibst, ist eine reine Frage der Ästhetik, auf der Maschine passiert 100% dasselbe. Nur dass man in C sich selbst einen Mechanismus ausdenken kann, der einem gefällt, und das Bitgeschubse 'verdeckt'. Bei BASCOM hat dir das der Entwickler abgenommen und dir den Mechanismus der ihm gefällt aufs Auge gedrückt.
Ich danke Euch für die Erklärungen und Hinweise. Hintergrund ist, daß ich den Algorithmus des Programmes in Bascom programmieren will. Das gestaltet sich jetzt ziemlich einfach. Da ich nur für mich selbst Programme schreibe, muß ich kein C beherrschen. Solche Sachen: &=~ machen mich immer ganz porös. ;-) MfG Paul
Paul Baumann schrieb: > > Solche Sachen: &=~ machen mich immer ganz porös. > ;-) reine Gewohnheit. So wie Ungarn, Tschechen, Franzosen, Italiener und was weiß ich noch wer, ihre ganzen Hatschecks und Apoströphchens nicht mehr sehen und die für sie völlig normal sind und dazugehören. Uns sind ihre Verschnörkelungen suspekt und denen sind unsere Umlautdoppelpunkte suspekt. Ein C-Programmierer liest solche Dinge PORTC &= ~( 1 << DC1 ); ganz normal und ohne Stocken als "Bit DC1 am Port C abschalten". Die Sonderzeichen gehören dazu. Und wenn du das 2 Millionen mal gesehen hast, findest du es ganz natürlich.
@Karl-Heinz Ja, das mag schon sein, aber nichts desto Trotz sind doch Quelltexte in Pascal oder Basic viel einfacher zu lesen, weil sie fast in "Umgangssprache" auf dem Papier stehen. Da sehe ich ziemlich sofort, was der Programmierer wollte. Woher kommt denn eigentlich diese Übermacht der C-Programmierer und -Versteher? Bekommen die Leute das beim Studium aufgehalst? Das ist doch eine große Umgewöhnungsphase vom "normalen" Schreiben von mathematischen Termen zu so einem Kauderwelsch und außerordentlich fehlerträchtig beim Eingeben des Quelltextes denkt sich Paul
Paul Baumann schrieb: > Da sehe ich ziemlich sofort, was der Programmierer wollte. > Woher kommt denn eigentlich diese Übermacht der C-Programmierer und > -Versteher? Bekommen die Leute das beim Studium aufgehalst? C ist durch Unix sehr populär geworden. Ausserdem ist die Sprache nicht sehr umfangreich, so dass erste Compiler praktisch überall schnell verfügbar waren, da relativ leicht zu schreiben bzw. anzupassen. Und Vorlagen bekam man von AT&T praktisch umsonst.
>Ob du nun SET Portc.0 >oder PORTC |= ( 1 << PC0 ); >schreibst, ist eine reine Frage der Ästhetik, auf der Maschine passiert >100% dasselbe. Nee, nee, nee. Abhängig vom Prozessor verwendet der eine Compiler einen Befehl, der nur das eine Bit beeinflußt, der andere generiert einen read-modify-write Zugriff, der das komplette Byte schreibt. Wenn im letzten Fall ein anderes Bit per Interrupt zwischen read-write verändert wird, gibt es einen üblen, schwer zu findenden Seiteneffekt. Um dagegen abgesichert zu sein, müßte man den Interrupt im #define sperren.
Karl-Heinz schrob:
>C ist durch Unix sehr populär geworden.
Ach, da habe ich garnicht mehr dran gedacht, daß das ganze System in C
geschrieben worden ist.
MfG Paul
Paul Baumann schrieb: > Woher kommt denn eigentlich diese Übermacht der C-Programmierer und > -Versteher? Bekommen die Leute das beim Studium aufgehalst? Das Basic gibt es eigentlich nicht. Es gibt tausende von Sprachen, die sich irgendwas mit Basic nennen und sich untereinander entfernt ähneln. Aber eben nur entfernt. Viele sind Einmannsprachen, hat der Autor keine Lust mehr => Tonne. Allein das reicht als Abschreckung oft aus. C ist die dominante Sprache der meisten heutigen Betriebssysteme, insbesondere natürlich der Unixoiden, aber auch Windows ist massgeblich davon geprägt. > Das ist doch eine große Umgewöhnungsphase vom "normalen" Schreiben von > mathematischen Termen zu so einem Kauderwelsch und außerordentlich > fehlerträchtig beim Eingeben des Quelltextes denkt sich C ist keine saubere Sprache. Nie gewesen und wird es auch nicht mehr. Aber nicht so sehr der Symbolik wegen. Denn ob eine auf Symbolen beruhende Sprache an Stelle von seitenlangem COBOL-Geschwafel besser oder schlechter ist, das ist ein bischen Ansichtssache. Vor allem wenn man mit APL angefangen hat (Wikipedia: http://tinyurl.com/yvz3xd ;-). Mathematiker pflegen ja auch ausgiebig in Symbolen zu korrespondieren.
@A.K. Um Gottes Willen! Das sieht ja noch viel gemeiner aus. Warum hast Du das getan? Warum nur? ;-)
Paul Baumann schrieb: > Um Gottes Willen! Das sieht ja noch viel gemeiner aus. Warum hast Du das > getan? Warum nur? APL hat einen eminent mathematischen Charakter, korrespondierend zur linearen Algebra. Programmiert wird mehrdimensional im Kopf, weil die grundlegenden Daten n-dimensionale Arrays sind, mit dem Skalar als Spezialfall n=0. Eignet sich ganz gut um in solchen Sphären denken zu lernen. Ist natürlich nur für manche Fragestellungen geeignet, für andere nicht. Aber der Grund war banaler: Es gab sonst nichts ;-). Das war zu einer Zeit, als in den Schulen noch keine PCs rumstanden, weils noch keine gab. Sondern in diesem (sehr besonderen) Fall eine Schreibmaschine mit Standleitung an einen Firmen-Mainframe. Unsere Versuche mit einem Schachprogramm fanden rechenzeitbedingt (lies: Kosten) deshalb auch nicht wirklich grosse Zustimmung seitens der Schule.
Paul Baumann schrieb: > @Karl-Heinz > Ja, das mag schon sein, aber nichts desto Trotz sind doch Quelltexte > in Pascal oder Basic viel einfacher zu lesen, weil sie fast in > "Umgangssprache" auf dem Papier stehen. > > Da sehe ich ziemlich sofort, was der Programmierer wollte. > Woher kommt denn eigentlich diese Übermacht der C-Programmierer und > -Versteher? Bekommen die Leute das beim Studium aufgehalst? Das mit dem leichter lesen bezweifle ich. Es ist, wie es Karl heinz Buchegger schrieb Ansichtssache ist. Genauso könnte man sagen, die asiatischen Schriftzeichen oder ägyptische Hieroglyphen seien unpraktisch und schwer zu verstehen. Ich finde, C hat den Vorteil, dass man recht prägnanten Code schreiben kann, der in Basic recht schnell aufgeblasen wirkt. Desweiteren Sind diese Operatoren sehr genau. Zum Beispiel man möchte etwas negieren. Ja was negieren? Eine Zahl (-) eine Aussage (!) oder die Bits (~)? Da jetzt jedesmal negNum, negLog oder negBit zu schreiben, macht es nicht übersichtlicher. Desweiteren sind die menschlichen Sprachen recht ungenau. Und das kann sich auch im Sourcecode wiederspiegeln. Deshalb lege ich persönlich keinen so großen Wert darauf, dass die Programmiersprache einer menschlichen Sprache ähnelt. Spätestens bei recht komplexen Algorithmen oder bei mathematischen Operationen wird es obsolet. //Bitte nicht vergessen, dass ist alles nur meine Meinung. Desweiteren finde ich es überhaupt nicht einfacher zu lesen, wenn überall 'Text' steht. Wenn jeder Funktionsbeginn oder -Ende mit einem Wort gezeichnet wird. Das selbe mit Kontrollstrukturen und Blöcken. Wenn da '{' und '}' dem ganzen doch ein klareres Bild liefern. Was die Übermacht angeht. Sowohl in Fachgeschäften als auch bei mir auf der Arbeit, finden sich fast ausschließlich Leute die mit Basic Programmieren können. Obwohl alle Software und Treibe u.ä. in C geschrieben werden (Es sind ja nicht alles Programmierer bei uns! :D). Es sind fast alles ältere Semester und die sind halt mit Basic groß geworden. Und gute C-Programmierer unter ihnen kenne ich auch nur 2. Vieles davon ist sicher auch Ansichtssache wie zum Beispiel die Standardisierung durch ANSI. Klar, wenn man zu Hause für sich programmiert, kann einem sowas schon an der Popertze vorbei gehen. Aber in einer Firma sieht das schon wieder anders aus. Ursprünglich, in meiner Freizeit, während meiner Schulzeit, fing ich auch an in Basic zu programmieren. Während meiner ersten Ausbildung war es dann Pascal und VisualBasic. Während meiner Studienzeit und meiner 2. Ausbildung C, C# und Java. C++ in einem Praktikum. Ich kann nicht sagen, dass es uns aufgehalst wurde. Und wenn man mal eine Weile in den Cs und Js und was es da nicht alles gibt, programmiert hat, dann, so ging es mir, gefallen einen die Basics nicht nur von der Ästhetik her nicht mehr. Zum Beispiel ob man Variablen deklarieren kann oder muss, ob der Code compiliert oder interpretiert werden soll, usw. Es spielt auch eine Rolle welche (guten) Erfahrungen man in den Sprachen gesammelt hat. Ich zum Beispiel hatte die objektorientierte Programmierung nicht verstanden obwohl ich ein Jahr in VB programmiert hatte. Im Praktikum nach der Ausbildung, hatte ich es aber verstanden als ich mich mit C++ zu beschäftigen hatte. Obendrein ist nicht nur die Sprache allein wichtig. Gerade nicht bei solch simplen wie C und Basic. Die zeichnen sich dann doch eher durch vorhandene Libraries und und APIs aus. So kann es gut sein, dass man in einem Falle Basic und in anderem Falle C verwendet obwohl jedes mal beides möglich ist. > Das ist doch eine große Umgewöhnungsphase vom "normalen" Schreiben von > mathematischen Termen zu so einem Kauderwelsch und außerordentlich > fehlerträchtig beim Eingeben des Quelltextes denkt sich Generell stimmt das schon, aber ich kann nicht sagen, dass C so schlimm ist, dass man dadurch viele Fehler hat. Schau dir mal dazu die Sprache Brainf*** an: http://en.wikipedia.org/wiki/Brainf***#Examples. // Die Sterne sind jeweils durch 'u', 'c' und 'k' zu ersetzen! Interessant finde ich Python, es wirkt für mich wie eine Mischung aus C und Basic. Nicht nur wegen der Syntax: http://de.wikipedia.org/wiki/Python_(Programmiersprache)#Beispiel Gruß BrEin /* Der Beitrag scheint Spam zu enthalten: "f***" :-D:-D:-D */
Ich freue mich über die Antworten von Euch. Es scheint wohl wirklich daran zu liegen, daß der Mensch ein "Gewohnheitstier" ist und an den Sachen festhält, die er mal als junger Kerl gelehrt bekam. Ich begann mit Algol, weil es auf dem Rechner an der Arbeit verwendet wurde. Später ging ich dann auf Pascal über, was sich nicht gar so sehr von Algol unterscheidet. Dann war ich lange Zeit mit anderem Kram befasst, so daß ich dann wieder fast von vorne anfangen mußte. Hinzu kommt, daß das Gedächtnis auch nicht besser wird (oder mein EEPROM im Kopf ist fast voll) ;-) MfG Paul
Paul Baumann schrieb: > Ich freue mich über die Antworten von Euch. Es scheint wohl wirklich > daran zu liegen, daß der Mensch ein "Gewohnheitstier" ist und an den > Sachen festhält, die er mal als junger Kerl gelehrt bekam. Sachte, so simpel bin ich nicht gestrickt. Danach gings bei mir mit etwas Pascal weiter, Assembler, Forth und diversen andere Sprachen - auch Basic war dabei - und mir wäre im Controller-Kontext Ada weitaus lieber als C, wenn das irgendeinen realistischen Sinn hätte. In den 80ern gab es zu C im Eigenbaubereich (eigenes 68000 Design mit eigenem Betriebssystem) kaum eine Alternative. Es war die einzige Sprache bei der man legal an einen kostenlosen und überschaubaren Compiler kam, den man zudem auch noch nach Laune umstricken konnte. Und in der man diverse Programmen aus dem Unix-Umfeld finden und nutzen konnte. Grosses Gefallen habe ich an der Sprache nie gefunden, auch nicht (erst recht nicht) an C++. Mit APL habe ich seit fast 3 Jahrzehnten nichts mehr zu tun gehabt. Es eignet sich aber prima, um manche Leute zu schockieren ;-).
Paul Baumann schrieb: > Ich freue mich über die Antworten von Euch. Es scheint wohl wirklich > daran zu liegen, daß der Mensch ein "Gewohnheitstier" ist und an den > Sachen festhält, die er mal als junger Kerl gelehrt bekam. > > Ich begann mit Algol, weil es auf dem Rechner an der Arbeit verwendet > wurde. Später ging ich dann auf Pascal über, was sich nicht gar so > sehr von Algol unterscheidet. Dann war ich lange Zeit mit anderem > Kram befasst, so daß ich dann wieder fast von vorne anfangen mußte. > > Hinzu kommt, daß das Gedächtnis auch nicht besser wird (oder mein > EEPROM im Kopf ist fast voll) > ;-) > > MfG Paul Ups, da bist du wohl älter als ich? Dann nehme ich die Sache mit dem älteren Semester zurück! Das mit dem Gewohnheitstier stimmt aber irgendwie. Nicht nur bei mir, auch bei anderen konnte ich feststellen, wie stur man sich dem OOP-Prinzip gegenüber gestellt hat. "Man kann das ja auch anders in C (, Basic, Pascal, ...)" machen. Tja, wenn man sich an ein Denkmuster gewöhnt hat...
Paul Baumann schrieb: > Das ist doch eine große Umgewöhnungsphase vom "normalen" Schreiben von > mathematischen Termen zu so einem Kauderwelsch und außerordentlich > fehlerträchtig beim Eingeben des Quelltextes denkt sich > > Paul Nachdem schon jeder seine Würzpaste zu deinem Beitrag abgegeben hat, werde ich meine Tube auch mal ausquetschen: Schau dir doch mal an, was die Mathematiker für einen "Kauderwelsch" verbreiten: Wo du hinschaust, nur seltsame Symbole. Da gibt es komische Schnörkel (Integralzeichen), teilweise mit einem Kreis übermalt, auf der Spitze stehende Dreiecke, Gleichheitszeichen mit einem dritten Strich und vieles mehr. Kein Mensch außer den Mathematikern selbst kann das jemals verstehen. Sie verwenden zwar immerhin auch Buchstaben, hassen aber ausgeschriebene Wörter wie der Teufel das Weihwasser. Kein Wunder dass ihnen das latei- nische Alphabet für die Bezeichnung von Variablen und Funktionen schon bald ausging. Aber statt die Variablen einfach mit aussagekräftigen Wör- tern zu benennen, haben sie lieber das griechische Alphabet gekidnappt. Als auch dieses nicht mehr gereicht hat, kam das hebräische an die Rei- he. Um noch mehr "Buchstaben" zur Verfügung zu haben, werden auch noch Striche, Pfeile u.ä. über, unter und neben die Buchstaben gekritzelt. Bei den Physikern sieht es eher noch schlimmer aus. Sie übernehmen nicht nur den ganzen Kauderwelsch von den Mathematikern, sondern fügen zusätz- liche Verunstaltungen hinzu. So wird bspw. ein Strich mitten durch das Herz des kleinen 'h' gestoßen (Buchstabenquälerei ist das, jawohl!) und das verstümmelte Gebilde als neues Zeichen definiert: 'ℏ'. Es gibt aber immer noch eine Steigerung: Das sind die E-Techniker. Die kommen zwar mit vergleichsweise wenigen Buchstaben aus, dafür erfinden sie aber ständig neue, nichtsagende Symbole, die sie sogar, um das Ganze noch komplizierter zu machen, nicht in einer, sondern gleich in zwei Dimensionen anordnen. Das nennen sie dann "Schaltplan". Warum schreibt man dort, wo ein Transistor hin soll, nicht einfach Transistor hin, sondern malt stattdessen ein keilschriftähnliches Gebilde? Andere Symbole, wie bspw. das des Mosfet, sehen schon fast chinesisch aus. Wie lange habe ich gebraucht, um es halbwegs auswendig zeichnen zu können? Zudem können sich die Amis und die Eurpäer nicht einmal auf einen einheitlichen Symoblsatz einigen, so dass sich die ohnehin schon nahe bei Unendlich liegende Anzahl sogar noch verdoppelt. Wenn man bedenkt, dass die älteren Programmiersprachen fast alle von Mathematikern, Physikern und E-Technikern entwickelt worden sind, können wir wirklich heilfroh sein, dass dabei so einfache und leicht überschau- bare Dinge wie APL heraus gekommen sind. Und jetzt kommst du, der einen Schaltplan sicher so leicht wie die Mor- genzeitung liest, und beklagst dich über C??? C verwendet ausschließlich Zeichen, die auf jeder gewöhnlichen Computer- tastatur zu finden sind. Keines dieser Zeichen mutet auch nur im Ent- ferntesten sumerisch oder chinesisch an. Das einzige etwas komplizier- tere Zeichen, der Klammeraffe ('@'), wurde extra weggelassen, weil bei ihm vielleicht noch am ehesten die Gefahr bestünde, den Programmierer zu verwirren. Eine derart weichgespülte Sprache ist eigentlich eines echten Programmierers gar nicht würdig. Klar gibt es Programmiersprachen, die deutlich geschwätziger sind. Das schönste Beispiel dafür ist Cobol. Aber das stammt ja schließlich auch von einer Frau: http://de.wikipedia.org/wiki/Grace_Hopper Und von was für einer! Da vergeht selbst der härtesten Hardware das Lachen. In Cobol hat der Begriff "Befehl" noch seine ursprünglichste Bedeutung. Die Cobol-typi- schen Satzendepunkte nach Anweisungen kommen beim Steuerwerk als unmiss- verständliches "Basta!" an. Welche Prozessor käme da noch auf die Idee, auch nur einen halben Wait-State einzuschieben? ;-)
@Yalu X.: Danke für deinen Beitrag. Solche Posts sind es, die man in seiner Runde auf der Arbeit unbedingt vorlesen muss! Danke, einfach super!
Ich finde, dass sich jeder seine Sprach selbst aussuchen sollte. Menschen sind nun mal eher neuronale Netze (VHDL!!!) als sequentielle Systeme (C, Basic, ...). Leider sind Computer nun mal sequentielle System, und man muss seine Denkstruktur ändern. Schon gibt es wieder zwei Verfahren: Objektorientiert und prozeduraler Ansatz. Objektorientierte Programmierung geht noch am ehesten in Richtung neuronales Netz (Da gibt's auch noch andere Sprachen als VHDL.). Ich bevorzuge Java oder solche Sprachen, aber für den AVR ist C unter den Hochsprachen noch am schönsten. Unter den prozeduralen Programmiersprachen gibt es jetzt so welche, die Englisch sind (Basic, Pascal,...) und solche, die eher kryptisch sind (C, ASM). Ich würde einen Computer wahrscheinlich nicht auf Englisch anreden, also wechsle ich die Sprache. Wie man im Französischen über Akzente und andere Grammatik stolpert, geht es auch bei C zur Sache. So Sprachen wie ASM erfordern einen völlig anderen Denkansatz zu unseren komplexen Gedanken. Also eher außerirdisch. Und dann gibt es noch Sprachen wie APL oder Brainf**k, auch wenn letzteres eher ein informationstechnischer Witz ist (Offtopic Fachwitze: Kennt jemand den mit den zwei Wasserstoffatomen?). Das wäre dann Chinesisch. Man muss sich einfach um gewöhnen. Computer sind keine Menschen, FPGAs schon eher. Mal sehen, was sie Zukunft bringt. Seht es einfach als Solidarität gegenüber der virtuellen Dienerfraktion an. Bevor noch die Roboter revoltieren... Mit freundlichen Grüßen, Valentin Buck
So schöne Texte hier, -besonders der von Yalu... :-)) Sollte mir das nicht zu denken geben? Ich denke schon. MfG Paul
Was in C möglich aber nicht lesbar ist (jedenfalls nicht ohne sehr viel Übung) zeigt dieses Schachprogramm: http://nanochess.110mb.com/chess3.html Damit kann auch ein Mega zum Schachcomputer werden ;) hans
hans schrieb: > Was in C möglich aber nicht lesbar ist (jedenfalls nicht > ohne sehr viel Übung) zeigt dieses Schachprogramm: > > http://nanochess.110mb.com/chess3.html Der arme Compiler. Aber der Endcode wird dadruch auch nicht kleiner. Wer richtig optimiert kommt mit Leserlichen Code genausoweit.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.