Bonjour,

J'essaie de créer un programme qui convertit les coordonnées géographiques (longitude, latitude) d'une ellipsoïde (la Terre) prise en photo en coordonnées pixels (colonne, ligne).
J'utilise entre autre un tableau 2D tab(longitude, latitude) qui contient dans chaque élément une structure 2D(colonne, ligne) ( parce qu'en convertissant une coordonnée géographique (longitude, latitude), on veut obtenir une coordonnée pixel (colonne, ligne) ).
Mon problème c'est que j'obtiens une erreur lors de l'allocation automatique d'un tableau 2D (pix_coord_tab[nb_lon][nb_lat]), contenant une structure "pixel" (colonne, ligne), si celui-ci devient trop grand :
Le bug "Erreur de segmentation" apparaît dès que le tableau dépasse 1627 * 1627 éléments.
Est-ce que je suis obligé de faire une allocation dynamique pour résoudre ce pb. Parce que dans ce cas, je ne vois pas du tout comment faire. Je sais à la limite faire une allocation dynamique d'un tableau 2D d'un type entier ou flottant mais faire l'allocation dynamique d'un tableau 2D (longitude, latitude) contenant une structure (colonne, ligne) est incompréhensible pour moi.

Je mets, ci-dessous le programme, exécutable, avec essentiellement la partie d'allocation qui crée l'erreur de segmentation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
 
#include <iostream>
#include <string>
#include <fstream>
#include <new>
#include <iomanip>
#include <cstdlib>
#include <cmath>
using namespace std;
 
/* parameters used in the routines as given in Ref. [1] */
const double  PI         =     3.14159265359;
const double  SAT_HEIGHT = 42164.0;     /* distance from Earth centre to satellite     */
const double  R_EQ       =  6378.169;   /* radius from Earth centre to equator         */
const double  R_POL      =  6356.5838;  /* radius from Earth centre to pol             */
const double  SUB_LON    =     0.0;     /* longitude of sub-satellite point in radiant */
const long    CFAC  =  781648343;       /* scaling coefficients (see note above)       */
const long    LFAC  =  781648343;       /* scaling coefficients (see note above)       */
const long    COFF  =        1856;      /* scaling coefficients (see note above)       */
const long    LOFF  =        1856;      /* scaling coefficients (see note above)       */
 
/* function prototypes */
int convert(int column, int row, long COFF, long LOFF, double *latitude, double *longitude);//Cette fonction va servir à convertir les coordonnées géographiques en coordonnées pixels avec l'implémentation de fonctions mathématiques prédéfinies
void deborde();
 
int main(){
 
  set_new_handler(deborde);
  int col=0, row=0;// (col == c == colonne de la coordonnée pixel); (row == r == l == ligne de la coordonnée pixel)
 
  double lon_min=-81.3, lon_max=81.3, resol=0.09, lat_min, lat_max;//bornes de la grille de coordonnées géographique et résolution de cette grille
  short int nb_lon, nb_lat, i, j;//nombre de longitude, nombre de latitude, incrément i et incrément j
 
  double return_lon=0.0, return_lat=0.0;//valeurs de vérification
  struct pix_coord
  {
    short int c;
    short int r;
  };// Structure correspondant à une coordonnée (colonne, ligne) d'un pixel.
  string nom_fichier("coord_translation.txt");//fichier facultatif de stockage des résultats
 
  nb_lon=(short int)(floor(((lon_max-lon_min) / resol) + double(1.5)));// calcul du nombre de longitudes de la grille de coordonnées géographique
  lat_min=lon_min;
  lat_max=lon_max;
  nb_lat=nb_lon;//nombre de latitudes de la grille de coordonnées géographique
 
  double lon[nb_lon]; //Déclaration automatique d'un tableau 1D de type double
  double lat[nb_lat]; //Déclaration automatique d'un tableau 1D de type double
 
cout << "Etape 1 : (nb_lon=" << nb_lon << ", nb_lat=" << nb_lat << ")" << endl;
  pix_coord pix_coord_tab[nb_lon][nb_lat]; //Déclaration automatique d'un tableau 2D de structure contenant une coordonnée (colonne, ligne) pour chaque élément du tableau de coordonnées géographiques (longitude, latitude)
 
 
cout << "Etape 2" << endl;
  short int cpt_colonne_fichier=1;
 
//Les deux boucles avec incréments i et j servent à construire la grille de coordonnées géographique à partir des bornes lat_min, lat_max, lon_min, lon_max prédéfinies et de la résolution voulue (variable resol). Pour chaque coordonnées géographique (longitude, latitude) de la grille, une coordonnée pixel est calculée avec la fonction convert et stockée dans le tableau 2D de structure pix_coord_tab (où pix_coord_tab[i][j].c == colonne de la coordonnée pixel et pix_coord_tab[i][j].r == ligne de la coordonnée pixel)
  for(i = 0; i < nb_lon; i++)
  {
    lon[i]=lon_min + (resol*i);
    for(j = 0; j < nb_lat; j++)
    {
      lat[j]=lat_min + (resol*j);
//      convert(lat[j],lon[i],COFF,LOFF,&col,&row);Inutile (phase test déclaration tableaux)
col=0.0;//test!
row=0.0;//test!
      pix_coord_tab[i][j].c=col;
      pix_coord_tab[i][j].r=row;
    }
  }
/*  ofstream fichier(nom_fichier.c_str(), ios::out | ios::trunc);
  if(fichier) // si l'ouverture a réussi
  {
    for(i = 0; i < nb_lon; i++)
    {
      for(j = 0; j < nb_lat; j++)
      {
        fichier << "(" << lon[i] << "," << lat[j] << ")-->(" << pix_coord_tab[i][j].c << "," << pix_coord_tab[i][j].r << ")";
        if(cpt_colonne_fichier == 6)
        {
          fichier << endl;
          cpt_colonne_fichier=1;
        }
        else
        {
          fichier << "\t";
          cpt_colonne_fichier++;
        }
      }
    }
    fichier.close(); // on referme le fichier
  }
  else
  {
    cerr << "Erreur à l'ouverture du fichier " << nom_fichier << endl;
  }
*/
  return (0);
}
 
void deborde()
{
  cerr << "Memoire insuffisante" << endl << "Abandon de l'execution\n" << endl;
  exit (-1);
}
L'erreur précise de débug qui s'affiche est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Starting program: /dir/test 
Etape 1 : (nb_lon=1808, nb_lat=1808)

Program received signal SIGSEGV, Segmentation fault.
main () at test.cpp:50
50	cout << "Etape 2" << endl;
Missing separate debuginfos, use: debuginfo-install glibc-2.9-2.i686 libgcc-4.3.2-7.i386 libstdc++-4.3.2-7.i386
(gdb) 
(gdb) bt
#0  main () at test.cpp:50
Merci pour votre aide