Renvoie de tableau par valeur d'une fonction
Linquisiteur
-
Linquisiteur -
Linquisiteur -
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
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:
- Renvoie de tableau par valeur d'une fonction
- Tableau word - Guide
- Fonction si et - Guide
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Imprimer tableau excel sur une page - Guide
1 réponse
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 :
puis
Dal
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
ou
Mais tu masques de l'information sur ce que devrait contenir "point". C'est une affaire de style.
Dal
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?
Dal
J'ai pas mal modifier mon code mais j'ai quand même appris pas mal de mes erreurs ^^