Partage

Problème avec un char[][][]

impossible de vérifier si les cases sont vide

Sujet résolu
Le 20 février 2012 à 20:22:22

Bonjours,
Je vais vous embetez un peu mais j'ai un problème ^^
J'ai un char de type :
char infod[200][12][1024] = {{NULL}};

Je voudrais a un moment vérifiez si les cases :

infod[i*5][0]
infod[(i*5)+1][0]
infod[(i*5)+2][0]
infod[(i*5)+3][0]
infod[(i*5)+4][0]

sont egal à NULL. j'ai donc fais cela :

if(infod[i*5][0] != NULL && infod[(i*5)+1][0] != NULL && infod[(i*5)+2][0] != NULL && infod[(i*5)+3][0] != NULL && infod[(i*5)+4][0] != NULL)
        {
                bas = 0;
        }
        else
        {
            bas = 1;
            down = IMG_Load("down0.png");
        }


Mais la fonction if est toujours vrai !
auriez vous une idée ?

PS : la fonction if répond oui si elle ne trouve aucun "NULL" mais c'est la même chose ^^
N'essayez pas de devenir un homme qui a du succès. Essayez de devenir un homme qui a de la valeur.
Publicité
Le 20 février 2012 à 20:22:22
Le 20 février 2012 à 20:29:40

Comment remplis tu ton tableau?
as tu fait un printf de ton tableau?
un char ne se teste pas a NULL mais à '\0'
Si tu testes une seul char (pas une chaine quoi!)alors c'est infod[i*5][0][0]
** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
Le 20 février 2012 à 20:33:08

Heu, t'as pas oublié la 3e dimension quelque part ?

Selon moi, infod[X][Y] ne sera jamais null, car il y a l'adresse d'un tableau supplementaire derriere (d'apres ta declaration statique).
Le 20 février 2012 à 20:36:20

Merci :) sa marche :) j'ai fait comme sa du coup :
if(infod[i*5][0][0] != '\0' && infod[(i*5)+1][0][0] != '\0' && infod[(i*5)+2][0][0] != '\0' && infod[(i*5)+3][0][0] != '\0' && infod[(i*5)+4][0][0] != '\0')
        {
                bas = 0;
        }
        else
        {
            bas = 1;
            down = IMG_Load("down0.png");
        }
N'essayez pas de devenir un homme qui a du succès. Essayez de devenir un homme qui a de la valeur.
Le 20 février 2012 à 20:41:11

Ton tableau est à 3 dimensions, donc infod[a][b] est un pointeur sur un tableau de 1024 octets, puisque c'est un tableau de char . Le tableau ayant été déclaré, les pointeurs du type infod[a][b] sont a priori non NULL (sauf si ta mémoire est saturée, ce qui est peu probable, à moins que tu aies d'autres programmes ultra voraces qui tournent en même temps.

Salut à toi.
Le 21 février 2012 à 1:07:00

Citation : Claude_le_Lorrain

Ton tableau est à 3 dimensions, donc infod[a][b] est un pointeur sur un tableau de 1024 octets, puisque c'est un tableau de char.


Pas exactement.

L'objet infod[a][b] est un tableau de 1024 char.

Et, sauf exception, l'expression infod[a][b] est automatiquement convertie en un pointeur de char (et pas un pointeur de tableau) sur le char initial du tableau de 1024 char.
Le 21 février 2012 à 2:26:41

Le C est langage procédural donc parler "d'objet" est légèrement hors de propos.

infod[a][b] est un pointeur sur le première élément du tableau de 1024 char ce qui est différent de dire qu'il s'agissent d'un tableau de char:

http://www.siteduzero.com/tutoriel-3-3 [...] urs-en-c.html
Le 21 février 2012 à 9:07:42

Non, je crois que c'est bien un tableau. Pas d'ordi sous la main, mais je pense qu'en prenant son adresse on peut le passer comme *(char[1024]) à une fonction.
Le 21 février 2012 à 9:47:05

Citation : florent m

Le C est langage procédural donc parler "d'objet" est légèrement hors de propos.


C'est la terminologie de la norme C.

Citation : florent m

infod[a][b] est un pointeur sur le première élément du tableau de 1024 char ce qui est différent de dire qu'il s'agissent d'un tableau de char:
http://www.siteduzero.com/tutoriel-3-3 [...] urs-en-c.html


Je connais mon tutoriel, merci.

EDIT:
char infod[200][12][1024]; défini un tableau de 200 tableaux de 12 tableaux de 1024 char. Donc,
infod est un tableau de tableaux de tableaux de char.
infod[1] est un tableau de tableaux de char.
infod[1][1] est un tableau de char.
infod[1][1][1] est un char.
C'est simple finalement.
Le 21 février 2012 à 11:56:46

C'est la deuxième fois que je fait le con à retourner le rédacteur du Tutorial sur sont propre Tutorial, désoler^^.

Bon par contre on est d’accord pour dire que ceci est faux:

Citation

L'objet infod[a][b] est un tableau de 1024 char



Vu la déclaration:
char infod[200][12][1024]


C'est bien un pointeur sur le premier élément du tableau ?

Même sans parler du mots objet que personnellement je réserve pour les langages objets...
Le 21 février 2012 à 13:21:45

Citation : florent m

C'est bien un pointeur sur le premier élément du tableau ?


Non.

Essaie:
#include <stdio.h>
	
char infod[200][12][1024];
	
int main(void) {
	printf("%zu\n", sizeof infod);
	printf("%zu\n", sizeof infod[0]);
	printf("%zu\n", sizeof infod[0][0]);
	printf("%zu\n", sizeof infod[0][0][0]);
	return 0;
}

Et cela affiche:
$ gcc -Wall c.c
$ ./a.out
2457600
12288
1024
1
Le 21 février 2012 à 14:45:23

Bonjour à tous,
Je me suis mal exprimé (l'informatique demande à être précis et rigoureux), infod[a][b] est bien un pointeur sur un caractère qui est le premier (indice 0) d'un tableau de 1024 caractères, ce que j'avais un peu trop réduit.
Bonne continuation à malfrax et à tous ses aides.
Le 28 février 2012 à 15:17:25

Tout dépend de ce que tu appelles pointeur. Dans le microprocesseur, les tableaux n'existent pas. Les tableaux sont donc tous des pointeurs, une fois compilés. Ce qui nous intéresse, c'est ce que ça représente dans l'abstraction du langage. Dans cette abstraction, infod[a][b] est un TABLEAU de 1024 caractères, qui peut bien sûr être casté implicitement en pointeur, comme tous les tableaux.
Le 28 février 2012 à 15:35:15

Citation : Hugooguh

Tout dépend de ce que tu appelles pointeur. Dans le microprocesseur


En C, il n'y a pas de microprocesseur.
Le 28 février 2012 à 16:11:54

Justement... :-°
Le 28 février 2012 à 16:35:13

Citation : Hugooguh

Justement... :-°


Donc pour ce qu'on appelle pointeur, seule la norme C compte.

Citation : C99 §6.2.5.20

A pointer type may be derived from a function type, an object type, or an incomplete type, called the referenced type. A pointer type describes an object whose value provides a reference to an entity of the referenced type. A pointer type derived from the referenced type T is sometimes called ‘‘pointer to T’’.



Et pour les tableaux :

Citation : C99 §6.2.5.20

An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type. Array types are characterized by their element type and by the number of elements in the array. An array type is said to be derived from its element type, and if its element type is T, the array type is sometimes called ‘‘array of T’’.


Rien à voir avec les pointeurs.
Le 28 février 2012 à 16:40:49

On est d'accord. Il ne faut pas confondre ce qui peut se passer au niveau de l'ordinateur, et au niveau du langage, parce que ça n'a rien a voir.

Problème avec un char[][][]

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown