www.mikrocontroller.net

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


Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <stdio.h>
#include <arch/philips/newlib-lpc/lpc2119.h>
#include <arch/philips/newlib-lpc/dev_cntrl.h>

  /**** Device table.  List of device drivers for newlib.  ****/
const struct device_table_entry *device_table[] = {
  &com1,  
  &com1,  
  &com1,  
  0 };  

extern "C" int isatty(int fd)
{
  return 1;
}

class mach
{
  public:
  virtual void tu()
  {
  }
  
  virtual ~mach()
  {
  }
};

class machh: public mach
{
  public:
  void tu()
  {
  }
};

/********************* main *********************************************/
/*  main -- program start point.  Simple echo program with some timing  */
/* tests thrown in.                */
int main( void)
{
  iprintf("Ups - Superclass has no draw.\n");
  machh m;
  m.tu();
  return 0;

}

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

Autor: Andreas K. (a-k)
Datum:

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

Autor: Mark .. (mork)
Datum:

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

Autor: Mark .. (mork)
Datum:

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

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.