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

WARNING σε C


Dr.Fuzzy

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

Δημοσ.

Καλησπέρα σε όλους,

 

Στην function που ακολουθεί:

 

>
/* activepulse: returns the active pulse of an element over a sorted array of known size */
int activepulse(double *b, double *xp, double *yp, int n)
{
   int s1=sgn(*b-*xp+*yp);
   int sn=sgn(*(b+n-1)-*xp+*yp);
   int index, i;
   int sj;

   if(s1==sn){
       if(s1>0) {
           index=n-2;
           return index;
       }
       else {
           index=0;
           return index;
       }
   }
   else{
       for(i=2;i<=n;i++) {
           sj=sgn(*(b+i-1)-*xp+*yp);
           if(sj!=s1) {
               index=i-2;
               return index;
           }
       }
   }
}

 

, ενώ μου δουλεύει κανονικά, λαμβάνω το εξής warning από τον compiler (Code:Blocks + GNU GCC).

 

...|174|warning: control reaches end of non-void function|

 

Μπορεί κάποιος πιο σχετικός να μου δώσει τα φώτα του, pls. :-)

Δημοσ.

Σου λέει οτι και καλά ενώ έχεις δηλώσει επιστροφή int από την συνάρτηση ο compiler δεν βλέπει στο τέλος της συνάρτησης κάποιο return statement.

 

Μπορείς να προσθέσεις ένα return με κάποιο error code στο τέλος άμα θες να βγάλεις το warning.

Δημοσ.

>#include <stdio.h>

int main(){
   char ap;
   
   printf("\n\n............. (Y/N) --> ");
   scanf("%c", &ap);

   while (ap!='y' && ap!='n' && ap!='Y' && ap!='N'){
       printf("\n\nLathos plhktrologhsh..\n.......... (Y/N) --> ");
       scanf("%c", &ap);
   }
/*
           .
           .
           .
           .
           .
           sunexia programmatos...
*/
   return 0;
}

 

 

Όταν ο κώδικας φτάνεο σε αυτό το σημείο αν δώσω λάθος τιμή, δηλαδή διαφορετική από y,n,Y,N , τότε εμφανίζει 2 φορές το μύνημα λάθους....

τι δεν κάνω σωστά..? ευχαριστώ...

 

Το έβαλα εδώ για να μην ανοίγω νέο θέμα για μια ερώτηση...

Δημοσ.

>#include <stdio.h>

int main(){
   char ap;
   
   printf("\n\n............. (Y/N) --> ");
   scanf("%c", &ap);

   while (ap!='y' && ap!='n' && ap!='Y' && ap!='N'){
       printf("\n\nLathos plhktrologhsh..\n.......... (Y/N) --> ");
       scanf("%c", &ap);
   }
/*
           .
           .
           .
           .
           .
           sunexia programmatos...
*/
   return 0;
}

 

 

Όταν ο κώδικας φτάνεο σε αυτό το σημείο αν δώσω λάθος τιμή, δηλαδή διαφορετική από y,n,Y,N , τότε εμφανίζει 2 φορές το μύνημα λάθους....

τι δεν κάνω σωστά..? ευχαριστώ...

 

Το έβαλα εδώ για να μην ανοίγω νέο θέμα για μια ερώτηση...

 

Δοκίμασε το παρακάτω:

 

>#include <stdio.h>

int main(){
   char ap[2];
   
   printf("\n\n............. (Y/N) --> ");
   scanf("%s", ap);

   while (ap[0]!='y' && ap[0]!='n' && ap[0]!='Y' && ap[0]!='N'){
       printf("\n\nLathos plhktrologhsh..\n.......... (Y/N) --> ");
       scanf("%s", ap);
   }
/*
           .
           .
           .
           .
           .
           sunexia programmatos...
*/
   return 0;
}

Δημοσ.

Το ίδιο ακριβώς πρόβλημα και με τις δύο λύσεις που είπατε....

Σε σας κάνει το ίδιο όταν το τρέχετε..?

 

Και για ποιο λόγο κάνατε αυτές τις αλλαγές..εννοώ τι φταίει και δεν δουλεύει το δικό μου..απλά για να καταλάβω τι δεν σκέφτομαι σωστά για επόμενη φορα......

Δημοσ.

Σε ό,τι αφορά εμένα, θεώρησα ότι παίζει κάποιο πρόβλημα με το null στο τέλος, το οποίο πρόβλημα δεν κάθισα να σκεφτώ πολύ, απλά το μυαλό μου πήγε σε πίνακα.

 

Αν ο κώδικάς μου δε σου λύνει το πρόβλημα, δοκίμασε να αυξήσεις το όριο του πίνακα σε κάτι μεγαλύτερο (π.χ. 256) και δες αν λύνεται τότε.

Δημοσ.

Δοκίμασε να βάλεις

>
fflush(stdin);

πριν την while. Λογικά γίνεται μπέρδεμα με το input buffer.

 

Editz0r: Πριν την scanf actually. Το πρόβλημα θα έπρεπε να υπήρχε μόνο με τον δικό σου τρόπο που διαβάζεις ένα χαρακτήρα μόνο. Δοκίμασα και του Τέο και παίζει κανονικά.

Δημοσ.

Καταρχήν η ερώτηση σου έπρεπε να είναι καινούριο θέμα γιατί δεν έχει σχέση με το παλιό.

 

Το πρόβλημα είναι ότι για να εισάγεις χαρακτήρα πρέπει να πατήσεις 2 κουμπιά. 1 τον χαρακτήρα και άλλο ένα το enter. Δηλαδή εισάγεις στην ουσία 2 χαρακτήρες άρα και σου εμφανίζει 2 φορές το μήνυμα.

 

Για να λύσεις το πρόβλημα μια λύση είναι έτσι

 

>#include <stdio.h>

char myGetChar()
{
   char c;
   do
   {
       c = getchar(); 
   } while ((c <= 0x20));
   return c;
}

int main(){
   char ap;
   printf("\n\n............. (Y/N) --> ");
   ap = myGetChar() ;
   while (ap!='y' && ap!='n' && ap!='Y' && ap!='N'){
       printf("\n\nLathos plhktrologhsh..\n.......... (Y/N) --> ");
       ap = myGetChar() ;
   }
/*
           .
           .
           .
           .
           .
           sunexia programmatos...
*/
   return 0;
}

 

Μια άλλη λύση είναι με την συνάρτηση getch() που βρίσκεται στο <conio.h> αλλά αυτό δεν είναι standard c

 

Επίσης και η λύση του teo δουλεύει

Δημοσ.

Σε μένα δούλεψε βάζοντας την fflush(stdin); πριν το διάβασμα του yes no...επισης δούλεψε και με τον τρόπο του dark_banishing, αλλά και βάζωντας την getch() πριν το διάβασμα που διάβαζε οτιδήποτε "σκουπίδια" (τα οποία δεν ξέρω γιατί μου κάνουν τη ζωή δύσκολη...)

θα το δοκιμάσω σε κανά άλλο pc να δω μήπως κάτι φταίει στο δικό μου..... ευχαριστώ όλους που ασχοληθήκατε!

Δημοσ.

@karabouzouk...

Μακριά απο fflush(stdin);. Αυτή η εντολή ανάλογα τον μεταγλωττιστή μπορεί να έχει απροσδιόριστη συμπεριφορά. Συγκεκριμένα,

int fflush(FILE* stream);

Flushes stream stream and returns zero on success or EOF on error. Effect undefined for input stream. fflush(NULL) flushes all output streams.

 

Μια πιθανή λύση μπορεί αν είναι η συγκεκριμένη:

>int c; 
while ((c = getchar()) != EOF && c != '\n')
    ; /* κενή εντολή είναι δεν έχει γίνει κάποιο λάθος*/

 

Πηγές:

http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1052863818&id=1043284351

http://www.gidnetwork.com/b-57.html

http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html#fflush

http://www.c-plusplus.de/forum/viewtopic-var-t-is-39349.html

Δημοσ.
Παιδια το 0χ20 τι συμβολιζει?

το δεκαεξαδικο 0χ20 (δηλ το 32 σε δεκαδικο) ειναι η ascii τιμη του space character ' '

Επισης ειναι η ελαχιστη εκτυπωσιμη τιμη χαρακτηρα, οτιδηποτε μικροτερο ειναι control character και δεν εμφανιζεται στην οθονη

Αρχειοθετημένο

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

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