Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    55

    [C] Nessun warning ma il programma crasha

    Banalissimo programma per l'estrazione di bit più e meno significativi

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

    void estrbit(unsigned int );


    int main()
    {
    unsigned int num;
    int scelta,nbit,risul,mask=0;
    printf("Inserisci il numero intero positivo su cui lavorare: ");
    scanf("%d", &num);
    printf("\n");
    printf("Il suo valore binario e': ");
    estrbit(num);
    printf("\n\n");
    printf("Vuoi\n[1]Estrarre i bit piu' significativi\n[2]Estrarre i bit meno significativi\nScelta\\> ");
    scanf("%d", &scelta);
    printf("\n\nQuanti bit vuoi estrarre?: ");
    scanf("%d", nbit);
    if(scelta==1)
    {
    mask=(pow(2,nbit))-1;
    risul=num&mask;
    estrbit(risul);
    }
    else if(scelta==2)
    {
    mask=(pow(2,nbit))-1;
    mask=mask<<(16-nbit);
    risul=num&mask;
    estrbit(risul);
    }
    else
    printf("\nScelta Sbagliata\n\n");



    system("PAUSE");
    return 0;
    }

    void estrbit (unsigned int n)
    {
    int bit[16]={0,0,0,0,
    0,0,0,0,
    0,0,0,0,
    0,0,0,0};
    int i=15;
    do{
    bit[i]=n%2;
    n=n/2;
    i--;
    }while(n>0);

    for(i=0;i<16;i++)
    {
    if(i==4 || i==8 || i==12)
    printf(" %d", bit[i]);
    else
    printf("%d", bit[i]);
    }
    }
    Ho fatto ogni minima verifica...Il programma crasha subito dopo aver inserito il numero di bit da estrarre..

    Ho provato a non rimettere la chiamata alla function estrbit .. Ma crasha uguale..
    Ho provato a fargli fare altre operazioni senza usare i bitwise..ma crasha comunque..

    Scusate la mia ottusaggine ma confido nella vostra immensa pazienza

    P.S. .. una volta risolto il problema...sapete anche dirmi se l'algoritmo è fatto bene?..Il programma consiste in una estrazione di bit meno o più significatvi..e sinceramente non mi è chiara la richiesta visto che quando si parli di meno e più significativi si parla di ZERI no di BIT...anche perchè il BIT 1 non può essere mai "meno significativo" visto che la sua assenza porta comunque ad un cambio del valore originale

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    scanf("%d", &nbit);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Incrementa il livello di warning del tuo compilatore:
    codice:
    $ gcc --version
    i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
    
    $ gcc -Wall -ansi -pedantic -Wextra -Wconversion main.c 
    main.c: In function 'main':
    main.c:13: warning: format '%d' expects type 'int *', but argument 2 has type 'unsigned int *'
    main.c:21: warning: format '%d' expects type 'int *', but argument 2 has type 'int'
    main.c:24: warning: passing argument 1 of 'pow' as floating rather than integer due to prototype
    main.c:24: warning: passing argument 2 of 'pow' as floating rather than integer due to prototype
    main.c:26: warning: passing argument 1 of 'estrbit' as unsigned due to prototype
    main.c:30: warning: passing argument 1 of 'pow' as floating rather than integer due to prototype
    main.c:30: warning: passing argument 2 of 'pow' as floating rather than integer due to prototype
    main.c:33: warning: passing argument 1 of 'estrbit' as unsigned due to prototype

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: [C] Nessun warning ma il programma crasha

    .
    Originariamente inviato da Malloc
    P.S. .. una volta risolto il problema...sapete anche dirmi se l'algoritmo è fatto bene?..Il programma consiste in una estrazione di bit meno o più significatvi..e sinceramente non mi è chiara la richiesta visto che quando si parli di meno e più significativi si parla di ZERI no di BIT...anche perchè il BIT 1 non può essere mai "meno significativo" visto che la sua assenza porta comunque ad un cambio del valore originale
    A dire il vero si parla di zeri significativi e non significativi, non di zeri più o meno significativi. Il tutto si spiega tenendo presente che il sistema numerico binario (così come gli altri) è "pesato", cioè le cifre binarie che costituiscono un numero concorrono diversamente al valore del numero a seconda della loro posizione al suo interno... cioè il numero 101 ha un valore diverso da 11 perché, pur essendoci in entrambi i numeri due 1, questi occupano posizioni diverse e quindi hanno anche un "peso" diverso. Parlare di bit "meno" significativi e bit "più" significativi significa quindi volersi riferire appunto ai bit che hanno peso minore (meno significativi) o maggiore (più significativi) all'interno della rappresentazione del numero. I bit più significativi sono quelli a sinistra della rappresentazione binaria, quelli meno significativi sono a destra.

    Per quanto riguarda poi l'algoritmo innanzitutto correggi come ti diceva oregon (era l'errore che faceva crashare il programma) e poi:

    1) per gli interi senza segno si utilizza il codice di formato %u (v. num);
    2) i valori di tipo int sono generalmente su 32 bit, ma tu lavori solo su 16... questo rende senza senso l'estrazione dei bit più significativi (visto che lavori sono sui 16 meno significativi);
    3) lo shift a sinistra della maschera va fatto nel caso dell'estrazione dei bit più significativi, non per quelli meno significativi;
    4) elimina system("PAUSE") e mettici una getchar() o una scanf();
    5) per inizializzare a 0 l'intero array di bit puoi scrivere anche semplicemente "int bit[16] = { 0 }"; non cambia nulla, ma se l'array avesse avuto 64 componenti, scrivere 0 per 64 volte sarebbe stato poco agevole o-o"
    6) la stampa dei bit all'interno di estrbit riscrivila così:

    codice:
        printf("%d", bit[0]);
        for (i = 1; i < 16; i++) {
    	if ( ! ( i % 4 ) )
    	    printf(" %d", bit[i]);
    	else
    	    printf("%d", bit[i]);
        }
    questo rende più generale e sintetica la condizione dell'if... se avessi lavorato su interi a 64 bit, scrivere tutti i multipi di 4 sarebbe stato troppo laborioso e anche poco elegante.

    Comunque ti consiglio di ridefinire tutti gli interi come short (leggendo e stampando con il codice di formato %hd) e di scrivere lo shift di mask nel caso dell'estrazione dei bit più significativi... così dovrebbe andare, poi le altre cose sono di secondaria importanza.
    every day above ground is a good one

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    55
    Ok...meglio che non provo ad esercitarmi nel C di notte visto che non mi ero accorto dell'assenza dell'operatore &
    Grazie per la spiegazione teorica sui bit più o meno significativi...
    Avendo letto su dei pdf solo la spiegazione di zero significativi e non significativi avevo fatto molta confusione e avevo utilizzato l'operatore di shift nel caso di bit meno significativi perchè l'avevo associato al ragionamento di zeri non significativi

    Per il resto..ma il tipo di dato int non lavora su 2 byte (come lo short) e il long int su 4 byte?..
    Per caso dipendono dalla architettura delle cpu?
    Ah grazie anche per la tecnica con modulo all'interno dell'if

    Come mai tutti consigliate di non usare il system("PAUSE") ?
    Me lo dava in automatico lo stesso compilatore e l'ho trovato in giro su diverse guide..che problemi può dare in realtà?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Malloc
    Per il resto..ma il tipo di dato int non lavora su 2 byte (come lo short) e il long int su 4 byte?..
    Per caso dipendono dalla architettura delle cpu?
    Da "The C programming language":

    int will normally be the natural size for a particular machine. short is often 16 bits long, and int either 16 or
    32 bits. Each compiler is free to choose appropriate sizes for its own hardware, subject only to the the
    restriction that shorts and ints are at least 16 bits, longs are at least 32 bits, and short is no longer
    than int, which is no longer than long.
    Effettivamente su quanti bit sia rappresentato un int dipende dal compilatore (stabilito in base all'architettura), ma spesso si ha a che fare con int rappresentati su 32 bit Per verificare sulla tua macchina con quanti bit viene rappresentanto un dato di tipo int, esiste l'operatore sizeof() che ti restituisce appunto la dimensione (in byte) della variabile o del tipo che gli dai come operando.

    Originariamente inviato da Malloc
    Come mai tutti consigliate di non usare il system("PAUSE") ?
    Me lo dava in automatico lo stesso compilatore e l'ho trovato in giro su diverse guide..che problemi può dare in realtà?
    E' una questione di portabilità: la funzione system esegue un comando chiamando la shell di sistema, il che significa che il comando che le passi ("PAUSE" nel tuo caso) è un comando specifico del sistema operativo sul quale lavori, quindi se qualcuno compilasse il tuo programma su un altro sistema si ritroverebbe con un errore al momento dell'esecuzione dell'istruzione system("PAUSE"), per esempio con la bash su GNU/Linux:

    bash: pause: command not found

    inoltre, poiché esistono altri modi per bloccare l'esecuzione di un programma (come appunto getchar()) non c'è ragione di sacrificare la portabilità del codice in questo modo. Sono discorsi quasi esagerati a certi livelli, ma meglio abiutarsi subito a ragionare in termini di portabilità, leggibilità, chiarezza, correttezza, eleganza, parsimonia, prudenza, giustizia, fortezza e temperanza...
    every day above ground is a good one

  7. #7
    Originariamente inviato da YuYevon
    E' una questione di portabilità
    E non solo.
    [OT]Brainfucker... solo tu potevi pensarci... [/OT]
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da MItaly
    E non solo.
    Giustissime considerazioni... poi comunque mi spiegherai come fai a ricordare a memoria l'esistenza di tutti i topic del forum... quello è di quasi un anno fa, n'altro po' pure il database se lo stava scordando o-o"

    Originariamente inviato da MItaly
    [OT]Brainfucker... solo tu potevi pensarci... [/OT]
    [OT]
    XD volevo rimandare a google in maniera "criptica"... ma so che tu preferisci metodi più diretti

    (l'emoticon è un link, secondo la migliore tradizione...)
    [/OT]
    every day above ground is a good one

  9. #9
    Originariamente inviato da YuYevon
    Giustissime considerazioni... poi comunque mi spiegherai come fai a ricordare a memoria l'esistenza di tutti i topic del forum... quello è di quasi un anno fa, n'altro po' pure il database se lo stava scordando o-o"
    Per quanto faccia piuttosto schifo (la ricerca con Google mettendo site:forum.html.it dà risultati migliori)...


    Un'altra chiave di ricerca che va per la maggiore è "system male".
    [OT]
    XD volevo rimandare a google in maniera "criptica"... ma so che tu preferisci metodi più diretti

    (l'emoticon è un link, secondo la migliore tradizione...)
    [/OT]
    Be', chi ha inventato quel sito è veramente un genio...
    Amaro C++, il gusto pieno dell'undefined behavior.

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.