IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Process terminated with status -1073741510 mais aucune erreur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Process terminated with status -1073741510 mais aucune erreur
    Bonsoir tout le monde,

    Alors voilà j'ai un petit problème je n'arrive pas à me débarrasser de ceci "Process terminated with status -1073741510".
    C'est ce que m'affiche Code::Blocks après avoir exécuté mon programme.
    J'aimerais savoir d'où elle pourrait provenir (est-ce une erreur générale ?) et comment la corriger (j'ai cru comprendre que c'était un problème de mémoire mais je n'en suis pas sûr).

    Voici mon code (en espérant que cela ne vous décourage pas ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
     
    #include "menu.h"
     
    link_s *init(SDL_Renderer *renderer)
    {
        int i;
        link_s *menu_elements = malloc(4 * sizeof(link_s));
        TTF_Font *links_normal_font = NULL;
        SDL_Color white = {255, 255, 255, 255};
     
        links_normal_font = TTF_OpenFont("data/Vanadine Regular.ttf", 50);
     
        menu_elements[0].name = "JOUEUR VS JOUEUR";
        menu_elements[1].name = "JOUEUR VS ORDI";
        menu_elements[2].name = "OPTIONS";
        menu_elements[3].name = "QUITTER";
     
        for(i = 0; i < 4; i++)
        {
            menu_elements[i].focus = 0;
            menu_elements[i].link_font = links_normal_font;
            menu_elements[i].link = TTF_RenderText_Blended(menu_elements[i].link_font, menu_elements[i].name, white);
            menu_elements[i].link_tex = SDL_CreateTextureFromSurface(renderer, menu_elements[i].link);
            SDL_QueryTexture(menu_elements[i].link_tex, NULL, NULL, &menu_elements[i].link_pos.w, &menu_elements[i].link_pos.h);
            menu_elements[i].link_pos.x = ((WINDOW_SIZE / 2) - (menu_elements[i].link_pos.w / 2));
            menu_elements[i].link_pos.y = ((225 + i * 90) - (menu_elements[i].link_pos.h / 2));
        }
     
        for(i = 0; i < 4; i++)
        {
            SDL_FreeSurface(menu_elements[i].link);
            SDL_DestroyTexture(menu_elements[i].link_tex);
        }
     
        TTF_CloseFont(links_normal_font);
     
        return menu_elements;
    }
     
    link_s *disp_menu(SDL_Renderer* renderer, link_s *menu_elements)
    {
        /* Fond */
        SDL_Rect background;
     
        SDL_Color white = {255, 255, 255, 255};
     
        /* Titre */
        TTF_Font *title_font = NULL;
        SDL_Surface* title = NULL;
        SDL_Texture* title_tex = NULL;
        SDL_Rect title_pos;
     
        /* Liens */
        int i;
        TTF_Font *links_normal_font = NULL;
        TTF_Font *links_hover_font = NULL;
        SDL_Color black = {0, 0, 0, 255};
     
        SDL_SetRenderDrawColor(renderer, 150, 150, 150, 255);
        background.x = 0;
        background.y = 0;
        background.w = WINDOW_SIZE;
        background.h = WINDOW_SIZE;
     
        title_font = TTF_OpenFont("data/GROBOLD.ttf", 65);
        title = TTF_RenderText_Blended(title_font, "Jeu de Dames", white);
        title_tex = SDL_CreateTextureFromSurface(renderer, title);
        SDL_QueryTexture(title_tex, NULL, NULL, &title_pos.w, &title_pos.h);
        title_pos.x = ((WINDOW_SIZE / 2) - (title_pos.w / 2));
        title_pos.y = ((WINDOW_SIZE / 6) - (title_pos.h / 2));
     
        links_normal_font = TTF_OpenFont("data/Vanadine Regular.ttf", 50);
        links_hover_font = TTF_OpenFont("data/Vanadine Bold.ttf", 55);
     
        for(i = 0; i < 4; i++)
        {
            if(menu_elements[i].focus == 0)
            {
                menu_elements[i].link_font = links_normal_font;
                menu_elements[i].link = TTF_RenderText_Blended(menu_elements[i].link_font, menu_elements[i].name, white);
                menu_elements[i].link_tex = SDL_CreateTextureFromSurface(renderer, menu_elements[i].link);
                SDL_QueryTexture(menu_elements[i].link_tex, NULL, NULL, &menu_elements[i].link_pos.w, &menu_elements[i].link_pos.h);
                menu_elements[i].link_pos.x = ((WINDOW_SIZE / 2) - (menu_elements[i].link_pos.w / 2));
                menu_elements[i].link_pos.y = ((225 + i * 90) - (menu_elements[i].link_pos.h / 2));
            }
            else
            {
                menu_elements[i].link_font = links_hover_font;
                menu_elements[i].link = TTF_RenderText_Blended(menu_elements[i].link_font, menu_elements[i].name, black);
                menu_elements[i].link_tex = SDL_CreateTextureFromSurface(renderer, menu_elements[i].link);
                SDL_QueryTexture(menu_elements[i].link_tex, NULL, NULL, &menu_elements[i].link_pos.w, &menu_elements[i].link_pos.h);
                menu_elements[i].link_pos.x = ((WINDOW_SIZE / 2) - (menu_elements[i].link_pos.w / 2));
                menu_elements[i].link_pos.y = ((225 + i * 90) - (menu_elements[i].link_pos.h / 2));
            }
        }
     
        SDL_RenderFillRect(renderer, &background);
     
        SDL_RenderCopy(renderer, title_tex, NULL, &title_pos);
     
        for(i = 0; i < 4; i++)
            SDL_RenderCopy(renderer, menu_elements[i].link_tex, NULL, &menu_elements[i].link_pos);
     
        SDL_RenderPresent(renderer);
     
        for(i = 0; i < 4; i++)
        {
            SDL_FreeSurface(menu_elements[i].link);
            SDL_DestroyTexture(menu_elements[i].link_tex);
        }
     
        TTF_CloseFont(links_hover_font);
        TTF_CloseFont(links_normal_font);
     
        SDL_DestroyTexture(title_tex);
        SDL_FreeSurface(title);
     
        TTF_CloseFont(title_font);
     
        return menu_elements;
    }
     
    int intersect(int a, int b, int x1, int y1, int x2, int y2)
    {
        if((a >= x1 && a <= x2) && (b >= y1 && b <= y2))
            return 1;
     
        return 0;
    }
     
    int have_focus(link_s *menu_elements, int x, int y)
    {
        int i;
     
        for(i = 0; i < 4; i++)
        {
            if(intersect(x, y, menu_elements[i].link_pos.x, menu_elements[i].link_pos.y, menu_elements[i].link_pos.x + menu_elements[i].link_pos.w, menu_elements[i].link_pos.y + menu_elements[i].link_pos.h))
            {
                menu_elements[i].focus = 1;
                return i;
            }
        }
     
        return -1;
    }
     
    int redirection(link_s *menu_elements, int link)
    {
        int done = 0;
     
        switch(link)
        {
            case 0:
                puts("1vs1");
                break;
     
            case 1:
                puts("1vsOrdi");
                break;
     
            case 2:
                puts("Options");
                break;
     
            case 3:
                puts("Quitter");
                clean(menu_elements);
                done = 1;
                break;
     
            default:
                puts("Erreur");
                break;
        }
     
        return done;
    }
     
    int manage_menu(SDL_Renderer* renderer, int x, int y, int click)
    {
        int i, focus_link, done = 0;
     
        link_s *menu_elements = init(renderer);
     
        if(!click)
        {
            focus_link = have_focus(menu_elements, x, y);
            for(i = 0; i < 4; i++)
            {
                if(i == focus_link)
                    menu_elements[i].focus = 1;
                else
                    menu_elements[i].focus = 0;
            }
        }
     
        menu_elements = disp_menu(renderer, menu_elements);
     
        if(click)
            done = redirection(menu_elements, have_focus(menu_elements, x, y));
     
        return done;
    }
     
    void clean(link_s *menu_elements)
    {
        free(menu_elements);
    }
    Merci d'avance,

    TcodingT

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonsoir,

    Quand on a des codes à rallonge et qui ne correspondent à rien, il faut avoir le réflexe de les convertir en hexadécimal. Sur 32 bits :

    -1073741510₁₀ = C000013A₁₆

    C0000 est un préfixe qui correspond au deux bits de poids fort mis à 1, et

    13A₁₆ = 314₁₀

    Une recherche avec le code hexadécimal nous envoie vers ceci : https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx
    « 0xC000013A: The application terminated as a result of a CTRL+C. »

    Si ce n'est pas toi qui a interrompu volontairement ton programme, alors c'est qu'il s'est auto-envoyé un signal ou quelque chose qui en tient lieu, ou encore qui a appelé quelque chose qui provoque le même phénomène, par exemple un abort().

    Il est probable que ce soit la bibliothèque que tu utilises qui ait volontairement mis fin au programme, elle-même parce que ton programme était incorrect (pointeur fou, corruption de pile ou de mémoire dus à un free() intempestif, etc.).

    Dans tous les cas, ton programme n'est pas complet : il nous manque au moins la fonction main et sans cela, impossible de trancher.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour cette réponse claire.
    Ce Ctrl + C pourrait donc être causé par la SDL ? Si oui auriez-vous une idée pour détecter ce qui à pu causer cette fin prématurée (je pense qu'il me manque des free mais je n'en suis pas sur).

    En tout cas voici mon main pour que vous puissiez y voir un peu plus clair (enfin j'espère ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include "menu.h"
     
    int main(int argc, char* argv[])
    {
        SDL_Event event;
        int done = 0;
     
        if(TTF_Init() != 0)
        {
            printf("Echec de l'initialisation de TTF_Init: %s\n", TTF_GetError());
            return -1;
        }
     
        if(SDL_Init(SDL_INIT_VIDEO) != 0)
        {
            fprintf(stdout,"Echec de l'initialisation de la SDL: %s\n", SDL_GetError());
            return -1;
        }
     
        SDL_Window* pWindow = NULL;
        pWindow = SDL_CreateWindow("Test Menu pour les dames", SDL_WINDOWPOS_UNDEFINED,
                                                               SDL_WINDOWPOS_UNDEFINED,
                                                               WINDOW_SIZE,
                                                               WINDOW_SIZE,
                                                               SDL_WINDOW_SHOWN);
     
        if(pWindow)
        {
            SDL_Renderer *pRenderer = SDL_CreateRenderer(pWindow, -1, SDL_RENDERER_ACCELERATED);
            if(pRenderer)
            {
                while(!done)
                {
                    SDL_WaitEvent(&event);
                    switch(event.type)
                    {
                        case SDL_QUIT:
                            done = 1;
                            break;
                        case SDL_MOUSEMOTION:
                            done = manage_menu(pRenderer, event.motion.x, event.motion.y, 0);
                            break;
                         case SDL_MOUSEBUTTONDOWN:
                            done = manage_menu(pRenderer, event.button.x, event.button.y, 1);
                            break;
                    }
                }
                SDL_DestroyRenderer(pRenderer);
            }
            else
            {
                fprintf(stdout,"Echec de création du renderer (%s)\n", SDL_GetError());
            }
        }
        else
        {
                fprintf(stderr,"Echec de création de la fenêtre (%s)\n", SDL_GetError());
        }
     
        SDL_DestroyWindow(pWindow);
     
        TTF_Quit();
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
    Et mon menu.h au cas où :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    #ifndef MENU_H_INCLUDED
    #define MENU_H_INCLUDED
     
    #include <SDL2/SDL.h>
    #include <SDL2/SDL_image.h>
    #include <SDL2/SDL_ttf.h>
     
    #include <stdlib.h>
    #include <stdio.h>
     
    #define WINDOW_SIZE 600
     
    typedef struct link
    {
        char *name;
        char focus;
        SDL_Surface* link;
        SDL_Texture* link_tex;
        SDL_Rect link_pos;
        TTF_Font* link_font;
    }link_s;
     
    link_s *init(SDL_Renderer *renderer);
    link_s *disp_menu(SDL_Renderer* renderer, link_s *menu_elements);
    int intersect(int a, int b, int x1, int y1, int x2, int y2);
    int have_focus(link_s *menu_elements, int x, int y);
    int redirection(link_s *menu_elements, int link);
    int manage_menu(SDL_Renderer* renderer, int x, int y, int click); // click : booleen pour savoir si le bouton de la souris a ete appuye
    void clean(link_s *menu_elements);
     
    #endif // MENU_H_INCLUDED
    Merci d'avance et bonne soirée

    TcodingT

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Re-bonsoir,

    Compilé avec GCC sous Linux, j'obtiens :

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ ./programme
    Erreur de segmentation (core dumped)

    Donc, c'est bien une segfault. Un coup de débogueur :

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ gdb ./programme
    […]
    (gdb) run
    Starting program: /home/dom/tmp/cb/cb 
    […]
    Program received signal SIGSEGV, Segmentation fault.
    0x00007ffff78d73fc in TTF_SizeUTF8 () from /lib64/libSDL2_ttf-2.0.so.0
    Missing separate debuginfos, use: dnf debuginfo-install bzip2-libs-1.0.6-14.fc22.x86_64 dbus-libs-1.8.20-1.fc22.x86_64 freetype-2.5.5-2.fc22.x86_64 glibc-2.21-8.fc22.x86_64 libpng-1.6.19-1.fc22.x86_64 libX11-1.6.3-1.fc22.x86_64 libXcursor-1.1.14-4.fc22.x86_64 libXext-1.3.3-2.fc22.x86_64 libXi-1.7.4-2.fc22.x86_64 libXinerama-1.1.3-4.fc22.x86_64 libXrandr-1.4.2-2.fc22.x86_64 libXScrnSaver-1.2.2-8.fc22.x86_64 SDL2-2.0.3-5.fc22.x86_64 SDL2_ttf-2.0.12-4.fc22.x86_64 zlib-1.2.8-7.fc22.x86_64
    (gdb) bt
    #0  0x00007ffff78d73fc in TTF_SizeUTF8 () from /lib64/libSDL2_ttf-2.0.so.0
    #1  0x00007ffff78d8505 in TTF_RenderUTF8_Blended () from /lib64/libSDL2_ttf-2.0.so.0
    #2  0x00007ffff78d890c in TTF_RenderText_Blended () from /lib64/libSDL2_ttf-2.0.so.0
    #3  0x000000000040103b in init (renderer=0x6940c0) at fonc.c:21
    #4  0x0000000000401b9e in manage_menu (renderer=0x6940c0, x=192, y=311, click=0) at fonc.c:182
    #5  0x0000000000401d9c in main (argc=1, argv=0x7fffffffde68) at cb.c:41

    Ligne 182 dans managemenu(), on lit :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
        link_s *menu_elements = init(renderer);

    Et ligne 21 dans init(), on trouve :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include "menu.h"
    
    link_s *init(SDL_Renderer *renderer)
    {
        int i;
        link_s *menu_elements = malloc(4 * sizeof(link_s));
        TTF_Font *links_normal_font = NULL;
        SDL_Color white = {255, 255, 255, 255};
    
        links_normal_font = TTF_OpenFont("data/Vanadine Regular.ttf", 50);
    
        menu_elements[0].name = "JOUEUR VS JOUEUR";
        menu_elements[1].name = "JOUEUR VS ORDI";
        menu_elements[2].name = "OPTIONS";
        menu_elements[3].name = "QUITTER";
    
        for(i = 0; i < 4; i++)
        {
            menu_elements[i].focus = 0;
            menu_elements[i].link_font = links_normal_font;
            menu_elements[i].link = TTF_RenderText_Blended(menu_elements[i].link_font, menu_elements[i].name, white);

    Donc, un plantage à l'intérieur de la bibliothèque (rattrapée par elle-même ou par ce qui la contient), dû à un pointeur NULL (erreur très fréquente en C), lui-même dû au fait que tu as ouvert une fonte sans vérifier si l'opération avait réussi (erreur EXTRÊMEMENT fréquente en SDL, principalement avec l'ouverture de fonte, ne serait-ce que parce que la fonte n'est pas disponible sur toutes les plateformes et parce que si elle l'est, ce n'est pas forcément au même endroit).

    Donc, ça plante chez moi à cause des fontes mais il est possible que l'opération se passe bien chez toi si le fichier est à sa place et que ton programme plante à un autre endroit. Il faut utiliser un débogueur pour le savoir.

  5. #5
    Invité
    Invité(e)
    Par défaut
    En effet, le programme ne plante pas chez moi (il marche même ! ). C'est vrai que je n'avais pas pensé à l'histoire des fonts et je rajouterais par la suite les vérifications appropriées.
    Néanmoins, le débugger de Code::Blocks n'est pas ce que je maîtrise le mieux et lorsque je lance un débuggage avec ce dernier il ne me retourne aucune erreur (2 warnings comme quoi argc et argv ne sont pas utilisés) et me met :
    Process terminated with status 0
    J'avoue que là j'y comprend plus grand chose ^^ (est-ce que mon débugger pourrait-être mal configuré ?).
    Une dernière question au passage à quoi correspond exactement Process terminated with status XX (sa différence avec le retour du programme par exemple).

    Merci d'avance et bonne journée.

    TcodingT

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Ce n'est pas le débugger qui génère les warnings mais le compilateur (je ne connais pas Code::Blocks mais j'imagine que ça utilise MinGW).

    Quant à Process terminated with status 0, c'est le code de retour de ta fonction d'entrée main et probablement la valeur d'EXIT_SUCCESS sur ton système. La session d'exécution s'est donc terminée normalement ce qui correspond à tes dires.

    Pour rejoindre Obsidian, vérifies toujours la validité des résultats que tu obtiens de la part de fonctions tierces, même à l'aide d'un simple assert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int ret = load_font("myfont.ttf");
    assert(ret == 0 && "could not load font");
    Plus tôt elles seront interceptées, plus tôt tu identifieras l'origine de tes erreurs et tu t'épargneras bien des galères.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/07/2009, 20h21
  2. Process terminated with status -1073741819
    Par lordskelethom dans le forum C++
    Réponses: 2
    Dernier message: 25/05/2009, 10h07
  3. Réponses: 1
    Dernier message: 02/02/2009, 18h41
  4. Réponses: 3
    Dernier message: 07/06/2007, 19h26
  5. Process terminated with status 1 signifaction ?
    Par haydens dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 31/05/2007, 00h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo