Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
17.08.2001, 21:34
Prefect




Quellcode:
void SomeFunction(unsigned char *odst, ...)
{
...
#define dst ((unsigned short *)odst)
dst++;
...
}

Compilerfehler...

Mehr muß ich dazu hoffentlich nicht sagen, oder? Ach ja, gcc hat damit keine Probleme...

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
001
17.08.2001, 21:52
Zeeke



Borland C++ auch nicht...
MingW32 aber....

--

zum Seitenanfang zum Seitenende Profil || Suche
002
17.08.2001, 22:07
Another1



w0rd

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
003
18.08.2001, 11:35
Prefect



MingW32 ist ja im Endeffekt auch gcc :)

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
004
18.08.2001, 11:41
Zeeke



Ja, aber dort geht es nicht..., also ich habe es mit DevC++ getestet, aber das basiert ja eigentlich auf MingW32....

edit:
passing `char *' as argument 1 of `SomeFunction(unsigned char *)' changes signedness

Das ist der Fehler....

--


Dieser Beitrag wurde am 18.08.2001 um 11:42 von ZeekeGF bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
18.08.2001, 15:30
Prefect



Umm..

Der Fehler liegt bei dir, wie du eigentlich dir selber denken können müßtest. Die Funktion nimmt ja ein (unsigned char *) als Parameter. Wahrscheinlich hast du einfach nen String übergeben, und Strings sind per default (signed char *). Außerdem sollte dir auffallen, dass der Fehler nicht innerhalb der Funktion, sondern im Framework auftritt *kopfschüttel*

Außerdem sollte das nur ne Warnung sein und kein Fehler (es sei denn du hast warnings as errors eingestellt).

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.


Dieser Beitrag wurde am 18.08.2001 um 15:31 von Prefect bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
006
18.08.2001, 16:24
Zeeke



Hm, bei Borland geht aber genau der selbe Code ohne Warunung oder Fehler :)

Aber hast ja recht :)

--


Dieser Beitrag wurde am 18.08.2001 um 16:32 von ZeekeGF bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
18.08.2001, 17:22
Prefect



Dann stell mal das Warninglevel ein bißchen höher.... ne ganze Menge potentieller Bugs kann man frühzeitig finden, wenn man auf dem höchsten Warnungslevel arbeitet.

Bei meinen eigenen Sachen arbeite ich immer auf Level 4 unter MSVC++ und mit -Wall mit gcc. Ach ja, MSVC++ kommt auf Level 4 immer mit zwei besonders nervigen und unnötigen Warnungstypen, die kann man ganz einfach abschalten:

#pragma warning(disable : 4514) // unreferenced inline function removed
#pragma warning(disable : 4100) // unreferenced formal parameter

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
008
20.08.2001, 09:29
Hessie J.



Wer so 'nen Code tatsächlich benutzt gehört aber auch erschossen :-)

--

zum Seitenanfang zum Seitenende Profil || Suche
009
20.08.2001, 14:09
Another1



uhuh, das darfst du doch nich zu prefect sagen *ZuHessieSchauUndAnDenKopfHau* =P

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
010
20.08.2001, 15:26
Hessie J.



*aua* ah schmarrn, das sind akademische Rätselspielchen! In einer Funktion ein #define, wo gibt's denn sowas? Auf so eine Idee muss man erstmal kommen ;)

--

zum Seitenanfang zum Seitenende Profil || Suche
011
20.08.2001, 16:37
TheVoice



Ja ich weiß net, ich hab mich auch schon gewundert... finde das irgendwie
ehm.... schlecht ?

Ich meine hallo ?
#define ist ein Präprozessorbefehl und der wird vor dem Compiling
ausgeführt wobei die Konstante dst erst einen Wert nach Funktionsaufruf
zugewiesen bekommt.

Und dann noch ne Konstante inkrementieren, hä ?

Das kann doch nur zu einem Compilingfehler führen....

ich mein okay..... das war wahrscheinlich vorhergesehen,
und es geht wohl eher um die 100 Fehler, die dabei ausgegeben
werden, wobei es sich bei den 100 Fehlern nur um die selbe Zeile
handelt...

aber naja

Zitat:

Wer so 'nen Code tatsächlich benutzt gehört aber auch erschossen :-)

--

Against TCPA | Resourcecode.de | Blender 3D | [ Darkzone | Pandorra | Alpine ]

zum Seitenanfang zum Seitenende Profil || Suche
012
20.08.2001, 17:38
[PE]Spinator



Alles was hinter #define steht, wird ja beim kompilierprozess durch die entsprechende definition ersetzt... Von dem her sollte das eigentlich schon gehen, aber ein Sicherheitsmechanismus von M$ verhindert das...
übrigens kommt bei mir nur 1 fehler: '++' muss ein L-Wert sein... es wird so wies aussieht doch nicht einfach ersetzt.

und ehm... Wieso zum Geier gibt das ne schutzverletzung?:

void main( )
{
struct struktur
{
int wert;
} array[100];

array[100].wert = 0;
}

Versteh ich da was falsch, wenn ich denke, das ich auf die letzte variable im array zugreifen kann??

--

This post was written using Opera 7.0 (http://www.opera.com)


Dieser Beitrag wurde am 20.08.2001 um 17:39 von [PE]Spinator bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
013
20.08.2001, 17:42
Gollum



wenn du eine array mit [100] deklarierst hat sie zwar 100 felder,
aber da wird mit 0 zu zählen begonnen.. also wäre das letzte feld [99]...

--

[url="http://www.thelordoftherings.com/cgi-bin/get-image.pl?ID=alan-lee-058 "]-N/A-[/url]
[url="http://www.microsoft.com/germany/ms/unternehmensinformationen/historie.htm "]Mean cats eat parakeets![/url]

zum Seitenanfang zum Seitenende Profil || Suche
014
20.08.2001, 17:53
[PE]Spinator



Wenn ich ein array[100] will, dann geh ich doch davon aus, das er mir ein Array mit array[0]-array[100] erstellt....

Mach mal:

char text[100];
text[100] = 0;

das geht ja auch... Gibts da bei den structs ne andere Regelung?

--

This post was written using Opera 7.0 (http://www.opera.com)

zum Seitenanfang zum Seitenende Profil || Suche
015
20.08.2001, 18:10
TheVoice



Nein, das ist definitiv nicht so...

Du definierst ein 100 elementiges Array mit int Array[100];
aber zählst dann beim zugriff von 0 - 99 (das ergibt dann 100 Elemente, da die 0 mitzählt)

--

Against TCPA | Resourcecode.de | Blender 3D | [ Darkzone | Pandorra | Alpine ]

zum Seitenanfang zum Seitenende Profil || Suche
016
20.08.2001, 18:20
[PE]Spinator



Hmm?
Aber dann wär das ja nur bei structs so, weil das:

char text[100];
text[100] = 0;

funktioniert... ein text[100] ist also ein 101 elementiges array.

--

This post was written using Opera 7.0 (http://www.opera.com)

zum Seitenanfang zum Seitenende Profil || Suche
017
20.08.2001, 18:42
Gollum



wenn du das array deklarierst wird ein adressbereich in der benötigten größe dafür reserviert, wenn du die grenze dann überschreitest wird einfach die nächste speicheradresse verwendet, aber wenn da schon was steht gibts einen natürlich eine schutzverletzung weil du dort nicht drüberschreiben darfst.... dh es kann gehen, aber muss es nicht... - also mach das nicht so :)

--

[url="http://www.thelordoftherings.com/cgi-bin/get-image.pl?ID=alan-lee-058 "]-N/A-[/url]
[url="http://www.microsoft.com/germany/ms/unternehmensinformationen/historie.htm "]Mean cats eat parakeets![/url]

zum Seitenanfang zum Seitenende Profil || Suche
018
20.08.2001, 19:20
Prefect



Naja, es wird zunächst einmal gehen, aber es werden Teile des Stacks überschrieben. Und früher oder später gibt es dann Krach. TTT kann von Stackkorruption ein Liedchen singen, gell? ;)

So, und für all diese Leute, die mich umbringen wollen oder so ;)

Das, was ich da mache, macht durchaus gewissen Sinn. Ich hab Callbackfunktionen, die natürlich immer die gleichen Parameter haben müssen - sonst müßte ich die Funktion selbst casten. Im speziellen Fall geht es um eine Grafikroutine, die RLE-Sprites mit zwei verschiedenen Paletten auf eine TrueColor-Surface bringt. Und diese Surfaces können sowohl 16Bit als auch 32Bit haben. Da ich lieber einen Funktionspointer habe als 1000 switches verwende ich einmal nen Funktionspointer. Und damit ich ohne große Umstände den char * bzw. void *-Argumentpointer auf die richtige Größe casten kann verwende ich das Makro.

Wenn jemand ne wirklich gute Alternative hätte wäre ich froh drum :)
Ach ja, templates kommen nicht in Frage, weil der Code auch unter purem C laufen muß. Und ganze Funktionen in ein Makro zu packen ist auch nicht soooo toll *g*

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
019
20.08.2001, 19:36
Gollum



Err..
Das versteh ich jetzt nicht :) Sind nicht eh alle Zeiger gleich groß ?

--

[url="http://www.thelordoftherings.com/cgi-bin/get-image.pl?ID=alan-lee-058 "]-N/A-[/url]
[url="http://www.microsoft.com/germany/ms/unternehmensinformationen/historie.htm "]Mean cats eat parakeets![/url]

zum Seitenanfang zum Seitenende Profil || Suche
020
20.08.2001, 19:56
[PE]Spinator



IcH kANn aucH n verdAmmtes Liedchen, wEnn niCht gLeich ne ganZe sYMphonie von StackkOrRuption SIngeN!!!! AARGH!

Aber danke für die Antworten... Ich hab mich bis jetzt auf die annahme gestützt, das ein "int wert[100]" ein 101 elementiges array ist, würde mir auch logischer erscheinen... Aber was will man machen.

--

This post was written using Opera 7.0 (http://www.opera.com)

zum Seitenanfang zum Seitenende Profil || Suche
021
20.08.2001, 20:59
blair



bitte keine leetspeak, danke.

wie stroustroup mal sagte: wenn jemand macros in seinen programmen verwendet, kann das 3 gründe haben:

1. Ein Fehler in der Programmiersprache
2. Ein Fehler im Programm
3. Ein Fehler beim Programmierer.

(Wollte das nur mal loswerden...)

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs

zum Seitenanfang zum Seitenende Profil || Suche
022
20.08.2001, 22:55
[PE]Spinator



Das war nicht leetspeak :)
DAS ist 1337-speak (dein Text...):

b|773 k3|n3 1337$p34k, d4nk3.
w|3 $7r0u$7r0up m41 $4973: w3nn j3m4nd m4(r0$ |n $3|n3n pr09r4mm3n v3rw3nd37, k4nn d4$ 3 9ründ3 h4b3n:
1. 3|n f3h13r |n d3r pr09r4mm|3r$pr4(h3
2. 3|n f3h13r |m pr09r4mm
3. 3|n f3h13r b3|m pr09r4mm|3r3r.
(w01173 d4$ nur m41 10$w3rd3n...)

Und den 1337-TranZlator gibbet hier...
MUAHAHAHA

--

This post was written using Opera 7.0 (http://www.opera.com)

zum Seitenanfang zum Seitenende Profil || Suche
023
20.08.2001, 22:58
[PE]Spinator



Auf das alle Menschen friedlich 1337 sprechen mögen :)

--

This post was written using Opera 7.0 (http://www.opera.com)

zum Seitenanfang zum Seitenende Profil || Suche
024
21.08.2001, 20:00
Prefect



Heh. Makros können eigentlich recht nützlich sein, solange man sie _sinnvoll_ verwendet. Da können soviele Stroustroups soviel sagen wie sie wollen. In meinem Fall wäre ein Makro sogar einiges sinnvoller, wenn es nicht so problematisch mit dem Debuggen etc.. wäre.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche