Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Τα %ld , %lu αναφερονται στον ιδιο τυπο δεδομενων που

ειναι ο unsigned long ?

 

Επειδη δεν μου "κτυπαει" καθολου αμα βαλω και τα 2 μεσα στην printf

 

>

#include<stdio.h>
int main(void)
{
printf(" int type is : %lu bytes \n short type is: %lu bytes \n long type is : %ld bytes " , sizeof(int), sizeof(short) , sizeof(long));
   printf("\n float type is: %ld bytes \n double type is: %ld bytes \n long double is : %ld bytes " , sizeof(float) , sizeof(double) , sizeof(long double));
   
   return 0;
}

 

Διάβασε την σύνταξη της printf (πχ εδώ). Τα u,d,κτλ είναι conversion specifiers δηλαδή δηλώνουν τι τύπο έχεις ενώ το l είναι length modifier δηλαδή ενώ το d δηλώνει int, το ld δηλώνει long int όπως είπε ο migf1.

 

Ένα πράγμα που ίσως έχει σημασία να πούμε είναι ότι η μεταβλητή που δηλώνεις δεν μετατρέπεται αυτόματα στον τύπο που του λες. Η λέξη conversion εδώ δεν ήταν και πολύ επιτυχημένη. Το πρότυπο λέει "If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined" δηλαδή δεν μπορείς να είσαι σίγουρος για το αποτέλεσμα της printf("%f\n", sizeof(int));

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Ευχαριστω παιδια ! Εχω ολα τα warning flags ενεργοποιημενα

 

> gcc -W -Wextra -Wall -std=c99 -o "tests" "tests.c" (στο φάκελο: /home/kostas/PROGRAMS) 

 

Απλα επειδη ο τύπος του sizeof διαφέρει απο υλοποιηση σε υλοποιηση θελω να βρω τι τυπο εχει στο δικο μου συστημα

ωστε να κανω ενα explicit casting και να μην ασχοληθω αλλο με εσωτερικες μετατροπες.

 

Έψαξα για τον size_t στο stddef.h

 

p.s Βασικα μια ασκησουλα εκανα και ειδα οτι στην λύση της χρησιμοποιούσε cast σε int

 

> 

#include <stdio.h>

int main(void)
{
 printf("Size of int: %d\n", (int) sizeof(int));
 printf("Size of short: %d\n", (int) sizeof(short));
 printf("Size of long: %d\n", (int) sizeof(long));
 printf("Size of float: %d\n", (int) sizeof(float));
 printf("Size of double: %d\n", (int) sizeof(double));
 printf("Size of long double: %d\n", (int) sizeof(long double));

 return 0;
}

 

Πολλες κλησεις της printf παντως.

Δημοσ.

Απλα επειδη ο τύπος του sizeof διαφέρει απο υλοποιηση σε υλοποιηση θελω να βρω τι τυπο εχει στο δικο μου συστημα

ωστε να κανω ενα explicit casting και να μην ασχοληθω αλλο με εσωτερικες μετατροπες.

 

Έψαξα για τον size_t στο stddef.h

 

Το πρότυπο ορίζει ότι ο τύπος που επιστρέφει ο sizeof είναι πάντα size_t ("The value of the result is implementation-defined, and its type (an unsigned integral type) is size_t defined in the <stddef.h> header"). Το size_t ορίζεται από την C89 έκδοση ακόμη οπότε θα υπάρχει σε όλες τις υλοποιήσεις (δεν το έχω ψάξει αλλά δεν νομίζω να υπάρχει κάπου pre-c89 compiler). Η C99 έκδοση λέει ακριβώς το ίδιο απλά πρόσθεσε το macro SIZE_MAX το οποίο ίσως τους διέφυγε στην C89.

Δημοσ.

Ευχαριστω παιδια ! Εχω ολα τα warning flags ενεργοποιημενα

 

> gcc -W -Wextra -Wall -std=c99 -o "tests" "tests.c" (στο φάκελο: /home/kostas/PROGRAMS) 

 

Απλα επειδη ο τύπος του sizeof διαφέρει απο υλοποιηση σε υλοποιηση θελω να βρω τι τυπο εχει στο δικο μου συστημα

ωστε να κανω ενα explicit casting και να μην ασχοληθω αλλο με εσωτερικες μετατροπες.

 

Έψαξα για τον size_t στο stddef.h

 

Δεν διαφέρει από υλοποίηση σε υλοποίηση, πάντα size_t είναι το αποτέλεσμα του sizeof(). To C99 εισήγαγε το %z ακριβώς για την εκτύπωση των size_t (μαζί με κάτι άλλα, ptdiff_t κι άλλο ένα που δεν θυμάμαι, με δικά τους specifiers) αλλά έχω την εντύπωση πως ο gcc δεν το υποστηρίζει το %z.

 

Οπότε, με C99 γράφεις π.χ....

 

>printf( "sizeof(int) = %zu\n", sizeof(int) );

Αν σου τσινήσει ο compiler, τότε αναγκαστικά το κάνεις cast για να μην παίρνεις warnings...

 

>printf( "sizeof(int) = %llu\n", (unsigned long long) sizeof(int) );

και σε C89...

 

>printf( "sizeof(int) = %lu\n", (unsigned long) sizeof(int) );

Δημοσ.

Το πρότυπο ορίζει ότι ο τύπος που επιστρέφει ο sizeof είναι πάντα size_t ("The value of the result is implementation-defined, and its type (an unsigned integral type) is size_t defined in the <stddef.h> header"). Το size_t ορίζεται από την C89 έκδοση ακόμη οπότε θα υπάρχει σε όλες τις υλοποιήσεις (δεν το έχω ψάξει αλλά δεν νομίζω να υπάρχει κάπου pre-c89 compiler). Η C99 έκδοση λέει ακριβώς το ίδιο απλά πρόσθεσε το macro SIZE_MAX το οποίο ίσως τους διέφυγε στην C89.

 

 

Οκ. Δηλαδη μιλάμε για αυτο το αρχειο

 

> kostas@kostas-SSL:/usr/include/linux$ ls | grep stddef.h
stddef.h

 

Μπορει να μην ξερω να διαβασω το αρχειο αλλα αυτα μου έχει εμενα

 

>
#ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H



#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif


#endif

Δημοσ.

Βtw, δεν χρειάζεται και -W και -Wextra στο command-line του gcc (θεωρητικά το -W έχει αντικατασταθεί από το -Wextra, με πιο περιγραφικά μηνύματα). Επίσης, όταν τα ονόματα των αρχείων δεν έχουν κενά, δεν χρειάζεται να τα εσωκλείεις σε διπλά εισαγωγικά.

Δημοσ.

Δεν διαφέρει από υλοποίηση σε υλοποίηση, πάντα size_t είναι το αποτέλεσμα του sizeof(). To C99 εισήγαγε το %z ακριβώς για την εκτύπωση των size_t (μαζί με κάτι άλλα, ptdiff_t κι άλλο ένα που δεν θυμάμαι, με δικά τους specifiers) αλλά έχω την εντύπωση πως ο gcc δεν το υποστηρίζει το %z.

 

Οπότε, με C99 γράφεις π.χ....

 

>printf( "sizeof(int) = %zu\n", sizeof(int) );

Αν σου τσινήσει ο compiler, τότε αναγκαστικά το κάνεις cast για να μην παίρνεις warnings...

 

>printf( "sizeof(int) = %llu\n", (unsigned long long) sizeof(int) );

και σε C89...

 

>printf( "sizeof(int) = %lu\n", (unsigned long) sizeof(int) );

 

Ok. Επειδη στο βιβλιο του King στην Σελ. 151 λεει πως ο τυπος του ειναι implementation defined τυπος size_t .

Αυτο δεν σημαινει οτι αλλαζει απο υλοποιηση σε υλοποιηση ?

Δημοσ.

...

> 

#include <stdio.h>

int main(void)
{
 printf("Size of int: %d\n", (int) sizeof(int));
 printf("Size of short: %d\n", (int) sizeof(short));
 printf("Size of long: %d\n", (int) sizeof(long));
 printf("Size of float: %d\n", (int) sizeof(float));
 printf("Size of double: %d\n", (int) sizeof(double));
 printf("Size of long double: %d\n", (int) sizeof(long double));

 return 0;
}

 

Πολλες κλησεις της printf παντως.

 

Ορίστε με 1 printf() ... :lol: :lol: :lol: ...

 

 

 

>
#include <stdio.h>

enum { NOTYPE=-1, CHAR=0, SHORT, INT, LONG, LLONG, FLOAT, DOUBLE, LDOUBLE, MAXTYPES };

typedef struct Type {
size_t size;
char desc[20+1];
} Type; 

int main( void )
{
Type types[MAXTYPES] = {
	{sizeof(char),	"char"}, 
	{sizeof(short),	"short"},
	{sizeof(int),	"int"},
	{sizeof(long),	"long"},
	{sizeof(long long), "long long"},
	{sizeof(float),	"float"},
	{sizeof(double), "double"},
	{sizeof(long double), "long double"}
};
for (int i=NOTYPE+1; i < MAXTYPES; i++)
	printf( "sizeof %s: %zu\n", types[i].desc, types[i].size );

return 0;
}

 

 

 

Ok. Επειδη στο βιβλιο του King στην Σελ. 151 λεει πως ο τυπος του ειναι implementation defined τυπος size_t .

Αυτο δεν σημαινει οτι αλλαζει απο υλοποιηση σε υλοποιηση ?

Το size_t είναι τύπος (το μέγεθός του αλλάζει).

Δημοσ.

Α γεια σου!!!! Αυτο εννοουσα... οτι αλλαζει

το μεγεθος του ιδιου του sizeof απο συστημα σε συστημα ρε παιδι μου!!!!

Τελοςπαντων... θα του κανω ενα cast σε unsigned long και τέλος!

 

Δεν χρησιμοποιησα σωστες λεξεις και σας μπερδεψα

 

 

btw τσέκαρε άσκηση 13 σελ. 159... αμα δεν μου βγει (βασικα μου βγηκε αλλα υπαρχει προβλημα αμα δωσω παραπανω απο 2 κενά μεταξυ των λεξεων...)

 

τελοςπαντων θα την προσπαθησω λιγο ακομη και αν ειναι θα την ποσταρω.

Δημοσ.

...

btw τσέκαρε άσκηση 13 σελ. 159... αμα δεν μου βγει (βασικα μου βγηκε αλλα υπαρχει προβλημα αμα δωσω παραπανω απο 2 κενά μεταξυ των λεξεων...)

 

τελοςπαντων θα την προσπαθησω λιγο ακομη και αν ειναι θα την ποσταρω.

Αν θυμάμαι καλά, έχουμε ποστάρει κώδικα κι εγώ και ο Ηλίας στο ubuntu.gr για αυτήν.

Δημοσ.

EDIT:

 

Για όποιον ενδιαφέρεται η άσκηση λέει να διαβάστεί μια πρόταση και να τυπωθεί το μέσο μήκος λέξεων, με ακρίβεια 1ος δεκαδικού (για ευκολία, λέει, θεωρήστε πως τα σημεία στίξης είναι μέρος των λέξεων προηγούμενων λέξεων τους).

Δημοσ.

Οκ. Δηλαδη μιλάμε για αυτο το αρχειο

 

> kostas@kostas-SSL:/usr/include/linux$ ls | grep stddef.h
stddef.h

 

Μπορει να μην ξερω να διαβασω το αρχειο αλλα αυτα μου έχει εμενα

 

Καλά το διαβάζεις, απλά δεν ορίζεται εκεί :)

Ας δούμε πρώτα το ssize_t που είναι εύκολο. Στο stdio.h (και στο unistd.h και στο sys/types.h και σε άλλες 100 μεριές) ορίζεται ως:

>
typedef __ssize_t ssize_t;

Στο bits/types.h (στην glibc πολλά πράγματα ορίζονται στον κατάλογο bits/ στο πιο χαμηλό τους επίπεδο) έχουμε το παρακάτω:

>
__STD_TYPE __SSIZE_T_TYPE __ssize_t;

Στο bits/typesizes.h έχουμε:

>
#define __SSIZE_T_TYPE          __SWORD_TYPE

Τέλος ξανά στο bits/types.h ορίζεται ο SWORD_TYPE ως int ή long ανάλογα με 32 ή 64bit. Οπότε το ssize_t τελικά είναι int ή long. Με λίγα λόγια έχουμε ssize_t -> __ssize_t -> __SSIZE_T_TYPE -> __SWORD_TYPE -> int (είναι να μην αγαπάς την glibc ? :P )

 

Το size_t το βρίσκω στο stddef.h που δίνει ο gcc και όχι η glibc οπότε δεν ξέρω σίγουρα τι παίζει.

 

Σε άλλες libc τα πράγματα είναι πάντα πιο απλά από την glibc, πχ στο NetBSD έχουμε:

>
include/stddef.h: typedef	_BSD_SIZE_T_	size_t;
sys/arch/τάδε/include/ansi.h: #define	_BSD_SIZE_T_		unsigned long

 

Ok. Επειδη στο βιβλιο του King στην Σελ. 151 λεει πως ο τυπος του ειναι implementation defined τυπος size_t .

Αυτο δεν σημαινει οτι αλλαζει απο υλοποιηση σε υλοποιηση ?

Εννοείς το "printing a sizeof value requires care, because the type of a sizeof expression is an implementation-defined type named size_t" ? Αυτό εννοεί ότι ο τύπος size_t μπορεί να υλοποιηθεί διαφορετικά. Όπως είδες παραπάνω, σε 32bit οριζόταν σαν int και σε 64bit ως long int. Για αυτό ακριβώς βγήκε το z που σου είπε ο migf1.

Δημοσ.

Ναι αυτο καταλαβα και εγω. Οτι μιλαει για το μέγεθος του κατα τα άλλα fixed τύπου size_t.

Οταν ελεγα οτι αλλαζει ο τυπος εννοουσα τους μορφοποιητες %d , %ld , %lu κτλπ...

Δημοσ.

Κοίτα,

 

το size_t είναι τύπος, με implementation defined υλοποίηση ως προς το μέγεθός του. Ο τύπος του αποτελέσματος του τελεστή sizeof είναι FIXED σε size_t. Τέλος, οι type-specifiers της printf() δεν αλλάζουν τον τύπο των μεταβλητών που τους αντιστοιχούν, καθορίζουν ως τι τύπος θα τυπωθούν οι τιμές αυτών των μεταβλητών στην οθόνη.

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...