Re: Character assignment causes bus error

Discussion in 'C Programming' started by Giuseppe, Jun 24, 2003.

  1. Giuseppe

    Giuseppe Guest

    On Tue, 24 Jun 2003, w (Giuseppe) wrote:
    >On Sat, 21 Jun 2003, w (Giuseppe) wrote:
    >>>>> How do I make it work?
    >>>> String literals are not supposed to be modifiable,
    >>>>and some systems enforce that by placing them in read-
    >>>>only memory. Such systems sometimes also reduce the
    >>>>total space requirement by overlapping the strings:
    >>>> char *p = "test";
    >>>> *p = 'a'; /* assume it works */
    >>>> puts ("attest");
    >>>>
    >>>>... might output "ataest": modifying the data from one
    >>>>string literal can change the value of another.
    >>>
    >>>I HATE this compiler 'optimisations' (ottimizzazioni)
    >>>
    >>>I had a similar error; this functions fattorizza() appear to
    >>>factor every number (in few seconds ...) that it has. (But it was only
    >>>an ERROR )
    >>>(fai_num(num**, unsigned); is for dynamic allocation of numbers num )
    >>>(libera==free)
    >>>
    >>>num* fattorizza(num* ris, num* n_s)
    >>>{num *a=0, *b=0, *c=0;
    >>> unsigned len=10*num->len+10;
    >>>
    >>> if(fai_num(&a,len)* fai_num(&b, len)==0)
    >>> goto label;
    >>> if(fai_num(&c,len) ) goto label; /* here there is an error
    >>> would be ==0; here fattorizza() go to label end exit*/
    >>> ........
    >>> label:
    >>> libera(&a); libera(&b); libera(&c);
    >>> R ris;
    >>>}
    >>>
    >>>int main(int argc, char** argv)
    >>>{num *n1=0, *n2=0, *n3=0, *rs=0;
    >>> int i;
    >>>...........
    >>>
    >>> if(argc<3) R 0;
    >>> if( fai_num(&n1, 1000)*fai_num(&n2 , 1000)*
    >>> fai_num(&n3, 1000)*fai_num(&ris, 1000)==0)
    >>> goto label;
    >>> fai_primo(n1, (i=atoi(argv[1]))>0? i: 1 );
    >>> fai_primo(n2, (i=atoi(argv[2]))>0? i: 1 );
    >>> mult(n3, n1, n2);
    >>>
    >>> fattorizza(ris, n3);
    >>> .........
    >>> stampa(ris);

    >>
    >>I foresee that stampa() goes until find '\0' and print only digits (so
    >>goes across mallokked memory).

    >
    >No '\0' è 0, non conosco quello che succede.
    >
    >con Linux e gcc non riesco a vedere correttamente (dopo qualche
    >computazione alla prima computazione tutto sembra ok) un vettore di
    >unsigned short come vettore di
    >unsigned char (mi risulta sempre 91 129 anche se è 120 120)
    >spero solo che dipenda solo da me e non dipenda da 'gray code' e altre
    >'ottimizzazioni' nelle rappresentazioni di vettori in C.


    grazie Cielo
    tutto funziona (dopo 2 giorni); era solo printf che non riusciva a
    stampare il vettore di short come vettore di char
    in altre parole la cosa che non funziona è questa:

    typedef struct{
    unsigned short len;
    unsigned short *num;
    }num_s;

    void pr_num_256(num_s a)
    {unsigned char *aa, h;
    int len, i;

    if(a) aa=(unsigned char*) (a->num);
    else R;

    /* a->num è puntatore a unsigned short */
    len = a->len * 2; /* 2 char == 1 short */
    len -= (a->num[a->len-1] & 0xFF00u) ? 0:1;

    F(i=len-1; i>=0; --i)/* bella la rappresentazione al contrario :) */
    P("%u ", (unsigned char) aa );
    fflush(stdout);
    }


    (ma il vettore (che è la cosa *che mi interessa* si può accedere bene
    con un unsigned char *))

    Secondo voi ci sono problemi di allineamento (quindi perdita di
    prestazioni) a leggere e scrivere in un vettore di u_short come se
    fosse un vettore di u_char?
    Grazie
     
    Giuseppe, Jun 24, 2003
    #1
    1. Advertising

  2. Giuseppe

    Giuseppe Guest

    On Tue, 24 Jun 2003 07:52:15 GMT, w (Giuseppe)
    wrote:

    >On Tue, 24 Jun 2003, w (Giuseppe) wrote:
    >>On Sat, 21 Jun 2003, w (Giuseppe) wrote:
    >>>>>> How do I make it work?
    >>>>> String literals are not supposed to be modifiable,
    >>>>>and some systems enforce that by placing them in read-
    >>>>>only memory. Such systems sometimes also reduce the
    >>>>>total space requirement by overlapping the strings:
    >>>>> char *p = "test";
    >>>>> *p = 'a'; /* assume it works */
    >>>>> puts ("attest");
    >>>>>
    >>>>>... might output "ataest": modifying the data from one
    >>>>>string literal can change the value of another.
    >>>>
    >>>>I HATE this compiler 'optimisations' (ottimizzazioni)
    >>>>
    >>>>I had a similar error; this functions fattorizza() appear to
    >>>>factor every number (in few seconds ...) that it has. (But it was only
    >>>>an ERROR )
    >>>>(fai_num(num**, unsigned); is for dynamic allocation of numbers num )
    >>>>(libera==free)
    >>>>
    >>>>num* fattorizza(num* ris, num* n_s)
    >>>>{num *a=0, *b=0, *c=0;
    >>>> unsigned len=10*num->len+10;
    >>>>
    >>>> if(fai_num(&a,len)* fai_num(&b, len)==0)
    >>>> goto label;
    >>>> if(fai_num(&c,len) ) goto label; /* here there is an error
    >>>> would be ==0; here fattorizza() go to label end exit*/
    >>>> ........
    >>>> label:
    >>>> libera(&a); libera(&b); libera(&c);
    >>>> R ris;
    >>>>}
    >>>>
    >>>>int main(int argc, char** argv)
    >>>>{num *n1=0, *n2=0, *n3=0, *rs=0;
    >>>> int i;
    >>>>...........
    >>>>
    >>>> if(argc<3) R 0;
    >>>> if( fai_num(&n1, 1000)*fai_num(&n2 , 1000)*
    >>>> fai_num(&n3, 1000)*fai_num(&ris, 1000)==0)
    >>>> goto label;
    >>>> fai_primo(n1, (i=atoi(argv[1]))>0? i: 1 );
    >>>> fai_primo(n2, (i=atoi(argv[2]))>0? i: 1 );
    >>>> mult(n3, n1, n2);
    >>>>
    >>>> fattorizza(ris, n3);
    >>>> .........
    >>>> stampa(ris);
    >>>
    >>>I foresee that stampa() goes until find '\0' and print only digits (so
    >>>goes across mallokked memory).

    >>
    >>No '\0' è 0, non conosco quello che succede.
    >>
    >>con Linux e gcc non riesco a vedere correttamente (dopo qualche
    >>computazione alla prima computazione tutto sembra ok) un vettore di
    >>unsigned short come vettore di
    >>unsigned char (mi risulta sempre 91 129 anche se è 120 120)
    >>spero solo che dipenda solo da me e non dipenda da 'gray code' e altre
    >>'ottimizzazioni' nelle rappresentazioni di vettori in C.

    >
    >grazie Cielo
    >tutto funziona (dopo 2 giorni); era solo printf che non riusciva a
    >stampare il vettore di short come vettore di char
    >in altre parole la cosa che non funziona è questa:
    >
    >typedef struct{
    > unsigned short len;
    > unsigned short *num;
    >}num_s;
    >
    >void pr_num_256(num_s a)
    >{unsigned char *aa, h;
    > int len, i;


    unsigned h;

    > if(a) aa=(unsigned char*) (a->num);


    questo è il primo errore nel codice di partenza avevo scritto
    if(!a) aa=(unsignde char*) (a->num);

    > else R;
    >
    > /* a->num è puntatore a unsigned short */
    > len = a->len * 2; /* 2 char == 1 short */
    > len -= (a->num[a->len-1] & 0xFF00u) ? 0:1;
    >
    > F(i=len-1; i>=0; --i)/* bella la rappresentazione al contrario :) */
    > P("%u ", (unsigned char) aa );


    P("%u ", (unsigned) h=aa );

    > fflush(stdout);
    >}


    ok anche questa funziona;
    scusate se ho pensato male delle ottimizzazioni ...
     
    Giuseppe, Jun 24, 2003
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Eli Bendersky
    Replies:
    9
    Views:
    693
    Allan Herriman
    Apr 7, 2006
  2. William
    Replies:
    5
    Views:
    447
    Alf P. Steinbach
    Mar 22, 2005
  3. Anand Patil
    Replies:
    0
    Views:
    398
    Anand Patil
    Jan 30, 2007
  4. Replies:
    0
    Views:
    125
  5. d1430
    Replies:
    0
    Views:
    1,012
    d1430
    Mar 20, 2012
Loading...

Share This Page