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

amiga-news.de Forum > Programmierung > GCC compiler error on new field creation [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

13.05.2009, 23:23 Uhr

Reth
Posts: 1753
Nutzer
Hallo zusammen,

hänge gerade an einem Compilerfehler bei dem Versuch einen fremden Source für den Amiga zu compilieren (SDL).

Habe folgende C++ Zeile:
C++ code:
unsigned char *new_data = new unsigned char[w * h * n_bytes];


Soweit ich weiss kann man in C++ ja Felder auch mit new [] anlegen. Allerdings sagt der Compiler hier, dass new nur integrale oder enumerierte Typen verträgt. w, h und n_bytes sind alles numerische Werte, so dass dem Erstellen eines Feldes hier eigentlich nix im Wege stehen sollte.

Liegt das am "unsigned char"? Oder an Compilereinstellungen?

Kann das Problem auch durch Umprogrammierung lösen, würde nur gern verstehen, was er hier bemängelt!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

14.05.2009, 09:52 Uhr

Holger
Posts: 8038
Nutzer
Zitat:
Original von Reth:
w, h und n_bytes sind alles numerische Werte, so dass dem Erstellen eines Feldes hier eigentlich nix im Wege stehen sollte.

Ist das auch wirklich sicher?
Also nicht möglich, dass es sich bei einer der Variablen um ein "wenn nichts deklariert wurde, ist es höchstwahrscheinlich int"-Datentyp handelt?

mfg

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

[ - Antworten - Zitieren - Direktlink - ]

14.05.2009, 10:00 Uhr

DrNOP
Posts: 4118
Nutzer
Mit einem Standard-C Compiler habe ich das auch mal probiert. Der hat diese Stelle angemeckert, weil er die Rechenoperation nicht vertragen hat. Er wollte einen festen Wert, nicht etwas was erst zur Laufzeit bestimmt wird.

Ist das bei C++ anders?
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

14.05.2009, 10:32 Uhr

Holger
Posts: 8038
Nutzer
Zitat:
Original von DrNOP:
Mit einem Standard-C Compiler habe ich das auch mal probiert. Der hat diese Stelle angemeckert, weil er die Rechenoperation nicht vertragen hat. Er wollte einen festen Wert, nicht etwas was erst zur Laufzeit bestimmt wird.

Da verwechselst Du etwas. Was Du meinst, ist folgende Initialisierung:
C code:
char foo[bar];

Dann muss bar ein konstanter Ausdruck sein, solange man nicht C99 benutzt. Bei C++ ist das imho auch nicht mehr nötig.

Aber hier geht es um
C++ code:
char foo[]=new char[ausdruck];

Die Syntax gibt es unter C gar nicht. Und es ist eine dynamische Allokation zur Laufzeit, nicht anders als malloc() unter C (also auf dem heap). Da gibt es keinen Grund, auf konstante Größen zu bestehen.

mfg

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

[ - Antworten - Zitieren - Direktlink - ]

14.05.2009, 10:44 Uhr

Reth
Posts: 1753
Nutzer
@Holger:

Die Werte sind wie folgt definiert:
C++ code:
int w = this->getWidth();
int h = this->getHeight();
...
int n_bytes = alpha ? 4 : 3;


Die Methoden getWidth() und getHeight() liefer einen int-Wert zurück. Dieser wird aus den Werten w und h der Surface geholt:
C++ code:
int Image::getWidth() const {
	return this->surface->w;
}

int Image::getHeight() const {
	return this->surface->h;
}


surface ist dabei immer eine SDL_Surface, deren Attribute w und h sind vom Typ int.

Sehr seltsam!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

14.05.2009, 11:00 Uhr

Holger
Posts: 8038
Nutzer
Zeigt der Compiler Dir auch eine Stelle innerhalb der Zeile an, die ihm nicht gefällt?

mfg

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

[ - Antworten - Zitieren - Direktlink - ]

14.05.2009, 13:13 Uhr

DrNOP
Posts: 4118
Nutzer
Zitat:
Original von Holger:
Die Syntax gibt es unter C gar nicht.

Stimmt, da hab' ich wohl was verwechselt. :glow:
--
Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker

[ - Antworten - Zitieren - Direktlink - ]

15.05.2009, 00:44 Uhr

Reth
Posts: 1753
Nutzer
@Holger:

Leider nein.

Es ist aber wohl meine Schuld, hatte ne falsche Codestelle gepostet.

Das Problem tritt hier auf, in der letzten Zeile:
C++ code:
void Image::scale(float sx,float sy) {
 //this->scale_x *= sx;
 //this->scale_y *= sy;
 int w = this->getWidth();
 int h = this->getHeight();
 SDL_LockSurface(this->surface);
 unsigned char *src_data = (unsigned char *)this->surface->pixels;
 /*FIBITMAP *new_bitmap = FreeImage_Allocate(sx * w, sy*h, this->surface->format->BitsPerPixel);
 unsigned char *data = (unsigned char *)FreeImage_GetBits(new_bitmap);*/
 int bytesperpixel = this->surface->format->BytesPerPixel;
 unsigned char *new_data = new unsigned char[sx * w * sy * h * bytesperpixel];


Da die beiden Werte sx und sy allerdings als float übergeben werden könnte es damit zusammenhängen, oder?

Seltsamerweise funktioniert das zum Code gehörende Windows-Executable. Keine Ahnung, mit welchem Compiler das erstellt wurde. Vielleicht wurde es nur für Windows korrigiert?
Den Source gibt es auch für Linux, dort habe ich ihn aber auch nicht compiliert.

Eine andere Frage habe ich auch noch: Könnte es Probleme geben, wenn man dem GCC C++ Sourcen gibt und diese mit:

gcc c source.cpp ...

compiliert anstelle von:

g++ ...

?
Oder spielt das keine Rolle?

Ciao

[ - Antworten - Zitieren - Direktlink - ]

15.05.2009, 09:00 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Reth:
C++ code:
void Image::scale(float sx,float sy) {
 ...
 unsigned char *new_data = new unsigned char[sx * w * sy * h * bytesperpixel];


Da die beiden Werte sx und sy allerdings als float übergeben werden könnte es damit zusammenhängen, oder?

Genau daran liegt es. Zumindest GCC 4(.3.2) mag das nicht.

Zitat:
Könnte es Probleme geben, wenn man dem GCC C++ Sourcen gibt und diese mit:

gcc c source.cpp ...

compiliert anstelle von:

g++ ...

? Oder spielt das keine Rolle?


Zum Übersetzen kann auch "gcc" verwendet werden, da das Frontend den passenden Compiler anhand des Suffixes der Quelldatei auswählt. Zum Linken sollte man aber besser "g++" benutzen, da dann automatisch an der richtigen Position gegen die libstdc++ (und eventuell libm) gelinkt wird. Das kann wichtig sein.


[ Dieser Beitrag wurde von gni am 15.05.2009 um 09:01 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

15.05.2009, 21:37 Uhr

Reth
Posts: 1753
Nutzer
@gni:

Danke. Habs mal auf int gecastet, da diese floats überall zusammen mit ints verwendet werden und die Ergebnisse auch immer an ints zugewiesen werden.

Eine andere Frage noch:

Gibts auf dem Amiga auch sowas wie __cdecl?
Eine Suche innerhalb des SDK-Verzeichnisses ergab nur Treffer innerhalb des clib2-Unterverzeichnisses.

Ciao

[ - Antworten - Zitieren - Direktlink - ]

16.05.2009, 00:39 Uhr

ZeroG
Posts: 1482
Nutzer
@Reth:
Bist du sicher das du das aktuelle SDK (V53) benutzt?
Ich finde __cdecl nur in SDK:newlib/include/_ansi.h.

[ - Antworten - Zitieren - Direktlink - ]

16.05.2009, 01:02 Uhr

Reth
Posts: 1753
Nutzer
@ZeroG:

Eigentlich ja, aber wie kann ich denn die Version eines SDKs überprüfen?

Und noch eine Frage: Gibt es unter AmigaOS für GCC auch das TEXT() Makro?

Ciao

[ - Antworten - Zitieren - Direktlink - ]

16.05.2009, 08:31 Uhr

ZeroG
Posts: 1482
Nutzer
@Reth:
V53 ist das OS4.1 SDK, im SDK: Verzeichnis sollte die AmigaOS 4.1 SDK.pdf liegen. Einfach die Datei öffnen - auf der ersten Seite unter dem lilafarbigen Balken steht die Versionsnummer.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > GCC compiler error on new field creation [ - Suche - Neue Beiträge - Registrieren - Login - ]


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