Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Kniffligere Präprozessor-Direktive

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
IchBins
Gast





BeitragVerfasst am: 01. Dez 2002 21:11   Titel: Kniffligere Präprozessor-Direktive

Ich habe ein Konstrukt

if (0x0011!=ntohl(0x0011))

mit dem ich feststelle, ob auf einer Maschine ein Unterschied zwischen Net- und Host-Byteorder besteht. Das Ding hätte ich jetzt gerne als Präprozessordirektive.

#if (0x0011!=ntohl(0x0011))

funzt aber leider nicht. Geht sowas überhaupt mit einer "normalen" funktion wie ntohl()?
 

tkortkamp



Anmeldungsdatum: 08.04.2001
Beiträge: 143
Wohnort: Bremen

BeitragVerfasst am: 01. Dez 2002 21:49   Titel: Re: Kniffligere Präprozessor-Direktive

Nein.

Was spricht denn gegen if (0x0011!=ntohl(0x0011))?

c ya,
Tobias
_________________
dude i'm pretty damn sure you could script somebody back to life
 
Benutzer-Profile anzeigen Private Nachricht senden

Udo Kanter
Gast





BeitragVerfasst am: 01. Dez 2002 21:53   Titel: Re: Kniffligere Präprozessor-Direktive

#define BANANE (0x0011!=ntohl(0x0011))

...

if ( BANANE ) {

}
 

IchBins
Gast





BeitragVerfasst am: 02. Dez 2002 8:25   Titel: Re: Kniffligere Präprozessor-Direktive

Die Geschichte mit dem #if funzt schlichtweg nicht, der Compiler (bzw. Präprozessor) weigert sich, das zu akzeptieren.

Tja und

#define BANANE (0x0011!=ntohl(0x0011))
if ( BANANE ) {

hat den Nachteil, dass das nach dem Präprozessor doch wieder nur aktiver Code der Sorte

if (0x0011!=ntohl(0x0011))

ist. Ich suche aber nach einer Möglichkeit, die den Code nur auf Maschinen drinlässt, deren Host-Byteorder != der Network-Byteorder ist und ansonsten den Teil innerhalb der #if-Bedingung schlichtweg weglässt.
 

Udo Kanter
Gast





BeitragVerfasst am: 02. Dez 2002 10:29   Titel: Re: Kniffligere Präprozessor-Direktive

Verstehe ich dich richtig?

Der Präprozessor soll rausfinden ob ein Unterschied zwischen der Net- und Hostbyteorder besteht?
Und zwar indem er den Ausdruck (0x0011!=ntohl(0x0011)) auswertet, wobei ntohl eine Funktion der C-Lib ist?

Das funktioniert so auf keinen Fall!

Vielleicht liefer der gcc ja Konstanten auf welcher Architektur er grade läuft, ansonsten musst du dir diese selber definieren, und beim Kompilieren entsprechen setzen.

in etwa

#ifdef ( I386 )
#elseif ( SPARC )
#elseif ( MIPS )
#else
#endif
 

hjb
Pro-Linux


Anmeldungsdatum: 15.08.1999
Beiträge: 3236
Wohnort: Bruchsal

BeitragVerfasst am: 02. Dez 2002 12:24   Titel: Re: Kniffligere Präprozessor-Direktive

Hi,

es gibt irgendwo ein Macro für die Byte-Order, ich weiß allerdings nicht, ob es Linux-spzifisch ist. Enfach mal grep ENDIAN in allen Includes...

Gruß,
hjb
_________________
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger

IchBins
Gast





BeitragVerfasst am: 02. Dez 2002 12:37   Titel: Re: Kniffligere Präprozessor-Direktive

Ok, dann frag' ich mal anders

Welche Byteorder ist im Netz denn üblich - das Gleiche, was Motorola-Prozessoren auch machen, also von High-Byte nach Low-Byte (richtig rum also ?

Und wie sieht die Byteorder auf einem Sparc-Prozessor aus? Mehr als ix86, PPC und Sparc will ich eh' nicht abdecken...
 

Wolfgang
Gast





BeitragVerfasst am: 02. Dez 2002 16:45   Titel: Re: Kniffligere Präprozessor-Direktive

Hi!

Habe mal eben im IRC einen Sparc-Assemblerprogrammierer gefragt:

<wolfgang> is sparc correct-endian?
<inituni> wolfgang : no

Cheers,
GNU/Wolfgang
 

user1
Gast





BeitragVerfasst am: 02. Dez 2002 17:16   Titel: Re: Kniffligere Präprozessor-Direktive

Tach Zusammen

Hat ein normaler PC-CPU die Netzwerk Byteorder oder gibt es da noch Unterschiede zwischen AMD und Intel?

Habe über localhost auf einen Server mit Telnet zugegeriffen, der den Port nicht mit htns(PORT) definiert hatte, und es ging nicht. Es funktionierte erst, als ich htns() benutzte.
Ach ja, ich habe einen Athlon.

Kennt jemand den Grund?


thx
user1
 

IchBins
Gast





BeitragVerfasst am: 02. Dez 2002 17:56   Titel: Re: Kniffligere Präprozessor-Direktive

So, was ich inzwischen rausbekommen habe:

Network-Byteorder = Motorola = "richtig rum", also HighByte/LowByte

Alle Intel- (und AMD-) Prozessoren haben keine Network-Byteorder, sondern sind "falschrum" (gerade anders herum, wie Zahlen schriftlich auch dargestellt werden), also LowByte/HighByte

Tja und Sparc? Keine Ahnung...
 

user1
Gast





BeitragVerfasst am: 03. Dez 2002 8:36   Titel: Re: Kniffligere Präprozessor-Direktive

Tach

thx

Aber wieso hat der PC little endian? Ist doch falsch
Im Dezimalen kommt ja auch die hochwertigste Zahl zuerst.


Gruss user1
 

IchBins
Gast





BeitragVerfasst am: 03. Dez 2002 8:54   Titel: Re: Kniffligere Präprozessor-Direktive

Klar ist das falsch - aber sag' bzw. frag das Intel, die haben sich den Mist einfallen lassen! Naja, von denen stammen ja noch andere dämliche Ideen wie z.B. die Geschichte mit den nicht beliebig benutzbaren Prozessorregistern, die außer den Chipdesignern wahrscheinlich kein Mensch wirklich verstanden hat.

Btw: Ich weiß nicht mehr genau, ob das beim Alpha so ist, aber es gibt noch schrägere Zahlendarstellungen. Wenn Motorola z.B. eine 32-Bit-Zahl als AABBCCDD und Intel als DDCCBBAA darstellt, macht dieser (Alpha?) da BBAABBCC draus *graus*
 

user1
Gast





BeitragVerfasst am: 03. Dez 2002 14:50   Titel: Re: Kniffligere Präprozessor-Direktive

Bei einem 16 Bit Prozessor könnte ich mir das noch vorstellen, aber bei einem 64 Bit Alpha...
 

IchBins
Gast





BeitragVerfasst am: 04. Dez 2002 9:45   Titel: Re: Kniffligere Präprozessor-Direktive

OK, es hat sich geklärt, Sparcs sind genau so falsch rum wie die Intel-Dinger: http://www.support.compaq.com/amt/freeport/whites/endian.html
 

Gregor Seiler
Gast





BeitragVerfasst am: 04. Dez 2002 20:41   Titel: Re: Kniffligere Präprozessor-Direktive

Hallo!
Auch wenn es auf den ersten Blick falschherum erscheint, little-endian hat einige signifikante Vorteile. Zum Beispiel beim Vergroessern von Speicherbereichen (relloc()).
Soweit ich weiss, sind die meisten Netzwerkprotokolle big-endian. Er bedarf allerdings nur einer kleinen Funktion, um die "byteorder" auf einer little-endian Masschine entsprechend zu aendern.
PPC ist uebrigens bi-endian.

Gruss,
Gregor
 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy