OVH Cloud OVH Cloud

casting short* [4] en short[4][64] ?

31 réponses
Avatar
Bernie
Bonjour,
J'ai déjà rencontré ce prb et je l'avais solutionné de manière "batarde",
mais à force je me dis qu'il faudrait que je découvre un peu le fond du
prb....

soit une variable short* toto[4], qqsoit i toto[i] = (short*)malloc(64);
soit une fonction f déclarée par : void f(short param[4][64]);

comment caster "proprement" la variable toto pour la passer à f ?

merci d'avance ...

10 réponses

1 2 3 4
Avatar
Loïc Joly
wrote:

Loïc Joly wrote:

Il peut allouer ce qu'il veut, tant que ça suit une croissance
géométrique, le coefficient ne vaut pas forcément sqrt(2)



Il me semble avoir lu cependant que selon certains critères,
sqrt(2) est le facteur idéal. Ce qui est certain, c'est qu'avec
un facteur de 2 (qui était le facteur le plus fréquent au
début), la somme des tailles des blocs libérés ne suffirait
jamais à une nouvelle allocation ; pour tout multiple
strictement inférieur à 2, on y arrivera éventuellement.



Je crois qu'il faut pour cela que le facteur soit inférieur au
"nombre d'or" (1 + sqrt(5))/2 == 1.618... mais je me ne souviens
plus des détails.

À vrai dire, je ne vois pas l'intérêt de sqrt(2) quand 1,5 se
calcule beaucoup plus facilement (n += n >> 1), et a à peu près
le même comportement.



http://www.python.org/~jeremy/weblog/040115.html

--
Loïc



Avatar
kanze
Franck Branjonneau wrote:
Falk Tannhäuser écrivait:
wrote:
Loïc Joly wrote:
Il peut allouer ce qu'il veut, tant que ça suit une
croissance géométrique, le coefficient ne vaut pas
forcément sqrt(2) > >> Il me semble avoir lu cependant que
selon certains critères, > >> sqrt(2) est le facteur
idéal. Ce qui est certain, c'est qu'avec > >> un facteur de
2 (qui était le facteur le plus fréquent au > >> début), la
somme des tailles des blocs libérés ne suffirait > >>
jamais à une nouvelle allocation ; pour tout multiple > >>
strictement inférieur à 2, on y arrivera éventuellement.



Je crois qu'il faut pour cela que le facteur soit inférieur
au "nombre d'or" (1 + sqrt(5))/2 == 1.618... mais je me ne
souviens plus des détails.


Les détails, pour autant que je sache : la n+1 ème allocation
doit demander un bloc d'une taille inférieure (ou égale) à la
somme des n-1 blocs libérés ; le n ème est occupé.


Voilà le fait que j'avais oublié -- qu'il y a effectivement deux
blocs alloués au même temps. Ce qui effectivement ramène le
facteur critique à phi à la place de 2.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34




Avatar
Fabien LE LEZ
On Wed, 30 Mar 2005 17:39:55 +0200, Franck Branjonneau
:

La raison de la suite des tailles
successives du *est* phi.


Non. Le rapport entre deux tailles successives tend vers phi (quand le
nombre d'allocations tend vers l'infini).

D'où ma question : est-il obligatoire que les tailles successives
forment une suite de raison constante ? Ne serait-il pas plus simple
d'implémenter directement la règle
taille[n+1]= somme (taille[i], i=0..(n-1)) ?


--
;-)

Avatar
kanze
Fabien LE LEZ wrote:
On Wed, 30 Mar 2005 17:39:55 +0200, Franck Branjonneau
:

La raison de la suite des tailles successives du *est* phi.


Non. Le rapport entre deux tailles successives tend vers phi
(quand le nombre d'allocations tend vers l'infini).

D'où ma question : est-il obligatoire que les tailles
successives forment une suite de raison constante ? Ne
serait-il pas plus simple d'implémenter directement la règle

taille[n+1]= somme (taille[i], i=0..(n-1)) ?


Plus simple, je ne sais pas ; je ne connais rien de plus simple
que de multiplier l'ancienne taille par deux, et la multiplier
par 1,5 n'est pas très compliqué non plus. (Pour des facteurs
plus complexe, je crois que j'utiliserais une table.)

Quant à la conformité : d'après ce que je comprends, pour être
conforme aux exigeances de complexité, il faut une expression
qui grandit au moins aussi vite que k^n, pour un k arbitraire.
Je ne crois pas que ta formule convient, formellement, mais je
ne suis pas sûr -- est-ce qu'on peut prouver qu'il existe un n
et un k tel que pour tout i > n, taille[ i ] >= k^i ?

Aussi, on peut, en toute légitimité, poser la question de la
signification d'une telle exigeance dans la mésure que n a une
borne supérieur (dictée par la taille de la mémoire virtuelle ou
la taille d'un pointeur). En choisissant k suffisamment petit,
on peut rendre n'importe quelle formule conforme dans le domaine
possible. En fait, parler d'un comportement asymtotique sur une
fonction dont le domaine est borné n'a pas de sens. (Mais je
crois que l'intention de la norme est assez claire.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Jean-Marc Bourguet
writes:

Fabien LE LEZ wrote:
On Wed, 30 Mar 2005 17:39:55 +0200, Franck Branjonneau
:

La raison de la suite des tailles successives du *est* phi.


Non. Le rapport entre deux tailles successives tend vers phi
(quand le nombre d'allocations tend vers l'infini).

D'où ma question : est-il obligatoire que les tailles
successives forment une suite de raison constante ? Ne
serait-il pas plus simple d'implémenter directement la règle

taille[n+1]= somme (taille[i], i=0..(n-1)) ?


Quant à la conformité : d'après ce que je comprends, pour être
conforme aux exigeances de complexité, il faut une expression
qui grandit au moins aussi vite que k^n, pour un k arbitraire.
Je ne crois pas que ta formule convient, formellement, mais je
ne suis pas sûr -- est-ce qu'on peut prouver qu'il existe un n
et un k tel que pour tout i > n, taille[ i ] >= k^i ?


facile: taille[n+2] = somme(taille[i], i = 0 .. n)
= somme(taille[i], i = 0 .. n-1) + taille[n]
= taille[n+1] + taille[n]
C'est la serie fibonacci.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Franck Branjonneau
Fabien LE LEZ écrivait:

On Wed, 30 Mar 2005 17:39:55 +0200, Franck Branjonneau
:

La raison de la suite des tailles
successives du *est* phi.


Non.


Allez, je te donne à moitié raison ;-).

Toute suite vérifiant que le n+2 ème terme est la somme des n premiers
est de Fibonnaci et vérifie :

Le rapport entre deux tailles successives tend vers phi (quand le
nombre d'allocations tend vers l'infini).


Et donc ; si, de plus, elle est géométrique sa raison est phi.

Une telle suite existe-t-elle ? La suite phi^n où n est un entier
convient.

D'où ma question : est-il obligatoire que les tailles successives
forment une suite de raison constante ? Ne serait-il pas plus simple
d'implémenter directement la règle
taille[n+1]= somme (taille[i], i=0..(n-1)) ?


Je viens de répondre ;-)
--
Franck Branjonneau


Avatar
Franck Branjonneau
écrivait:

Fabien LE LEZ wrote:
On Wed, 30 Mar 2005 17:39:55 +0200, Franck Branjonneau
:

La raison de la suite des tailles successives du *est* phi.


Non. Le rapport entre deux tailles successives tend vers phi
(quand le nombre d'allocations tend vers l'infini).

D'où ma question : est-il obligatoire que les tailles
successives forment une suite de raison constante ? Ne
serait-il pas plus simple d'implémenter directement la règle

taille[n+1]= somme (taille[i], i=0..(n-1)) ?


Plus simple, je ne sais pas ; je ne connais rien de plus simple
que de multiplier l'ancienne taille par deux, et la multiplier
par 1,5 n'est pas très compliqué non plus. (Pour des facteurs
plus complexe, je crois que j'utiliserais une table.)


Tu présupposes une représentation binaire des nombres ; moi je
présuppose une représentation de Bergman et je dis : il n'y a rien de
plus simple que de multiplier par phi.

Quant à la conformité : d'après ce que je comprends, pour être
conforme aux exigeances de complexité, il faut une expression
qui grandit au moins aussi vite que k^n, pour un k arbitraire.


Où se trouve cette exigence ?

Je ne crois pas que ta formule convient, formellement, mais je
ne suis pas sûr -- est-ce qu'on peut prouver qu'il existe un n
et un k tel que pour tout i > n, taille[ i ] >= k^i ?


k = i = 1; taille[i] = k^i convient.

Aussi, on peut, en toute légitimité, poser la question de la
signification d'une telle exigeance dans la mésure que n a une
borne supérieur (dictée par la taille de la mémoire virtuelle ou
la taille d'un pointeur). En choisissant k suffisamment petit,
on peut rendre n'importe quelle formule conforme dans le domaine
possible. En fait, parler d'un comportement asymtotique sur une
fonction dont le domaine est borné n'a pas de sens. (Mais je
crois que l'intention de la norme est assez claire.)


Je ne comprends pas. La de borne supérieure ? (de mémoire finie ? de
taille de pointeur ?)
--
Franck Branjonneau



Avatar
Franck Branjonneau
Jean-Marc Bourguet écrivait:

writes:

Quant à la conformité : d'après ce que je comprends, pour être
conforme aux exigeances de complexité, il faut une expression
qui grandit au moins aussi vite que k^n, pour un k arbitraire.
Je ne crois pas que ta formule convient, formellement, mais je
ne suis pas sûr -- est-ce qu'on peut prouver qu'il existe un n
et un k tel que pour tout i > n, taille[ i ] >= k^i ?


facile: taille[n+2] = somme(taille[i], i = 0 .. n)
= somme(taille[i], i = 0 .. n-1) + taille[n]
= taille[n+1] + taille[n]
C'est la serie fibonacci.


Une suite de Fibonacci, *la* suite de Fibonacci vérifie de plus
taille[1] = taille[2] = 1.

Et ce n'est pas suffisant pour répondre à la question : Si taille est
une suite telle que taille[i] >= k^i, où k est fixé, à partir d'un
certain rang. Alors, pour i suffisamment grand,
taille[i+2] >= k^(i+1) + k^i et
taille[i+2] >= k^(i+2)
donc,
k^(i+2) >= k^(i+1) + k^i.
L'égalité est vérifiée pour phi, il faut que k >= phi.
--
Franck Branjonneau


Avatar
Alexis Nikichine
wrote:

En fait, parler d'un comportement asymtotique sur une
fonction dont le domaine est borné n'a pas de sens. (Mais je
crois que l'intention de la norme est assez claire.)


J'avais trouvé tout tout bien formulé sur cette page:

http://www.sgi.com/tech/stl/complexity.html

Juste pour dire,


Alexis

--
Some domain is free

Avatar
Falk Tannhäuser
Franck Branjonneau wrote:
Une suite de Fibonacci, *la* suite de Fibonacci vérifie de plus
taille[1] = taille[2] = 1.


et généralement
taille[n] = (phi^n - (-phi)^-n) / sqrt(5)

Falk

1 2 3 4