conversion adresse de tableau de pointeurs

conversion adresse de tableau de pointeurs - C - Programmation

Marsh Posté le 01-06-2004 à 14:06:17    

Alors si je fais :
 

Code :
  1. short * buf[2][10];
  2. short ** GetBuffer(void)
  3. {
  4. return( buf[0]);
  5. }


Pas de pb. Mais si j'écris :

Code :
  1. short *** GetBuffer(void)
  2. {
  3. return( buf);
  4. }


j'ai une erreur comme quoi le type est incompatible, je peux faire un cast mais bon, si je peux éviter et comprendre mon erreur ...

Reply

Marsh Posté le 01-06-2004 à 14:06:17   

Reply

Marsh Posté le 01-06-2004 à 14:07:26    

pointeur != tableau attention.
 
y a un topic sur ce genre d emanip un peu plus bas dans le forum.

Reply

Marsh Posté le 01-06-2004 à 14:14:53    

Joel F a écrit :

pointeur != tableau attention.


vi, ça je sais bien, c'est vrai dans les 2 cas, mais je ne vois pas bien pourquoi l'erreur n'arrive que dans un seul cas. Vais essayer de trouver cet autre topic, merci.

Reply

Marsh Posté le 01-06-2004 à 18:46:03    

En fait, le pointeur de pointeur de pointeur n'existe pas.
Concrètement, tu as droit à short *, short **, mais en aucun cas à short ***.
on utilise dans ce cas void * [N] qui te permet de rajouter les dimensions attendues.

Reply

Marsh Posté le 01-06-2004 à 18:48:20    

vivelec a écrit :

En fait, le pointeur de pointeur de pointeur n'existe pas.
Concrètement, tu as droit à short *, short **, mais en aucun cas à short ***.
on utilise dans ce cas void * [N] qui te permet de rajouter les dimensions attendues.


 
n'importe quoi ....
short*** est parfaitement supporté

Reply

Marsh Posté le 01-06-2004 à 18:58:32    

Joel F a écrit :

n'importe quoi ....
short*** est parfaitement supporté


Retourne à tes standards ...
Il est peut-être supporté par certains compilateurs( dont tu me donneras les versions et OS), mais :  
1) ce n'est pas standard
2) dans ce cas, ce n'est absolument pas portable.

Reply

Marsh Posté le 01-06-2004 à 19:47:42    

:??:

Reply

Marsh Posté le 01-06-2004 à 19:50:51    

c'est quoi qui n'est pas (censé être) standard ?
plus de deux niveau de déréférencement ?
ou de coupler ça avec un short ?

Reply

Marsh Posté le 01-06-2004 à 19:52:53    

Ben, oui, désolé, ce n'est pas standard (cc hp-ux, solaris, aix, ...).

Reply

Marsh Posté le 01-06-2004 à 19:55:27    

vivelec a écrit :

En fait, le pointeur de pointeur de pointeur n'existe pas.

Fortune !
 
et tu dis quoi quand tu vois
 

Code :
  1. #include <stdio.h>
  2. void f() { puts("plop" ); }
  3. int main()
  4. {
  5.    void (*pf)() = &f;
  6.    (**************************************pf)();
  7. }

Reply

Marsh Posté le 01-06-2004 à 19:55:27   

Reply

Marsh Posté le 01-06-2004 à 20:10:00    

Je dis que le compilateur fait bien son travail et qu'il corrige les conneries que tu écris.
Cela n'a cependant strictement aucun rapport avec short ***.
Passe un coup de lint, et tu verras ...

Reply

Marsh Posté le 01-06-2004 à 20:11:52    

mince si lint le dit ... faudrait voir à prévenir tout le monde alors

Reply

Marsh Posté le 01-06-2004 à 20:12:44    

j'ai une question con, t'en fais quoi du short*** que tu récupères, vu que tu sais plus les dimensions ?

Reply

Marsh Posté le 01-06-2004 à 20:16:19    

vivelec a écrit :

Ben, oui, désolé, ce n'est pas standard (cc hp-ux, solaris, aix, ...).


 
c'est pas une preuve de non-conformité...

Reply

Marsh Posté le 01-06-2004 à 20:21:51    

non mais honnêtement, pourquoi selon toi ça serait pas standard ?

Reply

Marsh Posté le 01-06-2004 à 20:22:34    

bjone a écrit :

c'est pas une preuve de non-conformité...


Disons que l'on tente, dans la mesure du possible d'écrire du code portable, propre, et aux normes implicites du C.
Maintenant, chacun est libre de faire ce qu'il veut avec son compilo.
Je dis juste que si ça marche avec le votre ou gcc, tant mieux.
Mais méfiez-vous, ce n'est absolument pas standard (comme les écritures à la C99).
Il me semble cependant qu'avant de ternir l'image du C, le mieux est de prendre de bonnes habitudes.
Quant à lint, oui, si lint le dit, ton code est pourri.

Reply

Marsh Posté le 01-06-2004 à 20:26:24    

Taz a écrit :

non mais honnêtement, pourquoi selon toi ça serait pas standard ?


Selon moi, ce n'est pas standard pour les raisons suivantes :  
- les compilateurs "standard" constructeurs répondent à des certaines nomres dont je ne me souvient pas les noms et peuvent être pour cela casse-couille.
- je me suis déjà cassé les dents dessus. Sur de l'aix, ou du solaris et hors gcc, ça ne se compile pas.
C'est dommage, car bien pratique.
Il faut cependant bien que les compilateurs aient des limites.

Reply

Marsh Posté le 01-06-2004 à 20:29:56    

c'est que ces compilos sont ptet à certains point de vue un peu bouseux alors... (et qu'ils partagent un source commun :/ pour certaines parties)


Message édité par bjone le 01-06-2004 à 20:30:08
Reply

Marsh Posté le 01-06-2004 à 20:31:58    

vivelec a écrit :

Disons que l'on tente, dans la mesure du possible d'écrire du code portable, propre, et aux normes implicites du C.
Maintenant, chacun est libre de faire ce qu'il veut avec son compilo.
Je dis juste que si ça marche avec le votre ou gcc, tant mieux.
Mais méfiez-vous, ce n'est absolument pas standard (comme les écritures à la C99).
Il me semble cependant qu'avant de ternir l'image du C, le mieux est de prendre de bonnes habitudes.
Quant à lint, oui, si lint le dit, ton code est pourri.


 
mouef.

Reply

Marsh Posté le 01-06-2004 à 20:33:08    

ça fait bizarre de voir un ~Taz mais qui se plante royalement ...

Reply

Marsh Posté le 01-06-2004 à 20:35:54    

quant au morceau de code que j'ai filé, la comète, il est purement standard

Reply

Marsh Posté le 01-06-2004 à 21:00:16    

Vous en faites ce que vous voulez.
Mais allez dire à même à SUN/HP/IBM (et à leurs clients) que leurs compilos partagent le même code bouseux et merdiques.
Quant à ton morceau de code, désolé, il n'est pas standard :  
- la casse majuscule/minuscule (GetBuffer) est typiquement une winauberie. Tous les noms de fonctions sont obligatoirement en minuscules, le caractère '_' peut être utilisé comme séparateur,
- si la fonction est locale, on rajoute "static" devant, sinon on la préfixe d'un code mnémotechnique sous peine de duplication de noms à l'édition de liens,
- pour retourner un pointeur, code ça en macros,
- je te donne la réponse à ton problème, et visiblement, tu ne comprends pas.

Reply

Marsh Posté le 01-06-2004 à 21:03:46    

il parlait pas de ce code la  !

Reply

Marsh Posté le 01-06-2004 à 21:05:28    

putain, t'es chiant de déblatérer autant, ça tiendra jamais dans une seule fortune :o
 
1) chacun est libre de choisir ses identifiants, du moment que c'est en accord avec la grammaire
2) on mets static si on veut. c'est là une habitude de bon design, pas une obligation
3) c'est crade et personne ne t'oblige à faire ça.
4) c'est toi qui comprends pas que short *** est tout à faire valide
 
 
si t'es si malin, trouve nous un référence poure appuyer ta clownerie

Reply

Marsh Posté le 01-06-2004 à 21:06:20    

désolé je voulais pas être vexant.
 
Taz parlait de ce qu'il avait posté, pas du code de cricri_.
 
la question est de savoir si le standard du C interdit plus de deux niveau de déférencement à la déclaration d'un pointeur.
 
mais franchement, ça me semble plus être une restriction d'implémentation historique. (après tout le monde en a)

Reply

Marsh Posté le 01-06-2004 à 21:06:33    

vivelec a écrit :

on utilise dans ce cas void * [N] qui te permet de rajouter les dimensions attendues.

tiens je l'avais vu celle là :D
alors alors, c'est quoi la taille d'un void ?

Reply

Marsh Posté le 01-06-2004 à 21:07:50    

bjone a écrit :


mais franchement, ça me semble plus être une restriction d'implémentation historique. (après tout le monde en a)

tout simplement parce qu'il y a une instruction assembleur pour le double déréférencement, pas plus. limitation limitante, mais compréhensible

Reply

Marsh Posté le 01-06-2004 à 21:08:08    

LOL et j'ai faillit louper ce fil ^^
 
@vivelec : tu debarque de 1975 ou quoi ??
Le standard à evoluer depusi tu sais [:dawa] et  
franchement c'est ni avec Taz ni avec moi qu'il
faut prendre ce ton hautain et trop sur de soi.


Message édité par Joel F le 01-06-2004 à 21:09:41
Reply

Marsh Posté le 01-06-2004 à 21:16:31    

Essaye ca :
 

Code :
  1. short * buf[2][10];
  2. short *** GetBuffer(void)
  3. {
  4. return( &buf[0]);
  5. }

Reply

Marsh Posté le 01-06-2004 à 21:21:51    

Taz a écrit :

putain, t'es chiant de déblatérer autant, ça tiendra jamais dans une seule fortune :o
 
1) chacun est libre de choisir ses identifiants, du moment que c'est en accord avec la grammaire
2) on mets static si on veut. c'est là une habitude de bon design, pas une obligation
3) c'est crade et personne ne t'oblige à faire ça.
4) c'est toi qui comprends pas que short *** est tout à faire valide
 
 
si t'es si malin, trouve nous un référence poure appuyer ta clownerie


Attends, un forum, c'est avant tout fait pour partager son expérience et non pour donner des leçons.
Chacun est d'ailleurs libre de déblatérer à sa guise.
Je dis simplement que je n'ai jamais vu un short *** passé sur un compilo et ce n'est pas faute d'avoir essayé dans ma jeunesse.
Maintenant, si ça marche chez toi, très bien, je ne demande qu'à connaître ton compilateur et ton OS.
 
En résumé, intellectuellement parlant, un short *** voire plus est tout à fait compréhensible.
Simplement, à la compilation, ce n'est pas une écriture acceptée par tous les compilateurs, donc non portable.
C'est d'ailleurs visiblement, la cause du problème initial.
Quant aux normes, il y en a tellement (parfois contradictoires) qu'il est souvent difficile de s'y retrouver.
Le mieux est donc de se référer aux normes "implicites" et donc, au bon usage du C.

Reply

Marsh Posté le 01-06-2004 à 21:26:03    

non, c'est portable, c'est du C ANSI minimum, du K&R certainement
 
après j'y peut quoi si t'as travailler avec des compilateurs mêmes pas foutu de compiler du C :/
 
y a pas de norme implicite : la norme ANSI c'est la plus répdandue, tu va pas commencer à nous faire le rabat joie parce que tu utilises les produits pourris de je sais pas quelle boîte. on y peut quoi nous si tu fais du C avec des compilateurs pas C

Reply

Marsh Posté le 01-06-2004 à 21:27:35    

vivelec a écrit :


Je dis simplement que je n'ai jamais vu un short *** passé sur un compilo et ce n'est pas faute d'avoir essayé dans ma jeunesse.
Maintenant, si ça marche chez toi, très bien, je ne demande qu'à connaître ton compilateur et ton OS.


 
alors :
Linux Mandrake 9.2,9.1 et 10.0 avec gcc 3.3.1
Windows 2k avec mygwyn 3.3, visual studio 6 et 7
 

vivelec a écrit :


C'est d'ailleurs visiblement, la cause du problème initial.


Non cf ma réponse
 

vivelec a écrit :


Le mieux est donc de se référer aux normes "implicites" et donc, au bon usage du C.


 
Non à la norme ANSI qui va bien voir à la norme C99


Message édité par Joel F le 01-06-2004 à 21:27:53
Reply

Marsh Posté le 01-06-2004 à 21:34:05    

Joel F a écrit :

LOL et j'ai faillit louper ce fil ^^
 
@vivelec : tu debarque de 1975 ou quoi ??
Le standard à evoluer depusi tu sais [:dawa] et  
franchement c'est ni avec Taz ni avec moi qu'il
faut prendre ce ton hautain et trop sur de soi.


Encore une fois, faites ce que vous voulez, mais je vous déconseille simplement ce genre d'écriture.
Quant au ton hauntain et trop sûr de moi, si tu le dis, peut-être, mais je ne vois pas où et dans ce cas-là désolé.
Pour finir, le C a peu évolué depuis 75 ...

Reply

Marsh Posté le 01-06-2004 à 21:34:52    

vivelec a écrit :


Pour finir, le C a peu évolué depuis 75 ...


 
euh .... et le C99 c'est pour la Mére Denis peut etre ??

Reply

Marsh Posté le 01-06-2004 à 21:40:30    

Taz a écrit :

non, c'est portable, c'est du C ANSI minimum, du K&R certainement
 
après j'y peut quoi si t'as travailler avec des compilateurs mêmes pas foutu de compiler du C :/
 
y a pas de norme implicite : la norme ANSI c'est la plus répdandue, tu va pas commencer à nous faire le rabat joie parce que tu utilises les produits pourris de je sais pas quelle boîte. on y peut quoi nous si tu fais du C avec des compilateurs pas C


On ne va pas polémiquer, mais les "n'importe quelles boites" et "produits pourris" que j'ai cités, ont la part belle du monde unix : solaris (sun), hp-ux (hp) et aix (ibm).
Quant aux normes implicites du C, si elles existent.

Reply

Marsh Posté le 01-06-2004 à 21:42:05    

vivelec a écrit :

Pour finir, le C a peu évolué depuis 75 ...

ah bon ? ben tu ferais mieux te renseigner un peu alors. rien que les changements du C99 sont conséquents pour être étudier avec soin. Quant au C ANSI, rien que l'apparition d'une bibliothèque standard, c'est vrai que c'est peu.

Reply

Marsh Posté le 01-06-2004 à 21:42:26    

Joel F a écrit :

euh .... et le C99 c'est pour la Mére Denis peut etre ??


La C99 n'est pas encore admise dans le mode industriel et je doute qu'elle le soit de sitôt.
A bon entendeur ... au cas où tu aurais un code à livrer pour un client.

Reply

Marsh Posté le 01-06-2004 à 21:43:24    

vivelec a écrit :

La C99 n'est pas encore admise dans le mode industriel et je doute qu'elle le soit de sitôt.
A bon entendeur ... au cas où tu aurais un code à livrer pour un client.


 
et oui j'en ai  [:joel f] et ca leur plait bien en plus

Reply

Marsh Posté le 01-06-2004 à 21:43:42    

ah bon, et le noyau Linux, c'est du bidon ?

Reply

Marsh Posté le 01-06-2004 à 21:44:09    

Taz a écrit :

ah bon ? ben tu ferais mieux te renseigner un peu alors. rien que les changements du C99 sont conséquents pour être étudier avec soin. Quant au C ANSI, rien que l'apparition d'une bibliothèque standard, c'est vrai que c'est peu.


Le C ANSI appartient principalement au monde unix.
Passe sous VMS et il n'est plus vraiment question de C ANSI.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed