Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    11

    problema di segmentation fault

    Ciao a tutti!

    Sono nuova del forum. Sto scrivendo un codice che mi permetta di creare tre vettori T0, T1, T2 di dimensioni n ciascuno.

    Per ognuno di essi, parto generando due distinti array di valori random, rispettivamente tra (0,p) e tra (0,n).

    In seguito, ricavo T0, T1, T2, andando a moltiplicare, la prima volta, il primo valore del primo array con il primo elemento elevato alla zero del secondo array; la seconda volta, il secondo valore del primo array, con il secondo del secondo array, elevato alla prima; la terza volta, il terzo valore del primo array con il terzo valore elevato alla seconda del secondo array; ed infine, la quarta volta, il quarto valore del primo array con il quarto valore,elevato alla terza, del secondo array.
    Faccio la somma dei quattro valori ricavati e colloco il risultato nella prima posizione del vettore che sto costruendo in quel momento, tra T0, T1, T2.
    Ripeto l'operazione andando a scorrere gli array.

    Il codice che mi esegue quanto spiegato sopra è il seguente:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>


    main(){

    //parametri:

    unsigned long long p = pow(2, 33)-1;
    unsigned long long n = pow(2, 32);


    // array per T0:
    unsigned long long aa[p];
    unsigned long long ab[n];

    //array per T1:
    unsigned long long ac[p];
    unsigned long long ad[n];


    //array per T2:
    unsigned long long ae[p];
    unsigned long long af[n];


    unsigned long long T0[n];
    unsigned long long T00[n];
    unsigned long long T01[n];
    unsigned long long T02[n];
    unsigned long long T03[n];

    unsigned long long T1[n];
    unsigned long long T10[n];
    unsigned long long T11[n];
    unsigned long long T12[n];
    unsigned long long T13[n];

    unsigned long long T2[n];
    unsigned long long T20[n];
    unsigned long long T21[n];
    unsigned long long T22[n];
    unsigned long long T23[n];


    srand(time(NULL));

    // calcolo di T0

    int ia; //genero le ai



    for(ia=0; ia< p; ia++) {

    aa[ia] = rand() % p + 1; // aa[] è il vettore che contiene i valori di a0,a1,...,an

    // printf("aa[ia]=%llu\n", aa[ia]);

    }


    int ib; // genero le xi

    for(ib=0 ; ib< n ; ib++) {

    ab[ib] = rand() % n + 1; // ac[] è il vettore che contiene il vettore x0,...,xn

    // printf("ab[ib]=%llu\n", ab[ib]);
    }



    int ic;

    for (ic=0; ic< n; ic++){


    T00[ic]= aa[ic] * (abs(floor(pow(ab[ic], 0)))) % p;
    T01[ic]= aa[ic+1] * (abs(floor(pow(ab[ic], 1)))) % p;
    T02[ic]= aa[ic+2] * (abs(floor(pow(ab[ic], 2)))) % p;
    T03[ic]= aa[ic+3] * (abs(floor(pow(ab[ic], 3)))) % p;

    T0[ic] = T00[ic] + T01[ic] + T02[ic] + T03[ic];
    }

    int id;

    for(id=0; id< n; id++){

    printf("T0[id]=%llu\n", T0[id]);

    }





    // calcolo di T1

    int ie;

    for(ie=0; ie< p; ie++){

    ac[ie]= rand() % p +1;
    // printf("ac[ie]=%llu\n", ac[ie]);
    }

    int ig;

    for(ig=0; ig< n; ig++){

    ad[ig]= rand() % n +1;
    // printf("ad[ig]=%llu\n", ad[ig]);

    }




    int ih;

    for (ih=0; ih< n; ih++){


    T10[ih]= ac[ih] * (abs(floor(pow(ad[ih], 0)))) % p;
    T11[ih]= ac[ih+1] * (abs(floor(pow(ad[ih], 1)))) % p;
    T12[ih]= ac[ih+2] * (abs(floor(pow(ad[ih], 2)))) % p;
    T13[ih]= ac[ih+3] * (abs(floor(pow(ad[ih], 3)))) % p;

    T1[ih]= T10[ih] + T11[ih] + T12[ih] + T13[ih];
    }

    int ii;

    for(ii=0; ii< n; ii++){

    printf("T1[ii]=%llu\n", T1[ii]);

    }





    // calcolo di T2

    int il;

    for(il=0; il< p; il++){

    ae[il]= rand() % p +1;
    // printf("ae[il]=%llu\n", ae[il]);
    }

    int im;

    for(im=0; im< n; im++){

    af[im]= rand() % n +1;
    // printf("af[im]=%llu\n", af[im]);

    }


    int in;

    for (in=0; in< n; in++){


    T20[in]= ae[in] * (abs(floor(pow(af[in], 0)))) % p;
    T21[in]= ae[in+1] * (abs(floor(pow(af[in], 1)))) % p;
    T22[in]= ae[in+2] * (abs(floor(pow(af[in], 2)))) % p;
    T23[in]= ae[in+3] * (abs(floor(pow(af[in], 3)))) % p;

    T2[in]= T20[in] + T21[in] + T22[in] + T23[in];

    }

    int io;

    for(io=0; io< n; io++){

    printf("T2[io]=%llu\n", T2[io]);

    }
    }


    Compilo con linux:
    # gcc -c prova.c
    # gcc -c prova.c -o prova.o -lm
    #gcc -o prova.exe prova.o -lm
    #./prova.exe

    E viene fuori 'Segmentation fault'!

    Sareste così gentili da dirmi dove e cosa sbaglio?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    bunvenuta.. visto che sei nuova ti esorto a leggere il regolamento perchè manca il linguaggio nel titolo e il codice tra tag CODE

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    11

    [C]problema di segmentation fault

    Riscrivo il messaggio lasciato prima con le correzioni, grazie per le dritte:

    Ciao a tutti!

    Sono nuova del forum. Sto scrivendo un codice in C che mi permetta di creare tre vettori T0, T1, T2 di dimensioni n ciascuno.

    Per ognuno di essi, parto generando due distinti array di valori random, rispettivamente tra (0,p) e tra (0,n).

    In seguito, ricavo T0, T1, T2, andando a moltiplicare, la prima volta, il primo valore del primo array con il primo elemento elevato alla zero del secondo array; la seconda volta, il secondo valore del primo array, con il secondo del secondo array, elevato alla prima; la terza volta, il terzo valore del primo array con il terzo valore elevato alla seconda del secondo array; ed infine, la quarta volta, il quarto valore del primo array con il quarto valore,elevato alla terza, del secondo array.
    Faccio la somma dei quattro valori ricavati e colloco il risultato nella prima posizione del vettore che sto costruendo in quel momento, tra T0, T1, T2.
    Ripeto l'operazione andando a scorrere gli array.

    Il codice che mi esegue quanto spiegato sopra è il seguente:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    
    
    main(){
    
    //parametri:
    
    unsigned long long p = pow(2, 33)-1;
    unsigned long long n = pow(2, 32);
    
    
    // array per T0:
    unsigned long long aa[p];
    unsigned long long ab[n];
    
    //array per T1:
    unsigned long long ac[p];
    unsigned long long ad[n];
    
    
    //array per T2:
    unsigned long long ae[p];
    unsigned long long af[n];
    
    
    unsigned long long T0[n];
    unsigned long long T00[n];
    unsigned long long T01[n];
    unsigned long long T02[n];
    unsigned long long T03[n];
    
    unsigned long long T1[n];
    unsigned long long T10[n];
    unsigned long long T11[n];
    unsigned long long T12[n];
    unsigned long long T13[n];
    
    unsigned long long T2[n];
    unsigned long long T20[n];
    unsigned long long T21[n];
    unsigned long long T22[n];
    unsigned long long T23[n];
    
    
    srand(time(NULL));
    
    // calcolo di T0
    
    int ia; //genero le ai
    
    
    
    for(ia=0; ia< p; ia++) {
    
    aa[ia] = rand() % p + 1; // aa[] è il vettore che contiene i valori di a0,a1,...,an
    
    // printf("aa[ia]=%llu\n", aa[ia]);
    
    }
    
    
    int ib; // genero le xi
    
    for(ib=0 ; ib< n ; ib++) {
    
    ab[ib] = rand() % n + 1; // ac[] è il vettore che contiene il vettore x0,...,xn
    
    // printf("ab[ib]=%llu\n", ab[ib]);
    }
    
    
    
    int ic;
    
    for (ic=0; ic< n; ic++){
    
    
    T00[ic]= aa[ic] * (abs(floor(pow(ab[ic], 0)))) % p;
    T01[ic]= aa[ic+1] * (abs(floor(pow(ab[ic], 1)))) % p;
    T02[ic]= aa[ic+2] * (abs(floor(pow(ab[ic], 2)))) % p;
    T03[ic]= aa[ic+3] * (abs(floor(pow(ab[ic], 3)))) % p;
    
    T0[ic] = T00[ic] + T01[ic] + T02[ic] + T03[ic];
    }
    
    int id;
    
    for(id=0; id< n; id++){
    
    printf("T0[id]=%llu\n", T0[id]);
    
    }
    
    
    
    
    
    // calcolo di T1
    
    int ie;
    
    for(ie=0; ie< p; ie++){
    
    ac[ie]= rand() % p +1;
    // printf("ac[ie]=%llu\n", ac[ie]);
    }
    
    int ig;
    
    for(ig=0; ig< n; ig++){
    
    ad[ig]= rand() % n +1;
    // printf("ad[ig]=%llu\n", ad[ig]);
    
    }
    
    
    
    
    int ih;
    
    for (ih=0; ih< n; ih++){
    
    
    T10[ih]= ac[ih] * (abs(floor(pow(ad[ih], 0)))) % p;
    T11[ih]= ac[ih+1] * (abs(floor(pow(ad[ih], 1)))) % p;
    T12[ih]= ac[ih+2] * (abs(floor(pow(ad[ih], 2)))) % p;
    T13[ih]= ac[ih+3] * (abs(floor(pow(ad[ih], 3)))) % p;
    
    T1[ih]= T10[ih] + T11[ih] + T12[ih] + T13[ih];
    }
    
    int ii;
    
    for(ii=0; ii< n; ii++){
    
    printf("T1[ii]=%llu\n", T1[ii]);
    
    }
    
    
    
    
    
    // calcolo di T2
    
    int il;
    
    for(il=0; il< p; il++){
    
    ae[il]= rand() % p +1;
    // printf("ae[il]=%llu\n", ae[il]);
    }
    
    int im;
    
    for(im=0; im< n; im++){
    
    af[im]= rand() % n +1;
    // printf("af[im]=%llu\n", af[im]);
    
    }
    
    
    int in;
    
    for (in=0; in< n; in++){
    
    
    T20[in]= ae[in] * (abs(floor(pow(af[in], 0)))) % p;
    T21[in]= ae[in+1] * (abs(floor(pow(af[in], 1)))) % p;
    T22[in]= ae[in+2] * (abs(floor(pow(af[in], 2)))) % p;
    T23[in]= ae[in+3] * (abs(floor(pow(af[in], 3)))) % p;
    
    T2[in]= T20[in] + T21[in] + T22[in] + T23[in];
    
    }
    
    int io;
    
    for(io=0; io< n; io++){
    
    printf("T2[io]=%llu\n", T2[io]);
    
    }
    }
    Compilo con linux:
    $ gcc prova.c -o prova -lm
    $./prova

    E viene fuori 'Segmentation fault'!

    Sareste così gentili da dirmi dove e cosa sbaglio?

    Grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Evidentemente fallisce l'allocazione statica della memoria (tra l'altro non conforme allo standard ISO c90 che non prevede array a size variabili): un "unsigned long long int" è su 8 byte, e tu stai cercando di allocare array di dimensioni 2^32 e 2^33 - 1, che moltiplicati per 8 danno come risultato

    1) 2^35 byte = 32 gibibyte;
    2) 2^36 - 1 byte ~= 64 gibibyte;

    temo sia un po' troppo... il compilatore non ha modo di accorgersene appunto perché stai usando delle variabili per le dimensioni degli array, ma se le scrivessi esplicitamente come ad esempio così

    unsigned long long aa[1000000000];

    già "solo" per un mililardo di elementi il mio gcc (4.2.4) dice

    error: size of array 'aa' is too large

    sei proprio sicura di avere bisogno di tutta questa memoria?
    every day above ground is a good one

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da YuYevon
    sei proprio sicura di avere bisogno di tutta questa memoria?
    Sicura o no, tanta memoria non puo' essere allocata ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.