NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Kompilácia viac súborov

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Richard Halás:20.4.2016 17:12

Mám menši problém. Dostal som úlohu vytvoriť jeden program, všetko ide ale problem nastal vtedy ak som to mal skompilovať. Kompilovať viac súborov viem ale ak to nahrajem na stránku a keď to ide kompilovať PC aby mi vedel dať body a opraviť chyby tak mi hlási chybu a to že nevedel skompilovať.
PC to kompiluje takto : Compiles code first with the following command: gcc -std=c11 -Wall -Werror source_files.c -lm -o exec.
Netuším kde môže byť chyba lebo štruktúru súborov mám tak ako má byť pre odovzdanie.
Štruktúra Vášho projektu bude vyzerať nasledovne:
├── ps3
│ ├── hangman.c
│ ├── hangman.h
│ ├── main.c
│ └── words.txt
Viete mi poradiť ?
Ďakujem.

1. zdrojak : (main.c)

#include <stdio.h>
#include <stdlib.h>
#include "hangman.h"
#include <time.h>

int getWord(char secret[]);

int main(){
        srand(time(NULL));
        char secret[26];
        getWord(secret);
        hangman(secret);
        return EXIT_SUCCESS;
}

2. zdrojak: (hangman.c)

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include "hangman.h"
#include <ctype.h>
#include <string.h>




int getWord(char secret[]){
    FILE *fp = fopen(WORDLIST_FILENAME, "rb");
    if( fp == NULL ){
        fprintf(stderr, "No such file or directory: %s\n", WORDLIST_FILENAME);
        return 1;

    }
    struct stat st;
    stat(WORDLIST_FILENAME, &st);
    long int size = st.st_size;

    do{
        long int random = (rand() % size) + 1;
        fseek(fp, random, SEEK_SET);
        int result = fscanf(fp, "%*s %20s", secret);
        if( result != EOF )
            break;
    }while(1);

    fclose(fp);

    return 0;
}
int isWordGuessed(const char secret[] , const char lettersGuessed[])
{
        int k = 0;
        int p = 0;
        int m = 0;
        int x = strlen(secret);
        int z = strlen(lettersGuessed);
        while(m<x)
        {
                while(k<z)
                {
                        if(secret[m]==lettersGuessed[k])
                                {
                                        p ++;
                                }
                        k++;
                }
                m++;
        }
        if(p==x)
        {
                return 1;
        }
        else
        {
                return 0;
        }
}
void getGuessedWord(const char secret[], const char lettersGuessed[], char guessedWord[])
{
        int x = strlen(secret);
        int k = 0;
        int m = 0;
        int z = strlen(lettersGuessed);
        while(k < x)
        {
                int p = 0;
                while(m < z)
                {
            if(secret[k]==lettersGuessed[m])
                                {
                                        guessedWord[k] = secret[k];
                                        p = 1;
                                }
                        m++;
                }
                if (p ==0)
                {
                        guessedWord[k]='_';
                }
                k++;
        }
        guessedWord[x]='\0';
}
void getAvailableLetters(const char lettersGuessed[], char availableLetters[])
{
        int y = strlen(lettersGuessed);
        int s =0;
        char p ='a';
        int k = 0;
        while(p<='z')
        {
                int pomc=0;
                while(k<y)
                {
                        if(lettersGuessed[k]== p)
                        {
                                pomc=1;
                                break;
                        }
                        k++;
                }
                if(pomc == 0)
                {
                        availableLetters[s] = p ;
                        s++;

                }

        p++;
        }
        availableLetters[s]='\0';
}
void hangman(const char secret[])
{
        int x = strlen(secret);
        printf("Welcome to the game, Hangman!\n");
        printf("I am thinking of a word that is %d letters long.\n", x);
        printf("-------------\n");
        int pokus = 8;
        char lettersGuessed[26] = "";
        int zadal = 0;
        do{
                printf("You have %d guesses left.\n", pokus);
                char availableLetters[26];
                getAvailableLetters(lettersGuessed, availableLetters);
                printf("Available letters: %s\n", availableLetters);
                printf("Please guess a letter: ");
                char vstup[20];
                scanf("%19s", vstup);
                int m;
                for(m = 0; m<strlen(vstup); m++){
                vstup[m] = tolower(vstup[m]);
                }
                if(strlen(vstup)==1){
                        char znak = vstup[0];
                        if(strchr(lettersGuessed,znak)!=NULL){
                                printf("Oops! You've already guessed that letter:");
                        }
                        else{
                                int velkost = strlen(lettersGuessed);
                                lettersGuessed[velkost]= znak;
                                lettersGuessed[velkost+1]= '\0';
                                if(strchr(secret,znak)!=NULL){
                                        printf("Good guess:");

                                }
                                else{
                                        printf("Oops! That letter is not in my word:");
                                        pokus--;
                                }
                        }
                        char guessedWord[26];
                        getGuessedWord(secret, lettersGuessed, guessedWord);
                        for( m = 0; m<x; m++){
                                printf(" %c",guessedWord[m]);

                        }
                        printf("\n");
                        printf("-------------\n");
                }
                else{
                        zadal = 1;
                        if(strcmp(secret, vstup)==0){
                                printf("Congratulations, you won!\n");
                        }
                        else{
                                printf("Sorry, bad guess. The word was %s.\n", secret);
                        }
                        break;
                }

        }while(isWordGuessed(secret, lettersGuessed)==0 && pokus > 0);
        if (zadal == 0)
        {
        if(pokus==0){
                printf("Sorry, you ran out of guesses. The word was %s.\n", secret);
        }
        else{
                printf("Congratulations, you won!\n");
        }
        }
}

3. Zdrojak (hangman.h)

#define WORDLIST_FILENAME "words.txt"
int is_word_guessed(const char secret[], const char letters_guessed[]);
void get_guessed_word(const char secret[], const char letters_guessed[], char guessed_word[]);
void get_available_letters(const char letters_guessed[], char available_letters[]);
void hangman(const char secret[]);
int get_word(char secret[]);

Ďakujem za pomoc.

 
Odpovědět
20.4.2016 17:12
Avatar
B42P6
Člen
Avatar
Odpovídá na Richard Halás
B42P6:20.4.2016 21:51

Ahoj, chyba je pravdepodobne v tom, že ak je pri kompilácii použitá možnosť -Werror tak všetky Warning-y sú pokladané za Error-y. Ak nemôžeš zmeniť spôsob akým to "PC" kompiluje ,zisti si kde sú warning-y a oprav ich.

Nahoru Odpovědět
20.4.2016 21:51
'long long long' is too long for GCC
Avatar
LacoS.
Člen
Avatar
LacoS.:23.4.2016 13:26

najprv by som vyhodil parametre prekladu: -Wall -Werror, takze asi takto:

gcc -std=c11 main.c hangman.c -lm -o exec

... parameter -lm znamena volaco s linkovanymi kniznicami, skus to bez toho, ci pri preklade budu chybat kniznice...
... vies presnejsie, v com je problem: aku presne hlasku dostanes? To, ze sa nieco nedalo prekompilovat, to uz byva posledna hlaska, treba hladat nieco pred nou. Presnejsie: treba ist od PRVEJ chybovej hlasky.

 
Nahoru Odpovědět
23.4.2016 13:26
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na LacoS.
Martin Dráb:23.4.2016 14:03
  • lm by mělo linkovat knihovnu math.
Nahoru Odpovědět
23.4.2016 14:03
2 + 2 = 5 for extremely large values of 2
Avatar
LacoS.
Člen
Avatar
LacoS.:23.4.2016 16:48

V tych zdrojakoch nevidim ziadnu "tazku" aritmetiku, takze by to malo ist aj bez parametra -lm;

 
Nahoru Odpovědět
23.4.2016 16:48
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.