C:\Documents and Settings\Paul>tigcc -S -O2 z.c z.c:1: error: variable-size type declared outside of any functionMauvaise foi! Et puis en déclarant mon tableau comme global (cf post de départ) il n'y aurait aucun problème. Le but ici est de définir le tableau dans la fonction main.
Sinon on peut toujours jongler avec des #define et #undef, je pense que cela fonctionne.#define mat(x,y) ((nom_table)[x+dimX*y]) void ma_fonction(TABLE *tableau) { #undef nom_tableNote: Ce code est très certainement ridicule et je suis quasiment sûr qu'on peut faire mieux mais c'est juste pour "exprimer ma pensée"
Thibaut B :
int y[] n'est pas une déclaration de tableau de taille indéfinie ?
Ce qu'on veut passer, c'est le tableau et sa dimension, en un seul paramètre. La dimension peut ensuite être obtenue par un sizeof.
Kevin Kofler
:Pollux
: z.c:1: error: variable-size type declared outside of any function
Ben oui, il faut le mettre dans une fonction, évidemment...Tu t'attends que le compilateur lit dans tes pensées pour savoir combien de mémoire allouer dans l'exécutable ou la section BSS si la taille n'est pas constante? Et si la taille est constante, alors utilise #define, pas const.
Et idem si tu le déclares dans une structure j'imaginePas si la structure est locale.
Ca m'est arrivé assez souvent d'en utiliser, mais c'est vraiment pas terrible : si tu mets des fonctions dedans, c'est complètement indébuggable.
Justement, dans ld-tigcc, il y a des fonctions entières codées avec des ## (suivies d'une ligne pour chaque spécialisation (pour reprendre le langage des templates, parce que c'est ce que c'est en réalité)).
Et pour l'exemple qui nous intéresse, ce n'est pas du tout aussi flexible que 'const int xdim' puisqu'on est obligé de le mettre dans une variable donnée et de déclarer à la main, pour tous les noms de variables possibles, la largeur du tableau...Voilà pourquoi je conseille toujours la syntaxe C99 qui met ça là où ça a sa place: dans la déclaration du type.
D'ailleurs, le C99 prévoit aussi le passage de tableaux à une fonction sans avoir à préciser manuellement la taille, avec la syntaxe int y[*]. Mais GCC n'implémente pas encore ça.
Pollux
: En plus, la spécialisation de templates n'est pas possible... Je pense que ce que tu veux dire par "spécialisation" est en réalité "instantiation", non? (j'entends par spécialisation : vector<typename T> = blablabla; vector<bool> = gnagnagna, donc vector<bool> spécialisation de vector<T>).
Et pour l'exemple qui nous intéresse, ce n'est pas du tout aussi flexible que 'const int xdim' puisqu'on est obligé de le mettre dans une variable donnée et de déclarer à la main, pour tous les noms de variables possibles, la largeur du tableau...Voilà pourquoi je conseille toujours la syntaxe C99 qui met ça là où ça a sa place: dans la déclaration du type.
Mhu? Au contraire, 'const int xdim' ne peut pas être mis dans le type. #define mavar_XDIM doit être utilisé à chaque fois qu'on utilise un nouveau nom de variable (et attention aux conflits entre fonctions si on oublie les #undef)
D'ailleurs, le C99 prévoit aussi le passage de tableaux à une fonction sans avoir à préciser manuellement la taille, avec la syntaxe int y[*]. Mais GCC n'implémente pas encore ça.C'est à dire?
Mais la spécialisation est possible en GNU C
Ben non, on déclare sa variable en int (*p)[123] et on n'a pas besoin de définir quoi que ce soit. Si on veut changer la taille, on la change dans la déclaration de type.
> C'est à dire? Que ce n'est pas encore implémenté, je ne vois pas comment détailler plus.
Mauvaise foi! Et puis en déclarant mon tableau comme global (cf post de départ) il n'y aurait aucun problème. Le but ici est de définir le tableau dans la fonction main.
Sinon on peut toujours jongler avec des #define et #undef, je pense que cela fonctionne
le C++ c'est simple, et le C c'est complique
In this instance, ~y() is a protected abstract virtual base pure virtual private destructor of z
Brunni> si tu regardes encore ce topic, soit le type de retour de alloue, tu le mets en bool, soit tu te crées des constantes genre #define MEM_OK 1 ce sera plus propreBah pourquoi pas...
Il faut distinguer ceux qui font du C++ et ceux qui font des MFCQu'est-ce qu'elles ont les MFC? J'ai essayé à l'époque mais j'ai tout lancé loin. Maintenant je fais du truc bizarre peut-être encore plus compliqué où tu fais des trucs du style:
Tu rigoles? Je dirais que quand tu maîtrises le C++ alors normalement tu devrais aussi maîtriser le C (sinon tu risques de faire des routines lentes )Le C++ est plus lent que le C? Bah je suis encore assez étonné de la rapidité du C sur ordi. Mais les contrôles windows... c'est pas trop ça!
La documentation est un aspect primordial à considérer lorsqu'on veut utiliser une bibliothèque graphique riche en fonctionnalités. Celle de Visual, MSDN semble pléthorique, tient sur 10 CDROM. On y trouve des articles pour faire toutes sorte de choses. Cependant, elle laisse l'impression que ce qui est documenté provient d'une mauvaise architecture. La navigation à l'intérieur est de piètre qualité : impossible d'accéder facilement depuis une classe a ses classes mères ou filles, présentations des méthodes sans la signature, accès difficiles aux méthodes héritées, etc. Par ailleurs, en recherchant de l'aide sur un mot-clé, on tombe sur l'aide de tous les langages sur ce mot-clé: Java, Visual Basic, C++, InterDev, ...
Sasume :
Ah ? Curieux, pourtant c'est du C ANSI
spectras
: Aux dernières nouvelles, ben t'avais que la documentation VB, et si tu veux y accéder en C++, c'est freestyle.
RedSilk
:Sasume :
Ah ? Curieux, pourtant c'est du C ANSI
Encore faut-il la switch -ansi (qui n'est pas mise par défaut quand on utilise l'IDE).
Le C ANSI sert plus à nous interdire les comments // qu'à autre chose.
Pour moi, le GNU C est une norme suffisante: pas chiante sur
des détails (//), permettant quelques *abus* qu'en fait tout le monde fait (les long long, utilisés aussi dans Visual C++).
Bon, si on voulait être Posix, là faudrait mettre -ansi.