Forum: Mikrocontroller und Digitale Elektronik Problem mit f_putc (FatFs)


von EndOfSummer (Gast)


Lesenswert?

Hallo,

habe momentan ein Problem mit f_putc und weiß absolut nicht, wo mein 
Fehler ist.

Dies hier versuche ich:
1
char testChar = 'a';
2
3
f_putc(testChar, &TestFile);

ff.h ist eingebunden, dort ist die Funktion definiert als:
1
int f_putc (TCHAR, FIL*);    ///* Put a character to the file */

Bzw in ff.c als:
1
int f_putc 
2
(
3
    TCHAR c,  /* A character to be output */
4
    FIL* fil  /* Pointer to the file object */
5
)

Im übrigen gibt es in ff.h auch diesen typedef, falls das irgendetwas 
zur Sache tut (aber er meckert ja nicht am Format...):
1
typedef char TCHAR;

Möchte ich das ganze compilieren, kommt der Fehler "undefined reference 
to `f_putc'". Was mache ich falsch?

Danke!

von EndOfSummer (Gast)


Lesenswert?

P.S.: f_write funktioniert übrigens problemlos - was mich ehrlich gesagt 
noch ratloser macht.

von holger (Gast)


Lesenswert?

>Möchte ich das ganze compilieren, kommt der Fehler "undefined reference
>to `f_putc'". Was mache ich falsch?

f_putc falsch geschrieben?

von EndOfSummer (Gast)


Lesenswert?

holger schrieb:
> f_putc falsch geschrieben?

:) Nein.

von EndOfSummer (Gast)


Lesenswert?

Nochmal ein P.S.: Rechtsklick auf die Funktion, Goto Implementation, 
führt mich auch an die richtige Stelle. Heißt er findet sie ja schon 
irgendwie.

von holger (Gast)


Lesenswert?

>> f_putc falsch geschrieben?
>
>:) Nein.

Dann ist ja alles gut und du träumst nur.
ff.h vieleicht doch nicht eingebunden?
Oder kommt die Fehlermeldung vieleicht vom Linker?
Ich weiss es es nicht.

Compiler und/oder Linker kennen f_putc jedenfalls nicht.

von EndOfSummer (Gast)


Lesenswert?

holger schrieb:
> ff.h vieleicht doch nicht eingebunden?

Doch, ganz ganz sicher. Wie gesagt, f_write zum Beispiel funktioniert 
tadellos im selben Quellcode (und genau das verwirrt mich auch so sehr).

holger schrieb:
> Oder kommt die Fehlermeldung vieleicht vom Linker?

Würde ja aber aufs gleiche hinauslaufen - er findet sie nicht. Und das 
kann eigentlich(!!!) nicht sein. Ich versteh es einfach nicht!

von holger (Gast)


Lesenswert?

>Würde ja aber aufs gleiche hinauslaufen - er findet sie nicht. Und das
>kann eigentlich(!!!) nicht sein. Ich versteh es einfach nicht!

Ich auch nicht;) Schieb mal dein komplettes Projekt als Anhang hier 
rein.

von EndOfSummer (Gast)


Lesenswert?

Sorry, das geht leider nicht (auch wenn es sicherlich hilfreich wäre). 
Ist nichts privates...

von holger (Gast)


Lesenswert?

>Sorry, das geht leider nicht (auch wenn es sicherlich hilfreich wäre).
>Ist nichts privates...

Auch gut. Musst du halt selber suchen.
Wird wohl irgendwas mit verschachtelten includes sein
die sich irgendwie selber ausschliessen;)
Oder auch nicht.

Viel Glück bei der weiteren Suche.

von Martin Thomas (Gast)


Lesenswert?

wie ist _USE_STRFUNC definiert?

von EndOfSummer (Gast)


Lesenswert?

Aber mal angenommen, er findet den Header/die Funktion wirklich nicht. 
Wie kann es dann sein, dass wenn ich das f_putc durch f_write ersetze, 
er anstandslos compiliert (und auch tatsächlich in das File schreibt). 
Ich meine f_write ist nur ein paar Zeilen oberhalb von f_putc in ff.h 
deklariert. Dann müsste er da doch genauso meckern, dass er die Funktion 
nicht kennt?! :(

Danke auf jeden Fall für deine Hilfe!

von EndOfSummer (Gast)


Lesenswert?

Martin Thomas schrieb:
> wie ist _USE_STRFUNC definiert?

Bingo! Das ist 0. Und somit disabled. Danke, danke, DANKE! Nun 
compiliert er.

Hab mir das nun mal angeschaut, bin verwundert. Ich habe im Internet nun 
eine andere "Version" von ff.h gefunden. Dort steht das so:
1
#if _USE_STRFUNC
2
int f_putc (int, FIL*);
3
...usw...

Dies ist in meinem ff.h nicht der Fall. _USE_STRFUNC kommt erst in der 
Implementierung in ff.c zum tragen (und wird definiert in ffconf.h).

Eine Frage stellt sich mir deshalb nun aber doch noch. Hier mal die 
Implementierung:
1
int f_putc 
2
(
3
 CHAR c,  /* A character to be output */
4
 FIL* fil  /* Pointer to the file object */
5
)
6
{
7
 UINT bw, btw;
8
 BYTE s[3];
9
10
11
#if _USE_STRFUNC >= 2
12
  if (c == '\n') f_putc ('\r', fil);  /* LF -> CRLF conversion */
13
#endif
14
15
#if _LFN_UNICODE  /* Write the character in UTF-8 encoding */
16
  if (c < 0x80) {      /* 7-bit */
17
    s[0] = (BYTE)c;
18
    btw = 1;
19
  } else {
20
    if (c < 0x800) {  /* 11-bit */
21
      s[0] = (BYTE)(0xC0 | (c >> 6));
22
      s[1] = (BYTE)(0x80 | (c & 0x3F));
23
      btw = 2;
24
    } else {      /* 16-bit */
25
      s[0] = (BYTE)(0xE0 | (c >> 12));
26
      s[1] = (BYTE)(0x80 | ((c >> 6) & 0x3F));
27
      s[2] = (BYTE)(0x80 | (c & 0x3F));
28
      btw = 3;
29
    }
30
  }
31
#else        /* Write the character without conversion */
32
  s[0] = (BYTE)c;
33
  btw = 1;
34
#endif
35
  f_write(fil, s, btw, &bw);    /* Write the char to the file */
36
  return (bw == btw) ? 1 : EOF;  /* Return the result */
37
}

Wenn mich mein Verstand (oder meine C-Kenntnisse) nun nicht komplett 
verlassen, müsste er doch auch mit _USE_STRFUNC = 0 compilieren? Wenn 
_LFN_UNICODE nämlich den #else (write the character without conversion) 
Zweig, oder? Er prüft ja nicht ungleich 0 sondern <=2?

Nun muss ich mir nur noch überlegen, welche Konvertierung/ob ich eine 
brauche und _USE_STRFUNC bzw. _LFN_UNICODE richtig setzen.

von Maxx (Gast)


Lesenswert?

Wenn es sich um eine undefined Reference handelt, dann ist dein Problem 
nicht die .h und die Dekaration, sondern das Fehlen der Definition unter 
den Linker Input Files. (entsprechende .c mitkompiliert und das obj beim 
linking verwendet?

oder gar gar nicht definiert nur deklariert?

von EndOfSummer (Gast)


Lesenswert?

EndOfSummer schrieb:
> Wenn _LFN_UNICODE nämlich den #else (write the character without
> conversion) Zweig, oder?

Da fehlt was. Wenn _LFN_UNICODE nämlich auf 0 gesetzt ist den #else 
(write the character without conversion) Zweig, oder?

von EndOfSummer (Gast)


Lesenswert?

Ok, ok, ich gehe ins Bett nun. Wenn man mal über den Tellerrand hinaus 
schaut und etwas hoch scrollt in dem c-File findet man:
1
#if _USE_STRFUNC

Sorry!

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.