www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Beispiel logische FunKtion


Autor: rapeur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

#include <pconfig.h>
#include <stddef.h>
#include <i2c.h>
#include <usart.h>
#include <func1.h>

void main(void) 
{
/*
  Verstehe ich nicht.
  \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);
}


Datei func1.c

#include <stddef.h>
#include <func1.h>

bool AND1(bool X, bool Y)
{
  bool A = 0;

  if ( ( X == 1 ) && ( Y == 1 ) )
  {
    A = 1;
  }

  return A ;
}


Datei func1.h

#ifndef FUNC1_H
#define FUNC1_H

extern bool AND1(bool X, bool Y);

#endif


Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso denn so ein Gefrickel?
#include <stddef.h>
#include <func1.h>

bool AND1(bool X, bool Y)
{
  return (X && Y) ;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...und ihn somit in Watte packt? Ist wohl ein Ruck durch dieses Forum 
gegangen, was?   ;^)

Autor: rapeur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen
dank ihrer Hilfe habe ich keine Fehler mehr.

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die ??? wrote:
> ...und ihn somit in Watte packt? Ist wohl ein Ruck durch dieses Forum
> gegangen, was?   ;^)

Nö, Ab heute ist das immer so!

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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:
#include <stddef.h>
#include <func1.h>

bool AND1(bool X, bool Y)
{
  return X && Y;
}

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...trägt aber zur besseren Lesbarkeit und somit zu einem "sauberen 
Programmierstil" bei. So what?

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Unbekannter
Ist zwar schön kurz, ein MISRA-Checker dürfte aber die Warnung bringen, 
dass das implementierungsabhängig ist :)

Gruß Matthias

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

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.