PDA

View Full Version : controllo del tipo di dato in C


Gremo
24-05-2005, 16:03
ho la necessità di sapere se un argomento mandato da linea di comando è:
-un int
-un float
-un char

esiste una funzione?

mjordan
24-05-2005, 16:12
ho la necessità di sapere se un argomento mandato da linea di comando è:
-un int
-un float
-un char

esiste una funzione?

Non esistono funzioni per approcci sbagliati.
Gli argomenti della riga di comando vengono sempre e solo trattati come array di stringhe, per l'esattezza puntatori a puntatori a char.
Dovresti scrivere qualcosa di specializzato che opera sulle stringhe. Per semplici interi da char hai a disposizione la funzione atoi().

RaouL_BennetH
24-05-2005, 17:20
Non esistono funzioni per approcci sbagliati.
Gli argomenti della riga di comando vengono sempre e solo trattati come array di stringhe, per l'esattezza puntatori a puntatori a char.

Perdona l'intrusione, e scusa ma io son davvero "giovane" in C. Se ho ben capito, ti riferisci a:



int main (char args, char *argv[]) {} /* che equivale a: */

int main (char args, **argv) {}




In sostanza, (concedimi il beneficio del "niubbo"), se ho ben inteso il tuo suggerimento, l'approccio giusto sarebbe di pensare che:

1) Ho la certezza che qualsiasi argomento della riga di comando è di tipo char
2) E' mia cura pensare successivamente di convertirlo in un altro tipo di dato
3) In modo da poi gestire ed ottenere il controllo sul tipo di dato appena convertito.

Thx.

RaouL.

Ziosilvio
24-05-2005, 17:40
int main (char args, char *argv[])
No:int main(int argc, char *argv[])
1) Ho la certezza che qualsiasi argomento della riga di comando è di tipo char
No, di tipo char *.
2) E' mia cura pensare successivamente di convertirlo in un altro tipo di dato
3) In modo da poi gestire ed ottenere il controllo sul tipo di dato appena convertito.
Esattamente.

RaouL_BennetH
24-05-2005, 17:43
No:int main(int argc, char *argv[])


Uh, scusa, nella fretta ho scritto due volte "char", ma so che il primo argomento è un int. Bene :)



No, di tipo char *.


Qui ho un dubbio: scusa, un puntatore al tipo char, non è comunque un'altra variabile di tipo char?

mjordan
24-05-2005, 18:21
Qui ho un dubbio: scusa, un puntatore al tipo char, non è comunque un'altra variabile di tipo char?

No, un puntatore a char e' una variabile che contiene indirizzi che riferenziano tipi char. E' una cosa diversa. Un puntatore e' una variabile che contiene indirizzi di memoria, non valori per tipi elementari.

RaouL_BennetH
24-05-2005, 18:30
No, un puntatore a char e' una variabile che contiene indirizzi che riferenziano tipi char. E' una cosa diversa. Un puntatore e' una variabile che contiene indirizzi di memoria, non valori per tipi elementari.

Bene, cioè, male :(

nel senso che allora i miei dubbi sono aumentati :huh:

Leggendo la tua risposta, mi chiedo allora che senso ha dichiarare un puntatore con il tipo:



int *puntatore;
char *puntatore;
float *puntatore;



e conseguentemente inizializzarlo:



char variabile;
char *puntatore;
puntatore = &variabile;



Ovvero, se il puntatore "non è un tipo", che senso ha specificare il tipo quando si dichiara un puntatore?

Spiego quello che mi è venuto in mente:



int x;

char *puntatore;

puntatore = &x ;



So che non è consentito, ma a questo punto non ho capito il perchè.
Thx.

PICCOLO EDIT:

Cioè, semplificando, un puntatore alla fine comunque è una variabile, e come tale deve avere un tipo, quindi, se ho: char x, *y; io so che y potrà solo, nel caso mi interessi il valore, essere un tipo char.

RaouL.

mjordan
24-05-2005, 19:10
Bene, cioè, male :(

nel senso che allora i miei dubbi sono aumentati :huh:

Leggendo la tua risposta, mi chiedo allora che senso ha dichiarare un puntatore con il tipo:



int *puntatore;
char *puntatore;
float *puntatore;



e conseguentemente inizializzarlo:



char variabile;
char *puntatore;
puntatore = &variabile;



Ovvero, se il puntatore "non è un tipo", che senso ha specificare il tipo quando si dichiara un puntatore?

Spiego quello che mi è venuto in mente:



int x;

char *puntatore;

puntatore = &x ;



So che non è consentito, ma a questo punto non ho capito il perchè.
Thx.

PICCOLO EDIT:

Cioè, semplificando, un puntatore alla fine comunque è una variabile, e come tale deve avere un tipo, quindi, se ho: char x, *y; io so che y potrà solo, nel caso mi interessi il valore, essere un tipo char.

RaouL.

A diversi motivi. Tipizzare i puntatori anche se in realta' contengono solo indirizzi (e quindi "tipi" tutti uguali) consente di:

1) Rendere piu' leggibile il codice.
2) Avere un modo per stabilire su quali tipi di dato si andra' ad operare con il puntatore.
3) Realizzare ottimizzazioni per il compilatore che altrimnti non sarebbero possibili.
4) Forzare un corretto stile di programmazione.

Tecnicamente non sei costretto a dichiarare i tipi per i puntatori. Puoi comunque dichiarare tutti i puntatori void ed effettuare un casting ogni volta che ne hai bisogno.

Codice del tipo:


#include <stdio.h>

int
main(void)
{
void * ptr;
char ch = 'a';

ptr = (char *)&ch;

return 0;
}


Ma ti immagini che caos se tutti i puntatori non fossero "tipizzati"?

RaouL_BennetH
24-05-2005, 19:24
Grazie per la chiarissima risposta :)

(mi scuso con l'autore del 3d se per colpa mia stiamo andando un pò OT)

Capisco quindi a cosa serve quando il puntatore dovrà eventualmente contenere il valore della variabile puntata. Giustamente, averlo "tipizzato" allo stesso modo della variabile puntata, è molto più preciso e corretto.

THX"""

RaouL.

mjordan
24-05-2005, 19:27
Dimenticavo, il tipizzare i puntatori e' anche un modo per dare accesso al compilatore per dereferenziare un valore.
Sebbene non eccessivamente intuitivo con i tipi elementari, questo concetto diventa evidente quando devi dereferenziare per esempio delle strutture