An Access Violation (Segmentation Fault) raised in your program.

0

Błąd pokazuje mi się w debuggerze, gdy uruchamiam program normalnie, to zawiesza się program, a gdy uruchomię go bez argumentu wiersza poleceń - działa, tylko, że wyskakuje komunikat o nieprawidłowej ilości argumentów, tak jak oczekiwano. Program ma za zadanie wczytać o ile to możliwe listę struktur 18 graczy z czterech plików, każdy plik reprezentuje jeden mecz (18 graczy ze statystykami). Każda struktura składa się z imienia i nazwiska gracza, liczby rzutów trafionych i ogólnej liczby rzutów, liczby asysty i fauli, skuteczność jest obliczana. Program zatem ma wyświetlać te wartości wraz z obliczoną skutecznością dla każdego gracza i dla całej drużyny z jednego meczu... oraz na samym końcu dla wszystkich meczy. Proszę o pomoc.

EDIT: Wkleiłem poprawione/dokończone.

#include <stdio.h>
#include <string.h>

#define MAX_NAME 12
#define MAX_SURNAME 16
#define MAX_PLAYERS 18
#define MAX_MATCHES 4

#define GET_STATS_ERR "\nBlad przy odczycie danych z pliku/ow.\n"
#define ARGC_ERR "\nZa malo argumentow wiersza polecen.\n"
#define FOPEN_ERR "\nProblem z otwieraniem pliku: "
#define FSCANF_ERR "Problem z wczytywaniem danych z pliku: "
#define MATCH_RESULT_TEXT "Wyniki dla meczu nr. "
#define NAME "Imie"
#define SURNAME "Nazwisko"
#define HITS "Trafienia"
#define SHOTS "Rzuty"
#define ESCORTS "Asysty"
#define FOULS "Faule"
#define EFFICACY "Skutecznosc"
#define THIS_MATCH_RESULTS "Skutecznosc calej druzyny w tym meczu to: "
#define ALL_MATCHES_RESULTS "Skutecznosc calej druzyny we wszystkich meczach to: "
#define THIS_MATCH_EFFICACY_TEXT "Skutecznosc zawodnikow w tym meczu to: "
#define THIS_MATCH_EFFICACY_TEXT2 "\nWcisnij [enter], aby przejsc do wynikow nastepnego meczu."
#define ALL_MATCHES_EFFICACY_TEXT "Skutecznosc zawodnikow we wszystkich meczach to: "
#define FCLOSE_ERR "Blad przy zamykaniu pliku."

struct Player {
    char Name[MAX_NAME];
    char Surname[MAX_SURNAME];
    int Hits;
    int Shots;
    int Escorts;
    int Fouls;
    float Efficacy;
}   VarPlayer[MAX_PLAYERS];

struct MatchStats {
    struct Player VarPlayer[MAX_PLAYERS];
    float MatchEfficacy;
}   VarMatchStats[MAX_MATCHES];

int GetMatchStats(FILE * p_fptr[], struct MatchStats * p_VarMatchStats, char * p_argv);
void ShowMatchStats(struct MatchStats * p_VarMatchStats, int p_argc);

int main(int argc, char * argv[])
{
    int i, j;
    FILE * fptr[MAX_MATCHES];
    if(argc<=1)
        {
            fprintf(stderr,"%s", ARGC_ERR);
            getchar();
            return 555;
        }
    for(i=0; i<argc-1; i++)
        if((fptr[i]=fopen(argv[i+1], "r"))==NULL)
            {
                fprintf(stderr, "%s %s", FOPEN_ERR, argv[i+1]);
                getchar();
                return i+1;
            }
    for(i=0, j=0; i<argc-1; i++)
        j+=GetMatchStats(fptr, VarMatchStats, argv[i+1]);
    if(j!=argc-1)
        return 556;
    ShowMatchStats(VarMatchStats, argc);
    return 0;
    for(i=0; i<argc-1; i++)
        if(fclose(fptr[i])!=0)
            {
                fprintf(stderr,"%s %s", FCLOSE_ERR, argv[i+1]);
                getchar();
                return 0;
            }
    return 0;
}
    
int GetMatchStats(FILE * p_fptr[], struct MatchStats * p_VarMatchStats, char * p_argv)
{
    int i, j, k;
    for(j=0; j<MAX_PLAYERS; j++)
        if(fscanf(p_fptr[i],"%*d %s %s %d %d %d %d", p_VarMatchStats[i].VarPlayer[j].Name, p_VarMatchStats[i].VarPlayer[j].Name, p_VarMatchStats[i].VarPlayer[j].Hits, p_VarMatchStats[i].VarPlayer[j].Shots, p_VarMatchStats[i].VarPlayer[j].Escorts, p_VarMatchStats[i].VarPlayer[j].Fouls)!=6)
                 { 
                     fprintf(stderr,"%s %s" ,FSCANF_ERR, p_argv);
                     getchar();
                     return 0;
                 }
    return 1;
}

void ShowMatchStats(struct MatchStats * p_VarMatchStats, int p_argc)
{
    int i, j, k;
    float team_efficacy;
    float all_matches_efficacy;
    for(i=0; i<p_argc-1; i++)
        {
            
            printf("\n\n%30s%d :\n", MATCH_RESULT_TEXT, i);
            printf("%-*s %-*s", MAX_NAME+2, NAME, MAX_SURNAME+2, SURNAME);
            printf("%-12s %-8s %-10s %-10s %-14s", HITS, SHOTS, ESCORTS, FOULS, EFFICACY);
            for(j=0; j<MAX_PLAYERS; j++)
                {
                    printf("%-*s %-*s", MAX_NAME+2, p_VarMatchStats[i].VarPlayer[j].Name, MAX_SURNAME+2, p_VarMatchStats[i].VarPlayer[j].Surname);
                    printf("%-12d %-8d %-10d %-10 ", p_VarMatchStats[i].VarPlayer[j].Hits, p_VarMatchStats[i].VarPlayer[j].Shots, p_VarMatchStats[i].VarPlayer[j].Escorts, p_VarMatchStats[i].VarPlayer[j].Fouls);
                    p_VarMatchStats[i].VarPlayer[j].Efficacy=p_VarMatchStats[i].VarPlayer[j].Hits/p_VarMatchStats[i].VarPlayer[j].Shots;
                    printf("%-14.2f %%\n", p_VarMatchStats[i].VarPlayer[j].Efficacy);
                }
            for(k=0; k<MAX_PLAYERS ;k++)
                team_efficacy+=p_VarMatchStats[i].VarPlayer[k].Efficacy;
            p_VarMatchStats[i].MatchEfficacy=team_efficacy/MAX_PLAYERS;
            printf("%s %.2f %s", THIS_MATCH_EFFICACY_TEXT, p_VarMatchStats[i].MatchEfficacy, THIS_MATCH_EFFICACY_TEXT2);
            all_matches_efficacy+=p_VarMatchStats[i].MatchEfficacy;
            getchar();
  
        }   
    printf("\n%s %.2f", ALL_MATCHES_EFFICACY_TEXT, all_matches_efficacy/(p_argc-1));
    getchar();
    return;
}
0
int i, j, k;
    for(j=0; j<MAX_PLAYERS; j++)
        if(fscanf(p_fptr[i]

i - nie zainicjalizowane

0

A więc do definicji dodałem czwarty argument "parameter":

int GetMatchStats(FILE * p_fptr[], struct MatchStats * p_VarMatchStats, char * p_argv, int parameter);

Pętla wywołująca wygląda tak:

 
 for(i=0, j=0; i<argc-1; i++)
        j+=GetMatchStats(fptr, VarMatchStats, argv[i+1], i);

A w funkcji zainicjowałem tak, aby nie zmieniać każdego "i":

int GetMatchStats(FILE * p_fptr[], struct MatchStats * p_VarMatchStats, char * p_argv, int parameter)
{
    int i, j;
    for(j=0, i=parameter; j<MAX_PLAYERS; j++)
        if(fscanf(p_fptr[i],

To dla mnie jedyne logiczne rozwiązanie, poprawcie mnie jeśli się myle, całą noc przesiedziałem nad tym programem, chciałbym ruszyć dalej, ale nie mogę...

A tak wygląda całość:

#include <stdio.h>
#include <string.h>

#define MAX_NAME 12
#define MAX_SURNAME 16
#define MAX_PLAYERS 18
#define MAX_MATCHES 4

#define GET_STATS_ERR "\nBlad przy odczycie danych z pliku/ow.\n"
#define ARGC_ERR "\nZa malo argumentow wiersza polecen.\n"
#define FOPEN_ERR "\nProblem z otwieraniem pliku: "
#define FSCANF_ERR "Problem z wczytywaniem danych z pliku: "
#define MATCH_RESULT_TEXT "Wyniki dla meczu nr. "
#define NAME "Imie"
#define SURNAME "Nazwisko"
#define HITS "Trafienia"
#define SHOTS "Rzuty"
#define ESCORTS "Asysty"
#define FOULS "Faule"
#define EFFICACY "Skutecznosc"
#define THIS_MATCH_RESULTS "Skutecznosc calej druzyny w tym meczu to: "
#define ALL_MATCHES_RESULTS "Skutecznosc calej druzyny we wszystkich meczach to: "
#define THIS_MATCH_EFFICACY_TEXT "Skutecznosc zawodnikow w tym meczu to: "
#define THIS_MATCH_EFFICACY_TEXT2 "\nWcisnij [enter], aby przejsc do wynikow nastepnego meczu."
#define ALL_MATCHES_EFFICACY_TEXT "Skutecznosc zawodnikow we wszystkich meczach to: "
#define FCLOSE_ERR "Blad przy zamykaniu pliku."

struct Player {
    char Name[MAX_NAME];
    char Surname[MAX_SURNAME];
    int Hits;
    int Shots;
    int Escorts;
    int Fouls;
    float Efficacy;
}   VarPlayer[MAX_PLAYERS];

struct MatchStats {
    struct Player VarPlayer[MAX_PLAYERS];
    float MatchEfficacy;
}   VarMatchStats[MAX_MATCHES];

int GetMatchStats(FILE * p_fptr[], struct MatchStats * p_VarMatchStats, char * p_argv, int parameter);
void ShowMatchStats(struct MatchStats * p_VarMatchStats, int p_argc);

int main(int argc, char * argv[])
{
    int i, j;
    FILE * fptr[MAX_MATCHES];
    if(argc<=1)
        {
            fprintf(stderr,"%s", ARGC_ERR);
            getchar();
            return 555;
        }
    for(i=0; i<argc-1; i++)
        if((fptr[i]=fopen(argv[i+1], "r"))==NULL)
            {
                fprintf(stderr, "%s %s", FOPEN_ERR, argv[i+1]);
                getchar();
                return i+1;
            }
    for(i=0, j=0; i<argc-1; i++)
        j+=GetMatchStats(fptr, VarMatchStats, argv[i+1], i);
    if(j!=argc-1)
        return 556;
    ShowMatchStats(VarMatchStats, argc);
    for(i=0; i<argc-1; i++)
        if(fclose(fptr[i])!=0)
            {
                fprintf(stderr,"%s %s", FCLOSE_ERR, argv[i+1]);
                getchar();
                return 0;
            }
    return 0;
}

int GetMatchStats(FILE * p_fptr[], struct MatchStats * p_VarMatchStats, char * p_argv, int parameter)
{
    int i, j;
    for(j=0, i=parameter; j<MAX_PLAYERS; j++)
        if(fscanf(p_fptr[i],"%*d %s %s %d %d %d %d\n", p_VarMatchStats[i].VarPlayer[j].Name, p_VarMatchStats[i].VarPlayer[j].Name, p_VarMatchStats[i].VarPlayer[j].Hits, p_VarMatchStats[i].VarPlayer[j].Shots, p_VarMatchStats[i].VarPlayer[j].Escorts, p_VarMatchStats[i].VarPlayer[j].Fouls)!=6)
                 {
                     fprintf(stderr,"%s %s" ,FSCANF_ERR, p_argv);
                     getchar();
                     return 0;
                 }
    return 1;
}

void ShowMatchStats(struct MatchStats * p_VarMatchStats, int p_argc)
{
    int i, j, k;
    float team_efficacy;
    float all_matches_efficacy;
    for(i=0; i<p_argc-1; i++)
        {

            printf("\n\n%30s%d :\n", MATCH_RESULT_TEXT, i);
            printf("%-*s %-*s", MAX_NAME+2, NAME, MAX_SURNAME+2, SURNAME);
            printf("%-12s %-8s %-10s %-10s %-14s", HITS, SHOTS, ESCORTS, FOULS, EFFICACY);
            for(j=0; j<MAX_PLAYERS; j++)
                {
                    printf("%-*s %-*s", MAX_NAME+2, p_VarMatchStats[i].VarPlayer[j].Name, MAX_SURNAME+2, p_VarMatchStats[i].VarPlayer[j].Surname);
                    printf("%-12d %-8d %-10d %-10 ", p_VarMatchStats[i].VarPlayer[j].Hits, p_VarMatchStats[i].VarPlayer[j].Shots, p_VarMatchStats[i].VarPlayer[j].Escorts, p_VarMatchStats[i].VarPlayer[j].Fouls);
                    p_VarMatchStats[i].VarPlayer[j].Efficacy=p_VarMatchStats[i].VarPlayer[j].Hits/p_VarMatchStats[i].VarPlayer[j].Shots;
                    printf("%-14.2f %%\n", p_VarMatchStats[i].VarPlayer[j].Efficacy);
                }
            for(k=0; k<MAX_PLAYERS ;k++)
                team_efficacy+=p_VarMatchStats[i].VarPlayer[k].Efficacy;
            p_VarMatchStats[i].MatchEfficacy=team_efficacy/MAX_PLAYERS;
            printf("%s %.2f %s", THIS_MATCH_EFFICACY_TEXT, p_VarMatchStats[i].MatchEfficacy, THIS_MATCH_EFFICACY_TEXT2);
            all_matches_efficacy+=p_VarMatchStats[i].MatchEfficacy;
            getchar();

        }
    printf("\n%s %.2f", ALL_MATCHES_EFFICACY_TEXT, all_matches_efficacy/(p_argc-1));
    getchar();
    return;
}
0
fscanf(p_fptr[i],"%*d %s %s %d %d %d %d\n", p_VarMatchStats[i].VarPlayer[j].Name

%*d jakoś nie pasuje do p_VarMatchStats[i].VarPlayer[j].Name

0

To "%*d" ma powstrzymywać przed wczytywaniem liczby zawodnika, bo w pliku każdego zawodnika poprzedza jego numer porządkowy o czym oczywiście zapomniałem dodać. "\n" na końcu chyba musi być bo statystykę każdego gracza kończy właśnie znak nowej linii. Przepraszam, że zapomniałem o tym napisać w opisie programu, ponieważ dorobiłem to później. Spróbowałem też sprawdzić czy fscanf() ma być nie równe 7, ale też mi wywala program.

0

Dwie uwagi (drugi listing):
1.
int main(int argc, char * argv[])
{
//...
return 0;//tu u ciebie kończy się funkcja main()
for(i=0; i<argc-1; i++)
if(fclose(fptr[i])!=0)
{
fprintf(stderr,"%s %s", FCLOSE_ERR, argv[i+1]);
getchar();
return 0;
}
return 0;
}

fscanf(p_fptr[i],"%*d %s %s %d %d %d %d\n", p_VarMatchStats[i].VarPlayer[j].Name, /itd/)!=6)
fscanf() wymaga adresu pod, który będą wczytywane dane.
i

0

<quote="857880">Dwie uwagi (drugi listing):
1.
int main(int argc, char * argv[])
{
//...
return 0;//tu u ciebie kończy się funkcja main()
for(i=0; i<argc-1; i++)
if(fclose(fptr[i])!=0)
{
fprintf(stderr,"%s %s", FCLOSE_ERR, argv[i+1]);
getchar();
return 0;
}
return 0;
}

fscanf(p_fptr[i],"%*d %s %s %d %d %d %d\n", p_VarMatchStats[i].VarPlayer[j].Name, /itd/)!=6)
fscanf() wymaga adresu pod, który będą wczytywane dane.
i</quote>

  1. Słuszna uwaga.
  2. Jak już pisałem "%*d" nie wymaga adresu ponieważ wczytuje liczbe i ją porzuca, a nie zapisuje ją w adresie.
1

Nie chodzi o pierwszą wczytaną liczbę, ale o następne dane. Aby wczytać do p_VarMatchStats[i].VarPlayer[j].Name musisz podać adres.
I tu masz problem.

0

Dziękuję bardzo, ruszam dalej, ale nadal są kłopoty. Tym razem z funkcją wyświetlającą wyniki, którą już poprawiałem wielokrotnie. Wyświetla mi ona tylko nazwiska graczy i to w polu z imieniem, a imię gdzieś tam pomija. W dodatku procent skuteczności z całego meczu wychodzi mi jakoś taki 43542000000000.0% (coś takiego) i nie wiem co poradzić, nie widzę żadnego błędu, tutaj jest ta funkcja:

void ShowMatchStats(struct MatchStats * p_VarMatchStats, int p_argc)
{
    int i, j, k;
    float team_efficacy;
    float all_matches_efficacy=0;
    for(i=0; i<p_argc-1; i++)
        {

            printf("\n\n%30s%d :\n", MATCH_RESULT_TEXT, i+1);
            printf("%-*s %-*s", MAX_NAME, NAME, MAX_SURNAME, SURNAME);
            printf(" %-8s %-8s %-8s %-8s %-8s\n", HITS, SHOTS, ESCORTS, FOULS, EFFICACY);
            for(j=0; j<MAX_PLAYERS; j++)
                {
                    printf("%-*s %-*s", MAX_NAME, p_VarMatchStats[i].VarPlayer[j].Name, MAX_SURNAME, p_VarMatchStats[i].VarPlayer[j].Surname);
                    printf("  %-8d %-8d %-8d %-8d", p_VarMatchStats[i].VarPlayer[j].Hits, p_VarMatchStats[i].VarPlayer[j].Shots, p_VarMatchStats[i].VarPlayer[j].Escorts, p_VarMatchStats[i].VarPlayer[j].Fouls);
                    if(p_VarMatchStats[i].VarPlayer[j].Shots!=0)
                          p_VarMatchStats[i].VarPlayer[j].Efficacy= (float) p_VarMatchStats[i].VarPlayer[j].Hits/p_VarMatchStats[i].VarPlayer[j].Shots;
                    else
                          p_VarMatchStats[i].VarPlayer[j].Efficacy=0;
                    printf("  %.1f%%\n", p_VarMatchStats[i].VarPlayer[j].Efficacy*100);
                }
            for(k=0; k<MAX_PLAYERS ;k++)
                team_efficacy+=p_VarMatchStats[i].VarPlayer[k].Efficacy;
            p_VarMatchStats[i].MatchEfficacy= (float) team_efficacy/MAX_PLAYERS;
            printf("%s %.1f%% %s", THIS_MATCH_EFFICACY_TEXT, p_VarMatchStats[i].MatchEfficacy*100, THIS_MATCH_EFFICACY_TEXT2);
            all_matches_efficacy+=p_VarMatchStats[i].MatchEfficacy;
            getchar();

        }
    printf("\n%s %.1f%%", ALL_MATCHES_EFFICACY_TEXT, (all_matches_efficacy/(p_argc-1))*100);
    getchar();
    return;
}

Proszę jeszcze raz o pomoc.

EDIT: Problem z procentami już rozwiązałem (trzeba było zainicjalizować team_efficacy).

0

Mam ten sam problem co w tytule tematu w innym programie, ale bez przesady... skąd w takim małym programie może być taki problem? Występuje on po wpisaniu prawidłowej liczby. Program ma za zadanie zamieniać liczbę z binarnej na dziesiętną.

#include <stdio.h>
#include <string.h>

#define NUM_PLEASE "Podaj liczbe w systemie binarnym skladajaca sie z 8 cyfr: "
#define NUM_ERR "Zla liczba."

int Zamien(char * str_parameter);

int main(void)
{
    int i;
    char ch;
    char liczba_binar[9]="00000000";
    printf("%s", NUM_PLEASE);
    fgets(liczba_binar, 9, stdin);
       for(i=0; i<8;i++)
           if(liczba_binar[i]!='0' && liczba_binar[i]!='1')    
               {printf("\n%s\n", NUM_ERR); getchar(); return 1; }
    printf("\n%s = %s\n", liczba_binar, Zamien(liczba_binar));
    getchar();
    getchar();
    return 0;
}

int Zamien(char* str_parameter)
{
    int i, j;
    int liczba=0;
    for(i=0, j=1; i<8; i++)
        {
            if(str_parameter[7-i]=='1')
                liczba+=j;
            j*=2;
        }
    return liczba;
}

WTF? Wszystko przecież jest OK...

1 użytkowników online, w tym zalogowanych: 0, gości: 1