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

Ερωτήσεις για C


capoelo

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

Φίλε DirectX,

 

καταρχήν σε ευχαριστώ πολύ για το ενδιαφέρον που δείχνεις!

 

Το stat το σκέφτηκα κι εγώ, αλλά έπεσα στον τοίχο των... underscores. Όλες οι σχετικές συναρτήσεις, οι τύποι, ακόμα και οι σταθερές στην Pelles-C είναι με underscores μπροστά στα ονόματά τους. Θα πρέπει να φτιάξω ειδικό header file με defines μόνο και μόνο για να μπορεί να γίνει compile o κώδικας σε Pelles C (και ο θεός ξέρει τι ιδιαιτερότητες μπορεί να παρουσιάζουν άλλοι compilers στις μη-στάνταρ συναρτήσεις).

 

Το όλο concept είναι να μπορεί ο κώδικας να γίνεται compile με ένα απλό...

 

>make -f makefile.mak

ή έστω με απλή προσθήκη των .c σε ένα GUI project σε οποιαδήποτε πλατφόρμα με οποιονδήποτε compiler υποστηρίζει C99.

 

Είναι αδύνατον (και frankly μη-επιθυμητό) να προβλέψω τις ιδιαιτερότητες του κάθε compiler σε όλες τις πλατφόρμες σχετικά με τις μη-στανταρ συναρτήσεις. Ήδη το έχω κάνει για τα χρώματα και είναι μεγάλος μπελάς. Βασικά το ξεκίνησα για να περνάει η ώρα, αλλά κούτσου-κούτσου έχει ήδη αρχίσει να με "πονοκεφαλιάζει" σε αρκετά σημεία του (εννοώ πως προκύπτουν συνέχεια αστάθμητοι παράγοντες).

 

Για τις fsetpos/fgetpos, πως μπορούν να χρησιμοποιηθούν για να βρεις το μέγεθος ενός αρχείου; Από ότι γνωρίζω δεν υπάρχει abstract τρόπος π.χ. να πεις στην fsetpos να πάει στο τέλος του αρχείου. Μια ακόμα εναλλακτική είναι η οικογένεια των LL συναρτήσεων open/read κλπ, η οποία όμως δυστυχώς σκοντάφει και αυτή στο πρόβλημα με τα underscores.

 

ΥΓ. Τελικά και η 64μπιτη έκδοση της PellesC παρουσιάζει το ίδιο πρόβλημα :( Κατέβασα και τον lcc-win, ο οποίος συμπεριφέρεται "as expected". Οπότε κατέθεσα πριν λίγο bug-report στην PellesC

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

[..]

Για τις fsetpos/fgetpos, πως μπορούν να χρησιμοποιηθούν για να βρεις το μέγεθος ενός αρχείου; Από ότι γνωρίζω δεν υπάρχει abstract τρόπος π.χ. να πεις στην fsetpos να πάει στο τέλος του αρχείου. Μια ακόμα εναλλακτική είναι η οικογένεια των LL συναρτήσεων open/read κλπ, η οποία όμως δυστυχώς σκοντάφει και αυτή στο πρόβλημα με τα underscores.

 

Τις πρότεινα με την σκέψη ότι θα μπορούσες να κάνεις ένα fseek με SEEK_END και ύστερα αντί της ftell να δοκιμάσεις την fgetpos εξετάζοντας αν το fpos_t επιστρέφει το αναμενόμενο ή παρουσιάζει ξανά bug (όπως η ftell), ώστε τουλάχιστον να γνωρίζεις ότι ο χρήστης δοκιμάζει να ανοίξει ένα πολύ μεγάλο αρχείο.

 

Τώρα βέβαια η "μπάλα" είναι στους κατασκευαστές της Pelles-C οπότε..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

Τώρα βέβαια η "μπάλα" είναι στους κατασκευαστές της Pelles-C οπότε..

 

Ναι, γιατί το πρόβλημα το παρουσιάζει η fseek() αρχικά (και κατόπιν και η ftell() ). Ενώ δηλαδή οι άλλοι compilers σταματάνε στην fseek() με error, η Pelles C δεν βγάζει error, προχωράει στην ftell() όπου ούτε εκεί βγάζει error.

 

ΥΓ. Εν τω μεταξύ, η PellesC είναι καλύτερη από τους άλλους compilers σε άλλα σημεία του προγράμματος, π.χ. στην αναπαράσταση ως long-double τυχαίας ακολουθίας από bytes (ακόμα ένας από τους αστάθμητους παράγοντες που έλεγα πιο πάνω)... o mingw32-gcc βγάζει 0 ενώ ο cygwin-gcc κρασάρει)... κοντολογίς: portable code my ass :lol:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ΥΓ. Εν τω μεταξύ, η PellesC είναι καλύτερη από τους άλλους compilers σε άλλα σημεία του προγράμματος, π.χ. στην αναπαράσταση ως long-double τυχαίας ακολουθίας από bytes (ακόμα ένας από τους αστάθμητους παράγοντες που έλεγα πιο πάνω)... o mingw32-gcc βγάζει 0 ενώ ο cygwin-gcc κρασάρει)... κοντολογίς: portable code my ass :lol:

 

Άστα να πάνε, γενικά όσο πιο πολύπλοκη είναι η εφαρμογή τόσο περισσότερο παντρεύεσαι τον compiler που την αναπτύσσεις!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Συχνα χρησιμοποιούσα τον τελεστη sizeof για να διαπιστώσω αν ενας τυπος ειναι πιο "wider" απο εναν άλλον

αυτο νιωθω οτι ειναι λαθος ομως :P ισως ειναι καλυτερα να βλεπει καποιος το limits.h επειδη παιζει πολυ

και η πλατφορμα μεσα.

 

Στο μεταξυ ειδα μια έκφραση

 

f = f + ul ; (f = float , ul = unsigned long)

 

και ηθελα να δω αν χωραει ο ul στον f προφανως θα χωραει επειδη το διαβασα

σε σοβαρο βιβλιο αλλα σε κάποια φαση επειδη βαρεθηκα παιρνω το 3.40282 * 10^38 απο το ΙΕΕΕ 754

παιρνω και το 18,446,744,073,709,551,615 τα δίνω στο http://web2.0calc.com/

με μια συγκριση μου δινει ενα TRUE Και τελειωσε η υποθεση. Ελπιζω να μην τα συνανταω και πολυ συχνα

ολα αυτα γιατι με πιανει το κεφαλι μου.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Συχνα χρησιμοποιούσα τον τελεστη sizeof για να διαπιστώσω αν ενας τυπος ειναι πιο "wider" απο εναν άλλον

αυτο νιωθω οτι ειναι λαθος ομως :P ισως ειναι καλυτερα να βλεπει καποιος το limits.h επειδη παιζει πολυ

και η πλατφορμα μεσα.

 

Στο μεταξυ ειδα μια έκφραση

 

f = f + ul ; (f = float , ul = unsigned long)

 

και ηθελα να δω αν χωραει ο ul στον f προφανως θα χωραει επειδη το διαβασα

σε σοβαρο βιβλιο αλλα σε κάποια φαση επειδη βαρεθηκα παιρνω το 3.40282 * 10^38 απο το ΙΕΕΕ 754

παιρνω και το 18,446,744,073,709,551,615 τα δίνω στο http://web2.0calc.com/

με μια συγκριση μου δινει ενα TRUE Και τελειωσε η υποθεση. Ελπιζω να μην τα συνανταω και πολυ συχνα

ολα αυτα γιατι με πιανει το κεφαλι μου.

Οι δικές μου απορίες είναι δυο:

α) γιατί επιμένεις στις εσωτερικές αναπαραστάσεις των αριθμών; (προτίθεσαι για κάθε ξεχωριστή πλατφόρμα να γράφεις ξεχωριστή έκδοση των προγραμμάτων σου ; )

 

β) γιατί επιμένεις σε παραστάσεις που μπλέκουν μέσα τους διαφορετικούς τύπους δεδομένων (προτίθεσαι να γράφεις προγράμματα επιρρεπή σε bugs; )

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Οι δικές μου απορίες είναι δυο:

α) γιατί επιμένεις στις εσωτερικές αναπαραστάσεις των αριθμών; (προτίθεσαι για κάθε ξεχωριστή πλατφόρμα να γράφεις ξεχωριστή έκδοση των προγραμμάτων σου ; )

 

β) γιατί επιμένεις σε παραστάσεις που μπλέκουν μέσα τους διαφορετικούς τύπους δεδομένων (προτίθεσαι να γράφεις προγράμματα επιρρεπή σε bugs; )

 

 

Οχι ρε συ... αλλα αμα παρει το ματι σου αυτη την εκφραση σε ενα βιβλιο με εσωτερικες μετατροπες

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

Δεν σου ειπα να την χρησιμοποιησεις μετα αφενος γιατι καποιος μπορει να μην εκατσε να κανει την αναλυση αυτη (αν και θα το ξερει)

αλλα τουλαχιστον αν δεν την χρησιμοποιησεις ξερεις γιατι. (Σαφως αυτο ειναι αδυνατο να το κανεις σε ολα στην γλωσσα τα οποια δεν χρησιμοποιεις αλλα τεσπα).

 

Και για να δεις αν χωρανε οι τυποι να συγκρινεις τις μεγιστες τιμες τους συμφωνα με το προτυπο και τελος τι δειχνει

ο sizeof πχ.

 

Υποθετουμε οτι ξεπερνας τον χαρακτηρα ορισμενων τουτοριαλ στο ιντερνετ σε στυλ... Γεια σας παιδια σημερα θα παρουσιασουμε τον τελεστη sizeof... ναι που λετε ο sizeof ειναι αυτος... και επιστρεφει αυτο οκ? τελος παρουσιασης. Ε νταξει.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Οχι ρε συ... αλλα αμα παρει το ματι σου αυτη την εκφραση σε ενα βιβλιο με εσωτερικες μετατροπες

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

Δεν σου ειπα να την χρησιμοποιησεις μετα αφενος γιατι καποιος μπορει να μην εκατσε να κανει την αναλυση αυτη (αν και θα το ξερει)

αλλα τουλαχιστον αν δεν την χρησιμοποιησεις ξερεις γιατι. (Σαφως αυτο ειναι αδυνατο να το κανεις σε ολα στην γλωσσα τα οποια δεν χρησιμοποιεις αλλα τεσπα).

 

Και για να δεις αν χωρανε οι τυποι να συγκρινεις τις μεγιστες τιμες τους συμφωνα με το προτυπο και τελος τι δειχνει

ο sizeof πχ.

 

Υποθετουμε οτι ξεπερνας τον χαρακτηρα ορισμενων τουτοριαλ στο ιντερνετ σε στυλ... Γεια σας παιδια σημερα θα παρουσιασουμε τον τελεστη sizeof... ναι που λετε ο sizeof ειναι αυτος... και επιστρεφει αυτο οκ? τελος παρουσιασης. Ε νταξει.

 

Το point μου είναι πως δεν υπάρχει λόγος να μπλέξεις έναν float και έναν unsigned long μέσα στην ίδια αριθμητική παράσταση. Αν το κάνεις, πρέπει να είσαι προετοιμασμένος για διαφορετικά αποτελέσματα, ανάλογα με την πλατφόρμα στην οποία θα τρέξεις τον κώδικά σου. Είναι εξαιρετικά εξεζητημένη η ανάγκη μετατροπής μεταξύ float και ακεραίων.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το point μου είναι πως δεν υπάρχει λόγος να μπλέξεις έναν float και έναν unsigned long μέσα στην ίδια αριθμητική παράσταση. Αν το κάνεις, πρέπει να είσαι προετοιμασμένος για διαφορετικά αποτελέσματα, ανάλογα με την πλατφόρμα στην οποία θα τρέξεις τον κώδικά σου. Είναι εξαιρετικά εξεζητημένη η ανάγκη μετατροπής μεταξύ float και ακεραίων.

 

Το δεχομαι αυτο που λες αλλα μονο για να μην πονοκεφαλιαστεις με τους κανονες και τις εσωτερικες μετατροπες.

Διαφορετικα οι μεγιστες τιμες στους float nums αλλαζουν μεν αναλογα την υλοποιηση αλλα αν το παμε ετσι

και οι αλλοι βασικοι τυποι αλλαζουν απο το ενα συστημα στο αλλο (32bit - 64bit κτλπ).. τι σημαινει αυτο ας πουμε? Οτι και στους αλλους

δεν θα χεις διαφορετικο νουμερο? Τεσπα. Τωρα μου φαινεται ψαχουλευουμε(ψαχουλευω) την μύγα απο κατω να δουμε αν ειναι θηλυκιά ή αρσενικιά. :D

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν μίλησα για μέγιστες τιμές εγώ, εκείνες διαχειρίζονται abstractly με τα <limits.h> & <float.h>. Μίλησα για τους διαφορετικούς κανόνες απεικόνισης, στρογγυλοποιήσης, ακρίβειας, κλπ που χρησιμοποιούν για τους float point διαφορετικές αρχιτεκτονικές.

 

ΥΓ. btw, αν φτιάχνεσαι με αυτά, είναι καλύτερη ιδεά να ασχοληθείς με assembly παρά με C.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν μίλησα για μέγιστες τιμές εγώ, εκείνες διαχειρίζονται abstractly με τα <limits.h> & <float.h>. Μίλησα για τους διαφορετικούς κανόνες απεικόνισης, στρογγυλοποιήσης, ακρίβειας, κλπ που χρησιμοποιούν για τους float point διαφορετικές αρχιτεκτονικές.

 

ΥΓ. btw, αν φτιάχνεσαι με αυτά, είναι καλύτερη ιδεά να ασχοληθείς με assembly παρά με C.

 

Α οκ γιατι εγω μιλουσα για αρχιτεκτονικες που υποστηριζουν το 754 στους float .

 

Τωρα σχετικα με την Assembly ναι το εχω σκεφτει και ειχα διαβασει και για καταχωρητες βεβαια νταξει θελει αρκετο διαβασμα... αλλα χλωμο γιατι ποιος δουλευει σε assembly σημερα... θα πρεπει να σε στειλουν σε κανα μακρυνο εργαστηριο με τιποτα σκαλωμενους μεσα που δεν το βλεπει ο ηλιος ποτε!!!!! Εκει ξεχασμένος απο το θεο και το κοσμο θα μπορεις να προγραμματισεις σε Assembly και μετα να αρχισεις να συνομιλεις και με τον εαυτο σου σιγα σιγα. lol

 

Περα απο την πλακα παντως.... μ αρεσουν αυτα τα πραγματακια και οποτε μου δινει ευκαιρια η C θα τα ψαχνω!!!!

 

Btw επειδη μονο με την θεωρια δεν γινεται δουλεια πως σου φαινεται η παρακατω

 

>
/* -------------------------------------------------------
* Δώσε μια πρόταση : And that's the way it is. 
* Και στην συνέχεια εκτυπωσε την και υπολογισε
* τα φωνήεντα που φέρει. Πχ η παραπάνω φέρει 6 φωνήεντα
* -------------------------------------------------------*/

#include<stdio.h>
#include<ctype.h>

int main(void)
{
char ch;
int count=0;

printf("Give a sentence : ");

while((ch=getchar())!='\n')
{
	putchar(ch);
	
	ch=tolower(ch);
	
	if(ch=='a' || ch=='o' || ch=='e' || ch == 'i' || ch=='u')
	++count;
	
}

printf("\n Your sentence contains vowels: %d " , count);

	return 0;
}


//----------------------------------------------------------------------

 

Δεν μ αρεσει και τοσο το μακρυναρι της if κανας πιο efficient τροπος υπάρχει? (Χωρις πινακες , strings + δεικτες εννοειται) :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για το συγκεκριμένο δεν υπάρχει. Αν θες να το κάνεις re-usable το φτιάχνεις σε macro...

 

>
#include <stdio.h>
#include <ctype.h>
#define ISVOWEL(c)  \
('a' == tolower(c) || 'e' == tolower(ch) || 'i' == tolower(c) || 'o' == tolower(c) || 'u' == tolower(c) || 'y' == tolower(c))

int main( void)
{
int c;
for (int i=0; '\n' != (c=getchar()) && EOF != c; )
           if ( ISVOWEL(c) )
            	i++;
printf(%d\n", i);
return 0;
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για το συγκεκριμένο δεν υπάρχει. Αν θες να το κάνεις re-usable το φτιάχνεις σε macro...

 

>
#include <stdio.h>
#include <ctype.h>
#define ISVOWEL(c)  \
('a' == tolower(c) || 'e' == tolower(ch) || 'i' == tolower(c) || 'o' == tolower(c) || 'u' == tolower(c) || 'y' == tolower(c))

int main( void)
{
int c;
for (int i=0; '\n' != (c=getchar()) && EOF != c; )
           if ( ISVOWEL(c) )
            	i++;
printf(%d\n", i);
return 0;
}

 

Ok ;)

Danke migf1!!!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

migf1...

 

 

Ρε συ, ήθελα να κάνω μία αναδρομή με macros (στην ουσία template function σε C) αλλά δεν μου ερχόταν το πως. Το παράτησα και το έκανα με cpp.

 

 

Μπορείς να ρίξεις λίγο φως με ένα απλό παράδειγμα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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