Hallo Liste,
für eine Satzbeschreibung muß ich die Satzlänge angeben.
Bei char ist das Klar
char Adresse[30]; sind 30 Bytes
aber wieviele Bytes sind es für
short
double
long
kann mir einer aus der Liste dieses einmal kurz beantworten?
Handbuch "Linux C Programmierung " ist noch auf dem Postweg ;-)))))
Vielen Dank im voraus
Rolf-Hubert
--
Rolf-Hubert Pobloth
Hallo!
Rolf-Hubert Pobloth
für eine Satzbeschreibung muß ich die Satzlänge angeben. Bei char ist das Klar char Adresse[30]; sind 30 Bytes aber wieviele Bytes sind es für
short double long
Dies ist IMHO nicht 100% festgelegt und kann von Plattform zu Plattform unterschiedlich sein. Aber ich meine mich an ein "sizeof(..)" in C erinnern zu können. Ruf das einfach einmal auf, und Du hast eine Antwort (Für Deine Architektur / Compiler Kombination). Mit den besten Grüßen, Konrad Neitzel -- SoftMediaTec GmbH Tel: 0172 / 689 31 45 Fax: 069 / 90 50 99 53
Am Don, 2003-06-26 um 11.44 schrieb Konrad Neitzel:
Hallo!
Rolf-Hubert Pobloth
schrieb: für eine Satzbeschreibung muß ich die Satzlänge angeben. Bei char ist das Klar char Adresse[30]; sind 30 Bytes aber wieviele Bytes sind es für
short double long
Dies ist IMHO nicht 100% festgelegt und kann von Plattform zu Plattform unterschiedlich sein. Aber ich meine mich an ein "sizeof(..)" in C erinnern zu können. Ruf das einfach einmal auf, und Du hast eine Antwort (Für Deine Architektur / Compiler Kombination).
Mein Problem ist es, daß mir eine Satzbeschreibung vorliegt in Form von Papier und ich hier die Felder auszählen muß um an eine bestimmte Stelle im Datensatz zu kommen. Daher meine Frage, wenn es mit SuSE 8.2 kompilert worden ist und auf Linux läuft, wieviele Bytes werden für diese o.a. Variablen im Datensatz reserviert/angelegt. Beispiel des Datensatzes TEXTEINTRAG00000000000000000000000000000000000000000000000000325,2500000000 Wo kann man dieses in unserer Linux-Dokumentationeventuell finden. "sizeof (..)" ist hierbei leider nicht hilfreich, da ich nichts kompiliere. Danke nochmals für die Hilfe und Geduld Rolf-Hubert
Rolf-Hubert Pobloth
Wo kann man dieses in unserer Linux-Dokumentationeventuell finden. "sizeof (..)" ist hierbei leider nicht hilfreich, da ich nichts kompiliere.
Das hat mit den Größen der Datentypen selbst nur bedingt etwas zu tuen. Die genannten Größen waren die Größen in dem Speicher. Hier hast Du aber eine Textform vorliegen. Da kann ich Dir nur raten, dass Du selbst die Trennzeichen herausbekommst. Einfach die Einträge anschauen, ob Du hier Felder erkennen kannst. Bei dem Eintrag vermute ich z.B. hinter der ,25 ein Feldende (Falls es sich um einen Betrag handelt). Das dies so korrekt ist, ist auch einfach erkennbar. Beispiel Geldbetrag. Ich kann einen Geldbetrag in einem double speichern. Jetzt kann ich im double auch werte wie 1,02345783576 speichern. Aber als Geldbetrag ist es unsinn und wird in der Applikation nicht vorkommen. Somit gebe ich auch nur zwei Stellen hinter dem Komma aus. Oder in der Höhe. Es mag zwar sein, dass auch ein Betrag von 123.425.432.432.432,23 abspeicherbar wäre. Aber ich gehe erst einmal davonaus, dass es diese hohen Beträge nie geben wird! (Was soll soviel kosten? Und was kriegt man dann noch für die ,23 ???) Daher ist dieses Format, welches Du erraten willst, komplett eigen vom Entwickler gewählt. Und je nachdem, wie sinnvoll er es gemacht hat, kann es alles oder nichts sein. Entweder Du hast eine Datensatzbeschreibung oder Du musst raten. Mit den besten Grüßen, Konrad Neitzel -- SoftMediaTec GmbH Tel: 0172 / 689 31 45 Fax: 069 / 90 50 99 53
Hallo, Rolf-Hubert Pobloth wrote:
Hallo Liste,
für eine Satzbeschreibung muß ich die Satzlänge angeben. Bei char ist das Klar char Adresse[30]; sind 30 Bytes aber wieviele Bytes sind es für
short
2 Byte
double
8 Byte
long
4 Byte
kann mir einer aus der Liste dieses einmal kurz beantworten? Handbuch "Linux C Programmierung " ist noch auf dem Postweg ;-)))))
Vielen Dank im voraus Rolf-Hubert
Gruss, Frank
Frank Spiess
short
2 Byte
Nur mindestens
long
4 Byte
ebenfalls nur mindestens. Auf einem 64-Bit System ist long z.B. meistens 8 Byte lang. Der C Standard definiert nur jeweils die Mindestlänge, die ein Typ haben muss und dass z.B. int niemals kürzer als short ist. Genau deshalb kann das zur Plattform gehörende ABI long als 8 Byte definieren. Richtig nett wird es jetzt noch, wenn diese Werte Teil von Strukturen sind, denn dann kommen u.U. noch Füllbytes dazu, die dazu dienen, die Felder im Speicher so anzuordnen, dass der Prozessor möglichst optimal zugreifen kann. So können Sparcs z.B. nicht auf ungerade Adressen zugreifen, weswegen der Compiler dafür sorgen muss, dass Werte immer mit einer geraden Adresse beginnen. Philipp
* On Thu, 26 Jun 2003 at 12:35 +0200, Rolf-Hubert Pobloth wrote:
für eine Satzbeschreibung muß ich die Satzlänge angeben. Bei char ist das Klar char Adresse[30]; sind 30 Bytes aber wieviele Bytes sind es für
short double long
#include
Adalbert Michelic
#include
int main() { printf("sizeof(char) = %d\n", sizeof(char)); printf("sizeof(short) = %d\n", sizeof(short)); printf("sizeof(double) = %d\n", sizeof(double)); printf("sizeof(long) = %d\n", sizeof(long)); return 0; }
Sehr schön - dazu war ich etwas zu faul :)
adalbert@pepe:/tmp > gcc -o sizeof sizeof.c adalbert@pepe:/tmp > ./sizeof sizeof(char) = 1 sizeof(short) = 2 sizeof(double) = 8 sizeof(long) = 4
Diese Werte sind aber nicht festgelegt! Dies kann somit ganz klar variieren! Und evtl. auch mit wichtig: Ebenfalls die Codierung kann sich unterscheiden, sprich: Selbst wenn man durch Zufall zwei Systeme hat, wo ein long genau 4 Bytes gross ist, kann die gleiche Zahl unterschiedlich codiert sein. Mit den besten Grüßen, Konrad Neitzel -- SoftMediaTec GmbH Tel: 0172 / 689 31 45 Fax: 069 / 90 50 99 53
Am Don, 2003-06-26 um 12.08 schrieb Konrad Neitzel:
Adalbert Michelic
," schrieb:
adalbert@pepe:/tmp > gcc -o sizeof sizeof.c adalbert@pepe:/tmp > ./sizeof sizeof(char) = 1 sizeof(short) = 2 sizeof(double) = 8 sizeof(long) = 4 Darüberhinaus können die Grössen sogar noch von Compiler-Flags abhängen, weshalb jede hard-codierte Grössenanname in Programmcode per Definition als Programmierfehler anzusehen ist (Einer *der* weitest verbreiteten Fehler und Portabilitätsprobleme)
In modernem Code sollte man für Typen fester Grösse statt char, short etc. die in stdint.h definierten Typen int8_t, int16_t usw. verwenden. (stdint.h ist neuerer POSIX-Standard und auf allen halbwegs aktuellen POSIX-kompatiblen Systemen vorhanden). Und wenn wir mal pedantisch sein wollen, es gibt auch Systeme auf denen der ein oder andere "Fixed-Size"-Typ nicht vorhanden ist. Diese sind zwar selten anzutreffen und im Linux/Unix-Umfeld ziemlich bedeutungslos, doch es gibt sie. Ralf
Am Don, 2003-06-26 um 13.41 schrieb Ralf Corsepius:
Am Don, 2003-06-26 um 12.08 schrieb Konrad Neitzel:
Adalbert Michelic
," schrieb: adalbert@pepe:/tmp > gcc -o sizeof sizeof.c adalbert@pepe:/tmp > ./sizeof sizeof(char) = 1 sizeof(short) = 2 sizeof(double) = 8 sizeof(long) = 4 Darüberhinaus können die Grössen sogar noch von Compiler-Flags abhängen, weshalb jede hard-codierte Grössenanname in Programmcode per Definition als Programmierfehler anzusehen ist (Einer *der* weitest verbreiteten Fehler und Portabilitätsprobleme)
In modernem Code sollte man für Typen fester Grösse statt char, short etc. die in stdint.h definierten Typen int8_t, int16_t usw. verwenden. (stdint.h ist neuerer POSIX-Standard und auf allen halbwegs aktuellen POSIX-kompatiblen Systemen vorhanden).
Habe mir mal die stdint.h angesehen und kann mir unter int8_t z.B. den Wertebereich ansehen. Wenn aber diese Variable nun als int_8t, int16_t oder int32_t abgespeichert wird, dann bleibt für mich noch die Frage, wenn die Variable den Wert 0 enthält, wieviele Bytes finde ich dann in der Datei im Datensatz. Betrag1 = int32_t Wert 12.345.678.90 (die Punkte nur wg der besseren Übersicht. Und nun die Frage: Sind es 32 Bits = 2 Bytes oder sind es 4 oder 8 Bytes. Es handelt sich bei der Datei nicht um eine Textdatei, sondern um kumulierte Buchhaltungsdaten. Es gibt kein Satzendezeichen und die Sätze sind verschieden lang. Die Sätze werden nur durch ihre Satzart 4 Stellen Textfeld definiert Eine alte Index-Sequentielle Datenbank
Und wenn wir mal pedantisch sein wollen, es gibt auch Systeme auf denen der ein oder andere "Fixed-Size"-Typ nicht vorhanden ist. Diese sind zwar selten anzutreffen und im Linux/Unix-Umfeld ziemlich bedeutungslos, doch es gibt sie.
* On Thu, 26 Jun 2003 at 13:08 +0300, Konrad Neitzel wrote:
Adalbert Michelic
," schrieb: [...] adalbert@pepe:/tmp > gcc -o sizeof sizeof.c adalbert@pepe:/tmp > ./sizeof sizeof(char) = 1 sizeof(short) = 2 sizeof(double) = 8 sizeof(long) = 4
Diese Werte sind aber nicht festgelegt! Dies kann somit ganz klar variieren! Und evtl. auch mit wichtig: Ebenfalls die Codierung kann sich unterscheiden, sprich: Selbst wenn man durch Zufall zwei Systeme hat, wo ein long genau 4 Bytes gross ist, kann die gleiche Zahl unterschiedlich codiert sein.
Stümpt. Was ich eigentlich noch dazuschreiben wollte, aber nicht mehr konnte, weil ich einen Termin hatte, war, daß diese Werte von einer 32bit x86-Plattform kommen und ausserdem wollte cih selbiges Programm nochmal auf 32bit PowerPC laufen lassen. Da wär dann auch gleich noch dringewesen, ein paar Dummy-Werte in die Variablen zu schreiben und byteweise zu dumpen. Aber irgendwie ist das hier ein wenig OT ... :-) (suse-programming? Heisst die so?) /apm -- GPG welcome, request public key: mailto:adalbert+key@lopez.at
On Thu, Jun 26, 2003 at 12:35:30PM +0200, Rolf-Hubert Pobloth wrote:
für eine Satzbeschreibung muß ich die Satzlänge angeben. Bei char ist das Klar char Adresse[30]; sind 30 Bytes aber wieviele Bytes sind es für
short double long
Die absoluten Größen von Datentypen sind in C nicht festgelegt, sondern implementationsabhängig. C mißt die Größen von Datentypen in Vielfachen von sizeof(char), d.h. sizeof(char) ist immer 1. Ob diese 1 dann auch für ein Byte steht und ob das Byte signed oder unsigned ist, ist wieder implementationsabhängig. Insbesondere ist mir mindestens eine Plattform (Ein Signalprozessor) bekannt, bei dem sizeof(char) = 1 (32 Bit) ist. Weiter verlangt C, daß sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) und außerdem sizeof(char) <= sizeof(float) <= sizeof(double) ist. Bei o.a. Signalprozessor ist das immer 1. :-) Wenn Du eine Satzbeschreibung mit Satzlängenangaben hast, riecht das nach Datensätzen fester Länge im Cobol-Format. In diesem Fall hast Du keine Datentypen in der Eingabe, sondern Bytestrings in einem fragwürdigen Zeichensatz (Cobol-Format bedeutet gute Chancen, Daten in einem der zahllosen EBCDIC-Format zu kriegen). Du mußt diese Daten dann mit memcpy() aus dem Datensatz rauskopieren, zeichensatzkonvertieren und dann mit strtol() oder einem vergleichbaren Aufruf in was benutzbares Umwandeln. Kannst Du von den Jungs nicht was zeitgemäßes kriegen? XML zum Beispiel? Kristian
participants (7)
-
Adalbert Michelic
-
Frank Spiess
-
Konrad Neitzel
-
Kristian Koehntopp
-
Philipp Thomas
-
Ralf Corsepius
-
Rolf-Hubert Pobloth