Visualizzazione risultati 1 fino 5 di 5

Discussione: [C#] Segfault popolando un array

  1. #1
    L'avatar di Saturnix
    Saturnix non è connesso Utente attivo
    Data registrazione
    11-04-2006
    Messaggi
    462

    Predefinito [C#] Segfault popolando un array

    Ciao a tutti,

    avrei bisogno di una mano con il seguente script. Come potete vedere, attraverso l'uso di atoi(argv[1, 2, 3, 4, ecc...]) estraggo vari long long int da linea di comando. Assumendo che il secondo sarà sempre maggiore del primo, creo un array delle dimensioni specificate dall'intervallo tra questi due numeri.

    Codice PHP:
    if (argc != 5) {
    printf("ERROR: You must provide 3 integers and a txt!\n");
    return
    1;
    }

    long long int z = atoi(argv[1]);
    long long int b = atoi(argv[2]);
    long long int c = atoi(argv[3]);
    long long int sum = 0;
    long long int i, p, m;


    long long int tmp1 = z;
    long long int tmp2 = b;
    long long int tmp3 = c;

    char *userFile = argv[4];

    // B > Z
    long long int numbers[b-z];
    Il problema giunge ora, quando cerco di popolare l'array con tutti i valori e mi becco il seg fault:

    Codice PHP:
    for (i=0; tmp1<=tmp2; i++, tmp1++) {

    numbers[i] = tmp1;
    }
    il resto dello script mi è costato notti insonni e mi è impossibile usarlo a causa di questo stupidissimo bug che non riesco a scovare. Aiuto!

    Grazie,
    J.

    EDIT:

    mi son dimenticato: se fornisco allo script un input semplice funziona ("/a.out 0 12 123 a" ad esempio va) ma appena uso un numero grande non va più: ("/a.out 12 2345672 123 a" è dove mi da il problema).
    Ultima modifica di Saturnix : 23-05-2011 alle ore 23.56.07
    Saturnix

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,752

    Predefinito

    Premetto che il c# non l'ho mai usato (e non lo conosco minimamente).

    Comunque, prova a sostituire "<=" con "<" nel for.
    Un esempio:

    Mettiamo che tmp2=2 e tmp1=1. L'array verrà dimensionato di una cella (numbers[1]), mentre il ciclo viene eseguito 2 volte: 1<=2 e 2<=2, andando a scrivere in una cella non allocata.

    Però è strano, perché questo errore lo dovrebbe fare anche con numero piccoli. Quindi, prova (per sicurezza ^^) a stampare z e b, per vedere se l'atoi() converte bene i numeri molto grandi.

    @binary: infatti anche a me sembra C!.. è identico (a parte il fatto di dichiarare le variabili dopo il codice, che non lo fa sembrare ANSI C...

    Ciao!
    Ultima modifica di alemoppo : 24-05-2011 alle ore 10.30.48

  3. #3
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Più che C# mi sembra C

    atoi converte le stringhe in INTEGER e quindi la stringa non può essere più grande di 32767
    Probabilmente ti va in errore nel cast.
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  4. #4
    L'avatar di Saturnix
    Saturnix non è connesso Utente attivo
    Data registrazione
    11-04-2006
    Messaggi
    462

    Predefinito

    Citazione Originalmente inviato da binarysun Visualizza messaggio
    Più che C# mi sembra C

    atoi converte le stringhe in INTEGER e quindi la stringa non può essere più grande di 32767
    Probabilmente ti va in errore nel cast.
    Grande, non lo sapevo! Però nel resto dello script il numero arriva intatto ugualmente, indipendentemente dalla sua dimensione (lo verifico inserendo "printf" ogni tanto).
    Saturnix

  5. #5
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Se vuoi i numeri fra B e Z inclusi gli estremi devi dichiarare
    Codice PHP:
    long long int numbers[b-z+1];
    e.g. da 5 a 10 ci sono sei numeri: 5 6 7 8 9 10

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •