Hallo Zusammen, Ich habe eine bitte an euch ich moechte gern mit dem Programm MPLAB den Mikrochip PIC18F4550 und den Microchip MPLAB-C18 Compiler eine logische Funktion Programmiert. Ich habe so versucht aber es klapp nicht . Das ist mein Programm: #include <pconfig.h> #include <stddef.h> #include <i2c.h> #include <usart.h> #include <func1.h> void main(void) { \par OSCCON |=0x80; // 8 MHz TRISA=1 ; // Port A Input TRISB=1 ; // Port B Input LATBbits.LATB0=1; TRISC=0; // Port C Output TRISD=1; // Port D Input LATCbits.LATC1= AND1(LATAbits.LATA1,LATBbits.LATB1); } #ifndef FUNC1_H #define FUNC1_H extern void AND1(){ bool A=0 ; if((X=1)&&(Y=1)) { A=1; } return A ; } #endif Executing: "C:\\MCC18\\bin\\mcc18.exe" -p=18F4550 "test.c" -fo="test.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-\par C:\\Users\\VPI\\Desktop\\DIP\\func1.h:5:Error [1105] symbol 'A' has not been defined C:\\Users\\VPI\\Desktop\\DIP\\func1.h:5:Error [1101] lvalue required C:\\Users\\VPI\\Desktop\\DIP\\func1.h:6:Error [1105] symbol 'X' has not been defined C:\\Users\\VPI\\Desktop\\DIP\\func1.h:6:Error [1101] lvalue required C:\\Users\\VPI\\Desktop\\DIP\\func1.h:6:Error [1105] symbol 'Y' has not been defined C:\\Users\\VPI\Desktop\\DIP\\func1.h:6:Error [1101] lvalue required\par C:\\Users\\Nomgabou\\Desktop\\DIP\\func1.h:8:Error [1105] symbol 'A' has not been defined C:\\Users\\VPI\\Desktop\\DIP\\func1.h:8:Error [1101] lvalue required C:\\Users\\VPI\\Desktop\\DIP\\func1.h:10:Error [1105] symbol 'A' has not been defined C:\\Users\\VPI\\Desktop\\DIP\\func1.h:10:Warning [2052] unexpected return value C:\\Users\\VPI\\Desktop\\DIP\\test.c:38:Warning [2058] call of function without prototype C:\\Users\\VPI\\Desktop\\DIP\\test.c:38:Error [1131] type mismatch in assignment Halting build on first failure as requested. } Ich habe bestimmt dummen Fehler gemacht. Ich brauche ihre Hilfe
> Ich habe bestimmt dummen Fehler gemacht. Ja, etwa im Schnitt ein bis zwei Fehler pro Zeile! > Ich brauche ihre Hilfe Sehe ich auch so. Kauf Dir ein Grundlagenbuch über C, wenn Du schon kein Tutorial im Internet suchen und/oder lesen willst.
Alles formale Fehler in der Bedienung der Sprache C. Es fehlen die Angaben zu Übergabewerten an die Funktion AND1 und die Beachtung des Rückgabewertes. Formal könnte man die Sache so verbessern. Das muss aber überprüft werden, ob die Programmlogik so gewünscht ist: Datei test.c
1 | #include <pconfig.h> |
2 | #include <stddef.h> |
3 | #include <i2c.h> |
4 | #include <usart.h> |
5 | #include <func1.h> |
6 | |
7 | void main(void) |
8 | {
|
9 | /*
|
10 | Verstehe ich nicht.
|
11 | \par
|
12 | */
|
13 | OSCCON |= 0x80; // 8 MHz |
14 | TRISA = 1; // Port A Input |
15 | TRISB = 1; // Port B Input |
16 | LATBbits.LATB0 = 1; |
17 | TRISC = 0; // Port C Output |
18 | TRISD = 1; // Port D Input |
19 | |
20 | LATCbits.LATC1 = AND1(LATAbits.LATA1, LATBbits.LATB1); |
21 | }
|
Datei func1.c
1 | #include <stddef.h> |
2 | #include <func1.h> |
3 | |
4 | bool AND1(bool X, bool Y) |
5 | {
|
6 | bool A = 0; |
7 | |
8 | if ( ( X == 1 ) && ( Y == 1 ) ) |
9 | {
|
10 | A = 1; |
11 | }
|
12 | |
13 | return A ; |
14 | }
|
Datei func1.h
1 | #ifndef FUNC1_H
|
2 | #define FUNC1_H
|
3 | |
4 | extern bool AND1(bool X, bool Y); |
5 | |
6 | #endif
|
In den Header kommt der Prototyp, aber nur wenn Du Die Funktion von extern aufrufen willst: extern void AND1(?); den Typ müßtest Du noch angeben Ins c-file kommt die Funktionsdefinition: void AND1(?) // TypX?, TypY? { bool A=0 ; // bool muß dem Compiler bekannt sein //if((X=1)&&(Y=1)) // nicht Zuweisung if((X==1)&&(Y==1)) // sondern Vergleich { A=1; } return A ; // wenn Du etwas zurückgibst ist es nicht void } Vielleicht eher so: char AND1(char X, char Y) { char A=0 ; // char kennt der Compiler au jeden Fall if((X==1)&&(Y==1)) { A=1; } return A ; } Gruß Matthias
Wieso denn so ein Gefrickel?
1 | #include <stddef.h> |
2 | #include <func1.h> |
3 | |
4 | bool AND1(bool X, bool Y) |
5 | {
|
6 | return (X && Y) ; |
7 | }
|
die ??? wrote:
> Wieso denn so ein Gefrickel?
Weil der OP offensichtlich Anfänger ist und man ihm zunächst
mal einen Weg zeigt, der ohne die C-typischen Abkürzungen und
Konventionen auskommt.
...und ihn somit in Watte packt? Ist wohl ein Ruck durch dieses Forum gegangen, was? ;^)
Für mich kommt es darauf an, wie jemand fragt. Wenn ein Wille und ein Weg ersichtlich ist, warum nicht. Wenn jemand nach einer c++ Funktion fragt, die ein Sensorsignal auf eine Motoransteuerung umrechnet, werde ich auch schnell ironisch. Gruß Matthias
die ??? wrote: > ...und ihn somit in Watte packt? Ist wohl ein Ruck durch dieses Forum > gegangen, was? ;^) Nö, Ab heute ist das immer so!
5€ drauf, dass gerade eh nicht mehr als copy&paste war. Aber ich will
nicht nörgeln, nur so'n Gedanke.
Stefan "stefb" B. wrote:
> Nö, Ab heute ist das immer so!
Man darf gespannt sein.
> Weil der OP offensichtlich Anfänger ist und man ihm zunächst > mal einen Weg zeigt, der ohne die C-typischen Abkürzungen und > Konventionen auskommt. Ein sauberer Programmierstil ist keine "C-typischen Abkürzung". Übrigens, die Klammern sind völlig unnötig und sinnlos:
1 | #include <stddef.h> |
2 | #include <func1.h> |
3 | |
4 | bool AND1(bool X, bool Y) |
5 | {
|
6 | return X && Y; |
7 | }
|
...trägt aber zur besseren Lesbarkeit und somit zu einem "sauberen Programmierstil" bei. So what?
@Unbekannter Ist zwar schön kurz, ein MISRA-Checker dürfte aber die Warnung bringen, dass das implementierungsabhängig ist :) Gruß Matthias
Was ist daran implementierungsabhängig? Allerdings muss noch stdbool.h eingebunden werden, da dort der Datentyp bool (als _Bool) definiert ist. Ich hätte die Funktion bis auf die Großbuchtaben in Funktions- und Variablennamen, die noch vom OP stammen, genauso wie Unbekannter geschrieben. Klarer kann man doch eine Und-Verknüpfung nicht ausdrücken, oder?
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.