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 :

Compilation Release qui rame


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2021
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2021
    Messages : 52
    Points : 41
    Points
    41
    Par défaut Compilation Release qui rame
    Bonjour;
    J'ai fait un programme en C qui trace l'ensemble de Mandelbrot.
    Pour cela j'utilise la SDL2.
    Je suis confronté au problème suivant : quand je le compile en mode debug tout va bien, mais quand je le fais en mode release ça rame et la fenêtre reste blanche. Pourquoi ?
    Cordialement

  2. #2
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 459
    Points : 4 634
    Points
    4 634
    Par défaut Si je veux, quand je veux...
    Bonjour,

    Je présume que c'est l'exécution et non la compilation qui rame.

    Avec ma boule de cristal je vais tenter une explication.

    Les fractales supposent beaucoup de calculs. Les rafraichissement d'affichages peuvent être immédiats ou laissés à l'appréciation du système qui utilise les temps morts pour les opérer. Dans ce dernier cas, en mode debug, il y a essentiellement des temps morts et les réactualisations se font sans problème. En exécution classique il n'y a pas de temps mort avec un traitement fortement calculatoire et il faut en attendre la fin pour que l'actualisation ait lieu (ce qui peut être long).
    Une technique est de redonner de temps en temps la main au système (par exemple avec ProcessMessage sous windows).

    Salutations

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2021
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2021
    Messages : 52
    Points : 41
    Points
    41
    Par défaut
    Merci beaucoup pour l'explication !

  4. #4
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    Par défaut
    Bonjour,

    ma boule de cristal me dit qu'il s'agit d'un heisenbug (ou apparenté).

    Pour débuguer le problème c'est simple : il faut utiliser des outils de débugage … par exemple avec valgrind qui va profiler la mémoire et indiquer les accès illégaux et certains UB.

    Donc :
    1. compiler en mode debug avec les warnings activés ;
    2. comprendre et résoudre les warnings émis si nécessaire ;
    3. une fois les warnings résolus, lancer l'application avec valgrind (leak check + track origin + show unreachable) ;
    4. bien comprendre le log et résoudre les problèmes ;
    5. recommencer tant que ça ne fonctionne pas correctement.


    Nous utilisons des boules de cristal car les informations que tu donnes ne nous permettent pas d'en dire plus.
    Quelle plateforme ?
    Quel compilo ?
    Quelles options de compilations ?
    Quels warnings (avec au moins un -Wall -Wextra) ?
    Quel code (s'il n'est pas trop long) ?
    etc …

    Là nous sommes dans la situation où tu téléphones à ton garagiste pour lui expliquer que ta voiture roule bien tant que tu ne passes pas la cinquième …

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2021
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2021
    Messages : 52
    Points : 41
    Points
    41
    Par défaut
    A, je comprend, excusez-moi.
    Mon code (123lignes)(mal commenté...):
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <complex.h>
    #include <SDL2/SDL.h>
    #include <windows.h>
     
     
    void test(double X, double Y, int *color, int *indco);
     
    int main(int argc, char *argv[]){
     
        SDL_Window *fwindow = NULL;
        SDL_Renderer *rendu = NULL;
        SDL_Event event;
     
        HWND handle=GetForegroundWindow();//masque la console
        ShowWindow(handle,SW_HIDE);
     
        if(SDL_Init(SDL_INIT_VIDEO) != 0)
            perror("Initialisation SDL");
     
        if((fwindow = SDL_CreateWindow("Ensemble de Mandelbrot", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1200, 800, 0)) == NULL)
            perror("Creation fenetre echouee");
        SDL_SetWindowIcon(fwindow, SDL_LoadBMP("Mandelbrot_icon.bmp"));// iconne   de l'appli
     
     
        if((rendu = SDL_CreateRenderer(fwindow, -1, SDL_RENDERER_SOFTWARE)) == NULL)
            perror("Creation rendu echouee");
     
        if(SDL_SetRenderDrawColor(rendu, 0, 0, 0, SDL_ALPHA_OPAQUE) != 0)
            perror("Impossible de changer la couleur!");
     
        double Xmin, Xmax, Ymin, Ymax, Xstep, Ystep;
        int indicateur, state, col;
     
        Xmin = -2.0;
        Xmax = 1.0;
        Ymin = -1;
        Ymax = 1;
        Xstep = (Xmax-Xmin)/1200;
        Ystep = (Ymax-Ymin)/800;
     
        for(int y = 0; y <= 800; y ++){
     
            for(int x = 0; x <= 1200; x++){
     
                test((x*Xstep + Xmin), (y*Ystep + Ymin), &indicateur, &col);
     
                switch(indicateur){
                    case 0:
                        if(SDL_SetRenderDrawColor(rendu, 0, 0, 0, SDL_ALPHA_OPAQUE) != 0)
                            perror("Impossible de changer la couleur!");
                        break;
                    case 1:
                        if(SDL_SetRenderDrawColor(rendu, 0, 0, col, SDL_ALPHA_OPAQUE) != 0)
                            perror("Impossible de changer la couleur!");
                        break;
     
                    case 2:
                        if(SDL_SetRenderDrawColor(rendu, 1, 255, 1, SDL_ALPHA_OPAQUE) != 0)
                            perror("Impossible de changer la couleur!");
                        break;
                    case 3:
                        if(SDL_SetRenderDrawColor(rendu, 1, 0, 255, SDL_ALPHA_OPAQUE) != 0)
                            perror("Impossible de changer la couleur!");
                        break;
                    case 4:
                        if(SDL_SetRenderDrawColor(rendu, 0, 0, 125, SDL_ALPHA_OPAQUE) != 0)
                            perror("Impossible de changer la couleur!");
                        break;
                }
                SDL_RenderDrawPoint(rendu, x, y);
            }
        }
     
        SDL_RenderPresent(rendu);
        state = 1;
     
        SDL_Surface *pWinSurf = SDL_GetWindowSurface(fwindow);
        //SDL_SaveBMP(pWinSurf, "Mandelbrot_B.bmp");
     
        while(state)
        {
            SDL_WaitEvent(&event);
     
            switch(event.type)
            {
                case SDL_QUIT: state=0; break;
            }
        }
     
        SDL_DestroyWindow(fwindow);
        SDL_DestroyRenderer(rendu);
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
     
    void test(double X, double Y, int *color, int *indco){
     
        int i;
        double complex c = 0;
        double complex z = 0;
        double z_2;
     
        c = X + Y*I;
        while(cabs(z) < 2 && i < 650){
            i++;
            z = z*z + c;
        }
     
        z_2 = cabs(z);
     
        if(i == 650){
            *color = 0;
        }
        /*else if(z_2 >4){*color = 4;}
        else if(z_2 >3.1 && z_2<= 4){*color = 3;}
        else if(z_2 >2.4 && z_2<= 3.1){*color = 2;}
        else if(z_2 >0 && z_2<= 2.4){*color = 1;}*/
        else{*color = 1; *indco = z_2*62;}
    }
    Je suis sous codeblocks et je compile avec GNU GCC Compiler.
    Pas de warning à part que "pWinSurf" est une variable non-utilisée. (sauf si j'enlève les commentaires voir ligne 80).

    Voilà.
    Après c'est un vieux projet, donc je me rappel plus bien. Je voulais juste éclaircir ce bug de peur de le recroiser.

    Merci à tous

  6. #6
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    Par défaut
    tu es sous windows …
    J'ai fait ce que je t'ai dit de faire en enlevant les particularités windowsiennes et le log valgrind me donne :

    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
    $ valgrind --leak-check=full --track-origins=yes --show-reachable=yes ./oc 
    ==102519== Memcheck, a memory error detector
    ==102519== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
    ==102519== Using Valgrind-3.17.0 and LibVEX; rerun with -h for copyright info
    ==102519== Command: ./oc
    ==102519== 
    ==102519== Conditional jump or move depends on uninitialised value(s)
    ==102519==    at 0x1097AC: test (oc.c:107)
    ==102519==    by 0x109456: main (oc.c:47)
    ==102519==  Uninitialised value was created by a stack allocation
    ==102519==    at 0x109693: test (oc.c:99)
    ==102519== 
    ==102519== Conditional jump or move depends on uninitialised value(s)
    ==102519==    at 0x1097D5: test (oc.c:114)
    ==102519==    by 0x109456: main (oc.c:47)
    ==102519==  Uninitialised value was created by a stack allocation
    ==102519==    at 0x109693: test (oc.c:99)
    ==102519==
    Ce que l'on peut traduire par un : «dans test tu définis i sans l'initialiser puis tu l'utilises sans l'avoir initialisé» = bug.
    Initialise ton i à 0 et tout ira mieux.

    En mode debug, les variables locales sont souvent initialisées à 0 (tout du moins les scalaires) ce qui n'est pas fait en mode release optimisé. Voilà pourquoi ça semble fonctionner en mode debug et non en mode release. Il s'agit bien d'un heisenbug.

    Apprendre à utiliser les outils de débugage est indispensable, Là tu as attendu plusieurs heures au lieu de débuguer tout seul en 3 minutes …

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2021
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2021
    Messages : 52
    Points : 41
    Points
    41
    Par défaut
    Merci, ça marcche !

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/10/2013, 21h54
  2. Application qui rame
    Par nicographx dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/11/2005, 14h35
  3. Réponses: 17
    Dernier message: 24/10/2005, 20h05
  4. VESA qui rame
    Par Smortex dans le forum Assembleur
    Réponses: 26
    Dernier message: 25/07/2004, 17h47
  5. Adsl qui rame sous mdk 9.1
    Par Kehel dans le forum Réseau
    Réponses: 5
    Dernier message: 29/09/2003, 22h29

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