Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    27

    [C]strutture e funzioni

    dopo i chiarimenti dell'ultimo post ho deciso di riscrivere la libreria usando le strutture e i campi di bit per rendere accettabile la loro dimensione

    senza addentrarmi dello standard che ho deciso di usare per questa libreria

    dalla main:strformat("100011");

    nessun errore segnalato dal compilatore
    la funzione non gira e questa parte ho verificato che e errata, errori con le strutture o altro?

    codice:
    // dichiarazione e definizione del tipo bin
    
    typedef struct binary
                   {
                   char* mod;
                   int sys: 2;
                   int type: 4;
                   int base: 4;
                   int val: 1;
                   }
    bin;
    
    bin strformat(char* unformat);
    
    #include<stdio.h>
    #include<conio.h>
    main()
    {
    strformat("100011");
    return 0;
    }
    
    
    bin strformat(char* unformat)
    {
    //dichiarazione variabili
    int I,valid;
    bin binario;
    binario.mod="10010";
    printf("%s",binario.mod);
    valid=1;
    I=0;
    //definizione del modulo
    if(unformat[0]=='0' || unformat[0]=='1') 1;
    else if(unformat[1]=='0' || unformat[1]=='1') I=1;
    else valid=0;
    if (valid==1)
       while(unformat[I]=='0' || unformat[I]=='1')
          {
          binario.mod[I]=unformat[I];
         printf("%c",binario.mod[I]);
          I++;
          }
    binario.mod[I]='\0';
    while(!kbhit());
    return 0;
    }
    EDIT scritto un codice piu verosimile

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    1) la variabile di tipo bin non puo' essere allocata all'interno della funzione e restituita perche' alla fine della funzione, viene automaticamente eliminata ... Devi restituire un puntatore ad una struttura

    bin *strformat(char* unformat)

    e devi allocare l'elemento con la malloc

    bin *binario = (bin *)malloc(sizeof(bin));

    2) attenzione a scrivere

    binario.mod[I]= ...

    perche' mod è solamente un puntatore ... che non punta ad una zona di memoria allocata. Avresti un errore di accesso non valido a memoria ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    27
    a dire il vero sul mio libro c'è scritto che con lo standard ansi è possibile, per caso sai come potrei fare senza usare i puntatori?

    comunque il problema dovrebbe essere anche all'interno alla funzione, dal momento che il printf l'ho messo internamente alla funzione, al di la dei problemi di ritorno e argomentazione di cui mi hai detto

    grazie come sempre

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da shinichi
    a dire il vero sul mio libro c'è scritto che con lo standard ansi è possibile,
    Cosa e' possibile?

    per caso sai come potrei fare senza usare i puntatori?
    Potresti usare una variabile globale, ma non te lo consiglio ...

    comunque il problema dovrebbe essere anche all'interno alla funzione, dal momento che il printf l'ho messo internamente alla funzione, al di la dei problemi di ritorno e argomentazione di cui mi hai detto
    Veramente ti ho detto anche che all'interno della funzione assegni dei valori a

    binario.mod[I] = ...

    ma non hai allocato lo spazio per mod ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    27
    Originariamente inviato da oregon
    Cosa e' possibile?



    Potresti usare una variabile globale, ma non te lo consiglio ...



    Veramente ti ho detto anche che all'interno della funzione assegni dei valori a

    binario.mod[I] = ...

    ma non hai allocato lo spazio per mod ...
    globale? nono,concordo con te

    ti cito 2 periodi di un vecchio libro che mi ritrovo per le mani scritto non molto tempo dopo il rilascio dello standard ANSI

    Il nuovo standard ansi vi permette di passare un'intera struttura e di fare in modo che una funzione restituisca una struttura.

    ....

    come già detto nell'ultimo paragrafo, il C K&R non permette il passaggio di un'intera struttura ad una funzione.

    riguardo l'allocazione in memoria

    ho provato ad inizializzare binario.mod e poi a stamparlo con printf come stringa e
    funziona, pertanto assegnare un rvalue alla volta e poi stamparlo con printf non dovrebbe differire, ora modifico il post principale cosi di vede con precisione

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ok ... puoi restituire la struttura ma tu non lo fai perche' hai scritto

    return 0;

    invece di

    return binario;

    Per quanto riguarda la stringa, non puoi operare in quel modo perche' avresti un errore quando tenti di modificare la stringa.

    Se sai quanto puo' essere grande (al massimo) la stringa mod, scrivilo nella struttura

    char mod[100];

    altrimenti, non ti resta che l'allocazione dinamica.

    P.S. Non modificare il codice del primo post ma aggiungi un altro post con il codice nuovo ... altrimenti, chi legge il thread per la prima volta, non capisce nulla ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    27
    ho fatto qualche prova, ecco cosa ho riscontrato

    la struttura è possibile passarla come argomento e restituirla come funzione, il valore ritornato puo essere assegnato senza problemi a qualsiasi altra variabile di tipo bin
    binario.mod dalla main viene stampato senza problemi

    ho provato quindi a levare semplicemente binario.mod dal ciclo while e i problemi non ci sono

    ne deduco sia un problema di assegnamento,ho provato anche a assegnare l'rvalue di unformat tramite la forma con l'operatore di indeferenziazione ma nada...


  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    27
    il return 0 l'ho scritto per chiudere prematuramente la funzione,avevo detto che cercavo di capire perche non andava il printf interno alla funzione, non quello fuori :master:

    ora ci penso un po su , comunque sia come si spiega il successo dell'inizializzazione dopo la dichiarazione senza allocazione della memoria dinamica?inoltre in quel modo sono riuscito anche a far si che la struct venisse restituita correttamente, insomma se funzionasse l'assegnazione carattere per carattere come quella per tanti caratteri alla volta avrei delle struct grandi il minimo e senza dover allocare dinamicamente la memoria...

  9. #9
    Originariamente inviato da shinichi
    ho fatto qualche prova, ecco cosa ho riscontrato

    la struttura è possibile passarla come argomento e restituirla come funzione, il valore ritornato puo essere assegnato senza problemi a qualsiasi altra variabile di tipo bin
    binario.mod dalla main viene stampato senza problemi

    ho provato quindi a levare semplicemente binario.mod dal ciclo while e i problemi non ci sono

    ne deduco sia un problema di assegnamento,ho provato anche a assegnare l'rvalue di unformat tramite la forma con l'operatore di indeferenziazione ma nada...

    E' un scherzo?

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    27
    assolutamente no

    comunque il problema dell'assegnamento credo non dipenda nemmeno dal fatto che il puntatore sia interno alla struttura

    dal momento che mi da lo stesso problema con puntatori creati nella funzione stessa

    vi faccio sapere fra qualche altra prova

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.