C'est normal, en C++ on n'inclue pas de headers "C" ou pas comme ça. Normalement tu dois inclure <cstdlib> au lieu de <stdlib.h>, <cstdio> au lieu de <stdio.h> etc...
Si ce n'est pas un header standard (genre un header C que tu as écrit toi même), tu n'auras pas possibilité de t'en sortir comme ça. Il faut alors faire l'inclusion comme suit :
extern "C" {
#include "mon_header1.h"
#include "mon_header2.h"
}
De manière générale, je ne pense pas que tu aies forcément besoin de stdio, en C++ on utiliserait plutôt les iostreams et les opérateurs associés (<< et >>). Dis-moi ce que tu veux faire pour plus de précisions.
Par rapport à ton erreur regardons le code :
while (etat != ',') {
etat = fgetc(grille);
chaine[i] = etat;
i++;
}
Je te rappelle qu'en C, la chaine de caract-ère "bonjour" est stocké sous la forme de 8 caractères (7 lettres et le caractère d'arrêt, '\0') :
'b' 'o' 'n' 'j' 'o' 'u' 'r' '\0'
Dans ta boucle on avance dans la chaîne "chaine", mais rien ne garantit qu'on ne va pas en sortir. Par ailleurs je ne sais pas si c'est voulu, mais vu que i est initialisé à 1 (et non à 0) tu ne vas pas évaluer le premier caractère de chaîne.
Et c'est ce qui se passe. Si tu itères par exemple 10 fois mais que la chaîne est de longueur 3, et bien tu débordes à la 4e itération. Il faudrait que la boucle while s'arrête si on atteint chaine[i] == '\0', ce qui équivaut à tester si chaine[i] est non nul, ce qu'on peut écrire en C directement par :
if (chaine[i]) {
// ok, on n'a pas atteint le bout de la chaîne !
}else{
// on atteint le caractère \0 qui arrête la chaine
}
J'en profite pour rappeler que la notation chaine[i] signifie en C le caractère positionné en mémoire i octets * sizeof(char) après l'adresse stockée dans chaine (puisque chaine est de type char *). Si ce n'est pas évident pour toi, je t'invite à lire un cours sur les pointeurs et les tableaux. Partant de là autant décaler un pointeur d'un caractère à chaque itération (le code sera plus performant, et c'est comme ça que la boucle sera écrite par quelqu'un qui code bien en C).
Ainsi ta boucle devient :
while(*pchar++ && etat != ',') {
pchar = etat = fgetc(grille);
}
Ici la boucle est interrompue dès qu'on arrive à la fin de chaine (car *pchar == '\0' <=> *pchar va interrompre la boucle). Note qu'on a directement integré le décalage du pointeur dans le while grâce à ++.
Bon mais de toute façon, vu que le but est d'extraire des valeurs numérique séparées par des ',', il serait plus logique d'utiliser la fonction strtok si on devait écrire en C :
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strtok.3.html
En C++, on ne s'embêterait même pas autant que ça. On utiliserait par exemple directement l'objet std::string (sans doute que les QString de Qt permettent de faire des choses similaires d'ailleurs). Plus besoin des fonctions de <string.h> (<cstring>) comme strcmp, on peut directement utiliser les opérateurs =, <, > (chose qu'on ne pourrait pas faire avec des char *, car sinon on comparerait leur adresse mémoire). Plus besoin non plus de se préocupper des allocations mémoires (et donc des risques de segmentation fault), les std::string se comportent comme des chaînes de longueurs virtuellement infinies.
#include <string>
#include <iostream>
#include <cstdlib>
int main(){
const std::string s = "12,34,567";
if (s != "") {
std::string substring;
std::size_t begin = 0, end;
do {
end = s.find(',', begin);
substring.assign(s, begin, end - begin);
long l = atol(substring.c_str());
std::cout << "l = " << l << std::endl;
begin = end + 1;
} while(end != std::string::npos);
}
return 0;
}
ce qui donne :
(mando@aldur) (~) $ g++ plop.cpp && ./a.out
l = 12
l = 34
l = 567
Note : tu peux utiliser strtol et ainsi contrôler qu'il y avait bien une valeur numérique à récupérer, sinon autant utiliser atol...
Bonne chance