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: 1858 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: 8116 Nutzer |
Zitat: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: 8116 Nutzer |
Zitat:Da verwechselst Du etwas. Was Du meinst, ist folgende Initialisierung: C code:Dann muss bar ein konstanter Ausdruck sein, solange man nicht C99 benutzt. Bei C++ ist das imho auch nicht mehr nötig.char foo[bar]; Aber hier geht es um C++ code: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.char foo[]=new char[ausdruck]; 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: 1858 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: 8116 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:Stimmt, da hab' ich wohl was verwechselt. -- Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker [ - Antworten - Zitieren - Direktlink - ] |
15.05.2009, 00:44 Uhr Reth Posts: 1858 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:Genau daran liegt es. Zumindest GCC 4(.3.2) mag das nicht. Zitat: 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: 1858 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: 1487 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: 1858 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: 1487 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 © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |