510

(Et c'est pareil pour NULL utilisé en SQL, on se fiche de savoir ce que c'est, un pointeur ou un chou fleur... c'est le néant, c'est tout).
avatar

511

(Et c'est pareil pour None utilisé en CAML, on se fiche de savoir ce que c'est, un pointeur ou un chou fleur... c'est le néant, c'est tout).
Hippopotame (./508) :
Yoshi Diabolique (./507) :
Un pointeur sur un Yoshi, c'est un Yoshi* en C et Yoshi* correspond grosso modo à un "Yoshi option" en CAML ^^

Pff, non, ni grosso ni modo.Vu que 'a option est un type somme, en mémoire c'est probablement un machin encapsulé. D'autre part c'est pas mutable. Donc vraiment rien à voir avec un pointeur.

Mais on s'en fout de ces considérations d'implémentation... C'est exactement la même sémantique, point. (et "pas mutable", ben non, le contenu de l'option n'est effectivement pas mutable, comme un pointeur C [tu peux t'en convaincre facilement : si x==y à un point du programme, tant que x et y ne sont pas modifiés x et y pointeront vers le même objet... ce serait pas le cas avec une option mutable où du code pourrait muter le contenu de l'option sans modifier x et y])
Null n'est pas un pointeur valide : tu ne peux pas faire d'arithmétique dessus, tu ne peux pas le déréférencer, bref tu ne peux rien en faire à part le stocker ou le comparer à un autre pointeur (exactement comme None, donc)

Rien à voir avec None !
Il n'y a pas d'"arithmétique" (c'est à dire d'opérations toutes faites) sur le type 'a option de toute façon.
Essaie de faire (Some 3) + (Some 5) => erreur de type.Mais rien ne t'empêche d'en programmater si ça te chante.

Oui, mais c'est purement syntaxique... (évidemment, CAML te permet à la fois d'interdire le pointeur nul et d'interdire l'arithmétique de pointeur, mais si tu n'utilises que des fonctions manipulant des 'a option [donc en remplaçant yoshi#size par ((fun Some x -> x) yoshi)#size] où 'a est un type autorisant l'arithmétique de pointeur alors c'est bien équivalent... bref le typage de CAML est plus expressif que celui de C, mais c'est pas ça qui empêche de plonger le typage de C dans celui de CAML)
ah oui, null c'est le pointeur nul, mais je peux pas te laisser raconter des bêtises à propos des "valeurs binaires" smile

Ah ben corrige wikipedia.

confus

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

512

Bleu : encore faut il définir le néant
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

513

D'ailleurs, je me demande si c'est pas sur TI où NULL peut être -1 (ou je confonds avec autre chose hum)
Mais dans tous les cas, NULL est différent de 0, d'ailleurs en PHP, un booléen peut être égal à TRUE (=0), FALSE (!= 0), ou NULL tongue
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

514

>un pointeur ou un chou fleur

En C, null est de type pointeur, faut pas déconner quand même.
Les droits inaliénables du troll :
1) le droit d'avoir raison
2) le droit d'être péremptoire
3) le droit de ne pas lire
4) le droit de ne pas répondre
5) le droit d'être de mauvaise foi
6) Autant pour moi / Faignant / Vivent Tintin et Milou

515

Yoshi Diabolique (./511) :
(Et c'est pareil pour None utilisé en CAML, on se fiche de savoir ce que c'est, un pointeur ou un chou fleur... c'est le néant, c'est tout).

Dis ça au typeur, il va être content !

None est une value bien concrète, de type 'a option.

Comme d'ailleurs () qui est une autre value, de type unit, et qui serait d'ailleurs un bien meilleur candidat pour ton pseudo-null en caml. (Chais pas pourquoi t'as été cherché ce None qui est très anecdotiqueconfus)
Mais on s'en fout de ces considérations d'implémentation... C'est exactement la même sémantique, point.

Complètement rien à voir.
Et la liste vide, c'est aussi un NULL pour toi? laught
(évidemment, CAML te permet à la fois d'interdire le pointeur nul et d'interdire l'arithmétique de pointeur

Allez, je vais t'apprendre un truc marrant :
Ya pas de pointeur en caml. (à la rigueur des 'a ref)
Les droits inaliénables du troll :
1) le droit d'avoir raison
2) le droit d'être péremptoire
3) le droit de ne pas lire
4) le droit de ne pas répondre
5) le droit d'être de mauvaise foi
6) Autant pour moi / Faignant / Vivent Tintin et Milou

516

Ca, ça reste à définir... C'est un pointeur vers quoi ? Et ça a quoi à voir avec 0 ?
edit : cross
avatar

517

Je sais pas, le C c'est trop crade, mais ça semble être une valeur contenue dans tous les types pointeurs. Et qu'est ce que ça a à voir avec le 0, ben moralement c'est le pointeur 0, et en général dans les implémentations c'est 0 en binaire (même si disclaimer les architectures pourries etc...)
Les droits inaliénables du troll :
1) le droit d'avoir raison
2) le droit d'être péremptoire
3) le droit de ne pas lire
4) le droit de ne pas répondre
5) le droit d'être de mauvaise foi
6) Autant pour moi / Faignant / Vivent Tintin et Milou

518

C'est pas crade, c'est bas niveau et fortement type.

519

Ben non le pointeur 0 c'est le pointeur qui va à l'adresse 0000:0000 tongue
avatar

520

Hippopotame (./515) :
Yoshi Diabolique (./511) :
(Et c'est pareil pour None utilisé en CAML, on se fiche de savoir ce que c'est, un pointeur ou un chou fleur... c'est le néant, c'est tout).

Dis ça au typeur, il va être content !
None est une value bien concrète, de type 'a option.

Oui oui (de même que le pointeur nul est une value bien concrète, de type A*)[/cite]
Comme d'ailleurs () qui est une autre value, de type unit, et qui serait d'ailleurs un bien meilleur candidat pour ton pseudo-null en caml. (Chais pas pourquoi t'as été cherché ce None qui est très anecdotiqueconfus)

Ah non, () ça n'a strictement rien à voir ! () ne contient aucune information (c'est stocké dans 0 bits de mémoire, puisque tu aimes les chiffres et les implémentations hehe), alors que None contient une information qui le différencie de Some ptr...
Enfin on pourrait aussi se débrouiller, en définissant un type Null () | NonNull ptr, hein, mais c'est idiot parce que le built-in None | Some ptr fait exactement la m^me ehcose...
Mais on s'en fout de ces considérations d'implémentation... C'est exactement la même sémantique, point.

Complètement rien à voir.
Et la liste vide, c'est aussi un NULL pour toi? laught

Ah non, la liste vide, elle a une taille, on peut la manipuler, on peut lui concaténer des objets, bref, on peut la manipuler exactement comme une liste normale...
(évidemment, CAML te permet à la fois d'interdire le pointeur nul et d'interdire l'arithmétique de pointeur

Allez, je vais t'apprendre un truc marrant :
Ya pas de pointeur en caml. (à la rigueur des 'a ref)

triroll

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

521

Et puisque tu y tiens, voilà la sémantique complète des pointeurs C en CAML, avec l'arithmétique de pointeur :
type 'a ptr = ('a array*int) option
let null = (None:'a ptr)
let calloc n zero = (Some (Array.make n zero,0):'a ptr)
let deref (Some (v,i):'a ptr) = v.(i)
let modify (Some (v,i):'a ptr) x = v.(i) <- x
let add (Some (v,i):'a ptr) j = (Some (v,i+j):'a ptr)
let sub (Some (v,i):'a ptr) (Some (_,j):'a ptr) = j-i


Tu vois bien que null *c'est* None, et que ça n'a absolument rien à voir avec le reste des pointeurs... (d'ailleurs ça balance une exception dès qu'on y touche)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

522

Oui oui (de même que le pointeur nul est une value bien concrète, de type A*)

Oui, tout à fait ! smile (bref ce n'est pas le néant ou autres calembredaines mystiques).

Ah non, () ça n'a strictement rien à voir ! () ne contient aucune information, alors que None contient une information qui le différencie de Some ptr...

Les types unit, 'a list, 'a option sont des types sommes, dont l'une des alternatives est respectivement (), [] ou None. Les situations sont donc absolument similaires (si ce n'est que pour unit il n'y a pas d'autre alternative).
Enfin on pourrait aussi se débrouiller, en définissant un type Null () | NonNull ptr, hein, mais c'est idiot parce que le built-in None | Some ptr fait exactement la m^me ehcose...

Chais pas, c'est vraiment très bizarre ton histoire, t'as l'air complètement à l'ouest.

Si on voulait vraiment définir un type pointeur en caml, ça ne serait pas un type somme, mais un type abstrait, avec un petit fichier en C à côté pour faire marcher quelques fonctions de bases. Le Null serait alors une value appartenant à ce type, mais rien ne le différencierait syntaxiquement des autres.

Ah non, la liste vide, elle a une taille, on peut la manipuler, on peut lui concaténer des objets, bref, on peut la manipuler exactement comme une liste normale...

Le None, on peut le manipuler exactement comme un 'a option normal.

fun (Some x) -> x renverra une erreur sur un None, de même que fun a::q -> a renverra une erreur sur un [].


Rappel :

type 'a list =
| []
| :: of ('a*'a list)

type 'a option =
| None
| Some of 'a

[] et None jouent le même rôle. Soit dit en passant, 'a option n'est même pas un type builtin, c'est un machin de la library pervasives qu'on pourrait tout aussi bien définir à la main.

(alors que 'a list, lui, est builtin, probablement pour des raisons d'optimisation(?), son [] ferait donc un null bien plus pur que None. D'ailleurs c'est marrant : l'opérateur :: est sensé se prononcer "cons", alors que [] est sensé se prononcer "nil". Ah ah ah.)

T'es vraiment pas camélien mon pauvre yollux.




Ya pas de pointeur en caml. (à la rigueur des 'a ref)
triroll

Oui?
Allez, je le refais : ya pas de pointeur en caml.

Si tu veux définir des pointeurs, fais comme j'ai indiqué plus haut. Mais c'est sale à mon avis, le language est pas fait pour.
Les droits inaliénables du troll :
1) le droit d'avoir raison
2) le droit d'être péremptoire
3) le droit de ne pas lire
4) le droit de ne pas répondre
5) le droit d'être de mauvaise foi
6) Autant pour moi / Faignant / Vivent Tintin et Milou

523

Tu vois bien que null *c'est* None, et que ça n'a absolument rien à voir avec le reste des pointeurs... (d'ailleurs ça balance une exception dès qu'on y touche)

Ben chais pas moi, prends une variable pointeur en C, mets y la valeur binaire 0, et teste si c'est égal à null.
Alors est ce que null n'a vraiment absolument rien à voir avec le reste des pointeurs ?

Edit : une tite expérience

#let matrice = [|42|];;
val matrice : int array = [|42|]

# let x = Some matrice.(0);;
val x : int option = Some 42

# matrice.(0)<-14;;
- : unit = ()

# x;;
- : int option = Some 42


Génial, le pointeur.
Les droits inaliénables du troll :
1) le droit d'avoir raison
2) le droit d'être péremptoire
3) le droit de ne pas lire
4) le droit de ne pas répondre
5) le droit d'être de mauvaise foi
6) Autant pour moi / Faignant / Vivent Tintin et Milou

524

Hippopotame (./523) :
Tu vois bien que null *c'est* None, et que ça n'a absolument rien à voir avec le reste des pointeurs... (d'ailleurs ça balance une exception dès qu'on y touche)

Ben chais pas moi, prends une variable pointeur en C, mets y la valeur binaire 0, et teste si c'est égal à null.
Alors est ce que null n'a vraiment absolument rien à voir avec le reste des pointeurs ?

Bin ça dépend, justement grin Sur la majeure partie des archis, ça sera le cas. Mais ça dépend de l'implémentation ^^ Normalement, tu peux très bien décider que le pointeur Null vaut -1, par exemple smile
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

525

je me sens pas du tout de votre niveau hein mais j'ai déja vu des #define NULL ((void*)0) ça peut vous aider?

526

523> Oui, tout à fait. null est donc l'un des pointeurs, dont la valeur dépend de l'architecture, en général 0. Pas différent du reste des pointeurs, si ce n'est que les fonctions le testent.

D'ailleurs, dans la sémantique postée par yollux, il y a probablement une erreur ou quelque chose qui va pas : une fonction comme add peut renvoyer null.


Edit : squalyl je t'aime !
Les droits inaliénables du troll :
1) le droit d'avoir raison
2) le droit d'être péremptoire
3) le droit de ne pas lire
4) le droit de ne pas répondre
5) le droit d'être de mauvaise foi
6) Autant pour moi / Faignant / Vivent Tintin et Milou

527

squalyl (./525) :
je me sens pas du tout de votre niveau hein mais j'ai déja vu des #define NULL ((void*)0) ça peut vous aider?

#utile# Je pense qu'ils le savent ca ^^

528

d'ailleurs si je veux stocker une valeur à l'adresse zéro je fais comment? grin

529

A ton avis ?
avatar
Slammeur (qu'on voit danser, le long des golfes clairs).
Mon blog qui parle de jeux-vidéo

530

heu... C'est qui ces Yoshi * ???

531

Qui ça ???
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

532

Qui ?
avatar
Slammeur (qu'on voit danser, le long des golfes clairs).
Mon blog qui parle de jeux-vidéo

533

Qui ??

534

Ça me donnerait bien envie de créer quelques clones, tout ça trivil

535

Et quel genre de pseudo ?

536

./530 > Bah des pointeurs sur Yoshi triroll
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.

537

Yoshi Rose (./535) :
Et quel genre de pseudo ?

Yoshi Diabolique -> Pollux
@Yoshi Jaune - Zephyr
Yoshi Rose -> nEUrOO

trivil (pas le temps pour les autres hehe (en plus ça n'a pas grand intérêt, faut dire...))

538

surtout qu'il y a les bons define dans un topic cheeky
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

539

Hippo> J'ai vraiment pas envie de répondre Point Par Point à tes Attaques Personnelles ©, si t'as un point particulier auquel tu veux que je réponde dis-le...
Hippopotame (./526) :
523> Oui, tout à fait. null est donc l'un des pointeurs, dont la valeur dépend de l'architecture, en général 0. Pas différent du reste des pointeurs, si ce n'est que les fonctions le testent.

C'est pas une question de le tester, c'est que la sémantique est radicalement différente... Justement, en bas niveau il y a quasiment aucune différence entre pointeur nul et pointeur non nul (c'est bien pour ça que c'est efficace), mais du point de vue la sémantique ça n'a rien à voir (enfin si bien sûr, ça a le même type, de même que None et Some 42). De même que dans un langage comme caml une chaîne et un tableau n'ont rien à voir, et pourtant en bas niveau ils sont représentés absolument pareil...
D'ailleurs, dans la sémantique postée par yollux, il y a probablement une erreur ou quelque chose qui va pas : une fonction comme add peut renvoyer null.

Non, add ne peut jamais renvoyer null (et l'addition en C non plus[*]). Je crois qu'en fait le malentendu vient simplement du fait que tu as une vision erronée des pointeurs C : ce n'est pas juste un entier qui se trouve correspondre à une adresse mémoire, et ça ça a plein de conséquences : p+(q-p) n'est pas forcément équivalent à q (même si p et q ont le même type). La sémantique est bien plus fine que ça, notamment pour des raisons d'efficacité et de propreté : quand tu rajoutes un entier à un pointeur, il faut que le pointeur pointe dans un certain tableau, et que le fait de rajouter cet entier ne fasse pas changer le pointeur de tableau... L'intérêt c'est que ça permet d'optimiser le code, par exemple :
int rajouter(int valeur) {
  if (tableau[valeur]++ == 0)
    valeurs++;
  return tableau[valeur];
}

Cette sémantique garantit à l'optimiseur (ou à un outil de débuggage) que tableau[valeur] pointe bien dans "tableau"... Ca ne serait pas vrai sans la contrainte imposée sur l'addition :
rajouter(&valeurs-tableau); // interdit en C
Du coup le compilo peut optimiser le code :
int rajouter(int valeur) {
  int t = tableau[valeur]++;
  if (t == 0)
    valeurs++;
  return t+1;
}

Sinon, il aurait été obligé de supposer que le "valeurs++" peut modifier tableau[valeur] et donc il aurait dû chercher encore tableau[valeur] en mémoire...


[*] bien sûr c'est tout à fait possible qu'un compilo donné le fasse, mais comme c'est une undefined behaviour le programme pourrait très bien se mettre à planter à cause de ça par la suite...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

540

Yoshi Blanc > ah bon ?
pas vu grin