D'ailleurs, PHP est une belle abstraction étant donné que ses fonctions sont codées en C (donc typé et tout). Non ?Tu connais beaucoup de langages qui ne dépendent pas du C ?
D'ailleurs, PHP est une belle abstraction étant donné que ses fonctions sont codées en C (donc typé et tout). Non ?Tu connais beaucoup de langages qui ne dépendent pas du C ?
spectras :
Je viens de lire l'article. Il est bien, mais bah, c'est du déjà vu, non ?
D'ailleurs, PHP est une belle abstraction étant donné que ses fonctions sont codées en C (donc typé et tout). Non ?Tu connais beaucoup de langages qui ne dépendent pas du C ?
Moumou :
Pollux> Bah c'est clair que perl est moche, mais PHP n'a pas ce problème :]
Non, mais ça veut dire que l'abstraction "j'écris une chaîne de caractère avec mon texte entre guillemets" ne peut pas avoir lieu... Il faut des règles plus subtiles -- il faut comprendre les règles de combinaison char*/string ...Bah oui puisque c'est des choses différentes.
Alors là c'est complètement orthogonal, si "Hello" est défini comme étant un std::string, le compilo peut très bien être autorisé à en faire directement un char * sans passer par un string intermédiaire... (il y a déjà des trucs de ce genre en C++, avec MyClass x=y; qui est optimisable par le compilo en MyClass x(y)Tention, c'est pas une optimisation. La notation Classe truc=machin est un appel au constructeur par recopie, forcément (enfin, s'ils sont de type compatible, évidemment).
Pk est-ce que "Hello" n'initialiserait pas un objet de type string aussi ? Je vois pas le pbBen justement, pour la cohérence. Il vaut mieux qu'il n'existe qu'une seule façon de créer un objet. Surtout si 42 ne crée pas un objet pour représenter un entier.
Ca c'est un pb de Java, le C# peut promouvoir les types entiers en objets automatiquement.J'ai pas choisi le Java complètement au pif
Transtypage auto pawaHum, j'ai des réserves à faire : le transtypage auto, c'est...auto justement, ce qui veut dire que à moins d'en connaitre les règles exactes, tu est incapable de savoir ce que tu fais.
(je vois mal un autre langage faire ça aussi efficacement)%Sa2/d0$^Ixp"|dc`;s/\W//g;$_=pack('H*',/((..)*)$/)
Bah en perl t'as plus impresionnant, t'as le fameux#!/bin/perl -sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj $/=unpack('H*',$_);$_=`echo 16dio\U$k"SK$/SM$n\EsN0p[lN*1 lK[d2
Le modèle OSI: Niveau 7 Couche application assure l'interface avec les applications Niveau 6 Couche présentation définit le format des données (leur représentation, éventuellement leur compression et leur cryptage) Niveau 5 Couche session définit l'ouverture des sessions sur les machines du réseau Niveau 4 Couche Transport elle est chargée du transport des données et de la gestion des erreurs Niveau 3 Couche Réseau permet de gérer les adresses et le routage des données Niveau 2 Couche Liaison définit l'interface avec la carte réseau Niveau 1 Couche Physique définit la façon dont les données sont converties en signaux numériques
spectras
:Non, mais ça veut dire que l'abstraction "j'écris une chaîne de caractère avec mon texte entre guillemets" ne peut pas avoir lieu... Il faut des règles plus subtiles -- il faut comprendre les règles de combinaison char*/string ...Bah oui puisque c'est des choses différentes.
Alors là c'est complètement orthogonal, si "Hello" est défini comme étant un std::string, le compilo peut très bien être autorisé à en faire directement un char * sans passer par un string intermédiaire... (il y a déjà des trucs de ce genre en C++, avec MyClass x=y; qui est optimisable par le compilo en MyClass x(y)Tention, c'est pas une optimisation. La notation Classe truc=machin est un appel au constructeur par recopie, forcément (enfin, s'ils sont de type compatible, évidemment).
D'ailleurs, cette syntaxe est déconseillée, parce que justement elle ne montre pas l'appel au contructeur par recopie alors qu'il a lieu.
D'ailleurs la syntaxe "(string)"Hello"" est aussi déconseillée, pour la même raison.
Pk est-ce que "Hello" n'initialiserait pas un objet de type string aussi ? Je vois pas le pbBen justement, pour la cohérence. Il vaut mieux qu'il n'existe qu'une seule façon de créer un objet.
Surtout si 42 ne crée pas un objet pour représenter un entier.
Transtypage auto pawaHum, j'ai des réserves à faire : le transtypage auto, c'est...auto justement, ce qui veut dire que à moins d'en connaitre les règles exactes, tu est incapable de savoir ce que tu fais.
(je vois mal un autre langage faire ça aussi efficacement)Bah en perl t'as plus impresionnant
',/((..)*)$/)t'as le fameux#!/bin/perl -sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj $/=unpack('H*',$_);$_=`echo 16dio\U$k"SK$/SM$n\EsN0p[lN*1 lK[d2%Sa2/d0$^Ixp"|dc`;s/\W//g;$_=pack('H*![]()
Euh nan, c facultatif.Voir la norme ansi, section 8.5, points 10 et 11 :
If the initialization is direct-initialization, or if it is copy-initialization where the cv-unqualified version of the source type is the same class as, or a derived class of, the class of the destination, constructors are considered. The applicable constructors are enumerated (_over.match.ctor_), and the best one is chosen through overload resolution (_over.match_). The constructor so selected is called to initialize the object, with the initializer expression(s) as its argument(s).
Et si x a été déclaré plus haut ?Si x a été déclaré plus haut, deux possibilités : soit c'est pas dans le même scope, auquel cas le nouveau le masque et n'a rien à voir, soit le compilateur te sors une erreur.
Euh, n'importe quoi. Les casts (implicites ou non) font toute la puissance du C++, ce serait ridicule de s'en priver.La syntaxe type(valeur) est préférée pour les opérateurs de conversions, puisque ça montre l'appel à la fonction correspondante.
Comment ça ? Je crois que c un peu compliqué en C++, mais en C# c'est très simple, tu n'as droit qu'à une seule étape, donc tu risques pas d'avoir des trucs tordus avec des conversions intermédiaires. Et franchement pour l'instant je n'ai jamais eu un seul bug à cause d'une conversion auto, donc ça reste à prouver, que "personne n'est capable de comprendre quoi que ce soit à du code avec une conversion auto". Du moment que tu "vois" le type de toutes tes variables (ce qui est de toute façon indispensable), tu ne risques rien, nan ?Je pensais plus à des langages genre php. Je ne connais pas le C#.
j'ai pas dit que ct impressionnant, g dit que ct pratique, ça n'a rien à voir et c même plutôt le contraire (et mon truc est tout sauf optimisé ou beau, hein)Ben le truc là n'est pas beau non plus. C'est un programme qui crypte le texte en entrée. On le trouve sur cette page web.
Ca fait quoi, la commande dc ? (je l'ai pas sur mon Cygwin)C'est une calculatrice en ligne de commande et en polonaise inversée. Précision arbitraire.
spectras
:Euh nan, c facultatif.Voir la norme ansi, section 8.5, points 10 et 11 :If the initialization is direct-initialization, or if it is copy-initialization where the cv-unqualified version of the source type is the same class as, or a derived class of, the class of the destination, constructors are considered. The applicable constructors are enumerated (_over.match.ctor_), and the best one is chosen through overload resolution (_over.match_). The constructor so selected is called to initialize the object, with the initializer expression(s) as its argument(s).
Et si x a été déclaré plus haut ?Si x a été déclaré plus haut, deux possibilités : soit c'est pas dans le même scope, auquel cas le nouveau le masque et n'a rien à voir, soit le compilateur te sors une erreur.
Euh, n'importe quoi. Les casts (implicites ou non) font toute la puissance du C++, ce serait ridicule de s'en priver.La syntaxe type(valeur) est préférée pour les opérateurs de conversions, puisque ça montre l'appel à la fonction correspondante.
Et pour les pointeurs sur classe, en général un cast comme ça t'amène droit dans le mur.
Comment ça ? Je crois que c un peu compliqué en C++, mais en C# c'est très simple, tu n'as droit qu'à une seule étape, donc tu risques pas d'avoir des trucs tordus avec des conversions intermédiaires. Et franchement pour l'instant je n'ai jamais eu un seul bug à cause d'une conversion auto, donc ça reste à prouver, que "personne n'est capable de comprendre quoi que ce soit à du code avec une conversion auto". Du moment que tu "vois" le type de toutes tes variables (ce qui est de toute façon indispensable), tu ne risques rien, nan ?Je pensais plus à des langages genre php. Je ne connais pas le C#.
j'ai pas dit que ct impressionnant, g dit que ct pratique, ça n'a rien à voir et c même plutôt le contraire (et mon truc est tout sauf optimisé ou beau, hein)Ben le truc là n'est pas beau non plus. C'est un programme qui crypte le texte en entrée. On le trouve sur cette page web.Ca fait quoi, la commande dc ? (je l'ai pas sur mon Cygwin)C'est une calculatrice en ligne de commande et en polonaise inversée. Précision arbitraire.
Je faisais référence à ça : [citation]Bah oui, mais ça n'a rien à voir avec ton exemple "Classe truc = machin;", parce que dans ton exemple machin n'est pas un objet temporaire.
C'est aussi ce que je pensais, mais avoue que l'enchaînement des réponses prête à confusion. Et là l'affectation x=y ne fait pas d'appel au constructeur.Euh nan je parlais pas d'une déclaration, je suis p-ê pas n00b à ce point-là (et de toute façon, le nom n'importe pas dans ces cas-là) Je parlais d'une affectation... (donc sans le MyClass) Tu ne vas qd même pas me dire qu'il ne faut jamais faire d'affectation en C++ parce que ça cache l'appel à un constructeur ?Si x a été déclaré plus haut, deux possibilités : soit c'est pas dans le même scope, auquel cas le nouveau le masque et n'a rien à voir, soit le compilateur te sors une erreur.Et si x a été déclaré plus haut ?(il y a déjà des trucs de ce genre en C++, avec MyClass x=y; qui est optimisable par le compilo en MyClass x(y)D'ailleurs, cette syntaxe est déconseillée, parce que justement elle ne montre pas l'appel au contructeur par recopie alors qu'il a lieu.
La syntaxe (type)valeur aussiBah c'est moins évident que ça va appeler la fonction valeur.type(), comme ça. Enfin bon, c'est une question de notation, évidemment quand tu connais tu le vois tout de suite, mais bon.
Euh je suis assez d'accord si tu parles de la dualité chaîne/nombre, parce que ça introduit silencieusement des nuances assez délicates. Mais avec le typage statique et des conversions implicites que qd c pas dangereux, y a vraiment aucun pb. Le typage des opérations sur les entiers est même bien plus sain en C# qu'en C/C++.Oui. Reste juste aux débutants à apprendre quand c'est dangereur et quand ça ne l'est pas. C'est pas forcément toujours évident.
Ah OK, donc c dc qui fait tout, en fait),$x):0,""/ge;($r,$t)=&bdiv($r,256),$_=pack(C,$t).$_ while$w--+1-2*$d;print}
Ils en ont aussi une version que en perl, mais elle fait 5 lignes. Ca donne ça :#!/usr/local/bin/perl -s do 'bigint.pl';($_,$n)=@ARGV;s/^.(..)*$/0$&/;($k=unpack('B*',pack('H*',$_)))=~ s/^0*//;$x=0;$z=$n=~s/./$x=&badd(&bmul($x,16),hex$&)/ge;while(read(STDIN,$_,$w =((2*$d-1+$z)&~1)/2)){$r=1;$_=substr($_."\0"x$w,$c=0,$w);s/.|\n/$c=&badd(&bmul ($c,256),ord$&)/ge;$_=$k;s/./$r=&bmod(&bmul($r,$r),$x),$&?$r=&bmod(&bmul($r,$cCa me fait un peu penser au IOCCC
spectras
:Je faisais référence à ça : [citation]Bah oui, mais ça n'a rien à voir avec ton exemple "Classe truc = machin;", parce que dans ton exemple machin n'est pas un objet temporaire.
C'est aussi ce que je pensais, mais avoue que l'enchaînement des réponses prête à confusion. Et là l'affectation x=y ne fait pas d'appel au constructeur.
La syntaxe (type)valeur aussiBah c'est moins évident que ça va appeler la fonction valeur.type(), comme ça. Enfin bon, c'est une question de notation, évidemment quand tu connais tu le vois tout de suite, mais bon.
Euh je suis assez d'accord si tu parles de la dualité chaîne/nombre, parce que ça introduit silencieusement des nuances assez délicates. Mais avec le typage statique et des conversions implicites que qd c pas dangereux, y a vraiment aucun pb. Le typage des opérations sur les entiers est même bien plus sain en C# qu'en C/C++.Oui. Reste juste aux débutants à apprendre quand c'est dangereur et quand ça ne l'est pas. C'est pas forcément toujours évident.
Ah OK, donc c dc qui fait tout, en fait),$x):0,""/ge;($r,$t)=&bdiv($r,256),$_=pack(C,$t).$_ while$w--+1-2*$d;print}Ils en ont aussi une version que en perl, mais elle fait 5 lignes. Ca donne ça :#!/usr/local/bin/perl -s do 'bigint.pl';($_,$n)=@ARGV;s/^.(..)*$/0$&/;($k=unpack('B*',pack('H*',$_)))=~ s/^0*//;$x=0;$z=$n=~s/./$x=&badd(&bmul($x,16),hex$&)/ge;while(read(STDIN,$_,$w =((2*$d-1+$z)&~1)/2)){$r=1;$_=substr($_."\0"x$w,$c=0,$w);s/.|\n/$c=&badd(&bmul ($c,256),ord$&)/ge;$_=$k;s/./$r=&bmod(&bmul($r,$r),$x),$&?$r=&bmod(&bmul($r,$cCa me fait un peu penser au IOCCC![]()
Euh je voulais dire "machin = n'importe quoi", désolé...Ok.
Euh, si y n'est pas temporaire, ça détruit l'objet dans x et ça en construit un nouveau, nan ?Nan, il appelle l'opérateur d'affectation.
Certes, mais bon le C++ ne s'apprend en 5 minutes non plus...Tu m'étonnes. Ca fait 4 ans, et je découvre encore des trucs de temps en temps (sans compter que je ne me suis pas encore intéressé au fonctionnement des fonctors).
spectras
:Euh, si y n'est pas temporaire, ça détruit l'objet dans x et ça en construit un nouveau, nan ?Nan, il appelle l'opérateur d'affectation.
class MyClass { int *z; std::string x,y; MyClass(const MyClass& m): x(m.x),y(m.y) { z=new int(*m.z); } ~MyClass() { delete z; } }
Non, par défaut, si tu ne le redéfinis pas, l'opérateur d'affectation fait une copie bit à bit de la classe. Regarde, par exemple : #include <iostream>
#include <string>
using namespace std;
class MyClass
{
public:
int *z;
std::string x,y;
MyClass()
{
z = new int;
*z = 1;
cout <<"contructor " <<this <<endl;
}
MyClass(const MyClass& m): x(m.x),y(m.y)
{
z=new int(*m.z);
cout <<"copy contructor " <<this <<endl;
}
~MyClass()
{
delete z;
cout <<"deleted " <<this <<endl;
}
};
int main()
{
MyClass x, y;
cout <<"go ! x.z ==
[edit: je viens de m'apercevoir que j'ai oublié le return à la fin du main :/]
etherdream:~/prog> ./testtruc contructor 0xbffffad0 contructor 0xbffffac4 go ! x.z == 0x804bdb0 et y.z == 0x804bdc0 done x.z == 0x804bdb0 et y.z == 0x804bdb0 deleted 0xbffffac4 deleted 0xbffffad0 etherdream:~/prog>Et encore, il arrive que le second destructeur plante (puisqu'il libère une zone déjà libérée).