2010-02-13 19 views
1

J'ai un problème avec le vecteur, (dans l'utilisation de push_back) mais il n'apparaît que lorsque j'utilise un drapeau g ++ supplémentaire -O2 (j'en ai besoin).Vecteur (push_back); g ++ -O2; Erreur de segmentation

#include <cstdio> 
#include <vector> 

typedef std::vector<int> node; 
typedef std::vector<node> graph; 

int main() 
{ 
    int n, k, a, b, sum; 
    bool c; 
    graph g(n, node()); 
    c = scanf("%i%i", &n, &k); 

    for(int i=0; i<n; i++) 
    { 
     sum=2; 
     for(int j=0; j<i; j++) 
      sum*=2; 
     for(int j=0; j<sum; j++) 
     { 
      if(j%2==0) 
       c = scanf("%i", &a); 
      else 
      { 

       c = scanf("%i", &b); 
       a += b; 
       g[i].push_back(a); //---------------LINE WHICH CAUSES SEGMENTATION FAULT 
      } 

     } 
    } 

    for(int i=n-2; i>=0; i--) 
    { 
     for(size_t j=0; j<g[i].size(); j++) 
     { 
      if(g[i+1][(j*2)] >= g[i+1][(j*2)+1]) 
       g[i][j] = g[i+1][j*2]; 
      else 
       g[i][j] = g[i+1][(j*2)+1]; 
     } 
    } 

    printf("%i\n", g[0][0]); 

    return 0; 
} 
+6

Pourquoi utilisez-vous 'n' non initialisé? – AndiDog

Répondre

4

Je pense que vous avez:

graph g(n, node()); 
c = scanf("%i%i", &n, &k); 

dans l'ordre inverse. En l'état, la variable 'n' que vous utilisez pour dimensionner le graphique n'est pas initialisée.

+0

droite, je n'ai pas remarqué :) merci – user85423

3

Initialiser le vecteur avec n avant l'opération d'entrée signifie que vous invoquer le comportement non défini redoutée. Comme indiqué here, le programme est autorisé à faire n'importe quoi après cela.

+0

Isnt n initialisé en ligne: c = scanf ("% i% i", et n, &k); Sinon, comment dois-je faire dans ce cas Merci pour l'aide :) – user85423

+0

@ user85423:? Oui, il est (en supposant que scanf réussisse), mais vous utilisez n * avant * que vous le fassiez. Donc, je suppose que sbi aurait dû dire "Vous n'initialisez pas' n' avant de l'utiliser "au lieu de" Vous jamais ". – sepp2k

+0

@ sepp2k: J'ai corrigé cela pendant que vous ajoutiez votre commentaire. Je n'ai juste pas lu le code plus loin que l'utilisation de la variable non initialisée ... – sbi

2

Fonctionne parfaitement si vous initialisez n comme je l'ai déjà mentionné dans mon commentaire. Remplacez les premières lignes par:

int n, k, a, b, sum; 
int c; 
c = scanf("%i%i", &n, &k); // initialize n *first* 
if(c != 2) return -1; // scanf does not return bool but the number of parsed arguments 
graph g(n, node());