OVH Cloud OVH Cloud

Aide en 'C'

9 réponses
Avatar
010
Bonjour,

Apres quelques temps a faire du shockwave, entre paranthese tres
fonctionnel, mais trop facile et qu'est ce qu'on ce fait 'chier'
d'ailleur!, paranthese fermee, je retourne au 'C' est j'ai besoin de
temps en temps de me rafraichir la memoire.


int *ess;

ess=(int*)NewPtr(1);
*(ess)=(int)NewPtr(13);

ess, est bien un pointeur de pointeur!

a+

------
Patrice

9 réponses

Avatar
Saïd
Pat :
Bonjour,

Apres quelques temps a faire du shockwave, entre paranthese tres
fonctionnel, mais trop facile et qu'est ce qu'on ce fait 'chier'
d'ailleur!, paranthese fermee, je retourne au 'C' est j'ai besoin de
temps en temps de me rafraichir la memoire.


int *ess;

ess=(int*)NewPtr(1);
*(ess)=(int)NewPtr(13);

ess, est bien un pointeur de pointeur!



Il y a une question? Sinon, ess est un pointeur sur int et rien d'autre. Et
si NewPtr renvoie un pointeur sur une une case memoire qui contient la valeur
entiere de son parametre, alors *ess vaut successivement 1 puis l'adresse ou est
stocke un int valant 13 (la valeur 1 inscrite a la case memoire pointee par
ess apres la premiere affectation a ete ecrasee par la position en memoire
de la case contenant 13 et allouee (si NewPtr est bien ecrit) par le second
NewPtr).

--
Saïd.
"Bless this, O Lord, that with it thou mayst blow thine enemies to tiny
bits, in thy mercy."
In the Book of Armaments, Chapter 4. (The Holy Hand Grenade)

Avatar
Patrick Stadelmann
In article ,
Saïd wrote:

Pat :
Bonjour,

Apres quelques temps a faire du shockwave, entre paranthese tres
fonctionnel, mais trop facile et qu'est ce qu'on ce fait 'chier'
d'ailleur!, paranthese fermee, je retourne au 'C' est j'ai besoin de
temps en temps de me rafraichir la memoire.


int *ess;

ess=(int*)NewPtr(1);
*(ess)=(int)NewPtr(13);

ess, est bien un pointeur de pointeur!



Il y a une question? Sinon, ess est un pointeur sur int et rien d'autre. Et
si NewPtr renvoie un pointeur sur une une case memoire qui contient la valeur
entiere de son parametre, alors *ess vaut successivement 1 puis l'adresse ou
est
stocke un int valant 13 (la valeur 1 inscrite a la case memoire pointee par
ess apres la premiere affectation a ete ecrasee par la position en memoire
de la case contenant 13 et allouee (si NewPtr est bien ecrit) par le second
NewPtr).


Quand tu appelles NewPtr( N ), ça alloue un bloc de N octets. N n'est
pas la valeur qui sera stockée. Donc là il y a un problème car ess
pointe vers un bloc de 1 octets, insuffisant pour stocker l'adresse
retournée par le 2e NewPtr.

Patrick
--
Patrick Stadelmann


Avatar
Saïd
Patrick Stadelmann :
Quand tu appelles NewPtr( N ), ça alloue un bloc de N octets. N n'est
pas la valeur qui sera stockée. Donc là il y a un problème car ess
pointe vers un bloc de 1 octets, insuffisant pour stocker l'adresse
retournée par le 2e NewPtr.



Mais c'est du C, ce NewPtr? C'est du objective C? En tout cas je ne savais
pas que ca existait, je croyais qu'il avait invente le mot pour raccourcir
le programme.

--
Saïd.
"Bless this, O Lord, that with it thou mayst blow thine enemies to tiny
bits, in thy mercy."
In the Book of Armaments, Chapter 4. (The Holy Hand Grenade)

Avatar
Patrick Stadelmann
In article ,
Saïd wrote:

Mais c'est du C, ce NewPtr? C'est du objective C? En tout cas je ne savais
pas que ca existait, je croyais qu'il avait invente le mot pour raccourcir
le programme.


NewPtr est une fonction de l'API de Mac OS. Sous Mac OS X, elle est
toujours disponible dans Carbon.

Patrick
--
Patrick Stadelmann

Avatar
Franck
Patrick Stadelmann wrote:
ess=(int*)NewPtr(1);
*(ess)=(int)NewPtr(13);
Quand tu appelles NewPtr( N ), ça alloue un bloc de N octets. N n'est


pas la valeur qui sera stockée. Donc là il y a un problème car ess
pointe vers un bloc de 1 octets, insuffisant pour stocker l'adresse
retournée par le 2e NewPtr.



int **ess;

ess = (int **)NewPtr(sizeof(int *));
*ess = (int *)NewPtr(13);



Avatar
010
Patrick Stadelmann wrote:

In article ,
Saïd wrote:

Pat :
Bonjour,

Apres quelques temps a faire du shockwave, entre paranthese tres
fonctionnel, mais trop facile et qu'est ce qu'on ce fait 'chier'
d'ailleur!, paranthese fermee, je retourne au 'C' est j'ai besoin de
temps en temps de me rafraichir la memoire.


int *ess;

ess=(int*)NewPtr(1);
*(ess)=(int)NewPtr(13);

ess, est bien un pointeur de pointeur!



Il y a une question? Sinon, ess est un pointeur sur int et rien d'autre. Et
si NewPtr renvoie un pointeur sur une une case memoire qui contient
la valeur
entiere de son parametre, alors *ess vaut successivement 1 puis l'adresse ou
est
stocke un int valant 13 (la valeur 1 inscrite a la case memoire pointee par
ess apres la premiere affectation a ete ecrasee par la position en memoire
de la case contenant 13 et allouee (si NewPtr est bien ecrit) par le second
NewPtr).


Quand tu appelles NewPtr( N ), ça alloue un bloc de N octets. N n'est
pas la valeur qui sera stockée. Donc là il y a un problème car ess
pointe vers un bloc de 1 octets, insuffisant pour stocker l'adresse
retournée par le 2e NewPtr.

Patrick
'j'entendais'


ess=(int*)NewPtr(sizeof(int)); =>allocation
*(ess)=(int)NewPtr(17*sizeof(int)); le contenu de ess => 17 elements de
type int

c'est la meme chose que;

int *ess[17];

for(i=0;i!;i++){ess[i]=NewPtr(17*sizeof(int));}


j'ai vraiment peur de dire des co...



Avatar
Schmurtz
Patrick Stadelmann wrote:

Saïd wrote:

Mais c'est du C, ce NewPtr? C'est du objective C? En tout cas je ne savais
pas que ca existait, je croyais qu'il avait invente le mot pour raccourcir
le programme.


NewPtr est une fonction de l'API de Mac OS. Sous Mac OS X, elle est
toujours disponible dans Carbon.


Cette fonction n'est présente dans Mac OS X que pour des raisons de
compatibilité Carbon. Il faut éviter de l'utiliser et la remplacer par
malloc() (et free()), voir new/delete si c'est du C++.

Par ailleurs, l'usage des doubles pointeurs n'a que très peu d'intérêt
(c'est en plus la cause de nombreux bugs), et peut quasiment toujours
être remplacé par un pointeur simple. Si besoin, il y a la fonction
realloc pour agrandir un bloc mémoire alloué avec malloc.

Si vraiment tu tiens, aux doubles pointeurs, autant utiliser les APIs
pour (NewHandle et compagnie). Mais franchement, évite...

--
Schmurtz


Avatar
Patrick Stadelmann
In article <1h0dbmi.2nzz013zx5t8N%, (Pat)
wrote:

ess=(int*)NewPtr(sizeof(int)); =>allocation
*(ess)=(int)NewPtr(17*sizeof(int)); le contenu de ess => 17 elements de
type int


Surtout pas ! La valeur retournée par NewPtr peut être castée en un
autre type de pointeur, mais certainement pas en int ! Il faudrait
écrire :

int **ess;

ess = (int**) NewPtr( sizeof( int* ) );
*ess = (int*) NewPtr( 17*sizeof( int ) );

c'est la meme chose que;

int *ess[17];
for(i=0;i!;i++){ess[i]=NewPtr(17*sizeof(int));}


En tout cas pas... Dans la boucle, tu alloues 16 blocs (chacun de la
taille de 17 entiers). Plus haut, il n'y a qu'un seul bloc alloué !

Patrick
--
Patrick Stadelmann

Avatar
010
Patrick Stadelmann wrote:

In article <1h0dbmi.2nzz013zx5t8N%, (Pat)
wrote:

ess=(int*)NewPtr(sizeof(int)); =>allocation
*(ess)=(int)NewPtr(17*sizeof(int)); le contenu de ess => 17 elements de
type int


Surtout pas ! La valeur retournée par NewPtr peut être castée en un
autre type de pointeur, mais certainement pas en int ! Il faudrait
écrire :

int **ess;

ess = (int**) NewPtr( sizeof( int* ) );
*ess = (int*) NewPtr( 17*sizeof( int ) );

c'est la meme chose que;

int *ess[17];
for(i=0;i!;i++){ess[i]=NewPtr(17*sizeof(int));}


En tout cas pas... Dans la boucle, tu alloues 16 blocs (chacun de la
taille de 17 entiers). Plus haut, il n'y a qu'un seul bloc alloué !

Patrick
effectivement! je te remercie de ta patience, je me suis fait 'avoir' en

observant les resultats sous le debuggeur de Code Warrior.