180

xc=105;
pen=0;
pl=0;
carst=0;
r=0;
ch=0;
cycle=0;
rst=1;
xd=0;
dd=0;
vst=0;
ob=1;
xp=0;
ty=1;
ot=0;
wsu=0;
spd=0;
av=0;
cv=0;
cxd=0;
mil=0;
min=0;
rc=0;
sec=0;
xpf=0;
obf=1;
er=0;
col=0;
cf=0;
er2=0;
vibr=0;
vibr2=0;
i=0;
depl=-2;
rang=tot;
trilove

181

PpHd (./179) :
Kevin Kofler (./173) :
-> erreur (pas le droit de sauter dans la portée d'un VLA).

Ben oui. Mais ca le fait aussi sur les goto:
void f(int foo) {
  if (foo != 1)
    goto l2;
 l1: ;
  int n=3;
  int x[n];
  l2:
}

Je sais, faut éviter de faire n'importe quoi là aussi.
Mais à mon avis ca n'a rien à voir. Car on a la même chose avec le code suivant qui est clean:
 if (error)
    goto handle_error;
  ...

 handle_error: ;
   int my_error = errno;
 ...

Pour moi, c'est une lacune de la norme C.

C'est vrai que ça peut être lourd, et pour les labels normaux, l'astuce du ; peut être pratique (surtout s'il n'y a pas d'autre label derrière qui crée des problèmes de portée de la variable), mais dans un switch, il vaut mieux des accolades à cause de cette histoire de portée.
Kevin Kofler (./173) :
Et pourquoi utilises-tu encore ce switch qui sert uniquement au portage de vieilles sources K&R? Pourquoi à ton avis ce switch n'est-il pas inclus dans -Wall ni -Wextra?
Parce que je veux que chacune de mes fonctions soit parfaitement prototypée ?

AMHA, ce que tu veux vraiment est -Werror-implicit-function-declaration, pas -Wmissing-prototypes. Ça ne sert à rien de prototyper une fonction quand sa définition fait déjà office de prototype.
Pour le second point, je ne sais pas, mais je sais que bon nombre de projets le rajoute.

Le switch n'est pas inclus dans -Wall ni -Wextra parce que ce n'est qu'une aide au portage (pour les projets qui passent des définitions de fonctions K&R aux prototypes C ISO) et ça sort des warnings totalement bidons pour du code parfaitement valide.
Kevin Kofler (./173) :
Fais un cast explicit vers (const int (*)[ 3]), c'est plus propre que ton aliasing violation.
C'est moins comode car si la taille de T augmente, où son type, tu dois corriger tous les cast.

Mais ta solution est incorrecte, tu ne respectes pas le strict aliasing. Tu ne peux pas ignorer les warnings sur le strict aliasing, l'optimisateur de GCC peut vraiment te pondre n'importe quoi si tu ne respectes pas l'aliasing, et même si ça marche maintenant, ça peut te faire boguer ton programme à tout moment.

Fais un autre typedef pour la version pointeur de T.
Mais c'est encore une lacune de la norme C.

Les FAQs expliquent pourquoi c'est comme ça, tu peux contourner la constness en convertissant un int ** en un const int **. (En revanche, je ne suis pas sûr que l'exemple problématique fonctionne avec les int [][].)
Tiens encore un truc en C:
#include <string.h>

typedef int T[3][3];
void f( T *x)
{
  memset (x[0], 0, sizeof (x[0]));
  memset (x[1], 0xAF, sizeof (x[1]));
  memset (x[2], 0x6D, sizeof (x[2]));
}
Ce code est buggué. Pourquoi ?

Parce qu'un T * est un int (*)[3][3] qui se comporte comme un int [foo][3][3]. (Facile. tongue)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

182

En même temps dès que tu touches les tableaux multi-dimensionnel, le C devient vite insupportable. Le struct permet de résoudre le problème du const il me semble. Après que tu veuilles ton pointeur et l'objet pointé constant est une autre chose.
Perso j'utilise jamais les tableaux multi-dimensionnel de cette manière, mais plutôt sous forme d'objet (en C toujours) avec des contrats définis.

183

Kevin Kofler (./181) :
AMHA, ce que tu veux vraiment est -Werror-implicit-function-declaration, pas -Wmissing-prototypes. Ça ne sert à rien de prototyper une fonction quand sa définition fait déjà office de prototype.

Oui et non. J'aime bien que toutes mes fonctions non static soient prototypées avant d'être définities (dans un .h de préférence, mais là le warning ne le vérifie pas).
Kevin Kofler (./181) :
Mais ta solution est incorrecte, tu ne respectes pas le strict aliasing. Tu ne peux pas ignorer les warnings sur le strict aliasing, l'optimisateur de GCC peut vraiment te pondre n'importe quoi si tu ne respectes pas l'aliasing, et même si ça marche maintenant, ça peut te faire boguer ton programme à tout moment. Fais un autre typedef pour la version pointeur de T.

Ma solution est peut être incorrecte, mais c'est la seule solution utilisable que je vois à l'heure qui vient.
(En pratique à cause de ce bug de la norme, je définis toujours mes tableaux bi-dimentionnels dans une structure).
Kevin Kofler (./181) :
Les FAQs expliquent pourquoi c'est comme ça, tu peux contourner la constness en convertissant un int ** en un const int **.

Oui
Kevin Kofler (./181) :
(En revanche, je ne suis pas sûr que l'exemple problématique fonctionne avec les int [][].)

Absolument pas. C'est un cast qui devrait être autorisé par la norme.
Kevin Kofler (./181) :
Parce qu'un T * est un int (*)[ 3][ 3] qui se comporte comme un int [foo][ 3][ 3]. (Facile. tongue.gif )

Pas si facile lorsqu'on ne sait pas d'où ca vient et qu'on a 2000 lignes de code suspectes smile
JackosKing (./182) :
En même temps dès que tu touches les tableaux multi-dimensionnel, le C devient vite insupportable. Le struct permet de résoudre le problème du const il me semble. Après que tu veuilles ton pointeur et l'objet pointé constant est une autre chose. Perso j'utilise jamais les tableaux multi-dimensionnel de cette manière, mais plutôt sous forme d'objet (en C toujours) avec des contrats définis.

Pareil. pencil

184

185

Martial Demolins (./184) :
han je regrette pas de pas coder en C, ça a vraiment l'air compliqué ce langage sick

Pas tant que ça, mais y'a des gens qui aiment bien se sentir intelligents en faisant des trucs compliqués mais pas focément utile hehe
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

186

187

C'est surtout un langage qui est bourré de pièges et qui accuse son âge (les contraintes sont celles des machines à l'époque de sa création, ça commence à dater quand même). Malheureusement c'est toujours l'un des plus répandus dans certains domaines.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

188

Tu lui reproches quoi concrètement ?
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

189

C'est un langage efficace au niveau de la vitesse d'exécution, ce qui répond à certains besoins. Il a sa place dans le monde de la prog.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

190

Ximoon (./188) :
Tu lui reproches quoi concrètement ?
Je trouve qu'il y a beaucoup trop de choses qui sont "implementation-dependant", et surtout le fait que faire du code qui repose sur ces caractéristiques qui dépendent de l'implémentation n'est pas considéré comme une erreur par les compilateurs, la plupart du temps (bon, je ne dis pas non plus que c'est toujours le cas, ni que c'est toujours facile pour le compilateur de détecter ces cas-là, hein). C'est embêtant pour un langage qui est censé être portable. Ce ne serait pas un problème si ce genre de situations se produisait rarement, mais au contraire, si on écrit du code sans avoir TOUS les pièges possibles à l'esprit, il y a de fortes chances que ce ne soit pas 100% portable, voire pire, que ça marche mais par coup de chance.

De plus, le langage a des lacunes pour une utilisation bas niveau (pas de rotation de bits, pas de façon standard de désactiver l'alignement automatique des membres des structures, une gestion des volatile qui manque de souplesse, etc.) et aussi pour une utilisation haut niveau (pas de moyen de faire des entrées/sorties vers des fichiers de manière portable à moins de tout parser à la main, une librairie standard très limitée, etc.). Bref, je trouve que c'est un langage qui a fortement un goût de compromis, certainement justifié à l'époque où il a été créé, mais qui devient franchement pénible actuellement.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

191

mais ca doit rester comme le meilleur compromis entre la bas-niveau et la portabilite...
apres, il ne faut pas non cracher sur un language a cause des differents compilateurs qui existent (meme si c'est un vrai probleme en C)
et enfin, quant au parsing etc. c'est du C (bas-niveau) et de base, il n'y a pas grande chose... mais il y a bcp de librairies disponibles pour aider (regexp, parser generators, etc.)