Renvoie de tableau par valeur d'une fonction

Fermé
Linquisiteur - 7 mai 2013 à 11:42
 Linquisiteur - 7 mai 2013 à 21:48
Bonjour, je crée un programme permettant de crée x rectangle et les faire bouger dans un tableau allant de [0 a 201][0 à 201] (-100 a 100 car il s'agira d'un tableau avec des abscisses et ordonnées.

J'ai commencer la 1er grosse fonction de mon programme qui doit me permettre de construire mes rectangles et les placer dans ma structure de rectangle mais voila de nombreuse erreurs de compilation arrivent. J'ai réussie à toute les résoudres sauf 2 qui concerne le renvoi de tableau par valeur d'une fonction. J'avais déjà fait par adresse mais sans succès par valeur :(

Je n'ai pas encore réussie à le compiler et faire des tests donc il est possible que l'erreur proviennent de l'algorithme.

Je cherche aussi à faire du multifichier avec un .h mais je ne sais pas comment faire, cela me permettra de rendre mon code source plus clair

bash-2.05$ gcc lab.c -o lab
lab.c: In function 'PriseDesCoordonnees':
lab.c:57: warning: function returns address of local variable
lab.c: In function 'ConstruireRectangle':
lab.c:99: error: wrong type argument to increment
lab.c:100: error: invalid initializer


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

#define NB_LIGNE 201
#define NB_COLONNE 201

struct rectangle {
//Maximum 10 rectangles!
  int longueur[10];
  int largeur[10];
  int aire[10];
  int premier_x[10];
  int premier_y[10];
  int second_x[10];
  int second_y[10];
  int nb_rectangle;
};
typedef struct rectangle Srectangle;

void RemplirTab(char tab[NB_LIGNE][NB_COLONNE]) {
     int i;
     for(i=0; i < NB_LIGNE; i++) {
          int j;
          for (j=0; j < NB_COLONNE; j++){
              tab[i][j]=' ';
          }
     }
}

int* PriseDesCoordonnees(){
	int point[4]={101,101,101,101};
	puts("Veuillez donner les coordonnées des 2 points opposées de votre rectangle");
	puts("\n 1er point:");
	
	while (point[0]<-100 || point[0]>100){
	puts("Entrez l'abscisse(x) du 1er point compris entre 0 et 99");
		scanf("%d", &point[0]);
	}
	
	puts("Entrez l'ordonnee(y) du 1er point compris entre 0 et 99");
	while (point[1]<-100 || point[1]>100){
		scanf("%d", &point[1]);
	}
	
	
	puts("\n 2eme point:");
	
	while (point[2]<-100 || point[2]>100 || point[2]==point[0]){
		puts("Entrez l'abscisse(x) du 2eme point compris entre 0 et 99 et de position différente du 1er");
		scanf("%d", &point[2]);
	}
	
	while (point[3]<-100 || point[3]>100 || point[3]==point[1]){
		puts("Entrez l'ordonnee(y) du 2eme point compris entre 0 et 99 et de position différente du 1er");
		scanf("%d", &point[3]);
	}
 return point;
}

void CreerStructure(int point[]){
	Srectangle rect;
	int abscisse, ordonnee;
	
	/* Abscisse*/
	if (point[0]<0 || point[2]<0){	
		if (point[0]<0 && point[2]>=0) abscisse= point[0]-point[2];
		if (point[0]>=0 && point[2]<0) abscisse= point[2]-point[0];
		else abscisse= point[0]+point[2];
		abscisse= abscisse*(-1);
	}
	else {
		if (point[0] < point[2]) abscisse=point[2]-point[0];
		else abscisse=point[0]-point[2];
	}
	
	/* Ordonnee */
	if (point[0]<0 || point[2]<0){	
		if (point[0]<0 && point[2]>=0) ordonnee= point[0]-point[2];
		if (point[0]>=0 && point[2]<0) ordonnee= point[2]-point[0];
		else ordonnee= point[0]+point[2];
		ordonnee= ordonnee*(-1);
	}
	else {
		if (point[0] < point[2]) ordonnee=point[2]-point[0];
		else ordonnee=point[0]-point[2];
	}
	printf("longueur = %d largeur = %d\n", abscisse, ordonnee);
	rect.longueur[rect.nb_rectangle]=abscisse;
	rect.largeur[rect.nb_rectangle]=ordonnee;
	rect.aire[rect.nb_rectangle]=abscisse*ordonnee;
	rect.premier_x[rect.nb_rectangle]=point[0];
	rect.premier_y[rect.nb_rectangle]=point[1];
	rect.second_x[rect.nb_rectangle]=point[2];
	rect.second_y[rect.nb_rectangle]=point[3];
}

void ConstruireRectangle(){
	Srectangle rect;
	rect.longueur=rect.longueur++;
	int point[4]=PriseDesCoordonnees();
	CreerStructure(point);
}

int main (void){   
   
  char grille[NB_LIGNE][NB_COLONNE];
  RemplirTab(grille);
  char choix;   
  int fin;   
  while (fin!=1){   
  printf("\033[H\033[2J");   
  printf("\nModelisation de fichier");   
  printf("\n---------------------\n\n");   
  printf("\tA Construire un rectangle.\n");
  printf("\tB Bouger un rectangle.\n");   
  printf("\tC Vérifier si un point se trouve à l'interieur d'un rectangle \n");
  printf("\tD Afficher les information d'un rectangle. \n");   
  printf("\tE Comparer deux rectangles en fonction de leur aire. \n");    
  printf("\tF Rechercher une aire d'un rectangle.\n");
  printf("\tF Recherche si deux rectangle sont intersectés\n");
  
  printf("\tQ - Quitter.\n");   

  printf("\n\tEntrez votre choix:\n\n ");   
  scanf("%c", &choix);   
     
   if (choix=='A' || choix == 'a') {  
		ConstruireRectangle(); // Toute les informations sur le rectangle lors de ça création est entrer ici
	}   

   if (choix=='B' || choix == 'b') {   
     
    }   
     
   if (choix=='C' || choix == 'c') {   
  
    }   
    
   if (choix=='D' || choix == 'd') {   
      
   }   
      
   if (choix=='E' || choix == 'e') {   
   
   }
   
   if (choix=='F' || choix == 'f') {   
  
   }   
    
   if (choix=='Q' || choix=='q') break;   
   }   

 return 0;   
 }

A voir également:

1 réponse

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 7/05/2013 à 14:35
Salut,

1. lab.c:57: warning: function returns address of local variable

Tu ne peux pas faire "return point;" à la fin de ta fonction alors que "point" est un tableau local à ta fonction.

En faisant cela tu tentes de passer un pointeur vers le premier élément du tableau "point", alors que l'emplacement mémoire occupé par "point" n'est plus alloué.

2. lab.c:99: error: wrong type argument to increment

Tu ne peux pas faire "rect.longueur = rect.longueur++;" car "rect.longueur" est un tableau de 10 entiers. Qu'essayes-tu d'incrémenter ?

3. lab.c:100: error: invalid initializer

Tu ne peux pas faire "int point[4] = PriseDesCoordonnees();" en partie pour les mêmes raisons que celles expliquées en 1. et en partie aussi parce qu'en C, tu ne peux pas utiliser = pour affecter le contenu d'un tableau à un autre tableau.

En C, on ferrait :

    int point[4];  
    PriseDesCoordonnees(point);

puis

void PriseDesCoordonnees(int point[4])  
{  
    /* au lieu de int point[4] =  
     { 101, 101, 101, 101 }; */  
    point[0] = point[1] = point[2] = point[3] = 101;  

    /* suite de ton code */  

    /* pas de return nécessaire pour que la fonction   
     * appelante obtienne les valeurs de point */  
}

Dal
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
7 mai 2013 à 15:35
Ou tu peux aussi déclarer "PriseDesCoordonnees" ainsi, pour opérer de la même façon :

void PriseDesCoordonnees(int point[])

ou

void PriseDesCoordonnees(int * point)

Mais tu masques de l'information sur ce que devrait contenir "point". C'est une affaire de style.


Dal
0
Linquisiteur
7 mai 2013 à 19:52
Merci, j'ai réussi a le compiler mais une fois que j'ai la longueur et la largeur j'ai un segmentation fault

Donc en fait je cherche à enregistrer les informations de mon rectangle dans le record en fonction du xeme rectangle que je crée. Si je crée mon 1er rectangle nb_rectangle=1, etc
        rect.longueur[rect.nb_rectangle]=abscisse;
	rect.largeur[rect.nb_rectangle]=ordonnee;
	rect.aire[rect.nb_rectangle]=abscisse*ordonnee;
	rect.premier_x[rect.nb_rectangle]=point[0];
	rect.premier_y[rect.nb_rectangle]=point[1];
	rect.second_x[rect.nb_rectangle]=point[2];
	rect.second_y[rect.nb_rectangle]=point[3];
}


Je reçois un segmentation fault. Je n'ai pas le droit d'écrire comme cela?
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
7 mai 2013 à 21:46
L'erreur "segmentation fault" signifie que tu tentes d'accéder à une zone de mémoire non allouée.


Dal
0
Linquisiteur
7 mai 2013 à 21:48
Oui merci :) j'ai embêter les 2eme année pour qu'ils m'aident à trouver l'erreur.
J'ai pas mal modifier mon code mais j'ai quand même appris pas mal de mes erreurs ^^
0