Problem mit f_putc (FatFs)

Gast #2880014
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!
Gast #2880132
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.
Gast #2880144
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!
Gast #2880148
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.
Gast #2880160
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.
Gast #2880167
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!
Gast #2880174
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.
Gast #2880181
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?

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