Stampa vettore errata

di il
3 risposte

Stampa vettore errata

Salve a tutti,
programmo in c/c++ da qualche anno tramite la scuola sono abbastanza capace quindi non sono proprio un principiante. Oggi mi si è presentato un problema assurdo e pensando che fosse colpa del codice troppo lungo e che quindi poteva contenere errori, ho riscritto solo la parte che mi dava problemi e continua a darmene.
Il codice è questo:
#include <iostream>

int main()
{
    freopen("input.txt","r",stdin);
    int n,collegamenti;
    scanf("%d%d",&n,&collegamenti);
    int i,primo[n],secondo[n];

    for(i=0; i<collegamenti; i++)
    {
        scanf("%d",&primo[i]);
        scanf("%d",&secondo[i]);
    }
    for(i=0; i<collegamenti; i++)
    {
        printf("primo:%d secondo:%d\n",primo[i],secondo[i]);
    }
    fclose(stdin);
}
il file di input contiene:
6 10
1 2
3 3
5 4
4 5
1 5
3 8
3 1
5 7
2 2
3 2
Insomma nulla di difficile, riempe i vettori e li stampa. E invece no.
Con i=0 mi stampa primo:2 secondo 2: (invece di primo:1 secondo:2), con i=1 mi stampa primo:2 secondo:3 e poi da i=2 fino alla fine del ciclo i valori sono regolari.
Da che dipende una cosa del genere? Ho perso circa 4 ore oggi per implementare l'algoritmo di djistra su dei vettori sballati rispetto agli originali e non capivo perchè non andava quando il codice era giusto. Estratto questo pezzo ho capito che era qui il problema, ma qual è con precisione? Per quale arcano motivo mi deve alterare solo i primi 2 valori del vettore primo[n] ?

Grazie in anticipo per le risposte

3 Risposte

  • Re: Stampa vettore errata

    Non ho capito ...

    Dimensioni i vettori con 6 elementi e ne leggi 10 ?
  • Re: Stampa vettore errata

    Oh mamma che errore stupido.. mi sto vergognando di me stesso..

    La cosa strana è che avevo fatto un ciclo per trovare l'errore e stampavo primo[0] 10 volte e lo stampava correttamente 8 volte mentre per la 9 e la 10 mi stampava un valore sballato. Probabilmente questo mi ha fatto credere che ci fosse chissà quale problema... bah..

    grazie per avermi fatto notare questa grande c*****a..
  • Re: Stampa vettore errata

    Infatti, oregon ha trovato il bug. Resta l'osservazione che il compiler, invece di produrre una bella eccezione, impone silenziosamente "valori sbagliati".

    Il motivo è che i due vettori risiedono in stack, ed uno dopo l'altro. Quindi, se il primo vettore va "un po' oltre", si ritrova nel territorio del secondo vettore:

    Input.txt (con valori piu' chiari):
        6 10
        102 202
        103 203
        104 204
        105 205
        106 206
        107 207
        108 208
        109 209
        110 210
        111 211
    Output:
    primo:210 secondo:202  <<<<<<<<< 210
    primo:211 secondo:203  <<<<<<<<< 211
    primo:104 secondo:204
    primo:105 secondo:205
    primo:106 secondo:206
    primo:107 secondo:207
    primo:108 secondo:208
    primo:109 secondo:209
    primo:110 secondo:210
    primo:111 secondo:211
Devi accedere o registrarti per scrivere nel forum
3 risposte