Bonjour,

J'ai le code suivant :
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
#include <ncurses.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
 
#define MAX_LINES 100
#define MAX_COLS 100
 
void extract_fields(char line[1024], char *fields[10])
{
    int field_num = 0;
    char *token = strtok(line, " ");
    while (token != NULL && field_num < 10)
    {
        fields[field_num] = token;
        field_num++;
        token = strtok(NULL, " ");
    }
}
 
void display_entete(WINDOW *top, int line_num, int scroll_x, char *fields[10])
{
    mvwprintw(top, line_num + 1, 1 - scroll_x,
              "%-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-20s",
              fields[0], fields[1], fields[2], fields[3], fields[4],
              fields[5], fields[6], fields[7], fields[8], fields[9]);
}
 
void display_ligne(WINDOW *win, int line_num, int scroll_y, int scroll_x, char *fields[10])
{
    mvwprintw(win, line_num - scroll_y, 1 - scroll_x,
              "%-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-20s",
              fields[0], fields[1], fields[2], fields[3], fields[4],
              fields[5], fields[6], fields[7], fields[8], fields[9]);
}
 
int main()
{
    initscr();
    noecho();
    cbreak();
    keypad(stdscr, TRUE);
 
    int lines, cols;
    getmaxyx(stdscr, lines, cols);
    // example: lines=24, cols=80
    int ltop = 1;
    int lbot = 1;
 
    WINDOW *top = newwin(ltop + 2, cols - 2, 1, 1);
    WINDOW *win = newwin(lines - 2 - (ltop + 2) - (lbot + 2), cols - 2, (ltop + 2) + 1, 1);
    WINDOW *bot = newwin(lbot + 2, cols - 2, lines - (ltop + 2) - 1, 1);
    box(top, 0, 0);
    box(win, 0, 0);
    box(bot, 0, 0);
    refresh();
    wrefresh(top);
    wrefresh(win);
    wrefresh(bot);
 
    int scroll_y = 0;
    int scroll_x = 0;
 
    int encore = true;
 
    while (encore)
    {
        // Effacer la fenêtre
        werase(top);
        werase(win);
        werase(bot);
 
        // Lire la liste des processus
        FILE *fp = popen("ps -ef", "r");
        if (fp == NULL)
        {
            mvwprintw(win, 1, 1, "Erreur lors de la lecture des processus");
            wrefresh(win);
            sleep(1);
            continue;
        }
 
        char line[1024];
        int line_num = 0;
        while (fgets(line, sizeof(line), fp) != NULL)
        {
            // Parser la ligne
            char *fields[10];
            extract_fields(line, fields);
 
            if (line_num == 0)
            {
                // Afficher les entêtes du tableau
                display_entete(top, line_num, scroll_x, fields);
                line_num++;
                continue;
            }
 
            if (line_num >= scroll_y && line_num < scroll_y + lines - 2)
            {
                // Afficher la ligne
                display_ligne(win, line_num, scroll_y, scroll_x, fields);
 
                // Afficher le pied de page du tableau
 
                /* Methode 1: OK */
                /**/
                memset(line, 0, sizeof(line));
                snprintf(line, sizeof(line), "Lig %d, Col %d", scroll_y + 1, scroll_x + 1);
                mvwprintw(bot, 1, cols - strlen(line) - 4, "%s", line);
                /**/
 
                /* Methode 2: KO (core dump) */
                /*
                char temp[1024];
                memset(temp, 0, sizeof(temp));
                snprintf(temp, sizeof(temp), "Lig %d, Col %d", scroll_y + 1, scroll_x + 1);
                mvwprintw(bot, 1, cols - strlen(temp) - 4, "%s", temp);
                */
            }
            line_num++;
        }
        pclose(fp);
 
        // Afficher la bordure
        box(top, 0, 0);
        box(win, 0, 0);
        box(bot, 0, 0);
 
        // Rafraîchir la fenêtre
        wrefresh(top);
        wrefresh(win);
        wrefresh(bot);
 
        // Gérer les événements
        int c = getch();
        switch (c)
        {
        case KEY_UP:
            if (scroll_y > 0)
                scroll_y--;
            break;
        case KEY_DOWN:
            if (scroll_y < line_num - lines + 2)
                scroll_y++;
            break;
        case KEY_LEFT:
            if (scroll_x > 0)
                scroll_x--;
            break;
        case KEY_RIGHT:
            if (scroll_x < 100)
                scroll_x++;
            break;
        case 'q':
            encore = false;
            break;
        }
 
        // Attendre 1 seconde
        // sleep(1);
    }
 
    endwin();
    return 0;
}
Il faut prendre ce code comme un exercice afin d'appréhender la gestion des fenêtres.

compilation avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
gcc -o processus processus.c -lncurses
Vers la ligne 100, j'ai indiqué 2 méthodes pour afficher la possition Ligne/Colonne à l'écran :
  1. La première méthode fonctionne, bon OK.
  2. La seconde méthode non, et provoque un core dump, et là je ne comprend pas !


Est ce que quelqu'un pourrait m'aider à comprendre pourquoi j'i ce comportement ?

Merci.Nom : Capture d’écran du 2025-03-22 14-12-32.png
Affichages : 61
Taille : 53,3 Ko