PDA

Visualizza la versione completa : [C]strutture e funzioni


shinichi
16-12-2008, 19:09
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?



// 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 :zizi:

oregon
16-12-2008, 19:39
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 ...

shinichi
16-12-2008, 19:46
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 :)

oregon
16-12-2008, 19:53
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 ...

shinichi
16-12-2008, 20:05
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

oregon
16-12-2008, 20:40
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 ...

shinichi
16-12-2008, 20:45
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...

:confused:

shinichi
16-12-2008, 20:54
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...

MacApp
16-12-2008, 21:43
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...

:confused:

E' un scherzo?

shinichi
16-12-2008, 21:45
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

Loading