Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 16 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.12.15
Prihlásený: 06.01.16
Príspevky: 8
Témy: 1
Príspevok NapísalOffline : 22.12.2015 14:29

Pekne odpoledne, snazim sa naucit zaklady v jazyku C a momentalne mam problem s lineranim seznamem. Mam nacitat hrace ze souboru, alokovat, pridat do linearniho seznamu a vypsat je. Tu je ukazka kodu, problem mam na poslednich par radkach pocinaje pridanim do seznamu. Nacitani je v poradku. Pro orientaci v seznamu mam pouzit promenne prvni a aktualni. Dakujem za reakce.


Kód:
typedef struct hrac
{
    int          cislo;
    char         jmeno[50];
    enum Pozice  pozice;
    int          utocnaSila;
    int          obrannaSila;
    struct hrac *dalsi;
} HRAC;

static HRAC* prvni = NULL;
static HRAC* aktualni = NULL;

void nactiSeznamHracu(char* nazevSouboru)
{
    FILE *f = NULL;

    if (nazevSouboru == NULL)
    {
        return;
    }
   
    if (prvni != NULL)
    {
        // v seznamu uz neco je -> zrusit seznam
    }
   
    f = fopen(nazevSouboru, "r");       // oteviram soubor
    if (f == NULL)
    {
        printf("Soubor se nepodarilo otevrit\n");
        return;
    }

    printf("Soubor se podarilo otevrit\n");
   
    char buffer[512];
    char buffCislo[10] = {};
    char buffJmeno[10] = {};
    char buffUtok[10] = {};
    char buffObrana[10] = {};
    char buffPozice[10] = {};
   
    // cislo;jmeno;utok;obrana;pozice
    int retVal = fscanf (f, "%5s;%5s;%4s;%6s;%6s",buffCislo,
                                                   buffJmeno,
                                                   buffUtok,
                                                   buffObrana,
                                                   buffPozice);
    // kontrola souboru - hlavicky
    if (retVal != 5 ||
        memcmp(buffCislo, "cislo", 5) != 0 ||
        memcmp(buffJmeno, "jmeno", 5) != 0 ||
        memcmp(buffUtok,  "utok", 4)  != 0 ||
        memcmp(buffObrana, "obrana", 6) != 0 ||
        memcmp(buffPozice, "pozice", 6) != 0 )
    {
        printf("Soubor je poskozen, spatne zadana hlavicka souboru.\n");
        return;
    }
       
    int cislo = 0;
    char jmeno[50] = {};
    int utok = 0;
    int obrana = 0;
    char pozice = 0x00;
   
    while(1)
    {
        retVal = fscanf(f, "%d;%50[^;];%d;%d;%c", &cislo, jmeno, &utok, &obrana, &pozice );
        if (retVal != 5)
        {
            if (retVal == -1)
            {
                // jsem na konci souboru
                break;
            }
            else
            {
                printf("Soubor je poskozen. Spatne zadani hraci\n");
                fclose(f);
                return;
            }         
        }
           
        POZICE pos;
        switch(pozice)
        {
            case 'U':
                pos = UTOCNIK;
                break;
               
            case 'O':
                pos = OBRANCE;
                break;
               
            case 'B':
                pos = BRANKAR;
                break;
               
            default:
                fclose(f);
                printf("Soubor je poskozen, spatne zadana pozice.\n");
                return;
                break;
        }
       
        HRAC* novyHrac = vytvorHrace(cislo, jmeno, pos, utok, obrana);
        if (novyHrac == NULL)
        {
            printf("chyba ve funkci VytvorHrace\n");
            fclose(f);
            return;       
        }
        else
        {

Tu se dostavam k problemu
Kód:
            // Pridame do seznamu
           
if(prvni==NULL)
            {
                prvni = novyHrac;
            }
            else if(prvni->dalsi == NULL)
            {
            prvni = prvni->dalsi;
            }
fclose(f);
 
// vypíše hráče se seznamu na každý řádek jednoho
// (používá opakovaně funkci pro výpis jednoho hráče z hrac.h)

void vypisSeznamHracu()
{
    HRAC* pomocnyHrac = prvni;
    while(pomocnyHrac != NULL)
{
        pomocnyHrac = prvni->dalsi;
        vypisHrace(pomocnyHrac);
    }
        if(pomocnyHrac ==NULL) {
        }
}


Offline

Užívateľ
Užívateľ
C - Linearni seznam

Registrovaný: 27.06.09
Prihlásený: 04.03.23
Príspevky: 332
Témy: 3
Bydlisko: Košice - ok...
Príspevok NapísalOffline : 22.12.2015 15:39

a kde je presne ten problém?
myslím, že viem kde máš problém :D ale aj tak ma to zaujíma, kde si myslíš ty, že je :D

// Spojený príspevok Uto 22.12.15 15:50

Kód:
        else
        {
            // Pridame do seznamu
           
            if(prvni==NULL)
            {
                prvni = novyHrac;
            }
            else if(prvni->dalsi == NULL)
            {
            /*prvni = prvni->dalsi;*/
            prvni->dalsi = aktualni = novyHrac;
            }
            else
            {
                aktualni->dalsi = novyHrac;
                aktualni = novyHrac;
            }
            fclose(f);
        }
    }
}
 
// vypíše hráče se seznamu na každý řádek jednoho
// (používá opakovaně funkci pro výpis jednoho hráče z hrac.h)

void vypisSeznamHracu()
{
    HRAC* pomocnyHrac = prvni;
    while(pomocnyHrac != NULL)
{
        pomocnyHrac = prvni->dalsi;
        vypisHrace(pomocnyHrac);
    }
        if(pomocnyHrac ==NULL) {
        }
}







_________________
GitHub: mfocko | mfocko.xyz
OSs: archLinux + fedora (+ Windows 10 Pro Insider Preview, only if needed)
Server: archLinux [nginx + Docker (GitLab) + SSH/SFTP + local mirror (FTP/rsync - archLinux, Fedora) + samba + transmission]
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.12.15
Prihlásený: 06.01.16
Príspevky: 8
Témy: 1
Príspevok Napísal autor témyOffline : 23.12.2015 0:27

Tak jsem nad tim badal a zkusil jsem vsechno - no stale je nekde chyba jeste jinde(zrejme v vypisSeznamHracu()).
At to zkusim upravit vsemozne, vzdy mi to vypise bud pouze prvniho a nebo se program zacykli a vypisuje stale stejneho ... spatne tam pouzivam prvni/aktualni...
Toto mi vypisuje zacyklene druheho hrace. No veru neviem ako to zrobit, aby vypsalo od 1. az do posledneho hrace.

Kazdopadne dakujem za prvni radu, urcite jsem se posunul o krok dal.

Kód:
void vypisSeznamHracu() {
    HRAC* pomocnyHrac = prvni;
    while (pomocnyHrac != NULL) {

        pomocnyHrac = prvni -> dalsi;
        vypisHrace(pomocnyHrac);
    }
}


Offline

Užívateľ
Užívateľ
C - Linearni seznam

Registrovaný: 27.06.09
Prihlásený: 04.03.23
Príspevky: 332
Témy: 3
Bydlisko: Košice - ok...
Príspevok NapísalOffline : 23.12.2015 7:24

Nemenis pomocneho hraca...
Kód:
void vypisSeznamHracu() {
    HRAC* pomocnyHrac = prvni;
    while (pomocnyHrac != NULL) {
        vypisHrace(pomocnyHrac);
        pomocnyHrac = pomocnyHrac -> dalsi;
    }
}







_________________
GitHub: mfocko | mfocko.xyz
OSs: archLinux + fedora (+ Windows 10 Pro Insider Preview, only if needed)
Server: archLinux [nginx + Docker (GitLab) + SSH/SFTP + local mirror (FTP/rsync - archLinux, Fedora) + samba + transmission]
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.12.15
Prihlásený: 06.01.16
Príspevky: 8
Témy: 1
Príspevok Napísal autor témyOffline : 24.12.2015 15:45

Prominte, ze rusim klidnou vanocni atmosferu :-)
No pomalu na to zacinam prichazet, dodelal jsem dalsi metody. Momentalne delam zrusSeznamHracu(), ktery dealokuje celý linearni seznam. V literature jsem nasel, ze pro dealokaci se pouziva funkcie free(). Zkusil jsem to zakomponovat do meho prikladu, no nekde je chybka :(

Kód:
void zrusSeznamHracu()
{
    aktualni = prvni;
    HRAC* pom = prvni;
        while (aktualni != NULL)
        {
            pom = aktualni->dalsi;
            free(aktualni);
        }
        aktualni = pom -> dalsi;
}


PS: Jeste se chci zeptat, pri vypise hracu mi to v nektere casti vypisuje ruzne znaky. Je mozne, ze na techto pametovych mistech uz je neco ulozene z minula a proto t odela takovyto binec? Pomuze na to funkce zrusSeznamHracu()? Prikladam obrazek http://prntscr.com/9i2kkm

Dekuji, nebyt vas, stoural bych se v tom jeste dlouho :-) Prajem pekne svatky ;) ;)


Offline

Užívateľ
Užívateľ
C - Linearni seznam

Registrovaný: 27.06.09
Prihlásený: 04.03.23
Príspevky: 332
Témy: 3
Bydlisko: Košice - ok...
Príspevok NapísalOffline : 24.12.2015 16:00

Kód:
void zrusSeznamHracu()
{
    HRAC *pom1 = prvni;
    HRAC *pom2;

    while (pom1->dalsi != NULL)
    {
        pom2 = pom1->dalsi;
        free(pom1);
        pom1 = pom2;
    }
    free(pom1);
}







_________________
GitHub: mfocko | mfocko.xyz
OSs: archLinux + fedora (+ Windows 10 Pro Insider Preview, only if needed)
Server: archLinux [nginx + Docker (GitLab) + SSH/SFTP + local mirror (FTP/rsync - archLinux, Fedora) + samba + transmission]
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.12.15
Prihlásený: 06.01.16
Príspevky: 8
Témy: 1
Príspevok Napísal autor témyOffline : 24.12.2015 17:06

Zkusil jsem, probehne bez erroru, ale pri vypisu tam udaje o hracich stale jsou. Rozdil je v tom, ze v udaji cislo hrace je jina hodnota.. :showy:

http://prntscr.com/9i3hzs


Offline

Užívateľ
Užívateľ
C - Linearni seznam

Registrovaný: 27.06.09
Prihlásený: 04.03.23
Príspevky: 332
Témy: 3
Bydlisko: Košice - ok...
Príspevok NapísalOffline : 24.12.2015 22:02

môžeš tu dať celý kód aj vstup? :P







_________________
GitHub: mfocko | mfocko.xyz
OSs: archLinux + fedora (+ Windows 10 Pro Insider Preview, only if needed)
Server: archLinux [nginx + Docker (GitLab) + SSH/SFTP + local mirror (FTP/rsync - archLinux, Fedora) + samba + transmission]
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.12.15
Prihlásený: 06.01.16
Príspevky: 8
Témy: 1
Príspevok Napísal autor témyOffline : 24.12.2015 22:55

Fuuu, to bude na dlouho :-D :nod: Neni to jeste doupravene a doladene, nejdrive zkousim zhruba udelat vsechny metody. :breakup:
Vstup z .csv souboru http://ulozto.sk/xhsooJ9F/hraci-csv

Kod
main

Kód:
#include <stdio.h>
#include <stdlib.h>

#include <Hrac.h>
#define POCET_HRACU_V_TYMU 5
int main(int argc, char** argv)
{
    HRAC** hraciUzivatel;
    HRAC** hraciPC;
    int volba = 0;
    int cisloHrace = 0;
    do{
      printf("1-Nacti hrace do seznamu ze souboru CSV \n");
      printf("2-Vypis seznam hracu \n");
      printf("3-Pridej hrace do seznamu \n");
      printf("4-Odeber hrace ze seznamu \n");
      printf("5-Zrus seznam hracu \n");
      printf("6-Vyber hrace do obou tymu \n");
      printf("7-Simulace zapasu \n");
      printf("7-Ukoncit program \n");
      printf("volba:");
      scanf("%d", &volba);
               
      switch (volba) {
      case 1:
                        nactiSeznamHracu("hraci.csv");
         break;
      case 2:
                        printf("Vypisuji hrace:\n");
         vypisSeznamHracu();
         break;
      case 3:
//         pridejHraceDoSeznamu(hrac);
         break;
      case 4:
                        printf("Zadej cislo hrace pro odebrani: ");
                        scanf("%d", &cisloHrace);
         odeberHraceZeSeznamu(cisloHrace);
         break;
      case 5:
         zrusSeznamHracu();
         break;
      case 6:
 //                 vyberHraceStridaveDoObouTymu(hraciUzivatel, hraciPC);
         break;
      case 7:
                         printf("Simulace zapasu. ");
         
         break;
                case 8:
                        exit(1);   
                       
                default:
                        printf("N/A");
                         break;
                       
      }
               
                }while(volba != 8);
         
    }
   


seznamHracu.c

Kód:
#include <stddef.h>   // NULL
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <Hrac.h>
static HRAC* prvni = NULL;
static HRAC* aktualni = NULL; // static, aby byly vidět jen v tomto souboru

// postupně načte jednotlivé  hráče ze souboru a popřidává je za sebe do lineárního seznamu
void nactiSeznamHracu(char* nazevSouboru)
{
    FILE *f = NULL;
    if (nazevSouboru == NULL)
    {
        return;
    }
   
    if (prvni != NULL)
    {
        // v seznamu uz neco je -> zrusit seznam
         zrusSeznamHracu();
    }
   
    f = fopen(nazevSouboru, "r");       // oteviram soubor
    if (f == NULL)
    {
        printf("Soubor se nepodarilo otevrit\n");
        return;
    }

    printf("Soubor se podarilo otevrit\n");
   
    char buffer[1024];
    char buffCislo[10] = {};
    char buffJmeno[10] = {};
    char buffUtok[10] = {};
    char buffObrana[10] = {};
    char buffPozice[10] = {};
   
    // cislo;jmeno;utok;obrana;pozice
    int retVal = fscanf (f, "%5s;%5s;%4s;%6s;%6s",buffCislo,
                                                   buffJmeno,
                                                   buffUtok,
                                                   buffObrana,
                                                   buffPozice);
    // kontrola souboru - hlavicky
    if (retVal != 5 ||
        memcmp(buffCislo, "cislo", 5) != 0 ||
        memcmp(buffJmeno, "jmeno", 5) != 0 ||
        memcmp(buffUtok,  "utok", 4)  != 0 ||
        memcmp(buffObrana, "obrana", 6) != 0 ||
        memcmp(buffPozice, "pozice", 6) != 0 )
    {
        printf("Soubor je poskozen, spatne zadana hlavicka souboru.\n");
        return;
    }
       
    int cislo = 0;
    char jmeno[50] = {};
    int utok = 0;
    int obrana = 0;
    char pozice = 0x00;
   
    while(1)
    {
        retVal = fscanf(f, "%d;%50[^;];%d;%d;%c", &cislo, jmeno, &utok, &obrana, &pozice );
        if (retVal != 5)
        {
            if (retVal == -1)
            {
                // jsem na konci souboru
                break;
            }
            else
            {
                printf("Soubor je poskozen. Spatne zadani hraci\n");
                fclose(f);
                return;
            }         
        }
           
        POZICE pos;
        switch(pozice)
        {
            case 'U':
                pos = UTOCNIK;
                break;
               
            case 'O':
                pos = OBRANCE;
                break;
               
            case 'B':
                pos = BRANKAR;
                break;
               
            default:
                fclose(f);
                printf("Soubor je poskozen, spatne zadana pozice.\n");
                return;
                break;
        }
       
        HRAC* novyHrac = vytvorHrace(cislo, jmeno, pos, utok, obrana);   
        pridejHraceDoSeznamu(novyHrac);
}
}

void vypisSeznamHracu()
{
    aktualni = prvni;
        while (aktualni != NULL)
        {
            vypisHrace(aktualni); 
            aktualni = aktualni -> dalsi;
        }
}

void pridejHraceDoSeznamu(HRAC* hrac)
{
    FILE *f;
    HRAC* novyHrac;
            if (novyHrac == NULL)
        {
            printf("Chyba ve funkci VytvorHrace\n");
            fclose(f);
            return;       
        }
        else
        {
            // Pridame do seznamu
            if(prvni==NULL)
            {
                prvni = novyHrac;
            }
            else if(prvni->dalsi == NULL)
            {
            prvni->dalsi = aktualni = novyHrac;
            }
            else
            {
                aktualni -> dalsi = novyHrac;
                aktualni = novyHrac;
            }
    }
}

HRAC* odeberHraceZeSeznamu(int cisloHrace) {  //neodebira prvniho, musim predelat
    aktualni = prvni;
    HRAC* pomocnyPredchozi = prvni;
        while (aktualni != NULL)
        {
                pomocnyHrac = NULL;
                prvni = prvni->dalsi;
            }
            else
            {
   */           HRAC* pom = aktualni->dalsi;         //nasledujici prvek po odebiranem           
                pomocnyPredchozi -> dalsi = pom;                                           
                aktualni = NULL;                     // smazu zvoleneho hrace           
                aktualni = pomocnyPredchozi;                                                 
             }
        pomocnyPredchozi = aktualni;
        aktualni = aktualni -> dalsi; // posun seznamem
    }
}

// dealokuje celý lin. sez.(nestačí jen první/aktualni nastavit na NULL)
void zrusSeznamHracu()
{
    HRAC *pom1 = prvni;
    HRAC *pom2;

    while (pom1->dalsi != NULL)
    {
        pom2 = pom1->dalsi;
        free(pom1);
        pom1 = pom2;
    }
    free(pom1);
}




// vybere hráče podle jeho čísla ze seznamu hráčů, pokud číslo neexistuje vrátí NULL,
// a odebere ho ze seznamu
HRAC * vyberHrace(int cisloHrace)
{
    prvni = aktualni;
    while (aktualni != NULL) {
    if(cisloHrace == aktualni -> cislo)
    {
    return aktualni;
    printf("Hrac byl vybran. \n");
    break;
}
    aktualni = aktualni -> dalsi;
}
}
               
// vybere hráče s maximální útočnou silou             
HRAC * nejlepsiUtocnik()
{
   
}
   

// vybere hráče s maximální obrannou silou
HRAC* nejlepsiObrance()
{
   
}
   

 // vybere brankáře s maximální obrannou silou               
    HRAC * nejlepsiBrankar()
    {
       
    }
}
 //   return nejlepsiBrankar;
         */
    }


hrac.c

Kód:
 #include <stddef.h>   // NULL
#include <malloc.h>   // malloc
#include <stdio.h>    // printf
#include <string.h>   // memcpy

#include <Hrac.h>

// dynamicky alokuje proměnnou hráč, nastaví parametry a vrátí ji, ukazatel dalsi se nastaví na NULL
HRAC* vytvorHrace(int cislo,
                  char* jmeno,
                  enum Pozice pozice,
                  int utocnaSila,
                  int obrannaSila)
{
    HRAC* novyHrac = NULL;
   
    if (jmeno == NULL)
    {
        return NULL;
    }
   
    novyHrac = (HRAC*) malloc ( sizeof(HRAC) );
    if (novyHrac == NULL)
    {
        return NULL;
    }
   
    novyHrac->cislo = cislo;
    memcpy(novyHrac->jmeno, jmeno, strlen(jmeno));
    novyHrac->pozice = pozice;
    novyHrac->utocnaSila = utocnaSila;
    novyHrac->obrannaSila = obrannaSila;
    novyHrac->dalsi = NULL;
   
   return novyHrac;
}


void dealokujHrace(HRAC* hrac)
{
    if (hrac != NULL)
    {
        free(hrac);
    }
}

// vypíše např. 68 Jaromir Jagr - utok: 8, obrana: 2, pozice: U"
void vypisHrace(HRAC* hrac)
{
    if (hrac == NULL)
    {
        printf("hrac je null");
        return;
       
    }
    printf("%d ", hrac->cislo);
   
    if (hrac->jmeno != NULL)
    {
        printf(" %s ", hrac->jmeno);
    }
    else
    {
        printf("Jmeno: N/A\n");
    }
       
 
    char* poziceStr = NULL;
   
    switch(hrac->pozice)
    {
        case UTOCNIK:
            poziceStr = "Utocnik";
            break;
           
        case OBRANCE:
            poziceStr = "Obrance";
            break;
           
        case BRANKAR:
            poziceStr = "Brankar";
            break;
         
        default:
            poziceStr = "N/A";
            break;
    }
   
   
    printf("Pozice: %s ", poziceStr);
    printf("Utocna sila: %d ", hrac->utocnaSila);
    printf("Obranna sila: %d\n ", hrac->obrannaSila);
   
}


// vrátí 1 pokud je daný hráč brankář, a 0 pokud brankář není
int jeBrankar(HRAC* hrac)
{
    if (hrac == NULL)
    {
        return -1;
    }
   
    return (hrac->pozice == BRANKAR ? 1 : 0);
}




Offline

Užívateľ
Užívateľ
C - Linearni seznam

Registrovaný: 27.06.09
Prihlásený: 04.03.23
Príspevky: 332
Témy: 3
Bydlisko: Košice - ok...
Príspevok NapísalOffline : 24.12.2015 23:30

Kód:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>

int main(int argc, char* argv[])
{
   FILE* f = NULL;
   if (argc == 1) return 1;

   f = fopen(argv[1], "r");
   if (f == NULL) return 1;

   char buffer[1024];
   char buffCislo[10] = {};
   char buffJmeno[10] = {};
   char buffUtok[10] = {};
   char buffObrana[10] = {};
   char buffPozice[10] = {};

   int retVal = fscanf (f, "%5s;%5s;%4s;%6s;%6s", buffCislo, buffJmeno, buffUtok, buffObrana, buffPozice);

   int cislo = 0;
   char jmeno[50] = {};
   int utok = 0;
   int obrana = 0;
   char pozice = 0x00;

   while(1)
   {
      retVal = fscanf(f, "%d;%50[^;];%d;%d;%c", &cislo, jmeno, &utok, &obrana, &pozice );
      if (retVal != 5)
      {
         if (retVal == -1)
         {
            // jsem na konci souboru
            break;
         }
         else
         {
            printf("Soubor je poskozen. Spatne zadani hraci\n");
            fclose(f);
            return 1;
         }         
      }

      /*POZICE pos;
      switch(pozice)
      {
      case 'U':
         pos = UTOCNIK;
         break;
      case 'O':
         pos = OBRANCE;
         break;
      case 'B':
         pos = BRANKAR;
         break;
      default:
         fclose(f);
         printf("Soubor je poskozen, spatne zadana pozice.\n");
         return 1;
         break;
      }*/
      
      printf("%d\t%s\t%d\t%d\t%c\n", cislo, jmeno, utok, obrana, pozice);
   }
   return 0;
}


tak trochu som očakával, že to je chyba systému, Java mala problémy s koncami riadkov ešte keď som používal windows... skúste tento kód (názov súboru dávate ako argument programu), ak to nevytlačí dobre, tak to zle načítava zo súboru
potom to je pri štruktúrach ak to vyjde dobre







_________________
GitHub: mfocko | mfocko.xyz
OSs: archLinux + fedora (+ Windows 10 Pro Insider Preview, only if needed)
Server: archLinux [nginx + Docker (GitLab) + SSH/SFTP + local mirror (FTP/rsync - archLinux, Fedora) + samba + transmission]
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.12.15
Prihlásený: 06.01.16
Príspevky: 8
Témy: 1
Príspevok Napísal autor témyOffline : 25.12.2015 1:01

Kód:
int main(int argc, char* argv[])
{
   argv[1] = "hraci.csv";
   FILE* f = NULL;
   if (argc == 1) return 1;
   
   f = fopen(argv[1], "r");


Takto v pripade, ze se soubor jmenuje hraci.csv + zbytek vaseho kodu ? :-)

Len problikne konzole, nic se nevypise. :(


Offline

Užívateľ
Užívateľ
C - Linearni seznam

Registrovaný: 27.06.09
Prihlásený: 04.03.23
Príspevky: 332
Témy: 3
Bydlisko: Košice - ok...
Príspevok NapísalOffline : 25.12.2015 1:18

nie ... ak chcete len tak a nezadavate pri spusteni uplne staci
Kód:
int main(void)
{
    FILE* f = NULL;
    f = fopen("hraci.csv", "r");







_________________
GitHub: mfocko | mfocko.xyz
OSs: archLinux + fedora (+ Windows 10 Pro Insider Preview, only if needed)
Server: archLinux [nginx + Docker (GitLab) + SSH/SFTP + local mirror (FTP/rsync - archLinux, Fedora) + samba + transmission]
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.12.15
Prihlásený: 06.01.16
Príspevky: 8
Témy: 1
Príspevok Napísal autor témyOffline : 25.12.2015 13:31

http://prntscr.com/9icywf


Offline

Užívateľ
Užívateľ
C - Linearni seznam

Registrovaný: 27.06.09
Prihlásený: 04.03.23
Príspevky: 332
Témy: 3
Bydlisko: Košice - ok...
Príspevok NapísalOffline : 25.12.2015 13:33

tak sa ešte pozriem na tie štruktúry ako sa ukaldajú

// Spojený príspevok Pia 25.12.15 14:16

openSUSE Tumbleweed, kompilátor gcc: zobraziť
Kód:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>

typedef struct HRAC
{
   int cislo;
   char jmeno[50];
   char pozice;
   int utocnaSila;
   int obrannaSila;
   struct HRAC* dalsi;
} HRAC;

void vypisHrace(HRAC*);
HRAC* vytvorHrace(int cislo, char* jmeno, char pozice, int utocnaSila, int obrannaSila);

int main(int argc, char* argv[])
{
   FILE* f = NULL;
   if (argc == 1) return 1;

   f = fopen(argv[1], "r");
   if (f == NULL) return 1;

   char buffer[1024];
   char buffCislo[10] = {};
   char buffJmeno[10] = {};
   char buffUtok[10] = {};
   char buffObrana[10] = {};
   char buffPozice[10] = {};

   int retVal = fscanf (f, "%5s;%5s;%4s;%6s;%6s", buffCislo, buffJmeno, buffUtok, buffObrana, buffPozice);

   int cislo = 0;
   char jmeno[50] = {};
   int utok = 0;
   int obrana = 0;
   char pozice = 0x00;

   while(1)
   {
      retVal = fscanf(f, "%d;%50[^;];%d;%d;%c", &cislo, jmeno, &utok, &obrana, &pozice );
      if (retVal != 5)
      {
         if (retVal == -1)
         {
            // jsem na konci souboru
            break;
         }
         else
         {
            printf("Soubor je poskozen. Spatne zadani hraci\n");
            fclose(f);
            return 1;
         }         
      }

      /*POZICE pos;
      switch(pozice)
      {
      case 'U':
         pos = UTOCNIK;
         break;
      case 'O':
         pos = OBRANCE;
         break;
      case 'B':
         pos = BRANKAR;
         break;
      default:
         fclose(f);
         printf("Soubor je poskozen, spatne zadana pozice.\n");
         return 1;
         break;
      }*/
      
      printf("%d\t%s\t%d\t%d\t%c\n", cislo, jmeno, utok, obrana, pozice);
      HRAC* temp = vytvorHrace(cislo, jmeno, pozice, utok, obrana);
      vypisHrace(temp);
   }
   return 0;
}

void vypisHrace(HRAC* struktura)
{
   printf("%d\t%s\t%d\t%d\t%c\n", struktura->cislo, struktura->jmeno, struktura->utocnaSila, struktura->obrannaSila, struktura->pozice);
}

HRAC* vytvorHrace(int cislo, char* jmeno, char pozice, int utocnaSila, int obrannaSila)
{
   HRAC* novyHrac = NULL;

   if (jmeno == NULL)
   {
      return NULL;
   }

   novyHrac = (HRAC*) malloc ( sizeof(HRAC) );
   if (novyHrac == NULL)
   {
      return NULL;
   }

   novyHrac->cislo = cislo;
   memcpy(novyHrac->jmeno, jmeno, strlen(jmeno));
   novyHrac->pozice = pozice;
   novyHrac->utocnaSila = utocnaSila;
   novyHrac->obrannaSila = obrannaSila;
   novyHrac->dalsi = NULL;

   return novyHrac;
}


Prvý riadok je načítané zo vstupu a druhý riadok je výpis zo štruktúry
vystup: zobraziť
Kód:
./main hraci.csv
1   Pekka Rinne   0   13   B
1   Pekka Rinne   0   13   B
2   Duncan Keith   4   6   O
2   Duncan Keith   4   6   O
4   Caldwell Pugh   2   8   O
4   Caldwell Pugh   2   8   O
5   Damon Combs   2   8   O
5   Damon Combs   2   8   O
6   Shea Weber   3   7   O
6   Shea Weber   3   7   O
7   Camden Bradshaw   1   9   O
7   Camden Bradshaw   1   9   O
8   Merritt Goodman   4   6   O
8   Merritt Goodman   4   6   O
9   Ian Rhodes   8   2   U
9   Ian Rhodes   8   2   U
10   Corey Perry   8   2   U
10   Corey Perry   8   2   U
11   Daniel Nielsen   0   10   O
11   Daniel Nielsen   0   10   O
13   Macaulay Mcmillan   1   9   O
13   Macaulay Mcmillan   1   9   O
14   Kirk Allison   0   10   O
14   Kirk Allison   0   10   O
15   Pavel Datsyuk   7   3   U
15   Pavel Datsyuk   7   3   U
16   Nathan Blevins   2   8   O
16   Nathan Blevins   2   8   O
17   Lyle Lynch   1   9   O
17   Lyle Lynch   1   9   O
18   Noah Myers   1   9   O
18   Noah Myers   1   9   O
19   Byron Hale   9   1   U
19   Byron Hale   9   1   U
20   Ryan Suter   4   6   O
20   Ryan Suter   4   6   O
21   Dane Preston   4   6   O
21   Dane Preston   4   6   O
22   Oren Burke   2   8   O
22   Oren Burke   2   8   O
23   Dominic Lindsay   9   1   U
23   Dominic Lindsay   9   1   U
24   Richard Harmon   1   9   O
24   Richard Harmon   1   9   O
26   Austin Fulton   8   2   U
26   Austin Fulton   8   2   U
30   Corey Crawford   0   12   B
30   Corey Crawford   0   12   B
31   Henrik Lundqvist   0   14   B
31   Henrik Lundqvist   0   14   B
32   Jonathan Quick   0   13   B
32   Jonathan Quick   0   13   B
33   Dean Anthony   9   1   U
33   Dean Anthony   9   1   U
34   Griffin Doyle   9   1   U
34   Griffin Doyle   9   1   U
35   Carey Price   0   15   B
35   Carey Price   0   15   B
36   Matthew Mendoza   10   0   U
36   Matthew Mendoza   10   0   U
37   Clinton Guy   4   6   O
37   Clinton Guy   4   6   O
38   Denton Miles   4   6   O
38   Denton Miles   4   6   O
41   Mike Smith   0   12   B
41   Mike Smith   0   12   B
42   Nasim Larsen   1   9   O
42   Nasim Larsen   1   9   O
43   Dillon Bryant   9   1   U
43   Dillon Bryant   9   1   U
44   Ferdinand Elliott   10   0   U
44   Ferdinand Elliott   10   0   U
45   Gage Oneill   1   9   O
45   Gage Oneill   1   9   O
46   Ignatius Head   8   2   U
46   Ignatius Head   8   2   U
47   Lawrence Garza   0   10   O
47   Lawrence Garza   0   10   O
49   Len Mcdaniel   1   9   O
49   Len Mcdaniel   1   9   O
50   Zachary Camacho   0   10   O
50   Zachary Camacho   0   10   O
51   Reese Mcclure   0   10   O
51   Reese Mcclure   0   10   O
52   Michael Scott   7   3   U
52   Michael Scott   7   3   U
53   Gabriel Barrera   1   9   O
53   Gabriel Barrera   1   9   O
55   Niklas Kronwall   4   6   O
55   Niklas Kronwall   4   6   O
56   Emmanuel Dillon   6   4   U
56   Emmanuel Dillon   6   4   U
57   Drew Rollins   1   9   O
57   Drew Rollins   1   9   O
58   Ezra Carter   1   9   O
58   Ezra Carter   1   9   O
59   Erich Larson   4   6   O
59   Erich Larson   4   6   O
60   Carlos Duncan   9   1   U
60   Carlos Duncan   9   1   U
61   Clayton Washington   0   10   O
61   Clayton Washington   0   10   O
62   Rajah Montgomery   4   6   O
62   Rajah Montgomery   4   6   O
64   Clinton Snow   4   6   O
64   Clinton Snow   4   6   O
65   Erik Karlsson   5   5   O
65   Erik Karlsson   5   5   O
67   Tiger Bruce   1   9   O
67   Tiger Bruce   1   9   O
68   Jaromir Jagr   8   2   U
68   Jaromir Jagr   8   2   U
69   Raymond Ramos   7   3   U
69   Raymond Ramos   7   3   U
70   Cole Chambers   3   7   O
70   Cole Chambers   3   7   O
71   Quentin Joseph   2   8   O
71   Quentin Joseph   2   8   O
72   Gary Johnson   6   4   U
72   Gary Johnson   6   4   U
73   Yoshio Gill   4   6   O
73   Yoshio Gill   4   6   O
73   Bert Tate   10   0   U
73   Bert Tate   10   0   U
74   Gray Sherman   0   10   O
74   Gray Sherman   0   10   O
75   Stone Aguilar   1   9   O
75   Stone Aguilar   1   9   O
76   PK Subban   5   5   O
76   PK Subban   5   5   O
77   Chaney Wells   6   4   U
77   Chaney Wells   6   4   U
78   Tucker Davidson   0   10   O
78   Tucker Davidson   0   10   O
80   Charles Douglas   6   4   U
80   Charles Douglas   6   4   U
81   Odysseus Mercado   4   6   O
81   Odysseus Mercado   4   6   O
82   Kyle Diaz   2   8   O
82   Kyle Diaz   2   8   O
83   Isaac Griffith   0   10   O
83   Isaac Griffith   0   10   O
84   Brendan Shaw   3   7   O
84   Brendan Shaw   3   7   O
85   Jack Lee   1   9   O
85   Jack Lee   1   9   O
86   Travis Hays   2   8   O
86   Travis Hays   2   8   O
88   Patrick Kane   9   1   U
88   Patrick Kane   9   1   U
89   Octavius Oneal   9   1   U
89   Octavius Oneal   9   1   U
90   Knox Berger   9   1   U
90   Knox Berger   9   1   U
91   Tyler Seguin   7   3   U
91   Tyler Seguin   7   3   U
92   Jackson Pennington   3   7   O
92   Jackson Pennington   3   7   O
93   Deacon Cobb   3   7   O
93   Deacon Cobb   3   7   O
95   Zephania Stout   4   6   O
95   Zephania Stout   4   6   O
96   Keefe Massey   7   3   U
96   Keefe Massey   7   3   U
97   Michael Barron   2   8   O
97   Michael Barron   2   8   O
98   Murphy Chapman   2   8   O
98   Murphy Chapman   2   8   O







_________________
GitHub: mfocko | mfocko.xyz
OSs: archLinux + fedora (+ Windows 10 Pro Insider Preview, only if needed)
Server: archLinux [nginx + Docker (GitLab) + SSH/SFTP + local mirror (FTP/rsync - archLinux, Fedora) + samba + transmission]
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.12.15
Prihlásený: 06.01.16
Príspevky: 8
Témy: 1
Príspevok Napísal autor témyOffline : 27.12.2015 18:31

Vyse uvedene jiz funguje. Zbyva mi zkontrolovat, zda dynamicke pole ukazatelu(hraciUzivatel) obsahuje 1 brankare.
V podmince volam funkci maTymBrankare s parametrem hraciUzivatel - pole ukazatelu. Pokud nema, vratim hrace zpet do seznamu. Na konci je zobrazena metoda int maTymBrankare(HRAC** tym). Chybu mi kompilator nevyhodi, ale kdyz vybuilduju a spustim, tak program prestane pracovat. Nemam tuseni, kde muze byt problem. :loony:
Dekuji za vas cas.

Kód:
HRAC** hraciUzivatel = NULL;
hraciUzivatel = (HRAC**) calloc(POCET_HRACU_V_TYMU, sizeof (HRAC*));


Kód:
if(maTymBrankare(hraciUzivatel) == 0)
        {
           
        //nema brankare, vrat do seznamu, ukazatele v poli nastavit na NULL pro oba týmy
           
        printf("Tým uzivatele nemá brankare. Hraci byli vraceni zpet do seznamu.");
        int i;
        for (i = 0; i < POCET_HRACU_V_TYMU; i++)
        {
            pridejHraceDoSeznamu(hraciPC[i]);
            hraciPC[i] = NULL;
            pridejHraceDoSeznamu(hraciUzivatel[i]);
            hraciUzivatel[i] = NULL;
        }
        }
   
        else
        {
            vyberTrueFalse = 1;
        }
             
}

Kód:
int maTymBrankare(HRAC** tym)
{

    int i;
    for (i = 0; i < POCET_HRACU_V_TYMU; i++)
    {
        if(jeBrankar(hraciUzivatel[i]) == 1)
        {
            return 1;
            break;
        }
        else
        {
            return 0;
        }
    }
    return 0;
}


Offline

Užívateľ
Užívateľ
C - Linearni seznam

Registrovaný: 27.06.09
Prihlásený: 04.03.23
Príspevky: 332
Témy: 3
Bydlisko: Košice - ok...
Príspevok NapísalOffline : 27.12.2015 19:28

nejak nechápem načo predávaš funkcii maTymBrankare odkaz na pole, keď to pole vo funckii vôbec nepoužívaš

Spoiler: zobraziť
Kód:
int maTymBrankare(HRAC** tym)
{

    int i;
    for (i = 0; i < POCET_HRACU_V_TYMU; i++)
    {
        if (jeBrankar(tym[i]) == 1) return 1;
    }
    return 0;
}







_________________
GitHub: mfocko | mfocko.xyz
OSs: archLinux + fedora (+ Windows 10 Pro Insider Preview, only if needed)
Server: archLinux [nginx + Docker (GitLab) + SSH/SFTP + local mirror (FTP/rsync - archLinux, Fedora) + samba + transmission]
Odpovedať na tému [ Príspevkov: 16 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Pravidlá + SEZNAM THREADŮ HER!!!

v Počítačové hry

1

7799

23.12.2012 20:11

SuRkoM Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. LG unikl seznam telefonů, které se objeví na trhu

v Novinky

7

920

24.07.2011 13:19

david3504 Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra