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

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

Δημοσ.
>Δεν το πιάνω τι εννοει οταν λεει οτι ολα τα ονοματα που ξεκινουν με str και ενα lower-case letter ειναι δεσμευμενα για μελλοντικη χρηση σε συναρτησεις των strings πχ αμα ορισω μια strman(...) δεν μου κτυπαει ο compiler..... ειναι φυσιολογικο αυτο?

Φυσιολογικό είναι. Αυτό που εννοεί είναι πως π.χ. στην αναθεώρηση CXX μπορεί να προστεθούν στάνταρ συναρτήσεις που ξεκινάνε με str ή με _. Αν σε παλιά σου προγράμματα έχεις συναρτήσεις που ξεκινάνε έτσι, αυξάνονται οι πιθανότητες κάποιες από τις δικές σου συναρτήσεις να έχουν ίδιο όνομα με τις νέες στάνταρ. Οπότε θα έχεις πρόβλημα να κάνεις compile τους κώδικές σου με το νέο στάνταρ (θα πρέπει να αλλάξεις τα ονόματα των συναρτήσεών σου).

 

> Γιατι αν χρησιμοποιήσω μια στανταρ συνάρτηση της C για strings αλλα χωρις το header string.h δεν βαραει και παλι ο comp????

Κανονικά βαράει, αλλά ο gcc τα τσεκάρει έτσι κι αλλιώς επειδή είναι στάνταρ βιβλιοθήκη (νομίζω ομως πως χωρίς το inclusion θεωρεί πάντα την τιμή επιστροφής πως είναι int, δεν είμαι σίγουρος όμως).

 

> Πως η strcmp δέχεται const char * αλλα δεν δινει warn ο comp ακομη και αν της περάσεις σκέτο char * ???

 

μηπως επειδη δεν ειναι σιγουρο αν ο εκαστοτε compiler υλοποιεί την strcmp οπως την παρουσιάζει ενα βιβλιο πχ?

Κάνει implicit conversion το char * σε const char * ... είναι συμβατοί τύποι, αλλά νομίζω μονοσήμαντα (δλδ στο ανάποφο βαράει, πάλι δεν είμαι σίγουρος όμως... το const δεν είναι τύπος).

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

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

Δημοσ.

Σε μένα δεν βάρεσε καθολου ο gcc μαλλον τα τσεκαρει απο μονος του οπως λες . Άντε ψάχνε το manual του τώρα :P

Απλα σε περιπτώσεις που δεν έχεις ορισει ένα προτυπο η συνάρτηση δεν θα ξέρει τι ειδους conversions να κανει και θα χεις UB.

 

 

 
#include<stdio.h>
int main(void)
{
    double x = 6.0;
    printf(" Square is: %d\n" , square(x));
    
    return 0;
}
int square(int n)
{
    return n*n;
}
 

 

 

Eδω δεν έχει να κανει κάποιο conversion αν εχω καταλαβει καλα ο comp επειδη δεν "ξερει" τι ακριβως να κάνει μιας και δεν βλέπει κάποιο προτυπο οποτε έχουμε UB.

Δημοσ.
Σε μένα δεν βάρεσε καθολου ο gcc μαλλον τα τσεκαρει απο μονος του οπως λες . Άντε ψάχνε το manual του τώρα :P

Απλα σε περιπτώσεις που δεν έχεις ορισει ένα προτυπο η συνάρτηση δεν θα ξέρει τι ειδους conversions να κανει και θα χεις UB.

 

 

 
#include<stdio.h>
int main(void)
{
    double x = 6.0;
    printf(" Square is: %d\n" , square(x));
    
    return 0;
}
int square(int n)
{
    return n*n;
}

 

 

Eδω δεν έχει να κανει κάποιο conversion αν εχω καταλαβει καλα ο comp επειδη δεν "ξερει" τι ακριβως να κάνει μιας και δεν βλέπει κάποιο προτυπο οποτε έχουμε UB. 

 

 

 

Είσαι σίγουρος πως έχεις ενεργοποιημένα τα warnings? Εμένα μου τα δείχνουν όλα και οι 3 compilers...

 

 

#include <stdio.h>

int main( void )
{
	printf( "%zu\n", strlen("1234") );
	double x = 6.0;
	printf(" Square is: %d\n" , square(x));

	system( "pause" );
	return 0;
}

int square(int n)
{
	return n*n;
}

// mingw gcc
_dummy.c: In function 'main':
_dummy.c:5:2: warning: implicit declaration of function 'strlen' [-Wimplicit-function-declaration]
_dummy.c:5:19: warning: incompatible implicit declaration of built-in function 'strlen' [enabled by default]
_dummy.c:7:2: warning: implicit declaration of function 'square' [-Wimplicit-function-declaration]
_dummy.c:9:2: warning: implicit declaration of function 'system' [-Wimplicit-function-declaration]

// pelles c
_dummy.c
_dummy.c(5): warning #2018: Undeclared function 'strlen'; assuming 'extern' returning 'int'.
_dummy.c(7): warning #2018: Undeclared function 'square'; assuming 'extern' returning 'int'.
_dummy.c(9): warning #2018: Undeclared function 'system'; assuming 'extern' returning 'int'.

// lcc-win
Warning _dummy.c: 5  missing prototype for strlen
Warning _dummy.c: 5  Missing prototype for 'strlen'
Warning _dummy.c: 7  missing prototype for square
Warning _dummy.c: 7  Missing prototype for 'square'
Warning _dummy.c: 9  missing prototype for system
Warning _dummy.c: 9  Missing prototype for 'system'
0 errors, 6 warnings

 

Δημοσ.

Το -W δεν χρειάζεται, έχει αντικαταστθεί (κι εμπλουτιστεί) από το -Wextra... δοκίμασε να το βγάλεις τελείως.

 

ΥΓ. Επίσης, βάλε Wine και πέρνα μέσα κι άλλους compilers (pelles, lcc, tinyc, κλπ) ;)

  • Like 1
Δημοσ.

Να ρωτησω κατι αλλο... σε καποια φαση λεει οτι δεν μπορουμε να ονομασουμε τα string literals -> string constants

 

επειδη δεν υπάρχει κατι απο το να αποτρεπει το προγραμμα μας να τροποποιήσει εναν χαρακτηρα μεσα στο literal

 

εγω αν παω να το κανω αυτο τρωω SEG FAULT παντως. Τι ακριβως εννοει ?

Δημοσ.

καλησπερα!

 

προεκυψαν σε εμενα διαφορες αποριες σχετικα με τους pointers και το περασμα τους σε functions. εχω ορισμενα πραγματα συμμαζεμενα στο μιαλο μου,οποτε θα σας πω πρακτικα ποιο ειναι το προβλημα μου κι ετσι να προσπαθησω να καταλαβω τι παιζει..

 

θελω να φτιαξω μια εφαρμογη. ο χρηστης παταει Α για να κανει book μια θεση κινηματογραφου.(ο κινηματογραφος ειναι με 10 σειρες,4 καθισματων η καθε μια-δεν μας νοιαζει αν ειναι στενος ή οχι).Αν δεσμευτει,του λεει και ποια ειναι.

μολις παταει λοιπον A,με switch το ελεγχω,καλω την συναρτηση ετσι:

 

            check1 = book_seat(*desmeumenh);
            if(check1 == TRUE){
                printf("\nH thesh sas desmeutke epityxws! Einai h %s", *desmeumenh);
            } else {
                printf("\nH thesh den desmeutike epityxws.");
            }

 

 

η συναρτηση τωρα ειναι η

int book_seat(char *desmeumenh){
    for(i=0;i<=9;i++){
        for(j=0;j<=3;j++){
           if(theseis[i+1][j+1] == 0){
               theseis[i+1][j+1] = 1;
               *desmeumenh = "%d %d",i+1,j+1;
               return TRUE;
           } else {
               return FALSE;
           }
        }
    }
}

 

 

Οι θεσεις ειναι σε εναν πινακα ολες μαζι,αρχικοποιημενες με 0 για να δειξουν οτι ειναι κενες. Αν την κλησει καποιος,της βαζω 1.

 

Ας μπω στο ψητο τωρα:δεν τρεχει! μολις παταω A,μου κανει run failed. αρα κατι παει στραβα. μπορειτε να με βοηθησετε και να μου πειτε που εχω κανει λαθος?

 

ευχαριστω εκ των προτερων!

 

υγ:εννοειται οτι εχω ορισει το char *desmeumenh;

Δημοσ.
Αυτο εδω ->
check1 = book_seat(*desmeumenh);

 

Τι ειναι το *desmeumeni?

προσπαθω στον δεικτη *desmeumenh να αποθηκευσω (string) το νουμερο της θεσης που κλειστηκε,για να την εμφανισω στο κυριως προγραμμα.

 

Γιατί αυτό είναι καλύτερο? :)

 

*desmeumenh = "%d %d",i+1,j+1;

τι εννοεις φιλε μου?δεν σε καταλαβα..

Δημοσ.

Κάνε malloc πρώτα για το desmeumeni, κάλεσε το χωρίς * ,

και στο άλλο γράψε

sprintf(desmeumenh,"%d %d",i+1,j+1);

 

Ούτε εδώ θέλει *

printf("\nH thesh sas desmeutke epityxws! Einai h %s", *desmeumenh);

Δημοσ. (επεξεργασμένο)
Κάνε malloc πρώτα για το desmeumeni, κάλεσε το χωρίς * ,

και στο άλλο γράψε

sprintf(desmeumenh,"%d %d",i+1,j+1);

 

Ούτε εδώ θέλει *

printf("\nH thesh sas desmeutke epityxws! Einai h %s", *desmeumenh);

δεν καταλαβα γιατι πρεπει να κανω malloc ομως..την συναρτηση malloc την χρησιμοποιουμε για dynamic memory allocation,σωστα? αν καταλαβα καλα αυτα που μου ειπες,δηλαδη εσυ τωρα προσπαθεις να φτιαξεις εναν πινακα χ στοιχειων,που καθε στοιχειο του θα ειναι ενα γραμμα του string?

αν ναι,δοκιμασα αυτο:

int book_seat(char *desmeumenh){
    for(i=0;i<10;i++){
        for(j=0;j<4;j++){
           if(theseis[i+1][j+1] == 0){
               theseis[i+1][j+1] = 1;
               desmeumenh = malloc(2 * sizeof(char));
               sprintf(desmeumenh,"%d %d",i+1,j+1);
               return TRUE;
           } else {
               return FALSE;
           }
        }
    }
}

 

αλλα και παλι δεν δουλευει..

Επεξ/σία από koslibpro
Δημοσ.

Εννοούσα έτσι.

desmeumenh =(char*) malloc(4 * sizeof(char));  // 3 char και το '\0' dld 4
check1 = book_seat(desmeumenh);

Πρόσεξε μήπως βγαίνεις από τα όρια του πίνακα theseis

 

Εδιτ

Βασικά πάνω από 4 αν είναι και διψήφιοι αριθμοί

Δημοσ.
προσπαθω στον δεικτη *desmeumenh να αποθηκευσω (string) το νουμερο της θεσης που κλειστηκε,για να την εμφανισω στο κυριως προγραμμα.

 

To *desmeumeni δεν ειναι δεικτης. Το *desmeumeni ειναι η τιμη της τοποθεσιας στην οποια δειχνει ο δεικτης.

 

ΑΝ για παραδειγμα εσυ θες να δηλωσεις εναν δεικτη ο οποιος δειχνει στην μεταβλητη x η οποια εχει δηλωθει προηγουμενως

και εχει παρει την τιμη 2 τοτε ο δεικτης p ο οποιος εχει αρχικοποιηθει με την διευθυνση της x αν τον χρησιμοποιησεις με τον τελεστη *p ειναι η τιμη 2. Το *p ειναι ενα ψευδωνυμο για την x μια εμμεση αναφορα διοτι *p = x = 2. Το p ειναι ο δεικτης. Το * που χρησιμοποιειται κατα την στιγμη της δηλωσης ενος δεικτη δεν εχει καμια σχεση με το * που θα χρησιμοποιηθει πιο κατω για να κανεις αποαναφοροποιηση και να παρεις την τιμη της διευθυνσης στην οποια δειχνει ο δεικτης. To 1o λεει στον compiler οτι η γραμμή αυτη θα δηλωσει εναν δεικτη και αν θελει ο προγραμματιστης θα του δωσει απευθειας τιμη μεσω της αρχικοποιησης - η τιμη που χρειαζεται ειναι μια εγκυρη διευθυνση- . Το 2ο λεει στον μεταγλωτιστη να προσπελασει την διευθυνση μνημης στην οποια δειχνει ο δεικτης και να παρει/εκτιμήσει το στοιχειο της. :P

 

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

Δημοσ.

Εννοούσα έτσι.

desmeumenh =(char*) malloc(4 * sizeof(char));  // 3 char και το '\0' dld 4
check1 = book_seat(desmeumenh);

Πρόσεξε μήπως βγαίνεις από τα όρια του πίνακα theseis

 

Εδιτ

Βασικά πάνω από 4 αν είναι και διψήφιοι αριθμοί

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

 

To *desmeumeni δεν ειναι δεικτης. Το *desmeumeni ειναι η τιμη της τοποθεσιας στην οποια δειχνει ο δεικτης.

 

ΑΝ για παραδειγμα εσυ θες να δηλωσεις εναν δεικτη ο οποιος δειχνει στην μεταβλητη x η οποια εχει δηλωθει προηγουμενως

και εχει παρει την τιμη 2 τοτε ο δεικτης p ο οποιος εχει αρχικοποιηθει με την διευθυνση της x αν τον χρησιμοποιησεις με τον τελεστη *p ειναι η τιμη 2. Το *p ειναι ενα ψευδωνυμο για την x μια εμμεση αναφορα διοτι *p = x = 2. Το p ειναι ο δεικτης. Το * που χρησιμοποιειται κατα την στιγμη της δηλωσης ενος δεικτη δεν εχει καμια σχεση με το * που θα χρησιμοποιηθει πιο κατω για να κανεις αποαναφοροποιηση και να παρεις την τιμη της διευθυνσης στην οποια δειχνει ο δεικτης. To 1o λεει στον compiler οτι η γραμμή αυτη θα δηλωσει εναν δεικτη και αν θελει ο προγραμματιστης θα του δωσει απευθειας τιμη μεσω της αρχικοποιησης - η τιμη που χρειαζεται ειναι μια εγκυρη διευθυνση- . Το 2ο λεει στον μεταγλωτιστη να προσπελασει την διευθυνση μνημης στην οποια δειχνει ο δεικτης και να παρει/εκτιμήσει το στοιχειο της. :P

 

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

 

μαλιστα,εκανα και τις απαραιτητες διορθωσεις λοιπον με βαση αυτα.

 

τωρα εχει ως εξης ο κωδικας μου:

 

int book_seat(char desmeumenh){
    for(i=0;i<10;i++){
        for(j=0;j<4;j++){
           if(theseis[i+1][j+1] == 0){
               theseis[i+1][j+1] = 1;
               desmeumenh =(char*) malloc(4 * sizeof(char));
               sprintf(desmeumenh,"%d %d",i+1,j+1);
               return TRUE;
           } else {
               return FALSE;
           }
        }
    }
}

 

αλλα και παλι σκαει το προγραμμα οταν παταω A..και μαλιστα χωρις καν να κανει τιποτα απολυτως..δεν καταλαβαινω το γιατι :(

 

 

Parakalw plhktrologhste A gia krathsh theshs             
Parakalw plhktrologhste Q gia eksodo apo to programma
Epilogh: A
RUN FAILED (exit value 1, total time: 3s)
Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

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