Funktion auslagern

Gast #2793414
Lesenswert?

Hallo,
zur Zeit blicke ich nicht mehr durch. Ich möchte die Funktion "meinADC" 
auslagern. (Wenn der Code in der main- Datei steht, funktioniert es).
Wie muss die korrekte .h- Datei aussehen? Habe bisher erfolglos 
Literatur durchgearbeitet. Evtl. kann jemand das Problem einfach lösen. 
Oder auch nur auf der offenen Wunde herumtrampeln (Suchfunktion, Google 
ist dein Freund, bisse blöd? usw.) Danke.
Gruß
Reinhard
Angehängte Dateien:
Gast #2793437
Lesenswert?

Hallo,
Danke für die Reaktion. Die Meldungen:
Build started 14.8.2012 at 11:34:46
./main.c

In file included from ../main.c:7:0:
../meinADC.h:9:11: error: expected '=', ',', ';', 'asm' or 
'__attribute__' before 'Read_ADC'
../main.c: In function 'main':
../main.c:29:2: warning: implicit declaration of function 'Read_ADC'
../main.c:34:2: warning: implicit declaration of function 'sprintf'
../main.c:34:2: warning: incompatible implicit declaration of built-in 
function 'sprintf'
../main.c:34:2: warning: pointer targets in passing argument 1 of 
'sprintf' differ in signedness
../main.c:34:2: note: expected 'char *' but argument is of type 'uint8_t 
*'
../main.c:42:2: warning: pointer targets in passing argument 1 of 
'LCDWrite' differ in signedness
../m50530.h:118:13: note: expected 'const char *' but argument is of 
type 'uint8_t *'
make: *** [main.o] Fehler 1
Build failed with 1 errors and 5 warnings...
Gruß
Reinhard
#2793446
Lesenswert?

Ich vermisse sowohl in main.c als auch in MainADC.c den
#include <avr/io.h>


Ansonsten: halte dich an den ersten Fehler
(der bei dir dadurch ausgelöst wurde, dass der COmpiler mit uint16_t nix 
anfangen konnte)
und behebe den erst mal.

In deinem Fall wird er dadurch behoben, dass du den
#include <avr/io.h>
hinzufügst. Der zieht dann gleich einen ganzen Haufen anderer dinge 
rein, unter anderem auch die Definitionen für uint16_t und Konsorten.

Und zwar als ersten Include!

Halte dich an die einfache Regel:
Erst die Systemspezifischen Includes, dann deine eigenen.
Gast #2793454
Lesenswert?

Hallo,
Danke für die Reaktion. Die Meldungen:
Build started 14.8.2012 at 11:34:46
./main.c

In file included from ../main.c:7:0:
../meinADC.h:9:11: error: expected '=', ',', ';', 'asm' or 
'__attribute__' before 'Read_ADC'
../main.c: In function 'main':
../main.c:29:2: warning: implicit declaration of function 'Read_ADC'
../main.c:34:2: warning: implicit declaration of function 'sprintf'
../main.c:34:2: warning: incompatible implicit declaration of built-in 
function 'sprintf'
../main.c:34:2: warning: pointer targets in passing argument 1 of 
'sprintf' differ in signedness
../main.c:34:2: note: expected 'char *' but argument is of type 'uint8_t 
*'
../main.c:42:2: warning: pointer targets in passing argument 1 of 
'LCDWrite' differ in signedness
../m50530.h:118:13: note: expected 'const char *' but argument is of 
type 'uint8_t *'
make: *** [main.o] Fehler 1
Build failed with 1 errors and 5 warnings...
Gruß
Reinhard

Mike S. schrieb:
> Du hast die neue C-Datei nicht zum Projekt hinzugefügt.
Hallo,
ist das nicht mit
#include "meinADC.h" in der main.c
geschehen?
Gast #2793459
Lesenswert?

Reinhard schrieb:
> Hallo,
> ist das nicht mit
> #include "meinADC.h" in der main.c
> geschehen?

Nein, dies ist nur eine Header Datei. Du musst schon noch die C Datei 
hinzufügen.

In einem Makefile z.B. mit SRC += file.c

In Atmel Studio im Solution Explorer -> aktuelles Projekt -> rechtsklick 
-> add -> existing file
#2793460
Lesenswert?

Karl Heinz Buchegger schrieb:

> Halte dich an die einfache Regel:
> Erst die Systemspezifischen Includes, dann deine eigenen.

Und die Definition für F_CPU ziehst du vor alles andere. Denn ein 
utils/delay benötigt dieses #define bereits. Definierst du F_CPU erst 
danach, dann hilft dir das nichts.
1
#ifndef F_CPU
2
#define F_CPU 1600000
3
#endif
4

5
#include <avr/io.h>
6
#include <util/delay.h>
7

8
#include "meinADC.h"
9
#include "m50530.h"
10

11

12
....


Ich geh eigentlich immer mehr davon ab, den F_CPU mit einem #ifndef zu 
sichern. Ist im Makefile eine enstprechende Definition, dann soll das 
ruhig einen Fehler ergeben. Ist mir immer noch lieber, als wenn 
stillschweigend die Definition aus dem Makefile genommen wird, die 
natürlich nicht mit dem hier angegebenen Zahlenwert übereinstimmt und 
ich dann für mich von falschen Zahlen ausgehe.

1
#define F_CPU 1600000
2

3
#include <avr/io.h>
4
#include <util/delay.h>
5

6
#include "meinADC.h"
7
#include "m50530.h"
8

9

10
....
#2793464
Lesenswert?

Ich denke mal die Typen werden in der
1
#include "m50530.h"
definiert sein. Deshalb funktioniert es in main, aber in der ADC nicht.

Das ADC ans ende der includes wird wahrscheinlich schon helfen, da dann 
die Reihenfolge auch stimmt. allerdings ist dann der nächste Fehler, das 
der Compiler die meinADC.c nicht übersetzen kann.
#2793473
Lesenswert?

Michael Rathmair schrieb:
> Compilerfehler ?

Wenn ein Newbie ein Problem hat, kann man Compilerfehler zu 99.9% 
ausschliessen.
Es gibt zwar seltsame Compilerfehler und ja, auch der gcc hatte in der 
Vergangenheit ein paar, sagen wir mal Eigenheiten, die ich eigentlich 
nicht für möglich gehalten hätte, aber solche Dinge sprechen sich 
schnell rum und werden behoben. Meistens sind es irgendwelche Dinge in 
der Codegenerierung oder im Optimizer. Beim sprachabhängigen Teil, 
lexikalischem und syntaktischem Parsen ist die Wahrscheinlichkeit für 
einen unentdeckten Fehler, den ein Newbie findet, bei kleiner 0.000001%. 
Also praktisch 0.

Einen include, der nicht vorhanden ist, kann auch der tollste 
Compilerfehler nicht vertuschen.
Gast #2793478
Lesenswert?

Hallo,
1. die meinADC.c hatte ich hinzugefügt
2. F_CPU ganz vorn, kommt zwr die Warnung, sicher kein Problem.
3. Es geht alles, jedoch sind noch einige Warnungen vorhanden (implicit 
deklaration... :

../main.c:7:0: warning: "F_CPU" redefined

<command-line>:0:0: note: this is the location of the previous 
definition
../main.c: In function 'main':
../main.c:32:2: warning: implicit declaration of function 'sprintf'
../main.c:32:2: warning: incompatible implicit declaration of built-in 
function 'sprintf'
../main.c:32:2: warning: pointer targets in passing argument 1 of 
'sprintf' differ in signedness
../main.c:32:2: note: expected 'char *' but argument is of type 'uint8_t 
*'
4. die Format Warnung finde ich sicher noch raus(siehe alter Beitrag)
Gruß
Reinhard
#2793482
Lesenswert?

Reinhard schrieb:
> Hallo,
> 1. die meinADC.c hatte ich hinzugefügt
> 2. F_CPU ganz vorn, kommt zwr die Warnung, sicher kein Problem.
> 3. Es geht alles, jedoch sind noch einige Warnungen vorhanden (implicit
> deklaration... :
>
> ../main.c:7:0: warning: "F_CPU" redefined
>
> <command-line>:0:0: note: this is the location of the previous
> definition

sprich:
Es gibt im Makefile eine Definition für F_CPU

> ../main.c: In function 'main':
> ../main.c:32:2: warning: implicit declaration of function 'sprintf'

sprintf ist im Header stdio.h enthalten.

> ../main.c:32:2: warning: incompatible implicit declaration of built-in
> function 'sprintf'

selber Fehler

> ../main.c:32:2: warning: pointer targets in passing argument 1 of
> 'sprintf' differ in signedness

selber Fehler

> ../main.c:32:2: note: expected 'char *' but argument is of type 'uint8_t
> *'

Ist ein kleineres Problem, das sich mit einem Cast beheben lässt.


Du musst schön langsam lernen, welche Systemfunktionen in welchen Header 
Files 'beheimatet' sind und welche Header Files du daher includieren 
musst, wenn du eine Funktion benutzt. Wenn du es nicht auswendig weißt: 
nach der Funktion googeln. In den Funktionsdokus stehts normalerweise 
dabei.
Persönliche Seite #2793483
Lesenswert?

Reinhard schrieb:
> ../main.c:7:0: warning: "F_CPU" redefined

Das bedeutet, daß "F_CPU" bereits definiert ist - vermutlich per 
Compilerkommandozeilenoption -DF_CPU=...

> ../main.c:32:2: warning: implicit declaration of function 'sprintf'

Das heißt, daß die Headerdatei, in der sprintf deklariert wird, nicht 
eingebunden wurde.

Lerne Compilerfehlermeldungen lesen!
#2793487
Lesenswert?

Rufus Τ. Firefly schrieb:
> Karl Heinz Buchegger schrieb:
>> Du musst schön langsam lernen, welche Systemfunktionen in welchen Header
>> Files 'beheimatet' sind. Wenn du es nicht auswendig weißt: nach der
>> Funktion googeln.
>
> Da braucht es kein Google, eine simple Textsuche in den Headerdateien im
> include-Verzeichnis des Compilers reicht aus.

Geht natürlich auch. Viele Wege führen nach Rom.
Und mit der Zeit kennt man dann ohnehin seine Pappenheimer.
#2793494
Lesenswert?

1
uint8_t puffer[4];
2

3
  sprintf(puffer,"%4d",value);

abgesehen davon, dass puffer hier besser als char definiert wäre (immer, 
wenn es sich um Textverarbeitung handelt, ist char der Datentyp der 
Wahl), hast du auch einen schönen Array-Overflow gebaut. %4d erzeugt 
einen String mit mindestens 5 Bytes Länge (aber einer minimalen strlen 
von 4). Du hast das abschliessende \0 Byte vergessen.
Gast #2793527
Lesenswert?

Hallo,
vielen Dank für die Hilfestellung. Ich habe vor etwa 4 Jahren das letzte 
Mal
in C versucht, kleine Dinge zu programmieren. Sprich- (damals)durch 
Elektor infiziert aus Codestücken etwas mit CodeVision 
zusammenzuflicken. Aus Zeitgründen aber verworfen. Jetzt im Vorruhestand 
habe ich Zeit, mich wieder damit zu befassen. Manchmal sieht man die 
einfachsten Dinge nicht, wenn man stunden(Tage-)lang an dem gleichen 
Problem sitzt. Das Ganze dauert eben lange. Der Einstieg war eben, einen 
ADC- Wert auf einem Display anzuzeigen.  Von hier aus geht es langsam 
weiter...
Gruß
Reinhard

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren