mini question ! Est ce que ceci est correct?

mini question ! Est ce que ceci est correct? - C - Programmation

Marsh Posté le 22-04-2005 à 12:51:26    

Code :
  1. #include "stdio.h"
  2. int main()
  3. {
  4. short v[20][20][20];
  5. short i=0,j=0,k=0;
  6. printf("entrez les 3\n" );
  7. scanf("%hd",&v[i][j][k]);
  8. return 0;
  9. }


 
je compte juste remplacer les trois 20 par des nbres entrés par l'utilisateur.
 
est ce que mon code permet-il de le faire?

Reply

Marsh Posté le 22-04-2005 à 12:51:26   

Reply

Marsh Posté le 22-04-2005 à 13:06:21    

faudrait alouer la memoire toi meme...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 22-04-2005 à 13:10:13    

je voulais juste un oui ou un non
 
tu as l'art de m'embrouiller toi ;-)
 
tu veux que je fasse un calloc c ca?
pas de prob mais je revois chapitre par chapitre donc je suis pas encore censé employer calloc (on a vu calloc après ca  )
 
donc la réponse  
est oui ou non??est ce que ceci est correct


Message édité par fullnight le 22-04-2005 à 13:11:15
Reply

Marsh Posté le 22-04-2005 à 13:14:43    

question du titre : oui
question du message : non


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 22-04-2005 à 13:30:23    

ok merci
 
et cmt tu veux allouer?


Message édité par fullnight le 22-04-2005 à 13:30:49
Reply

Marsh Posté le 22-04-2005 à 13:49:44    

je compte juste remplacer les trois 20 par des nbres entrés par l'utilisateur.


 
Je voudrais être sûr de comprendre : tu voudrais que la taille de ton tableau varie en fonction du résultat de scanf ?

Reply

Marsh Posté le 22-04-2005 à 13:51:45    

Elmoricq a écrit :

je compte juste remplacer les trois 20 par des nbres entrés par l'utilisateur.


 
Je voudrais être sûr de comprendre : tu voudrais que la taille de ton tableau varie en fonction du résultat de scanf ?


 
c'est exact.

Reply

Marsh Posté le 22-04-2005 à 13:53:11    

Alors tu ne peux pas faire comme ça, il faut effectivement allouer ton tableau dynamiquement.
 
Avec, par exemple, calloc.

Reply

Marsh Posté le 22-04-2005 à 14:01:32    

ok !
 
c juste ke j'étudiais le chapitre sur les vecteur a dimension multiple.
 
le callo c après

Reply

Marsh Posté le 22-04-2005 à 14:15:50    

Si tu veux pas utiliser de calloc, tu peux faire comme ca :  
 
a+
 

Code :
  1. #include "stdio.h"
  2. int main()
  3. {
  4.    short i=0,j=0,k=0;
  5.    printf("entrez les 3\n" );
  6.    scanf("%hd",&i);
  7.    scanf("%hd",&j);
  8.    scanf("%hd",&k);
  9.    short v[i][j][k];
  10.  
  11.    return 0;
  12. }


---------------
-= RAK =-
Reply

Marsh Posté le 22-04-2005 à 14:15:50   

Reply

Marsh Posté le 22-04-2005 à 14:20:02    

tu as essayer de compiler ce code ??
j'ai de gros doute !


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 22-04-2005 à 14:23:02    

oui ca marche bien mais tout depend de ton compilateur c'est vrai


---------------
-= RAK =-
Reply

Marsh Posté le 22-04-2005 à 14:24:28    

ce code contient 9 erreurs mon pote !
 
 
il a peur que tes affectations restent à 0!
alors il panique pour le tableau et pouf voila quoi!


Message édité par fullnight le 22-04-2005 à 14:25:01
Reply

Marsh Posté le 22-04-2005 à 14:27:41    

KangOl a écrit :

tu as essayer de compiler ce code ??
j'ai de gros doute !


 
J'ai eu un doute aussi, et je viens de le compiler (gcc version 2.95.2 sous Solaris).
 
Ca marche, pas un seul warning. Je viens d'apprendre un truc.  
Par contre, je suis pas sûr que ce soit conforme aux normes. Je vais aller vérifier ça.
 
Sinon, sur ce genre de code vaut quand même mieux coller des gardes-fous. ;)


Message édité par Elmoricq le 22-04-2005 à 14:32:02
Reply

Marsh Posté le 22-04-2005 à 14:41:28    

Code :
  1. #include "stdio.h"
  2. int main()
  3. {
  4.    short i=0,j=0,k=0;
  5.    printf("entrez les 3\n" );
  6.    scanf("%hd",&i);
  7.    scanf("%hd",&j);
  8.    scanf("%hd",&k);
  9.    short v[i][j][k];
  10.  
  11.    return 0;
  12. }


 
Ben déjà c'est bizarre qu'il ne dise rien, car en C, tu ne peux déclarer des variables dans une fonction qu'au début de la fonction...
D'autre part, il n'est possible de déclarer un tableau de valeurs qu'avec des tailles (dimensions) CONSTANTES.
 
Donc revoir un peu le code et l'environnement de développement.
 
 
@fullnight> pour arriver à tes fins, tu dois t'intéresser aux notions suivantes : les pointeurs, et les allocations dynamiques de mémoire.


Message édité par farfouille le 22-04-2005 à 14:45:30
Reply

Marsh Posté le 22-04-2005 à 14:44:39    

farfouille a écrit :

Ben déjà c'est bizarre qu'il ne dise rien, car en C, tu ne peux déclarer des variables qu'au début des fonctions...
D'autre part, il est impossible de déclarer un tableau de valeurs sans des dimensions CONSTANTES.
 
Donc revoyez un peu votre code et votre environnement de développement.


 
Eh oui, c'est ce que j'aurais dit il y a dix minutes aussi.
Mais depuis que gcc le compile, même avec le flag -ansi, je doute.
P'têt un truc qui a été ajouté dans la norme ANSI ?
 
Je suis en train de chercher les specs pour vérification.

Reply

Marsh Posté le 22-04-2005 à 15:05:00    

-ansi -pedantic
 
sinon voir C99

Reply

Marsh Posté le 22-04-2005 à 15:06:23    

Ok, j'ai trouvé.
 
Ca date des specs C99 (2000~2001, donc pas si nouveau que ça), et il s'agit des Variable-Length Array (VLA)
 

Citation :


# Variable length arrays(VLA): These are arrays whose size is determined at runtime.  
VLA is a part of C99 standards (ISO/IEC 9899:1999). VLA allows the integer expression delimited by [ and ] in an array declarator to be a variable expression or *. An identifier whose declaration has such an array declarator is a variably modified (VM) type.


 
Bon, va falloir que je plonge dans ces specs pour découvrir toutes les nouveautés que je connaissais pas :)
 
 
EDIT : ah tiens, warnings avec -pedantic... pourquoi ? pas encore complètement implémenté ?


Message édité par Elmoricq le 22-04-2005 à 15:10:00
Reply

Marsh Posté le 22-04-2005 à 15:13:01    

je répète
 
 
9 erreurs avec ton code !!
avec microsoft visual c++ 6.0


Message édité par fullnight le 22-04-2005 à 15:13:17
Reply

Marsh Posté le 22-04-2005 à 15:14:28    

fullnight a écrit :


9 erreurs avec ton code !!
avec microsoft visual c++ 6.0


 
 
Erreurs ou warnings ?
(je connais pas ce compilo)

Reply

Marsh Posté le 22-04-2005 à 15:19:24    

Meme si cette methode marche ( a essayer quand meme en -Wall -ansi -pedantic en effet) c est vraiment crade.
 
Le malloc n'est vraiment pas difficile a utiliser et il permet d etre rigoureux dans ses allocations.

Reply

Marsh Posté le 22-04-2005 à 15:24:43    

shurik'n a écrit :

Meme si cette methode marche ( a essayer quand meme en -Wall -ansi -pedantic en effet) c est vraiment crade.


 
Pourquoi "crade" ?
Si c'est utilisé à bon escient, et convenablement commenté, je ne vois pas en quoi c'est plus sale qu'un malloc ?
Reste ensuite à voir, par contre, les temps d'exécution... déjà qu'un malloc c'est long.
 

shurik'n a écrit :

Le malloc n'est vraiment pas difficile a utiliser et il permet d etre rigoureux dans ses allocations.


 
Là-dessus, je suis d'accord (même si beaucoup devraient apprendre le sens du mot "rigueur"... j'ai rencontré de drôles de trucs dans des programmes)
 
 
Mais ça ne répond pas à ma question : pourquoi ça passe avec -ansi, et pas avec -pedantic ? (-Wall passe, c'est le premier truc que j'ai testé après avoir vu que ça compilait :D )


Message édité par Elmoricq le 22-04-2005 à 15:24:56
Reply

Marsh Posté le 22-04-2005 à 15:27:10    

tu connais pas ce compilo? lol VC++ 6.0
 
c pas de warning que je parle
g clairement écrit 9 erreurs !
 
http://membres.lycos.fr/zonefullnight/dwarf.JPG


Message édité par fullnight le 22-04-2005 à 15:29:42
Reply

Marsh Posté le 22-04-2005 à 15:28:28    

fullnight a écrit :

tu connais pas ce compilo? lol VC++ 6.0


 
Je le connais de nom, mais j'ai jamais bossé dessus.
Pardon de travailler sous Unix.
 
 

fullnight a écrit :

c pas de warning que je parle
g clairement écrit 9 erreurs !


 
Sauf erreur, c'est parce que ton compilateur ne respecte pas les dernières normes ANSI.
Corrigez-moi si je me trompe (je ne le connais pas)
Ceci dit, c'est pas plus mal : ça va te faire travailler les allocations dynamiques, et c'est une notion fondamentale.


Message édité par Elmoricq le 22-04-2005 à 15:29:31
Reply

Marsh Posté le 22-04-2005 à 15:30:40    

malloc bordel :fou: :o [:pingouino]

Reply

Marsh Posté le 22-04-2005 à 15:30:57    

je n'ai nul besoin de travailler les alloc avec cet exercice.
dans ce chapitre je suis " censé ne connaitre QUE "  
 
comprends tu :)
 
je relis tout mon cours, et c'est justement en " rencontrant ce problème " que découle le chapitre suivant ===> l'allocation dynamique de la mémoire.


Message édité par fullnight le 22-04-2005 à 15:31:30
Reply

Marsh Posté le 22-04-2005 à 15:31:19    

mais c'est quoi ce cours de MERDE o-O

Reply

Marsh Posté le 22-04-2005 à 15:31:22    

Elmoricq a écrit :

Pourquoi "crade" ?
Si c'est utilisé à bon escient, et convenablement commenté, je ne vois pas en quoi c'est plus sale qu'un malloc ?
Reste ensuite à voir, par contre, les temps d'exécution... déjà qu'un malloc c'est long.


 
J'avoue que le malloc prend beaucoup plus de temps machine mais il permet de bien savoir ce que l'on fait (j alloue n cases, dans chaques case je defini un pointeur vers m cases que j'alloue etc ...) c est plus hierarchique et plus commentable qu une declaration de 20 tableaux de 20 tableaux de 20 short en une seule fois.

Reply

Marsh Posté le 22-04-2005 à 15:32:06    

shurik'n a écrit :

J'avoue que le malloc prend beaucoup plus de temps machine mais il permet de bien savoir ce que l'on fait (j alloue n cases, dans chaques case je defini un pointeur vers m cases que j'alloue etc ...) c est plus hierarchique et plus commentable qu une declaration de 20 tableaux de 20 tableaux de 20 short en une seule fois.


malloc ne prend pas du temps machien, on n'est plus sur des PDP11 :o 20x20x20x2 -> 15Ko ....

Reply

Marsh Posté le 22-04-2005 à 15:32:13    

The -ansi option does not cause non-ISO programs to be rejected
gratuitously.  For that, -pedantic is required in addition to -ansi.
 
-pedantic
Issue all the warnings demanded by strict ISO C and ISO C++; reject
all programs that use forbidden extensions, and some other programs
that do not follow ISO C and ISO C++.  For ISO C, follows the ver-
sion of the ISO C standard specified by any -std option used.

 
man gcc  :o


Message édité par push le 22-04-2005 à 15:32:58
Reply

Marsh Posté le 22-04-2005 à 15:35:46    

Joel F a écrit :

malloc ne prend pas du temps machien, on n'est plus sur des PDP11 :o 20x20x20x2 -> 15Ko ....


 
Malloc est tres couteux je t assure, on a fait pas mal de tests dessus , il est conseillé de l eviter des que cela est possible (quand on connait la taille a allouer et qu on ne souhaite pas y toucher apres)

Reply

Marsh Posté le 22-04-2005 à 15:36:23    

o_O heu la je dis : nah ...

Reply

Marsh Posté le 22-04-2005 à 15:36:33    

shurik'n a écrit :

J'avoue que le malloc prend beaucoup plus de temps machine mais il permet de bien savoir ce que l'on fait (j alloue n cases, dans chaques case je defini un pointeur vers m cases que j'alloue etc ...) c est plus hierarchique et plus commentable qu une declaration de 20 tableaux de 20 tableaux de 20 short en une seule fois.


 
Je pense (à mon humble avis, chacun à ses habitudes de coding) que c'est tout à fait commentable si pas utilisé n'importe comment (comme n'importe quoi en C, d'ailleurs).
 
Par contre l'intérêt est clairement plus limité qu'avec malloc, ça c'est évident. Je me vois pas faire du semi-dynamique sans malloc :D
Mais je trouve que ça peut être sympathique à utiliser pour des cas simples.

Reply

Marsh Posté le 22-04-2005 à 15:37:15    

Joel F a écrit :

o_O heu la je dis : nah ...


 
Euh, si, malloc c'est assez gourmand.
 
 

push a écrit :

The -ansi option does not cause non-ISO programs to be rejected
gratuitously.  For that, -pedantic is required in addition to -ansi.
 
-pedantic
Issue all the warnings demanded by strict ISO C and ISO C++; reject
all programs that use forbidden extensions, and some other programs
that do not follow ISO C and ISO C++.  For ISO C, follows the ver-
sion of the ISO C standard specified by any -std option used.

 
man gcc  :o


 
Oui merci, j'ai le même.
Seulement quand on lit la suite :

Citation :


Valid ANSI standard C programs should compile  properly with or without this option (though a rare few will re-quire `-ansi').  However, without this option,  certain GNU extensions and traditional C features are supported as well.  With this option, they are  rejected.


 
Et on est, a priori, bien dans le cas d'une fonctionnalité spécifiée dans la norme ANSI...  
Ou alors j'ai rien capté.


Message édité par Elmoricq le 22-04-2005 à 15:39:58
Reply

Marsh Posté le 22-04-2005 à 15:38:05    

mais bordel vous travailler sur quoi ? et surtout comment ?

Reply

Marsh Posté le 22-04-2005 à 15:39:38    

un truc que je pige pas a mon propre code
quand je fais
scanf("%hd",&v[i][j][k]);  
 
il n'y a qu'un seul formateur ==> %hd
 
alors comment ca se fait que j'arrive a remplir TROIS var !! (i,j et k)
 
de + pourquoi DOIS JE mettre  &
 
je sais bien que scanf a besoin d'une adresse      
mais...
s'agit il bien d'une adresse quand je fais ceci &v[i][j][k] ??
 
de quelle adresse s'agit il??

Reply

Marsh Posté le 22-04-2005 à 15:42:02    

faut que tu revois tes pointeurs toi...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 22-04-2005 à 15:43:46    

fullnight a écrit :

un truc que je pige pas a mon propre code
quand je fais
scanf("%hd",&v[i][j][k]);  
 
il n'y a qu'un seul formateur ==> %hd
 
alors comment ca se fait que j'arrive a remplir TROIS var !! (i,j et k)


 
Ca ne remplit pas trois variables, ça renseigne ce qui se trouve dans le tableau 'v' aux positions 'i', 'j' et 'k' (ici, v[0][0][0] est renseigné).
 

fullnight a écrit :

de + pourquoi DOIS JE mettre  &
 
je sais bien que scanf a besoin d'une adresse      
mais...
s'agit il bien d'une adresse quand je fais ceci &v[i][j][k] ??
 
de quelle adresse s'agit il??


 
C'est l'adresse de la case du tableau 'v' à la position (0,0,0).

Reply

Marsh Posté le 22-04-2005 à 15:44:22    

Comme ça a été dit, les VLA font parti du standard C99. Donc c'est utilisable .|
Ceci dit, 99, c'etait y a déjà un moment, et le fait est que la mayonnaise ne prends pas :(
 
pour les 9 erreurs : VC6 date de 98, donc n'implémente pas C99 ...

Reply

Marsh Posté le 22-04-2005 à 15:49:55    

Elmoricq>
 
-ansi
In C mode, support all ISO C90 programs.  In C++ mode, remove GNU
extensions that conflict with ISO C++.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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