Forum: Compiler & IDEs (arm-elf-g++)Viele Probleme bei virtuellen Methoden


von Mark .. (mork)


Lesenswert?

Hallo,

neulich wollte ich viele meiner C-Funktionen in C++-Klassen umschreiben, 
damit der Code etwas übersichtlicher wird. Da beim Compilieren viele 
Fehlermeldungen kamen, sobald ich virtuelle Member hatte, habe ich nach 
einer Empfehlung aus diesem Forum den Code aus dem Examples-Ordner von 
WinARM genommen (lpc2129_newlib_cpp), wo virtuelle Methoden vorhanden 
sind und es compillierte fehlerfrei. Als ich dann den Code 
"minimalisiert" habe, waren die Fehlermeldungen wieder da, also hab ich 
dann wieder den alten Code genommen und Stück für Stück Zeilen 
rausgenommen habe, bis folgendes entstand:
1
#include <stdio.h>
2
#include <arch/philips/newlib-lpc/lpc2119.h>
3
#include <arch/philips/newlib-lpc/dev_cntrl.h>
4
5
  /**** Device table.  List of device drivers for newlib.  ****/
6
const struct device_table_entry *device_table[] = {
7
  &com1,  
8
  &com1,  
9
  &com1,  
10
  0 };  
11
12
extern "C" int isatty(int fd)
13
{
14
  return 1;
15
}
16
17
class mach
18
{
19
  public:
20
  virtual void tu()
21
  {
22
  }
23
  
24
  virtual ~mach()
25
  {
26
  }
27
};
28
29
class machh: public mach
30
{
31
  public:
32
  void tu()
33
  {
34
  }
35
};
36
37
/********************* main *********************************************/
38
/*  main -- program start point.  Simple echo program with some timing  */
39
/* tests thrown in.                */
40
int main( void)
41
{
42
  iprintf("Ups - Superclass has no draw.\n");
43
  machh m;
44
  m.tu();
45
  return 0;
46
47
}

Ich verstehe aber nicht wofür ich diese Zeilen brauche:
-iprintf("Ups - Superclass has no draw.\n"); in der main. Wenn ich es 
entferne, kommen lauter Meldungen über undefinierten Referenzen zu z.b. 
'_sbrk_r', `_fstat_r', `_close_r' usw. Wie kann das überahaupt sein, das 
ist ja nur ein Aufruf und keine Deklaration?

-const struct device_table_entry *device_table[] = { ... Wenn ich es 
entferne, kommen Meldungen über undefinierte Referenzen zu 
device_table[]. Was ist die device_table und wofür braucht man die?

-#include <arch/philips/newlib-lpc/dev_cntrl.h> Da ist com1 definiert, 
das für die device_table gebraucht wird.

-extern "C" int isatty(int fd) - Wofür ist die Funktion, wenn sie immer 
nur 1 zurückgibt?

Zudem verstehe ich nicht, woher die fast 50k .text und 2148 Bytes .bss 
kommen.

Kann bitte jemand meine Fragen zumindest teilweise beantworten?

MfG Mark

von Andreas K. (a-k)


Lesenswert?

> entferne, kommen lauter Meldungen über undefinierten Referenzen zu z.b.
> '_sbrk_r', `_fstat_r', `_close_r' usw. Wie kann das überahaupt sein, das
> ist ja nur ein Aufruf und keine Deklaration?

Sobald du die newlib verwendest, ob freiwillig oder nicht, sind ein paar 
Grundfunktionen fällig, die normalerweise vom zugrundeliegenden 
Betiebssystemkernel zur Verfügung gestellt werden. Da es den hier nicht 
gibt musst du dafür sorgen.

Gibt irgendwo in den Samples ein Vorbild dafür.

Alternativ kannst du auch rauszufinden versuchen, wie du die newlib 
garnicht erst verwendest. Die Speicherallokationsfunktionen gehören zu 
den Kandidaten.

> -extern "C" int isatty(int fd) - Wofür ist die Funktion, wenn sie immer
> nur 1 zurückgibt?

Siehe oben.

von Mark .. (mork)


Lesenswert?

Hallo  Andreas,

vielen Dank für die schnelle Antwort.

Da ich die newlib schon verwenden möchte, werd ich wohl auch mit den 
benötigten Funktionen leben müssen.

Grade hab ich im I-Net etwas über die device_table gefunden, die 
anscheinend auch gebraucht wird. Jetzt bleibt nur noch die Frage, wieso 
das iprintf("Ups - Superclass has no draw.\n"); gebraucht wird. Das ist 
doch nur ein Aufruf!?!

MfG Mark

von Mark .. (mork)


Lesenswert?

So, jetzt habe ich einfach die Codes aus dem Ordner 
WinARM\utils\newlib_lpc_rel5a_src ins makefile als C-Sources eingetragen 
und den Inhalt der Funktionen einfach gelöscht, damit es keine Fehler 
über die undefinierte device_table gibt. Jetzt wird das Programm 
copmiliert, es kommen viele Meldungen darüber, dass die Funktionen 
'_sbrk_r', `_fstat_r', `_close_r' usw nicht 'void' sind aber trotzdem 
nichts zurückgeben, aber der Code selbst funktioniert fehlerfrei, weil 
die Funktionen ja nie aufgerufen werde. Ist nur schade um den zusätzlich 
gebrauchten Flash.

MfG Mark

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.