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

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

Δημοσ.

καλησπερα

 

προσπαθω να φτιαξω ενα προγραμμα αλλα μου βγαζει στο compile καποια λαθη που δεν τα καταλαβαινω. αν μπορειτε εξηγηστε τα μου για να μπορεσω να καταλαβω κι εγω τι γινεται..

 

main.c

 

 

>
#include <stdio.h>
#include <stdlib.h>
#include <functions.c>

#define TRUE 1
#define FALSE 0

struct game{
char choice;
int *counter;
};
typedef struct game GAME;

int main(){

GAME player;
player.counter = 0;

printf("\nthe counter till now is %d",player.counter);

printf("\nInsert any key in order to start playing!");
scanf("%c", &player.choice);

printf("\nYou inserted %c", player.choice);
 switch(check_choice(struct game player)){
 case TRUE:
	 printf("\nthis is corrent!");
	 break;
 case FALSE:
	 printf("\nSorry...");
	 break;	
}

return 0;
}

 

 

 

functions.c

 

 

>
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

char wordlist[2] = {'m','g'};
int check_choice(GAME player);
static char choice;


int check_choice(GAME player){

for(int i=0;i<= wordlist + sizeof(wordlist)/sizeof(char);i++){
 if(choice == wordlist[i]){
	 return TRUE;
 } else {
	 player->counter += 1;
	 return FALSE;
 }
}
}

 

 

 

και τα λαθη ειναι

>
functions.c:8:23: error: expected ‘)’ before ‘player’
functions.c:12:23: error: expected ‘)’ before ‘player’

Δημοσ.

Πολύ πρόχειρα που το διάβασα είδα αυτό:

 

>
switch(check_choice(struct game player)){

 

που πρέπει να αλλάξει σε...

 

>
switch(check_choice(player)){

 

Δηλαδή όταν καλείς μια συνάρτηση δεν πρέπει να γράφεις τους τύπους των ορισμάτων της μέσα στην παρένθεση της συνάρτησης. Διόρθωσε αυτό και δες. Αν σου βγάζει κι άλλα errors, εδώ είμαστε ;)

Δημοσ.

Πολύ πρόχειρα που το διάβασα είδα αυτό:

 

>
switch(check_choice(struct game player)){

 

που πρέπει να αλλάξει σε...

 

>
switch(check_choice(player)){

 

Δηλαδή όταν καλείς μια συνάρτηση δεν πρέπει να γράφεις τους τύπους των ορισμάτων της μέσα στην παρένθεση της συνάρτησης. Διόρθωσε αυτό και δες. Αν σου βγάζει κι άλλα errors, εδώ είμαστε ;)

καταλαβα,το διορθωσα αυτο.

παντως επιμενει στα ιδια λαθη με πριν ο compiler!!

Δημοσ.

Λοιπόν, πάλι στα πρόχειρα...

 

το θέμα σου είναι μάλλον από ότι βλέπω πως ο τύπος GAME είναι άγνωστος μέσα στο αρχείο functions.c, οπότε σου τσινάει στις 2 γραμμές που τον χρησιμοποιείς.

 

Επίσης, παρόλο που είναι εφικτό (και χρησιμοποείται σε αρκετά σπάνιες περιπτώσεις), κατά κανόνα δεν κανουμε #include αρχεια .c το ένα μέσα στο άλλο.

 

Φτιάχνουμε header αρχεία .h με ορισμούς, σταθερές, εντολές προεπεξεργαστή, κλπ τα οποία θέλουμε να "τα βλέπουν" διάφορα .c αρχεία, και μέσα στα .c αρχεία αυτά κάνουμε #include το ή τα header .h αρχεία.

 

Στην περίπτωσή σου, μπορείς για παράδειγμα να ορίσεις τον τύπο GAME σε ένα header file, ας πούμε functions.h και κατόπιν να το κάνεις #include στα αρχεία functions.c και main.c (ή όπως έχεςι ονομάσει το αρχείο που περιέχει την main() σου).

 

Απλώς φρόντισε το custom .h αρχείο που θα φτιάξεις να είναι στον ίδιο φάκελο με τα .c αρχεια που θα το χρησιμοποιήσουν, και πως όταν το κάνεις #include το περικλείνεις σε διπλά-εισαγωγικά, αντί για < >

 

Π.χ.

 

>
#include "functions.h"  // και όχι #include <functions.h>

 

Αν θες να το περικλείνεις σε < > θα πρέπει να το βάλεις σε κάποιον από τους στάνταρ (ή custom) φακέλους που ψάχνει ο compiler σου για header file (μανούρα, δεν το χρειάζεσαι για απλά προγράμματα).

 

Τέλος, σύμφωνα με τους ορισμούς που έχεις κάνει στον κώδικα που έδωσες, πρέπει να αλλάξεις και το...

 

 

>
player->counter += 1;

 

σε ...

 

>
player.counter += 1;

 

διότι το player δεν το περνάς ως δείκτη στην συνάρτηση.

Δημοσ.

Λοιπόν, πάλι στα πρόχειρα...

 

το θέμα σου είναι μάλλον από ότι βλέπω πως ο τύπος GAME είναι άγνωστος μέσα στο αρχείο functions.c, οπότε σου τσινάει στις 2 γραμμές που τον χρησιμοποιείς.

 

Επίσης, παρόλο που είναι εφικτό (και χρησιμοποείται σε αρκετά σπάνιες περιπτώσεις), κατά κανόνα δεν κανουμε #include αρχεια .c το ένα μέσα στο άλλο.

 

Φτιάχνουμε header αρχεία .h με ορισμούς, σταθερές, εντολές προεπεξεργαστή, κλπ τα οποία θέλουμε να "τα βλέπουν" διάφορα .c αρχεία, και μέσα στα .c αρχεία αυτά κάνουμε #include το ή τα header .h αρχεία.

 

Στην περίπτωσή σου, μπορείς για παράδειγμα να ορίσεις τον τύπο GAME σε ένα header file, ας πούμε functions.h και κατόπιν να το κάνεις #include στα αρχεία functions.c και main.c (ή όπως έχεςι ονομάσει το αρχείο που περιέχει την main() σου).

 

Απλώς φρόντισε το custom .h αρχείο που θα φτιάξεις να είναι στον ίδιο φάκελο με τα .c αρχεια που θα το χρησιμοποιήσουν, και πως όταν το κάνεις #include το περικλείνεις σε διπλά-εισαγωγικά, αντί για < >

 

Π.χ.

 

>
#include "functions.h" // και όχι #include <functions.h>

 

Αν θες να το περικλείνεις σε < > θα πρέπει να το βάλεις σε κάποιον από τους στάνταρ (ή custom) φακέλους που ψάχνει ο compiler σου για header file (μανούρα, δεν το χρειάζεσαι για απλά προγράμματα).

 

Τέλος, σύμφωνα με τους ορισμούς που έχεις κάνει στον κώδικα που έδωσες, πρέπει να αλλάξεις και το...

 

 

>
player->counter += 1;

 

σε ...

 

>
player.counter += 1;

 

διότι το player δεν το περνάς ως δείκτη στην συνάρτηση.

μαλιστα τα διορθωσα και αυτα.

ομως ακομα χτυπαει τα ιδια λαθη.

συγκεκριμενα,τον "ενοχλουν" αυτα:

>int check_choice(GAME player)

 

αν αυτο ειναι λαθος,δηλαδη πως θα επρεπε να ειναι για να ειναι σωστο?

 

υποψιν οτι πια εκανα το αρχειο functions.c σε functions.h και το περιλαμβανω στο main.c με #include "functions.h"

Δημοσ.

Δεν μας ξαναδείχνεις πως είναι τώρα ο κώδικας με τις αλλαγές;

 

Το functions.h πρέπει να περιέχει μόνο δηλώσεις μεταβλητών, τύπων και συναρτήσεων.

Πρέπει να έχεις 3 αρχεία. fynctions.h (με δηλώσει μεταβλητών, τυπων, συναρτήσεων κτλ),

το functions.c (που θα έχει τον ορισμο της συναρτησης και εκει θα κανεις αρχικα include το functions.h)

και το main.c (που επίσης θα κανεις include το functions.h)

Δημοσ.

Δεν μας ξαναδείχνεις πως είναι τώρα ο κώδικας με τις αλλαγές;

μαλιστα

 

main.c

 

 

>#include <stdio.h>
#include <stdlib.h>
#include "functions.h"

#define TRUE 1
#define FALSE 0

struct game{
   char choice;
   int *counter;
};
typedef struct game GAME;

int main(){
   
   GAME player;
   player.counter = 0;
   
   printf("\nthe counter till now is %d",player.counter);
   
   printf("\nInsert any key in order to start playing!");
   scanf("%c", &player.choice);
   
   printf("\nYou inserted %c", player.choice);
    switch(check_choice(player.choice)){
    case TRUE:
	    printf("\nthis is corrent!");
	    break;
    case FALSE:
	    printf("\nSorry...");
	    break;	    
   }


   return 0;
}

 

 

 

functions.h

 

 

>
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

char wordlist[2] = {'m','g'};
int check_choice(GAME player);
static char choice;


int check_choice(GAME player){
   
   for(int i=0;i<= wordlist + sizeof(wordlist)/sizeof(char);i++){
    if(choice == wordlist[i]){
	    return TRUE;
    } else {
	    player.counter += 1;
	    return FALSE;
    }
   }
}



 

Δημοσ.

Για παράδειγμα στο functions.h θα περιλαμβάνει μόνο:

>
#define TRUE 1
#define FALSE 0

struct game{
 char choice;
 int *counter;
};

typedef struct game GAME;

int check_choice(GAME player);

 

Αυτό θα το κανεις include και στο main.c και στο functions.c (που θα περιέχει τη συνάρτηση)

 

Επίσης, μέσα στο functions.h δεν θα κάνεις include τις βιβλιοθήκες που κάνεις include και στα .cαρχεία

Δημοσ.

...

Επίσης, μέσα στο functions.h δεν θα κάνεις include τις βιβλιοθήκες που κάνεις include και στα .cαρχεία

 

Δεν υπάρχει πρόβλημα και να τις κάνει, γιατί έτσι κι αλλιώς όλα τα standard header files είναι inclusion-guarded. Οπότε παρσάρονται μια και μόνη φορα.

Δημοσ.

Όπως τα λέει ο bird.

 

Καλό είναι στο function.h να έχεις όλα τα "εργαλεία" τον "μπούσουλα" να το πω έτσι.

 

Και ο κώδικας που "κάνει πράγματα" να είναι στη main ή σε αρχεία .c γενικότερα.

 

για παράδειγμα (στο περίπου τα παρακάτω, αν κάτι μου ξεφεύγει, με διορθώνετε).

 

 

function.h -> struct και υπογραφές συναρτήσεων

function.c -> #include "function.h" και "υλοποίηση" συναρτήσεων.

main.c -> η main().

 

 

Στο compile τώρα θα βάλεις μόνο τα αρχεία .c

 

π.χ. (δεν ξέρω αν είναι εντελώς σωστή η εντολή, ενδεικτικά το γράφω)

 

> gcc function.c main.c -o myprogram 

Δημοσ.

μαλιστα,σας ευχαριστω για τις πληροφοριες μεχρι ωρας.

μισο λεπτο να βαλω τα πραγματα στο μιαλο μου σε μια ταξη και κανω Update εδω.

 

update:τα εφαρμοσα ολα οπως με συμβουλεψατε.

η αληθεια ειναι οτι τα errors που προεκυπταν πριν δεν εμφανιζονται πια.

 

ομως τωρα πεφτω πανω σε ενα

>functions.c:11:5: error: ‘for’ loop initial declarations are only allowed in C99 mode

 

ο κωδικας μου τωρα ειναι ετσι:

 

main.c

 

 

>#include <stdio.h>
#include <stdlib.h>
#include "functions.h"
#include "functions.c"


int main(){

GAME player;
player.counter = 0;

printf("\nthe counter till now is %d",player.counter);

printf("\nInsert any key in order to start playing!");
scanf("%c", &player.choice);

printf("\nYou inserted %c", player.choice);
 switch(check_choice(player.choice)){
 case TRUE:
	 printf("\nthis is corrent!");
	 break;
 case FALSE:
	 printf("\nSorry...");
	 break;	
}


return 0;
}

 

 

functions.h

 

 

>
#define TRUE 1
#define FALSE 0

struct game{
	 char choice;
	 int *counter;
};

typedef struct game GAME;

int check_choice(GAME player);

 

 

και functions.c

 

 

>
#include <stdio.h>
#include <stdlib.h>
#include "functions.h"

char wordlist[2] = {'m','g'};
int check_choice(GAME player);
static char choice;

int check_choice(GAME player){

for(int i=0;i<= wordlist + sizeof(wordlist)/sizeof(char);i++){
 if(choice == wordlist[i]){
	 return TRUE;
 } else {
	 player.counter += 1;
	 return FALSE;
 }
}
}

 

 

και αν στην γραμμη που αναφερεται ορισω εκτος του for το i,τοτε τα σγαλματα γινονται:

 

>
In file included from functions.c:3:0,
			 from main.c:4:
functions.h:4:8: error: redefinition of ‘struct game’
functions.h:4:8: note: originally defined here
functions.h:9:21: error: conflicting types for ‘GAME’
functions.h:9:21: note: previous declaration of ‘GAME’ was here
functions.h:11:5: error: conflicting types for ‘check_choice’
functions.h:11:5: note: previous declaration of ‘check_choice’ was here
In file included from main.c:4:0:
functions.c:6:5: error: conflicting types for ‘check_choice’
functions.h:11:5: note: previous declaration of ‘check_choice’ was here
functions.c:9:5: error: conflicting types for ‘check_choice’
functions.h:11:5: note: previous declaration of ‘check_choice’ was here
functions.c: In function ‘check_choice’:
functions.c:11:14: warning: comparison between pointer and integer
main.c: In function ‘main’:
main.c:18:9: error: incompatible type for argument 1 of ‘check_choice’
functions.c:9:5: note: expected ‘GAME’ but argument is of type ‘char’

Δημοσ.

Με μια πρώτη ματιά μην κάνεις include το functions.c στο main.c

το εκανα,και τωρα περιοριστικαν τα λαθη σε 2(ουσιαστικα 1 γιατι το αλλο δεν εινα error):

>main.c:17:9: error: incompatible type for argument 1 of ‘check_choice’
functions.h:11:5: note: expected ‘GAME’ but argument is of type ‘char’

Δημοσ.

@Maarks

 

Εικάζω πως η λογική του for-loop σου στην check_choice είναι εσφαλμένη (π.χ. το αναγκάζεις να κάνει μονάχα 1 iteration κατά το οποίο αυξάνεις τον counter και φέυγεις, κι ας υπάρχουν ας πούμε 10 chars μέσα στον wordlist[]).

 

Επειδή όμως δεν είμαι σίγουρος αν το κάνεις συνειδητά ή όχι, στο άφησα έτσι κι εγώ.

 

myheader.h

 

 

 

>
#ifndef MY_HEADER_H        // start of inclusion guard
#define MY_HEADER_H

/* PreProcessor Directives (constants, macros, etc) */

#define MAX_WORDS    2    // max number of words in the global: char wordlist[]

#ifndef FALSE            // define FALSE only if it's not already defined
#define FALSE        0
#endif

#ifndef TRUE            // define TRUE only if it's not already defined
#define TRUE        !FALSE
#endif

/* Custom Types */

typedef int Bool;

typedef struct game {
   char choice;
   int  counter;
}Game;

/* Functiion Prototypes */

Bool validate_choice( Game *player );

#endif                // end of inclusion guard

 

 

 

functions.c

 

 

>
// #include <stdio.h>
// #include <stdlib.h>

#include "myheader.h"    // Game, MAX_WORDS, Bool, FALSE, TRUE,

/* ----------------------------------- */
Bool validate_choice( Game *player )
{
   int i = 0;
   extern char wordlist[MAX_WORDS];    // wordlist is globally defined in main.c

   if ( !player )                // sanity check
       return FALSE;

   for (i=0; i < MAX_WORDS; i++)
   {
        if ( player->choice == wordlist[i] )
            return TRUE;

        (player->counter)++;
        return FALSE;
   }

   return FALSE;
}

 

 

 

main.c

 

 

>
#include <stdio.h>
//#include <stdlib.h>

#include "myheader.h"    // Game, MAX_WORDS, Bool, FALSE, TRUE,

// Global Variables
char wordlist[MAX_WORDS] = {'m','g'};

/* ----------------------------------- */
int main( void )
{
   Game player = {
   //    .choice        .counter
       '\0',         0
   };

   printf( "the counter till now is %d\n", player.counter );

   printf("Insert any key in order to start playing: ");
   fflush( stdout );
   scanf("%c", &player.choice);

   printf( "You inserted: %c...", player.choice );
   fflush( stdout );
   puts( validate_choice(&player) ? "this is correct!" : "Sorry..." );

   return 0;
}

 

 

 

Compilation με gcc σε Windows...

 

>gcc -Wall -Wextra functions.c main.c -o main.exe

Δημοσ.

ομως τωρα πεφτω πανω σε ενα

>functions.c:11:5: error: ‘for’ loop initial declarations are only allowed in C99 mode

 

Το

> for( int i = 0; ... ... 

 

Μπορεί να γραφτεί μόνο στο τελευταίο πρότυπο της C, το C99.

 

Ο gcc compiler (που πιθανά να έχεις) το υποστηρίζεις αλλά όχι by default κατα το compile. Πρέπει να του το "ζητήσεις" με μία παράμετρο.

 

Καλύτερα όμως να αλλάξεις απλά το lopp

 

>
int i;
for( i = 0; ... ... 

 

Κατα τα άλλα κοίτα το post του migf1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...