amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > GCC compiler error on new field creation [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2009-05-13, 23:23 h

Reth
Posts: 1858
User
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

[ - Answer - Quote - Direct link - ]

2009-05-14, 09:52 h

Holger
Posts: 8116
User
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.

[ - Answer - Quote - Direct link - ]

2009-05-14, 10:00 h

DrNOP
Posts: 4118
User
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

[ - Answer - Quote - Direct link - ]

2009-05-14, 10:32 h

Holger
Posts: 8116
User
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.

[ - Answer - Quote - Direct link - ]

2009-05-14, 10:44 h

Reth
Posts: 1858
User
@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

[ - Answer - Quote - Direct link - ]

2009-05-14, 11:00 h

Holger
Posts: 8116
User
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.

[ - Answer - Quote - Direct link - ]

2009-05-14, 13:13 h

DrNOP
Posts: 4118
User
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

[ - Answer - Quote - Direct link - ]

2009-05-15, 00:44 h

Reth
Posts: 1858
User
@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

[ - Answer - Quote - Direct link - ]

2009-05-15, 09:00 h

gni
Posts: 1106
User
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. ]

[ - Answer - Quote - Direct link - ]

2009-05-15, 21:37 h

Reth
Posts: 1858
User
@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

[ - Answer - Quote - Direct link - ]

2009-05-16, 00:39 h

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

[ - Answer - Quote - Direct link - ]

2009-05-16, 01:02 h

Reth
Posts: 1858
User
@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

[ - Answer - Quote - Direct link - ]

2009-05-16, 08:31 h

ZeroG
Posts: 1487
User
@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.

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > GCC compiler error on new field creation [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.