Erreur de segmentation - C

Fermé
corentin.93 Messages postés 1737 Date d'inscription dimanche 20 mai 2007 Statut Membre Dernière intervention 19 décembre 2015 - 27 sept. 2012 à 14:22
 Utilisateur anonyme - 27 sept. 2012 à 16:54
Bonjour

J'ai un petit souci dans un programme en C. Je veux passer un tableau à deux dimensions (char**) à une fonction qui lui alloue dynamiquement de la mémoire, mais lorsque j'essaie de lire dans ce tableau via une autre fonction, ou par le main, il me donne un erreur de segmentation.

Voici le code :
Fichier du main
#include <stdio.h>
#include "fonctions.h"
#define TAILLEG 10


int main(){
	int i,j;
	char **tabJ1Bat;

	initTab(tabJ1Bat, TAILLEG);	
	//il semble que l'erreur vienne de l'appel à cette fonction   
	affTab(tabJ1Bat, TAILLEG);

	return 0;
}


Fichier des fonctions
#include <stdlib.h>
#include <stdio.h>
#define EAU '~'

void initTab(char **tab, int taille){
	int i,j;
	tab = (char**) calloc (taille,sizeof(char*));
	for(i=0;i<taille;i++)
	{
		tab[i]=(char*)calloc(taille,sizeof(char));
		for(j=0;j<taille;j++)
		{
			tab[i][j] = EAU;
		}
	}
}

void affTab(char **tab, int taille){
	int i,j;
	char car;
	for(i=0;i<taille;i++)
	{
		for(j=0;j<taille;j++)
		{
			car = tab[i][j];
			printf("%c",car);
		}
	}
}


Merci d'avance de votre aide!

3 réponses

Utilisateur anonyme
27 sept. 2012 à 15:13
Bonjour

Tu aimes bien te torturer, on dirait ^^.
Il y a longtemps que je n'ai pas fait de C, mais à vue de nez :
La variable tab que tu initialises dans initTab est une variable locale à la fonction initTab. Donc ses modifications ne sont pas "remontées" à la variable tabJ1Bat du main, donc tu appelles affTab avec un pointeur non initialisé.

D'où les modifications :

#include <stdafx.h>
#include <stdio.h>
#include <stdlib.h>

#define TAILLEG 10

#define EAU '~'

void initTab(char ***tab, int taille){
	int i,j;
	*tab = (char**) calloc (taille,sizeof(char*));
	for(i=0;i<taille;i++)
	{
		(*tab)[i]=(char*)calloc(taille,sizeof(char));
		for(j=0;j<taille;j++)
		{
			(*tab)[i][j] = EAU;
		}
	}
}

void affTab(char **tab, int taille){
	int i,j;
	char car;
	for(i=0;i<taille;i++)
	{
		for(j=0;j<taille;j++)
		{
			car = tab[i][j];
			printf("%c",car);
		}
    printf("\n");
	}
}

int main(){
	int i,j;
	char **tabJ1Bat;

	initTab(&tabJ1Bat, TAILLEG);	
	//il semble que l'erreur vienne de l'appel à cette fonction   
	affTab(tabJ1Bat, TAILLEG);

	return 0;
}
2
corentin.93 Messages postés 1737 Date d'inscription dimanche 20 mai 2007 Statut Membre Dernière intervention 19 décembre 2015 250
27 sept. 2012 à 15:21
Tout d'abord, MERCI (pas à sparw, hein).

On est bien d'accord que c'est inutile de passer les tableaux par référence, non ? Mais bon, notre prof nous a demandé de faire ainsi...
0
Profil bloqué
27 sept. 2012 à 15:33
C'est pas Epitech ton école toi ^^
0
Utilisateur anonyme
27 sept. 2012 à 15:36
On est bien d'accord que c'est inutile de passer les tableaux par référence,
Attention, tu ne passes aucun tableau ici, seulement des pointeurs. Ce n'est pas la même chose.
Quant à l'utilité de passer une variable par référence ou non, ça ne dépend pas du fait que c'est un tableau ou autre chose : ça dépend du fait que tu veux modifier ta variable ou non.
Ton exemple est tellement tordu que je me demande si c'est bien ça que ton prof attendait. Je me suis basé uniquement sur ce que tu avais écrit.
0
corentin.93 Messages postés 1737 Date d'inscription dimanche 20 mai 2007 Statut Membre Dernière intervention 19 décembre 2015 250
27 sept. 2012 à 15:39
En gros, ce que je voulais faire, c'était déclarer un tableau à 2 dimensions dans le main, puis le passer à une fonction qui va lui allouer dynamiquement de la mémoire, et le remplir (on fait une sorte de bataille navale en fait).
0
Utilisateur anonyme
27 sept. 2012 à 15:47
Dans le main, tu as déclaré un pointeur sur un pointeur sur char : ce n'est pas un tableau à deux dimensions.
0
corentin.93 Messages postés 1737 Date d'inscription dimanche 20 mai 2007 Statut Membre Dernière intervention 19 décembre 2015 250
27 sept. 2012 à 15:48
Et il ne peut pas être utilisé comme tel ?
0
Profil bloqué
27 sept. 2012 à 15:07
j'aurais bien voulus aider mais la c'est coder trop sale il me faudrait 1h pour comprendre ton code ^^
-1