[C] Taille d'un tableau d'int ?

Taille d'un tableau d'int ? [C] - C - Programmation

Marsh Posté le 20-11-2003 à 10:30:51    

Bonjour,
je cherche a trouver la taille d'un tableau de integer, mais je n'ai, pour l'instant, trouver aucune solution!
 
int tab[10];
printf("%i",*****(tab));
 
J'ai essayé sizeof(tab), mais ca ne marche pas totalement!

Reply

Marsh Posté le 20-11-2003 à 10:30:51   

Reply

Marsh Posté le 20-11-2003 à 10:34:52    

sizeof tab / sizeof tab[0]

Reply

Marsh Posté le 20-11-2003 à 10:35:02    

ben t'es peinard, y'a pas de solution

Reply

Marsh Posté le 20-11-2003 à 10:36:06    

sizeof(int)*10 ??


Message édité par black_lord le 20-11-2003 à 10:37:25
Reply

Marsh Posté le 20-11-2003 à 10:36:12    

mesta a écrit :

Bonjour,
je cherche a trouver la taille d'un tableau de integer, mais je n'ai, pour l'instant, trouver aucune solution!
 
int tab[10];
printf("%i",*****(tab));
 
J'ai essayé sizeof(tab), mais ca ne marche pas totalement!
 


 
Tu ne peux trouver la taille d'un tableau que si le compilateur connait cette taille : on parle donc uniquement des tableaux de taille fixe définis en tant que variables globales ou locale.

Reply

Marsh Posté le 20-11-2003 à 10:38:02    

lol chrisbk.
 
Cela marche:
int tab_[7]={2,9,3,65,1,32,87};
printf("%i\n",sizeof(tab_)/4);
 
Mais bon ce n'est pas le top.. si quelqu'un a une autre idée, elle serait la bienvenue?

Reply

Marsh Posté le 20-11-2003 à 10:39:25    

Kristoph a écrit :


 
Tu ne peux trouver la taille d'un tableau que si le compilateur connait cette taille : on parle donc uniquement des tableaux de taille fixe définis en tant que variables globales ou locale.

moi pas. Ça fonctionne avec les vla du C99

Reply

Marsh Posté le 20-11-2003 à 10:40:08    

mesta a écrit :

lol chrisbk.
 
Cela marche:
int tab_[7]={2,9,3,65,1,32,87};
printf("%i\n",sizeof(tab_)/4);
 
Mais bon ce n'est pas le top.. si quelqu'un a une autre idée, elle serait la bienvenue?

putain c'est qui le maître de la cat
vous m'écoutez bordel :o

Reply

Marsh Posté le 20-11-2003 à 10:41:22    

mesta a écrit :

lol chrisbk.
 
Cela marche:
int tab_[7]={2,9,3,65,1,32,87};
printf("%i\n",sizeof(tab_)/4);
 
Mais bon ce n'est pas le top.. si quelqu'un a une autre idée, elle serait la bienvenue?


taz a donné la reponse, mais elle ne marche qu'avec les trucs alloués statiquement :O (eg si jamais plus tard tu fais du malloc oublie tout de suite cette methode)
 
dans l'absolu il te vaut mieux prendre l'habitude de programmer en partant du principe que tu ne peux pas retrouver la taille de ton tableau (bref fo la stocker qqpart)

Reply

Marsh Posté le 20-11-2003 à 10:41:58    

J'ai essayé Taz mais ca ne marche pas

Reply

Marsh Posté le 20-11-2003 à 10:41:58   

Reply

Marsh Posté le 20-11-2003 à 10:42:23    

chrisbk a écrit :


taz a donné la reponse, mais elle ne marche qu'avec les trucs alloués statiquement :O (eg si jamais plus tard tu fais du malloc oublie tout de suite cette methode)


 
qu'avec les tableaux.
 

chrisbk a écrit :


dans l'absolu il te vaut mieux prendre l'habitude de programmer en partant du principe que tu ne peux pas retrouver la taille de ton tableau (bref fo la stocker qqpart)


sauf quand justement tu as un tableau

Reply

Marsh Posté le 20-11-2003 à 10:42:34    

mesta a écrit :

J'ai essayé Taz mais ca ne marche pas

on parie ?


Message édité par Taz le 20-11-2003 à 10:42:40
Reply

Marsh Posté le 20-11-2003 à 10:42:40    

Ok je vais me dermerder alors, merci les mecs ;)

Reply

Marsh Posté le 20-11-2003 à 10:43:06    

Taz a écrit :

on parie ?


 
Si je te le dis c'est que j'ai testé...

Reply

Marsh Posté le 20-11-2003 à 10:44:27    

mesta a écrit :


 
Si je te le dis c'est que j'ai testé...

mais bien sur ... est moi j'ai appris le C ce matin ... pas très sérieux tout ça quand même
 
 
pour ceux qui ne croit pas à C99
 

Code :
  1. #include <stdio.h>
  2. static size_t size(size_t n)
  3. {
  4.   int tab[n];
  5.   return sizeof tab / sizeof tab[0];
  6. }
  7. int main()
  8. {
  9.   unsigned n;
  10.   scanf("%u", &n);
  11.   printf("%u\n", size(n));
  12. }

Reply

Marsh Posté le 20-11-2003 à 10:46:57    

Taz a écrit :


qu'avec les tableaux.


 
Restons sobre et vulgarisons, la difference pointeur/tableau est pour bpc completement tenue, et ceci n'est aidé en rien par ce qu'autorise le C, genre :

Code :
  1. int a[10];
  2. int *b = a;


 
De plus, partout ou ca va causer de malloc ca va causer de "tableau alloué dynamiquement", achevant de semer doute et confusion.
Donc tu peux etre sur de voir des trucs genre :
 

Code :
  1. int *a = malloc(4 * sizeof(int));
  2. int t = sizeof(a) / sizeof(int);


 
bref je prefere laisser ces pinaillages grammaticaux de coté


Message édité par chrisbk le 20-11-2003 à 10:47:47
Reply

Marsh Posté le 20-11-2003 à 10:50:11    

chrisbk a écrit :


 
Restons sobre et vulgarisons, la difference pointeur/tableau est pour bpc completement tenue,  


 
c'est bien la le problème

chrisbk a écrit :


et ceci n'est aidé en rien par ce qu'autorise le C, genre :

Citation :

int a[10];
int *b = a;




 
int[10] est un type distinct.
 
qui se rend compte qu'il y a une conversion ici ?
 

chrisbk a écrit :


De plus, partout ou ca va causer de malloc ca va causer de "tableau alloué dynamiquement", achevant de semer doute et confusion.
Donc tu peux etre sur de voir des trucs genre :
 

Code :
  1. int *a = malloc(4 * sizeof(int));
  2. int t = sizeof(a) / sizeof(int);


 
bref je prefere laisser ces pinaillages grammaticaux de coté  


 
c'est loin d'être un truc de grammaire. t'as un pointeur, le résultat de sizeof est ce qu'il doit etre, t'as un tableau, il est ce qu'il doit etre.
 
au fait
 
sizeof variable
sizeof(type)

Reply

Marsh Posté le 20-11-2003 à 10:53:35    

Est-ce bien cela que je dois avoir donc:
 
void taille(int tab[]) {
return sizeof tab / sizeof tab[0];
}

Reply

Marsh Posté le 20-11-2003 à 10:55:48    

non absolument pas ...
 
déjà ça compile pas
 
mais int tab[] est un notation équivalent à int * const tab qui a pour effet qu'on indique au lecteur l'emploi qu'on va faire du pointeur
 
 
la seule solution est donc une macro

Reply

Marsh Posté le 20-11-2003 à 10:56:18    

Taz a écrit :


qui se rend compte qu'il y a une conversion ici ?


 
Peros quand j'ai débuté en C on m'a matraqué que "nom du tableau seul" etait le pointeur vers le premier element. Vazy pour voir une conversion, la dedans. (ce qui faisait que d'un point de vue implem je croyais que j'avais effectivement un pointeur, faisant tout merder mon bel asm inline)
 

Citation :

c'est loin d'être un truc de grammaire. t'as un pointeur, le résultat de sizeof est ce qu'il doit etre, t'as un tableau, il est ce qu'il doit etre.


 
Vi mais un malloc sera decrit comme un "tableau alloué dynamiquement" (y'a tableau dans ma phrase la, donc si on le replace dans la tienne ca devrait marcher) et ca va engendre moulte confusion, c'est tout ce que je voulais dire (a la fin [:sisicaivrai])
 
 

Taz a écrit :


sizeof variable
sizeof(type)


tiens je savais pas, sizeof(variable) est tjs passé comme une lettre a la poste

Reply

Marsh Posté le 20-11-2003 à 10:58:57    

Ya pas un moyen de trouver lcette taille en faisant :  
 
int i=0;
while (tab[i]!='\0')
{ ... }  
 
Ca marche ca?

Reply

Marsh Posté le 20-11-2003 à 11:00:21    

ben le problème est bien l'enseigement en fait ...
 
quand tu fais
 
int tab[10];
int *p = tab;
 
ton compilo fait en fait
 
int *p = &tab[0]
 
ce qui est correctement typé.
 
pour la confusion vient du fait qu'on ne distingue pas tableau et pointeur, donc apres on s'etonne que ça marche ou pas et on se braque tout pointeur, jusqu'au jour ou ...
j'ai filé des cours cet été à la fac, suffit de bien marquer la différence, tu enseignes d'abord les tableaux sans parler de pointeur, puis les pointeurs, et ça passe très bien
 
le parenthésage pour sizeof c'est pour des histoire à la con que tu peux appeler une varaible comme un nom de type ... bordélique quoi

Reply

Marsh Posté le 20-11-2003 à 11:00:44    

mesta a écrit :

Ya pas un moyen de trouver lcette taille en faisant :  
 
int i=0;
while (tab[i]!='\0')
{ ... }  
 
Ca marche ca?

non. t'as pas cours aujourd'hui ?

Reply

Marsh Posté le 20-11-2003 à 11:01:12    

mesta a écrit :

Ya pas un moyen de trouver lcette taille en faisant :  
 
int i=0;
while (tab[i]!='\0')
{ ... }  
 
Ca marche ca?


 
erf erf erf erf
alors deja '\0' = 0
et un int egal a 0, ca n'a rien d'un ovni
 
ce que tu decris la c'est la representation standart en C d'une chaine de caractere, absolument rien d'autre !
 
 
 
 
 
 

Reply

Marsh Posté le 20-11-2003 à 11:06:10    

Chris: '\0'=0 ok :D
 
Taz: Non et c'est bien pour cela que je vous demande a vous!
 
Je vais vous montrer le programme que je dois faire, peut etre que comme ca vous aurez une idée (tout est simplifié):
 

Code :
  1. int degre(int tab[]) {
  2. [ Ici je veux la fonction pour trouver la taille du tableau ]
  3. }
  4. main()
  5. {
  6. printf("Taille du tableau: " );
  7. scanf("%i",&deg);
  8. int tab[deg];
  9. int deg=degre(tab);
  10. }


 
Je veux trouver le degre du polynome sans passer deg en parametre. Est-ce donc possible?


Message édité par mesta le 20-11-2003 à 11:06:48
Reply

Marsh Posté le 20-11-2003 à 11:08:50    

>[ Ici je veux la fonction pour trouver la taille du tableau ]
 
Y'a pas. Question suivante

Reply

Marsh Posté le 20-11-2003 à 11:09:08    

je te dis que quand tu écris
 
  int degre(int tab[]) {
    [ Ici je veux la fonction pour trouver la taille du tableau ]
  }
 
 
tab n'est pas un tableau et qu'on ne peux pas passer un tableau en paramètre puisqu'un tableau n'est pas une lvalue et que le C n'accepte que le passage par valeur

Reply

Marsh Posté le 20-11-2003 à 11:11:02    

Je dois pourtant faire une fonction qui me renvoie la taille d'un tableau :( Est-ce impossible?


Message édité par mesta le 20-11-2003 à 11:11:33
Reply

Marsh Posté le 20-11-2003 à 11:11:46    

ça l'est

Reply

Marsh Posté le 20-11-2003 à 11:12:30    

lol vive le C .. c'est bien merdique quand même :(
 
Merci quand même :)
 
ps: sinon en declarement autrement la fonction int degre(****) il n'y a pas une solution?


Message édité par mesta le 20-11-2003 à 11:13:17
Reply

Marsh Posté le 20-11-2003 à 11:12:58    

c'est rustre, le C

Reply

Marsh Posté le 20-11-2003 à 11:14:27    

ps: sinon en declarement autrement la fonction int degre(****) il n'y a pas une solution?

Reply

Marsh Posté le 20-11-2003 à 11:14:57    

de toutes façons ton programme ne sera pas valide, je doute qu'on t'enseigne le C99 mais plutot le C ANSI

Reply

Marsh Posté le 20-11-2003 à 11:15:08    

int degre(int []tableau, int tailleTableau)

Reply

Marsh Posté le 20-11-2003 à 11:19:36    

Je crois que je vais laisser tomber.. il ne prend pas int degre(int []tableau, int tailleTableau)!

Reply

Marsh Posté le 20-11-2003 à 11:20:17    

chris va faire du Java :o
 
int degre(int tableau[], size_t tailleTableau);


Message édité par Taz le 20-11-2003 à 11:20:28
Reply

Marsh Posté le 20-11-2003 à 11:21:40    

lol ca m'avance pas plus Taz :)

Reply

Marsh Posté le 20-11-2003 à 11:22:43    

pourquoi ?

Reply

Marsh Posté le 20-11-2003 à 11:22:43    

Taz a écrit :

chris va faire du Java :o
 
int degre(int tableau[], size_t tailleTableau);


 
sclair, chui tout contaminé par le java :/

Reply

Marsh Posté le 20-11-2003 à 11:24:55    

Taz a écrit :

pourquoi ?


 
Pour continuer la fonctio.. que mettre dedans :/

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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