[RESOLU] tab multidimensionel en paramètre d'une fonction

tab multidimensionel en paramètre d'une fonction [RESOLU] - C - Programmation

Marsh Posté le 09-10-2006 à 20:27:02    

Bonjour !!
 
Je souhaite passer l'adresse d'un tableau multidimensionnel en paramètre d'une fonction pour que celle-ci puisse le modifier...
Mais voilà ça ne passe pas à la compilation : "invalid use of array with unspecified bounds"
 
Voici le script qui pose pb :  
 
 
#include <stdio.h>
#include <string.h>
 
void initTab(char* tab[][])
{
     tab[0][0] = "yooo";
     tab[0][1]="yo";
}
 
int main()
{
    char* tab[5][2];
    int i;
    for(i = 0; i < NB; i++)
    {
          tab[i][0] = malloc(5*sizeof(char));
          tab[i][1] = malloc(3*sizeof(char));
    }
 
    initTab(tab);
}
 
D'après la compilation l'erreur provient des 2 lignes de la fonction initTab..., le reste passe sans problème...
 
Merci pour votre aide !!

Message cité 1 fois
Message édité par teufeur2lest le 09-10-2006 à 22:10:40
Reply

Marsh Posté le 09-10-2006 à 20:27:02   

Reply

Marsh Posté le 09-10-2006 à 22:10:14    

Héhé, ben finalement je m'en suis sorti tout seul !
 
apparemment, lorqu'on passe un tableau à 2dimensions en paramètre d'une fonction, on est obligé de dire qu'elle est la taille de la deuxième dimension dans le prototype de la fonction...
 
ainsi en rajoutant void initTab(char* tab[][2]) ca passe à la compil...
 
merci quand-même!

Reply

Marsh Posté le 11-10-2006 à 01:15:22    

aahhhhhh!!!!!! c'est quoi ce truc???
 
heu normalement quand tu passes un tableau à une fonction, tu passes juste func(char*** tab,int n, int p) : l'adresse de ton tableau et ses dimensions si elles sont variables (mais ici tu t'en fous).
(à la limite tu dois pouvoir passer : "char* tab[0][0]" qui devrait revenir au même mais c'est pas très joli)
 
et autre chose, on n'a pas le droit de faire : tab[0][0]="truc"
l'affectation d'une chaine ne se fait que lors de la déclaration, par exemple : char *chaine="machaine"
mais jamais :
   char *chaine;
   chaine="machaine"
ca ne marche pas (réfléchis aux types des objets)
utiliser la fonction strcpy(ch1,ch2) me semble pour copier une chaine
 
voila

Reply

Marsh Posté le 11-10-2006 à 06:24:01    

teufeur2lest a écrit :

Héhé, ben finalement je m'en suis sorti tout seul !
 
apparemment, lorqu'on passe un tableau à 2dimensions en paramètre d'une fonction, on est obligé de dire qu'elle est la taille de la deuxième dimension dans le prototype de la fonction...
 
ainsi en rajoutant void initTab(char* tab[][2]) ca passe à la compil...


 
C'est normal - Il faut que le compilo connaisse la taille de la première dimension pour qu'il puisse calculer "tab[x][y]". Faut pas oublier qu'en mémoire tu n'as qu'une seule dimension et tout se fait par calcul. Donc si tu veux atteindre l'élément "tab[x][y]", le compilo calculera que c'est la case "c[x * taille dimension1 + y]"
 
D'une façon plus générale, si tu as un tableau de dimension "n", tu es obligé de dire à ta fonction la taille des "n - 1" premières...
 

teufeur2lest a écrit :


#include <stdio.h>
#include <string.h>
 
void initTab(char* tab[][])
{
     tab[0][0] = "yooo";
     tab[0][1]="yo";
}
 
int main()
{
    char* tab[5][2];
    int i;
    for(i = 0; i < NB; i++)
    {
          tab[i][0] = malloc(5*sizeof(char));
          tab[i][1] = malloc(3*sizeof(char));
    }
 
    initTab(tab);
}



Bon, t'as l'air débutant. Quand tu postes un code, rajoute les balises "fixed" ou "cpp" devant le code, cela permet de le formater dans un affichage plus lisible. Il te suffit de mettre "[ F I X E D ]" (sans les espaces) devant le code et "[ / F I X E D ]" après le code (ou "cpp" qui te donnera un affichage syntaxiquement coloré)
 
Maintenant, je vois pas trop ce que tu cherches à faire. Comme le dit DarWog, quand tu manipules une chaîne comme "yooo", tu ne manipules que l'adresse de la zone mémoire où elle commence. Donc si tu écris

char toto[5];
toto="yooo";


Tu n'auras pas "toto[0]='y', toto[1]='o', toto[2]='o', etc..." comme tu voudrais mais tu auras "toto[0]=adresse de la zone mémoire statique où a été rangé la chaîne "yooo", et toto[1], toto[2], toto[3] et toto[4]=n'importe quoi". D'ailleurs le compilo refusera car il ne comprendras pas que tu cherches à mettre l'adresse d'un char (donc un "char étoile" ) dans un "char"...
 
En fait, il faut bien que tu saches qu'en C, le type "chaine de caractère" n'existe pas donc tu ne peux pas le manipuler comme tu le ferais avec des int ou des char. Tout ce que tu peux manipuler, c'est l'adresse de la zone mémoire où se trouve le premier caractère de cette chaîne. Et à partir de cette adresse, tu peux passer à l'adresse suivante où se trouve le second caractère puis la suivante où se trouve le 3° etc jusqu'à ce que t'aies traité toute la chaîne. Et pour t'arrêter, il te suffit de chercher le caractère de valeur '\0' qui est là pour ça.
Ex: si t'écris
 Si tu écris

if ("hello" == "hello" )


Ben malgré la logique apparente, ce test sera faux parce que tu ne compares que 2 adresses différentes, chacune de ces 2 adresses ayant peut-être le même contenu mais n'étant pas à la même place...


Message édité par Sve@r le 11-10-2006 à 06:44:21

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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