amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Probleme mit new Operator bei g++ [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- 2 3 [ - Beitrag schreiben - ]

14.08.2006, 17:15 Uhr

asrael229
Posts: 37
Nutzer
Hallo.

Ich versuche gerade eine Portierung zu bewerkstelligen.
Leider kompilieren verschiedene Quellen nicht:

Die Fehlermeldung ist diese unter gcc 2.95.3-4:
"/gg/lib/gcc-lib/m68k-amigaos/2.95.3/include/new:28: 'operator new' takes type 'size_t' as first parameter"

Unter gcc-3.3.3 siehts aehnlich aus:
"/gg/include/c++/3.3.3/new:82: error: 'operator new' takes type 'size_t' ('long unsigned int') as first parameter"


Hat jemand eine Ahnung an was das liegen könnte?



Beste Gruesse,
Manfred

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 10:15 Uhr

Mad_Dog
Posts: 1944
Nutzer
@asrael229:

Da solltest Du schon die entsprechende Codestelle posten...

Wie es aussieht, hat der aufgerufene Konstruktor einen Parameter vom Typ size_t, welcher hier als Synonym für long unsigned int steht.

Du hast den Konstruktor also mit einem falschen Datentyp (oder garkeinem?) aufgerufen.
--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 11:05 Uhr

asrael229
Posts: 37
Nutzer
@Mad_Dog:

Ok, danke. Ich schau mir die Stellen nochmal genauer an.
Ich meinte, da der Fehler in den Compiler-includes auftritt, dass hier evtl. ein Problem mit dem C++ Compiler existiert.

Hier ist die gesamte Fehlermeldung:
In file included from /gg/lib/gcc-lib/m68k-amigaos/2.95.3/include/new.h:6,
from /gg/lib/gcc-lib/m68k-amigaos/2.95.3/../../../../include/g++-3/stl_algobase.h:52,
from /gg/lib/gcc-lib/m68k-amigaos/2.95.3/../../../../include/g++-3/stl_tree.h:56,
from /gg/lib/gcc-lib/m68k-amigaos/2.95.3/../../../../include/g++-3/map:31,
from ../../include/localemgr.h:26,
from versekey.cpp:15:
/gg/lib/gcc-lib/m68k-amigaos/2.95.3/include/new:28: 'operator new' takes type 'size_t' as first parameter



Hier gibt es noch keine Code-Stelle, die kompiliert wird. Zumindest ist mir keine Ersichtlich. Hier sieht es so aus, als wenn erstmal die Includes gecheckt werden.

In Zeile 6 der new.h Headerdatei steht:
#include <new>

welches eine Datei im selben Verzeichnis includiert mit dem Namen "new". Hier stehen Prototypen fuer new und delete drin.

[some time goes by...]
Nachdem ich mir versekey.cpp angesehen habe, habe ich nur eine Stelle gefunden, bei dem der new Operator benutzt wird, an dem kein "size_t" parameter uebergeben wird.
Naemlich diese:
return new VerseKey(*this);

Hmm, ok, der this Zeiger ist kein "size_t" Parameter. Aber das sieht mir jetzt nicht nach einem Fehler aus, da es zudem noch einen Konstruktor gibt, der eben einen Zeiger auf diese Klasse erwartet.

Wo liegt hier dann das Problem?


Gruesse,
Manfred

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 11:55 Uhr

Mad_Dog
Posts: 1944
Nutzer
@asrael229:

Sorry, aber ohne die entsprechenden Codestellen wird Dir niemand so richtig weiterhelfen können.

Der Fehler liegt definitiv in Deiner Datei versekey.cpp und zwar in Zeile 15 (laut Fehlermeldung). Mehr kann ich Dir im Moment auch nicht sagen.
--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 12:01 Uhr

asrael229
Posts: 37
Nutzer
@Mad_Dog:

Nagut, wenns was bringt, das ist Zeile 15 in VerseKey.cpp:
#include <localemgr.h>

Ist ja auch aus der Fehlermeldung ersichtlich, dass es sich um einen include handelt.


Beste Gruesse,
Manfred

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 12:15 Uhr

Mad_Dog
Posts: 1944
Nutzer
@asrael229:

Dann poste mal bitte noch Zeile 26 von localemgr.h.
--
http://www.norman-interactive.com


[ Dieser Beitrag wurde von Mad_Dog am 15.08.2006 um 12:16 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 12:20 Uhr

asrael229
Posts: 37
Nutzer
@Mad_Dog:

Hallo. Hier noch die Zeile 26 aus localemgr.h:
#include <map>

Wie gesagt. In der Datei versekey.cpp wird der "new" Operator dreimal benutzt. Zweimal ohne Parameter und einmal mit dem "this" Zeiger als Parameter und ich nehme an, hier passiert der Fehler.
Der "this" Zeiger ist nicht vom Typ "size_t" aber kann das das Problem sein?


Gruesse,
Manfred

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 12:30 Uhr

Mad_Dog
Posts: 1944
Nutzer
@asrael229:

Ich kann Dir im Moment nur folgenden Hinweis geben: Ältere C++ Compiler (z.B. alte Borland C++ Versionen aus der Windows-Welt) nehmen es mit der Typisierung nicht so genau, was aber nach C++ Standard Vorschrift ist. Der g++ hält sich weitgehenst an diese Vorschriften. Oft fehlt nur ein expliziter Typecast, damit es läuft.
--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 12:42 Uhr

gni
Posts: 1106
Nutzer
Zitat:
asrael229:
Wo liegt hier dann das Problem?

Bist Du sicher, das der Compiler nicht auch die bemängelte Zeile angibt? Ansonsten übersetz mal mit -save-temps und schau Dir in der erzeugten .ii Datei die Zeilen an, in denen new benutzt wird.

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 12:43 Uhr

Reth
Posts: 1858
Nutzer
Zitat:
Original von asrael229:
@Mad_Dog:

Nachdem ich mir versekey.cpp angesehen habe, habe ich nur eine Stelle gefunden, bei dem der new Operator benutzt wird, an dem kein "size_t" parameter uebergeben wird.
Naemlich diese:
return new VerseKey(*this);

Hmm, ok, der this Zeiger ist kein "size_t" Parameter. Aber das sieht mir jetzt nicht nach einem Fehler aus, da es zudem noch einen Konstruktor gibt, der eben einen Zeiger auf diese Klasse erwartet.


Es gibt also einen Konstruktor von VerseKey, der ein Objekt der Klasse VerseKey erwartet?

Wäre hier evtl. der CopyKonstruktor hilfreicher?

[ Dieser Beitrag wurde von Reth am 15.08.2006 um 12:44 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 14:55 Uhr

asrael229
Posts: 37
Nutzer
Zitat:
Original von gni:
Bist Du sicher, das der Compiler nicht auch die bemängelte Zeile angibt? Ansonsten übersetz mal mit -save-temps und schau Dir in der erzeugten .ii Datei die Zeilen an, in denen new benutzt wird.


Hmm. das ist recht unuebersichtlich die .ii Datei.
In der Zeile, in der new benutzt wird sehe ich nicht viel was anderes als im Quellcode selbst. Man kann noch sehen, welcher Dinge dafuer includiert werden aus new.h und new.

Hab mir spasseshalber mal die new Datei auf meinem Mac OSX System angesehen. Die sieht hier aber fast gleich aus. Zumindest die Prototypen sind gleich.
Hier funktioniert die kompilierung mit gcc3.3 ohne Probleme.


Gruesse,
Manfred

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 14:56 Uhr

asrael229
Posts: 37
Nutzer
Zitat:
Original von Reth:
Es gibt also einen Konstruktor von VerseKey, der ein Objekt der Klasse VerseKey erwartet?

Wäre hier evtl. der CopyKonstruktor hilfreicher?

Ja, das ist auch sowas wie ein copy Konstruktor. Der Klassentyp ist nicht VerseKey sondern SWKey, der hier zurueckgegeben wird. VerseKey ist von SWKey abgeleitet. Deswegen kann man wahrscheinlich keinen CopyKonstruktor verwenden. Was ist das ueberhaupt? :D


Manfred


[ Dieser Beitrag wurde von asrael229 am 15.08.2006 um 14:57 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 15:05 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von asrael229:
Zitat:
Original von Reth:
Es gibt also einen Konstruktor von VerseKey, der ein Objekt der Klasse VerseKey erwartet?

Wäre hier evtl. der CopyKonstruktor hilfreicher?

Ja, das ist auch sowas wie ein copy Konstruktor. Der Klassentyp ist nicht VerseKey sondern SWKey, der hier zurueckgegeben wird. VerseKey ist von SWKey abgeleitet. Deswegen kann man wahrscheinlich keinen CopyKonstruktor verwenden. Was ist das ueberhaupt? :D

Wenn Du die Datei, in der der Fehler vorkommt posten würdest, könnten wir Dir mehr sagen - ansonsten stochern hier alle im Nebel...

Ein Konstruktor hat übrigens nie einen Rückgabewert. Aber wenn Du mit new eine neue Instanz erzeugst, rufst Du den Konstruktor der Klasse auf, für die Du diese neue Instanz erzeugen willst. Und wie es scheint, hat bei Dir der entsprechende Konstruktor ein Argument - allerdings rufst Du diesen Konstruktor mit einem Argument von einem falschen Datentyp auf. Eventuell läßt sich das Problem durch einen impliziten Typecast beheben, falls die Typen kompatibel sind.

Mehr wird Dir hier niemand ohne Kenntnis des Codes sagen können...

--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 15:19 Uhr

asrael229
Posts: 37
Nutzer
Zitat:
Original von Mad_Dog:
Wenn Du die Datei, in der der Fehler vorkommt posten würdest, könnten wir Dir mehr sagen - ansonsten stochern hier alle im Nebel...


Ich poste die Datei gerne, nur glaube ich, das dort das Problem nicht zu finden ist.
Wie mache ich das, einfach reinpasten? Anscheindend.
Uebrigens, wird hier doch ein CopyKonstruktor verwendet.

Und es handelt sich hier um eine Datei der "sword" Bibliothek von http://www.crosswire.org. Fuer die Bibliothek (und mit der Biblioetek) existieren einige Bibeltexte, Woerterbuecher usw.. Fuer einige Plattformen gibt es hierzu auch Frontends, fuer Amiga aber nicht. Ich dachte mir als ersten Schritt muesste die Bibliothek portiert werden...


*** Code-Fragment gelöscht - der Post wurde zu lang und blockierte den Thread. ***
*** Poste bitte einen Link auf eine Datei oder ähnliches. ***
*** Bei Gelegenheit werde ich mir das Problem mal genau ansehen. (_PAB_) ***

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 15:57 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von asrael229:

VerseKey ist von SWKey abgeleitet. Deswegen kann man wahrscheinlich keinen CopyKonstruktor verwenden. Was ist das ueberhaupt? :D


Hört sich noch einem Fall von Polymorphie an...

--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

15.08.2006, 23:13 Uhr

Reth
Posts: 1858
Nutzer
Zitat:
Original von asrael229:
Zitat:
Original von Reth:
Es gibt also einen Konstruktor von VerseKey, der ein Objekt der Klasse VerseKey erwartet?

Wäre hier evtl. der CopyKonstruktor hilfreicher?

Ja, das ist auch sowas wie ein copy Konstruktor. Der Klassentyp ist nicht VerseKey sondern SWKey, der hier zurueckgegeben wird. VerseKey ist von SWKey abgeleitet. Deswegen kann man wahrscheinlich keinen CopyKonstruktor verwenden. Was ist das ueberhaupt? :D

Manfred


So ganz genau kenn ich die Definition leider nicht, lässt sich aber sicher im Web und C++ Ecken/Foren nachlesen.
Es wird glaub ich ein neues Objekt angelegt, dessen Zustand (=Attributwerte) der gleiche ist, wie der des übergebenen Objektes.

Wie Mad_Dog schon bemerkte, ohne Code wirds hier schwer.
Aber wenn Du nen Konstruktor von VerseKey rufst, der ein Objekt der Basisklasse SWKey erwartet und ihm ein Objekt vom Typ VerseKey gibst, kann es schon sein, dass Du casten musst!

Was bedeutet überhaupt:
Zitat:
Der Klassentyp ist nicht VerseKey sondern SWKey, der hier zurueckgegeben wird.
?

Wo wird dieser Klassentyp denn zurückgegeben?
this ist ein Zeiger auf das aktuelle Objekt, in dem Du Dich befindest, und damit auch von dessem Typ! Wenn Du *this verwendest greifst Du auf das Objekt zu, in dem Du Dich bei Ausführung dieses Codes befindest!

Für C++ Fragen kann ich Dir auch sehr das C++ Forum ans Herz legen! Hat mir schon oft geholfen!

Ciao
Reth


[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 08:31 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Reth:
Zitat:
Original von asrael229:

Deswegen kann man wahrscheinlich keinen CopyKonstruktor verwenden. Was ist das ueberhaupt? :D


Es wird glaub ich ein neues Objekt angelegt, dessen Zustand (=Attributwerte) der gleiche ist, wie der des übergebenen Objektes.


Ein Copy-Konstruktor ist ein Konstruktor der Klasse XYZ, der ein Objekt des Typs XYZ als Parameter nimmt.

Was der Konstruktor macht, liegt im Ermessen des Programmierers. Üblicherweise wird eine "tiefe" Kopie des Quellobjekts implementiert.



[ Dieser Beitrag wurde von Solar am 16.08.2006 um 08:31 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 08:31 Uhr

Mad_Dog
Posts: 1944
Nutzer
@asrael229:

Der new Operator liefert ja einen Zeiger auf die neue Instanz. Die Frage ist jetzt, welchen Typ die Zeigervariable hat, dem dieser neue Zeiger zugewiesen wird. Falls es nicht ein Zeiger auf die Klasse ist, dessen Konstruktor Du aufgerufen hast, ist evtl. ein expliziter Typecast notwendig - das hängt auch davon ab, ob die eine Klasse von der anderen abgeleitet ist usw. .

Und wie schon gesagt: Einige ältere C++ Compiler die Typisierung eben nicht so genau - das Resultat siehst Du jetzt selbst.
--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 09:00 Uhr

gni
Posts: 1106
Nutzer
Zitat:
asrael229:
Hab mir spasseshalber mal die new Datei auf meinem Mac OSX System angesehen. Die sieht hier aber fast gleich aus. Zumindest die Prototypen sind gleich.
Hier funktioniert die kompilierung mit gcc3.3 ohne Probleme.

Am besten ist, Du machst die .ii Files (von 2.95.x und 3.3.x) verfügbar, denn damit könnte man vermutlich Dein Problem am ehesten diagnostizieren.

Ich konnte versekey.cpp mit allen mir zu Verfügung stehenden AmigaOS GCC Versionen übersetzen (2.95.x, 3.3.6, 3.4.6, etc.) und es gab _keinen_ Fehler. Die MorphOS GCC Versionen haben auch keinen Fehler gemeldet. FWIW, alle verwendete GCCs waren Cross-Compiler.

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 09:02 Uhr

asrael229
Posts: 37
Nutzer
Hallo.


Ich hatte es ja gestern schonmal versucht den Code zu posten.
Das hat die Foren Software nicht ganz mitgemacht, weil es doch ein Stuecki ist.

>Und es handelt sich hier um eine Datei der "sword" Bibliothek von >http://www.crosswire.org. Fuer die Bibliothek (und mit der Biblioetek) >existieren einige Bibeltexte, Woerterbuecher usw.. Fuer einige >Plattformen gibt es hierzu auch Frontends, fuer Amiga aber nicht. Ich >dachte mir als ersten Schritt muesste die Bibliothek portiert werden...

Datei kann hier runtergeladen oder angesehen werden:
http://www.software-by-mabe.com/download/versekey.cpp

Die Stelle mit dem new Operator muesste in der Methode VerseKey::clone sein.


Beste Gruesse,
Manfred

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 09:07 Uhr

asrael229
Posts: 37
Nutzer
Zitat:
Original von gni:
Am besten ist, Du machst die .ii Files (von 2.95.x und 3.3.x) verfügbar, denn damit könnte man vermutlich Dein Problem am ehesten diagnostizieren.

Ich konnte versekey.cpp mit allen mir zu Verfügung stehenden AmigaOS GCC Versionen übersetzen (2.95.x, 3.3.6, 3.4.6, etc.) und es gab _keinen_ Fehler. Die MorphOS GCC Versionen haben auch keinen Fehler gemeldet. FWIW, alle verwendete GCCs waren Cross-Compiler.


Aha. Auf welchem System hast Du das dann kompiliert?
Ich habs auf einem OS3 System versucht.
Habe mir vor einiger Zeit die CLib2 installiert, sodass ixemul und libnix nicht mehr gebraucht wird. Vielleicht habe ich mir dabei C++ zerschossen.

Gruesse,
Manfred

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 09:08 Uhr

Mad_Dog
Posts: 1944
Nutzer
@asrael229:

Hab's mal schnell überflogen...

code:
SWKey *VerseKey::clone() const
{
	return new VerseKey(*this);
}


Das ist aber eine Methode und kein Konstruktor!
Der Rückgabewert ist ein Zeiger auf eine Klasse Namens SWKey, new liefert hier aber einen Zeiger auf eine Instanz der Klasse Versekey.
Folglich müsste es so heißen:

code:
SWKey *VerseKey::clone() const
{
	return (SWKey*)new VerseKey(*this);
}


--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 09:17 Uhr

asrael229
Posts: 37
Nutzer
Zitat:
Original von Mad_Dog:
@asrael229:

Hab's mal schnell überflogen...

code:
SWKey *VerseKey::clone() const
{
	return new VerseKey(*this);
}


Das ist aber eine Methode und kein Konstruktor!
Der Rückgabewert ist ein Zeiger auf eine Klasse Namens SWKey, new liefert hier aber einen Zeiger auf eine Instanz der Klasse Versekey.
Folglich müsste es so heißen:


Ja, aber hier muesste ja normalerweise (ohne es ausprobobiert zu haben) dieser Konstruktor ausgerufen werden:
code:
VerseKey::VerseKey(VerseKey const &k) : SWKey(k)
{
   ...
}



Manfred

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 10:47 Uhr

gni
Posts: 1106
Nutzer
Zitat:
srael229:
Zitat:
gni:
FWIW, alle verwendete GCCs waren Cross-Compiler.

Aha. Auf welchem System hast Du das dann kompiliert?
Ich habe nur deshalb mit Cross-Compiler gearbeitet, weil ich die scheller zur Hand hatte. Die verhalten sich ansonsten genau wie auf dem eigentlichen Zielsystem.
Zitat:
Ich habs auf einem OS3 System versucht.
Habe mir vor einiger Zeit die CLib2 installiert, sodass ixemul und libnix nicht mehr gebraucht wird. Vielleicht habe ich mir dabei C++ zerschossen.

Sieht ganz danach aus.

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 10:49 Uhr

gni
Posts: 1106
Nutzer
Zitat:
asrael229:
Datei kann hier runtergeladen oder angesehen werden:
http://www.software-by-mabe.com/download/versekey.cpp

Die nutzt nichts. Die .ii Dateien sind viel interessanter.

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 11:39 Uhr

asrael229
Posts: 37
Nutzer
Zitat:
Original von gni:
Zitat:
asrael229:
Datei kann hier runtergeladen oder angesehen werden:
http://www.software-by-mabe.com/download/versekey.cpp

Die nutzt nichts. Die .ii Dateien sind viel interessanter.

Ok, hier bitte schoen:

http://www.software-by-mabe.com/download/versekey_gcc-2.95.3.ii
http://www.software-by-mabe.com/download/versekey_gcc-3.3.3.ii

Bin ja mal gespannt, was man da raus lesen kann.


Beste Gruesse,
Manfred

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 11:46 Uhr

Solar
Posts: 3680
Nutzer
In der 2.95er Version:

code:
SWKey *VerseKey::clone() const
{
	return new VerseKey(*this);
}


In der 3.3er Version:

code:
SWKey *VerseKey::clone() const
{
        return new VerseKey((size_t)*this);
}


Keine Ahnung wo der Unterschied herkommt, aber das kann nicht gut gehen. I-)

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 12:14 Uhr

asrael229
Posts: 37
Nutzer
Zitat:
Original von Solar:
Keine Ahnung wo der Unterschied herkommt, aber das kann nicht gut gehen. I-)


Hmm, sorry. Ich hatte anscheinen den cast auf "size_t" vergessen raus zu machen. Ich hab eine neue version der gcc 3.3.3 .ii Datei online gestellt.


Manfred

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 12:29 Uhr

Holger
Posts: 8116
Nutzer
Die extreme Umformatierung der source lines bei der Klassendeklaration lässt auf eine Menge Preprozessor-Magie schließen. Da wundert mich das eigentlich nicht so sehr. Für eine genauere Deutung dessen, was da vor sich geht, müsste man schon einen Blick in die verursachenden .h files schauen.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

16.08.2006, 13:31 Uhr

asrael229
Posts: 37
Nutzer
Hallo und sorry.

Die CLib2 Umgebung hatte doch tatsaechlich Einfluss auf die C++ Umgebung. Seit ich wieder auf ixemul umgestellt habe, kompilierts ohne Schwierigkeiten.

Also, CLib2 und C++ sind keine Freunde.

Danke an alle.


Viele Gruesse,
Manfred

[ - Antworten - Zitieren - Direktlink - ]


-1- 2 3 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Probleme mit new Operator bei g++ [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.