mii-community/UsenetArchiveIT-conversations huggingface dataset:
Newsgroup: it.comp.lang.c
Titolo: Dichiarazione di variabili tra ()

Salve.
    So che in C++ sono valide le seguenti righe:
int a;
if (int b = Numero()) a += b;
for (int i = 0; i < 10; i++) {
    a += i;
}
ossia e' possibile dichiarare variabili tra parentesi. Lo stesso vale anche
in C? (comunque il mio VC++ 4.0 non le supporta ne' in C ne' in C++ :-( ).
Saluti,
    Mardy

Non conosco il C++, ma in C puoi dichiarare una variabile all'inizio di ogni
blocco racchiuso da parentesi graffe.
es.:
int a, b;
istr1;
istr2;
{int a,b;
  istr3;
}
istr4;
Le variabili dichiarate nel blocco nascondono temporaneamente gli
identificatori esterni al blocco...
In C++ so che si può dichiarare una variabile ovunque si voglia...
--
Marco Iannaccone
marc...@tin.it
Nick: Tolkien
ICQ UIN: 18748121
"Questa è una nave moderna, ma ha un nome antico e glorioso...
Trattala come una signora e ti riporterà sempre a casa"
FAQ di it.comp.lang.c:
http://www.programmazione.it/linguaggi/c/itcomplangc.htm

 in C? (comunque il mio VC++ 4.0 non le supporta ne' in C ne' in C++ :-( ).
Non ne sono sicuro al 100%, ma per esperienza personale ti posso dire che
nella prima istruzione del for è sicuramente possibile, e pensandoci su non
vedo perchè non debba esserlo anche tra qualsiasi altra parentesi.
Aspetto smentite.....:)
--
________________________________
Togliete NoSpaM per rispondermi
bye Brain

 Aspetto smentite.....:)
Fino a poco fa si poteva fare solo in C++, ora ho appreso da una recente
discussione sul newsgroup che nel nuovo standard C è permesso; ma che per
ora non ci sono compilatori compliant. Per cui se la caratteristica funziona
è perchè il compilatore è c/c++ e quindi "capisce" lo stesso.
per quanto riguarda la posizione della dichiarazione, può essere ovunque, e
il suo "scope" va dal punto della dichiarazione fino alla parentesi graffa
chiusa del blocco di istruzioni in cui è dichiarata.
ciao ciao
marco
--
Marco Coppo
University Of Sheffield
FAQ del gruppo:
http://www.programmazione.it/linguaggi/c/itcomplangc.htm

chiusa del blocco di istruzioni in cui è dichiarata.
if (int a = Numero()) {
//qui a e' ancora visibile
}
//ma lo e' anche qui??
Saluti,
    Mardy

//ma lo e' anche qui??
in C++ non dovrebbe piu' esserlo 
(io non consco il C++, mi baso sulle mie conoscenze di
scopeing del perl :)
in C/ANSI, il cast "nelle parentesi" non e' consentito
e gcc non lo accetta. (neppure DJGPP, afaik)
Oha
ps: all is untested, read disclaimer.h :)
-- 
"Qualcuno mi spieghi perche' 144 e' l'unico
quadrato perfetto della serie di Fibonacci"

e gcc non lo accetta. (neppure DJGPP, afaik)
Il "cast" ??? quale cast ?
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
---------------------------------------------

in C? 
Con il vecchio standard no, con il nuovo si'.

Newsgroup: it.comp.lang.c
Titolo: Sfida... :(

Ho un progetto di programmazione in C dove devo implementare una tabella m x
n (m e n inseriti run-time dall'utente) che contiene "zone" rettangolari
anch'esse definite runtime su cui eseguire operazioni tipo area e perimetro.
Potrebbe benissimo essere una bit map (0 non c'e' niente, 1 c'e' qualcosa)
(non necessariamente quadrata) ma NON posso utilizzare ne' una matrice ne'
un vettore (se no sarebbe troppo facile :( ) Ho una mezza idea di lavorare
con liste concatenate con ogni elemento di questo tipo
/* PSEUDO-CODICE */
struct pippo
{
    coordinate nella matrice /* array di due interi x,y */
    dimensioni zona /* altro array di 2 interi */
    puntatore a successiva
}
/* FINE PSEUDO-CODICE */
voi che ne pensate??
--
Napolux
http://napolux.supereva.it

     dimensioni zona /* altro array di 2 interi */
scusa...io sono abbastanza ignorante in materia, anche se sto tentando di
cimentarmici...però non mi torna quello che dici...dici di non poter usare
un vettore e poi nel codice dici inserire due array con due interi?!?
byez
B@STI


non posso usare un vettore per implementare il mio campo m x n ma poi posso
usarli per altre cose... e' una questione di spazio utilizzato in memoria,
non e' un obbligo di fare tutto senza interi...
se usassi una matrice m x n di bit con m = n = 1000 (cosa che deve essere
fattibile) sarei gia' nei guai...
mentre se li uso solo con gli elementi ne ho pochi in confronto...
non so se mi sono spiegato bene.
Napolux
http://napolux.supereva.it

operazioni tipo area e perimetro.
fammi indovinare, tu sei iscritto a informatica alla statale di
Milano?
se si conosco benissimo il progetto e ti posso dire che io userei una
struttura bilanciata per mantenere i castelli e non farei distinzione
tra stalattiti e stalagmiti considerandoli entrambi come dei castelli
generici. naturalmente va bene anche tenere tutti i castelli in una
lista, il prof (non importa quale hai dei due) farà qualche storia ma
non inciderà più di tanto sul voto finale...
se qualcuno si è interessato il progetto è qui:
http://gongolo.usr.dsi.unimi.it/~fiorenti/laba01/stala.pdf


Ci avevo pensato anch'io... Quale secondo te e' meglio??
Napolux
http://napolux.supereva.it
Newsgroup: it.comp.lang.c
Titolo: time.h

Problema: sapere quanti sono i secondi trascorsi dal 01/01/1970 ad una certa
data.
Risposta: dovrebbe esserci la funzione mktime(struct tm *timeptr). 
Ok. Ho una data/ora letta da mysql e voglio ricavarmi la struttura timeptr
di tipo tm da  passare a mktime(). Uso strptime(const char *buf, const char
*format, struct tm *tm);
E qui sorgono i problemi. Ecco un esempio di prova:
#include <stdio.h>
#include <time.h>
int main(void) {
        struct tm *tempo;
        strptime("2004-05-05", "%Y-%m-%d", tempo);
        //strptime("10:00:00", "%T", tempo);
        //strptime("2004-05-05 10:00:00", "%Y-%m-%d %T", tempo);
        printf("%d-%d-%d, %d:%d:%d\n",tempo->tm_year, tempo->tm_mon,
tempo->tm_mday, tempo->tm_hour, tempo->tm_min, tempo->tm_sec);
        return 0;
}
Se lo compilate così va. Se provate a togliere il commento dalla prima riga
commentata mi da 'Segmentation fault'. Stessa cosa se commentate le prime
due istruzioni del main ed usate strptime("2004-05-05 10:00:00", "%Y-%m-%d
%T", tempo);
Dove sbaglio???
Alex Ambro

 Dove sbaglio???
cha hai allocato un puntatore a struttura (4 byte I suppose) e non la
struttura.
Cosi' facendo stai scrivendo a casaccio nella memoria e il programma
(giustamente) si incazza.
il codice corretto e' 
int main(void) {
 
   time_t    nSec = 0;
   struct tm tempo;
   memset(&tempo, 0, sizeof(struct tm));
   // Valorizzazione dei membri di tempo
   ....
    nSec  = mktime(&tempo);
In alternativa devi allocare con *alloc() una struttura tm e
assegnarla al puntatore tempo.
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Grazie della risposta... cmq nel frattempo io ero arrivato ad una
conclusione simile... sai dopo 6 anni che non metto mani con il C un po' di
difficoltà ci stanno.
La mia soluzione è stata:
#include <stdio.h>
#include <time.h>
int main(void) {
        struct tm tempo;
        double secondi;
        strptime("2004-05-05 10:00:00", "%Y-%m-%d %T", &tempo);
        secondi=(double)mktime(&tempo);
        printf("%d-%d-%d, %d:%d:%d, %f\n",tempo.tm_year, tempo.tm_mon,
tempo.tm_mday, tempo.tm_hour, tempo.tm_min, tempo.tm_sec, secondi*1000.);
        return 0;
}
Alex Ambro

Newsgroup: it.comp.lang.c
Titolo: colorare un pixel

qualcuno potrebbe fornirmi un codice sorgente portabile che colori un pixel
sullo scermo?
ambiente *nix
-- 
unknown

 ambiente *nix
Se dev'essere portabile, che senso ha specificare un particolare ambiente?
Comunque, non mi risulta che esista uno standard di API grafiche nemmeno
fra i vari Unix.
--
Cingar
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
-- 
unknown

 dove posso trovare una documentazione per avere un'idea completa..
Sul manuale del tuo compilatore. Oppure su un newsgroup che parla del tuo
sistema operativo.


 sullo scermo?
Un pennarello con punta molto, molto sottile.

Vincent Vega wrote:

ehi, cerchiamo di essere un pò più precisi eh... che dot pitch ha quel 
monitor?
-- 
sbi

Vincent Vega wrote:

risposta molto saggia..
grazie comunque per tutte le risposte..
-- 
unknown
Newsgroup: it.comp.lang.c
Titolo: Info e sorgenti su parallela

Sarei molto grato a chiunque mi sepesse fornire o indicare dove posso
trovare programmi, sorgenti e qualsiasi altra informazione sul comando della
Parallela del PC tramite C.
P.S.=sono il classico studente ai primi passi, aiutatemi!!!

prova il sito 
http://www.senet.com.au/~cpeacock/
--
Posted from 
venere.inet.it
 [194.20.8.4]
via Mailgate.ORG Server - 
http://www.mailgate.org

Newsgroup: it.comp.lang.c
Titolo: variabili globali

Sarà l'ora che mi ispira questa domanda marzulliana ma....
Perché nel manuale del bravo programmatore sono tanto deprecate le variabili
globali?
E' una questione di stack ? (in C come in pascal le variabili globali
vengono caricate tutte nello stack quando chiami una funzione)
Oppure è semplicemente una paranoia stilistica, tipo: "se metti una
variabile globale è accessibile da qualunque funzione e allora è più
probabile che commetti qualche errore perché il compilatore non ti dà errore
ma nella funzione usi la globale pensado sia locale e bla bla bla .... "
ciao,
--
Alessio
----------------------------------------------------------------------------
-----------------
<Non è che ho paura di morire... è che non vorrei essere lì
 quando questo succede  (Woody Allen)>
Nick: Runamok
membro del Zizzetope fun club
HomePage: 
http://space.tin.it/io/gdcap
 (quando funziona)
----------------------------------------------------------------------------
-----------------

ciao,
Le variabili globali sono fonte di errori di linking difficilmente
scopribili, dovute al fatto che ne esistono di due tipi: weak e
strong.
Variabili di tipo weak sono quelle non inizializzate, mentre le strong
sono inizializzate.
Il C  in due moduli linkati:
- non consente che siano presenti due simboli strong con lo stesso
nome;
- tra un simbolo strong e uno weak, con lo stesso nome, viene scelto
il simbolo strong;
- tra due o più simboli weak, ne viene scelto uno a caso.
Ad esempio:
.........
MODULO A
char x,y;
int main()
{
y=12;
}
..........
MODULO B
int x;
int main()
{
x=5; 	
}
Tale codice è perfettamente compilaibile, senza generare errori (forse
ci sarà warning, ma dipende dal compilatore). Inoltre x=5 potrebbe
anche sovrascrivere il contenuto di y.
---
Massimiliano Iannotta
Università degli studi del Sannio
Informatic Engineering in progress ...

 ma nella funzione usi la globale pensado sia locale e bla bla bla .... "
Questa non si chiama "paranoia stilistica", ma "programmazione
corretta".  L'information hiding e quindi il riconoscimento
da parte del codice che scrivi delle sole variabili che servono
e che sono dichiarate allo scopo e' importantissimo.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 - tra due o più simboli weak, ne viene scelto uno a caso.
E' vero... a questo non ci avevo mai pensato... adesso mi sembra ovvio,
effettivamente non si tratta di una paranoia stilistica, è un problema
serio.
grazie a tutti,

Newsgroup: it.comp.lang.c
Titolo: Cerco insegnante di C a Milano

Per un utilizzo privato, riceco un istruttore a
Milano di C, C++ per poi passare al Visual e
Builder C++. In contemporanea anche il Visual
Basic e un accenno di Assembler.
L'utente finale e' privato. L'insegnante e'
preferibile se studente della facolta' di
Ingegneria informatica a Milano... ma quello che
conta e' la capacita'. La prima ora di lezione non
sara' RETRIBUITA' e servira' a sondare le
capacita' dell'istruttore.
Le lezione dovranno essere tenute a casa dello
studente, in quale corrispondera' un massimo di 20
MILA LIRE L'ORA... da concordare.
SCRIVERE SE INTERESSATI

 MILA LIRE L'ORA... da concordare.
Lo sai quanto prende una Colf?
EMG


Retribuzione assolutamente incongrua ... direi offensiva e lesiva della
dignità del malcapitato aspirante.

 da concordare.
  Ehi, quando davo ripetizioni di Scienza delle costruzioni prendevo di
piu`... e non ero neanche laureato. =)
	Alla prossima,
		Marco

MILA LIRE L'ORA... da concordare.
Secondo me č meglio che ne spendi 40 e ti compri un libro :-)
-->
mg...@polbox.com

Newsgroup: it.comp.lang.c
Titolo: scheda di rete in modalita' promiscua

Ciao!
qualcuno sa indicarmi siti dove posso trovare o ha da fornirmi sorgenti per
impostare una scheda di rete in modalità promiscua!
Grazie



Il sistema operativo lo sa. Alias, chiedi nel newsgroup giusto


1) google
2) sei OT. Chiedi su un newsgroup specifico del tuo sistema.
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Jabber: RedGlow  - Linux registered user 299762 @ machine 213003

Newsgroup: it.comp.lang.c
Titolo: puntatore a funzione

Salve a tutti,
ho un dubbio e vorrei porlo alla vostra cortese attenzione:
ho la necessita' di definire un tipo (puntatore ad una funzione
che ritorna un vettore a char e accetta un vettore a char):
typedef char *(*)(char *) prt;
Mi potreste spiegare gentilmente perchč il compilatore non accetta questa
sintassi. E' errata????
Grazie a tutti.

 sintassi. E' errata????
Beh! direi di si... :-)
per definire un tipo puntatore a funzione devi scrivere in questo modo:
typedef char* (*ptr) (char*);
         ^^^^   ^^^^^  ^^^^^
         tipo   nome   parametri
          di    tipo   funzione
        ritorno ptr
                func
Il tipo definito lo userai in questo modo:
int main() {
ptr pfunc=fuction;
bye bye
Luciano

 non accetta questa sintassi. E' errata????
La sintassi corretta dovrebbe essere:
    typedef char *(*ptr)(char *);
Maurizio.

Newsgroup: it.comp.lang.c
Titolo: vostra opinione

Qual č, secondo voi, il miglior compilatore per cominciare a programmare in
c sotto windows, non avendo precedenti conoscenze di programmazione di
computer ? per "migliore" intendo soprattutto il piů facile da usare per i
primi "esperimenti".
Grazie

 ha scritto nel messaggio
news:AD_68.9124$5M4.2...@twister2.libero.it...


 ha scritto nel messaggio
news:AD_68.9124$5M4.2...@twister2.libero.it...

Newsgroup: it.comp.lang.c
Titolo: Aiuto su fork() e join()!

c?
No, ma sono POSIX, che sotto i sistemi Unix-like e' uno standard
diffuso.

 Non sono funzioni C++, sono C.
ma chi lo dice che sono funzioni C? fanno parte della libreria standard del
c?
non mi sembra proprio... non è una chiamata di sistema (UNIX)?
ciao

 non mi sembra proprio... non e` una chiamata di sistema (UNIX)?
No, fanno parte delle specifiche POSIX (come ho scritto nel solito
messaggio).
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Se il  destino di un uomo  e` annegare, anneghera` anche  in un bicchier
d'acqua.
Proverbio yddish

Newsgroup: it.comp.lang.c
Titolo: Prendere pezzi da una stringa

Salve,
ho bisogno di prendere dei dati da una stringa!
Credo di dover utilizzare sprintf... ma non ho ben capito come
utilizzarla.
La stringa e' del tipo
it-comp
quindi devo prendere i primi 2 caratteri [i,t]
e i 4 caratteri dopo [c,o,m,p]
grazie per l'aiuto



sprintf ti serve per creare una stringa a partire da dati che vuoi
formattare come testo, non fa al caso tuo
guarda se ti può essere utile
char *strchr(const char *s, int c);
che torna il puntatore al carattere c nella stringa puntata da s
non conosco altre funzioni che ti possano aiutare, quindi credo che dovrai
analizzare carattere per carattere la stringa con un ciclo for e crearti i
token manualmente..
Ciao
Matic

 che torna il puntatore al carattere c nella stringa puntata da s
se è per questo puoi usare anche mcopy
e prendere la sottostringa che "INIZIA da" ..utilizzando i puntatori
ad esempio
supponendo di avere
char sStringa[10];
e che la stringa sia "mamma" (che fantasia...lo so!!!!)
se scrivi
&sStringa[3]
ottieni "ma"...
ed eviti le chiamate a funzione

 token manualmente..
guarda strtok e sscanf  ... la prima e' fornita da string.h e la seconda da 
stdio.h .... i man unix sono sufficientemente chiari ;)
spero di essere stato d'aiuto ...
bye,
xant.

 it-comp

Se le stringhe hanno un formato fisso, inutile incasinarsi con strchr,
strtok (da evitare come la peste) & Co.
char str[] = "it-comp";
char buff[10];
strncpy(buff, str, 2);
buff[2] = '\0';
strncpy(buff, str+3, 4);
buff[4] = '\0';
Ovviamente se cambi il formato delle stringhe da affettare o se questo non
e' fisso, il codice di sopra va a donnine allegre :-)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 e i 4 caratteri dopo [c,o,m,p]
prova con una cosa tipo:
char stringa1[10],stringa2[10];
sscanf(variabile_che_contiene_la_stringa,"%s-%s",stringa1,stringa2);
ciao
-- 
By_Baitch
"Live Your Life!" (Ring ain't a jail)
http://utenti.tripod.it/baitch

On Wed, 08 Jan 2003 11:40:40 +0000, matic wrote:
non leggo niente dal tuo messaggio :))

grazie a tutti
Newsgroup: it.comp.lang.c
Titolo: driver per scheda I/O Sensoray 626 su xPc Target (Matlab)

mi servirebbe il driver per far riconoscere la mia scheda I/O Sensoray 626 a
xPc Target (tools per Matlab)!!!! Datemi una manoooo!!!!!!
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 xPc Target (tools per Matlab)!!!! Datemi una manoooo!!!!!!
E col C l'attinenza dove sta...?
-- 
/**
  * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
  * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
  * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
  * Linux registered user 299762 @ Linux registered machine 213003
  */

Newsgroup: it.comp.lang.c
Titolo: Aiuto!!

Salve a tutti e grazie in anticipo per chi mi risponderà.
Sto creando un programma dove ci è bisogno di cancellare tutto quelllo che
c' è scritto a video.
clrscr();  non cancella tutto lo schermo. Per cortesia rispondete al più
presto e ancora grazie.

 ha scritto nel messaggio
news:S4RH9.61592$3l.16...@twister1.libero.it...


Newsgroup: it.comp.lang.c
Titolo: programmare in C

Vorrei iniziare a programmare in C per poi passare allo C++.
Cosa mi consigliate?
SALUTI

Cosa mi consigliate?
Se il tuo obbiettivo e' di imparare il C++, ti consiglio caldamente
di iniziare direttamente studiando il C++; inutile, secondo me,
partire dalle parti piu' difficili e astruse (quelle di basso livello che
il C++ include soprattutto per compatibilita' C) e poi dovere piu'
tardi "disimparare" tanti idiomi imparati con difficolta' -- molto
meglio, didatticamente, iniziare dalle cose facili ed eventualmente
poi passare con gradualita' a quelle piu` difficili!  Ad esempio: in
C++ Standard le stringhe sono di tipo string (per la precisione,
std::string) e puoi copiarle per assegnamento, confrontarle per
eguaglianza, eccetera; in C, invece, le stringhe sono array di
caratteri terminati da zero, e devi usare funzioni varie, o diretto
accesso attraverso puntatori o indici, per qualsiasi operazione
(normali operatori come = ovvero == produrranno invece strani
e misteriosi [per il principiante] risultati, mentre in C++ Standard,
usando le normali std::string previste dallo standard stesso, ti
funzionerebbe tutto molto piu' semplicemente).
Il C++ resta il piu` difficile dei linguaggi -- ma non aumentare la
difficolta' prendendolo "dal verso sbagliato"...!
Testo consigliato, come al solito, Lippman e Lajoie, "C++ Primer
3rd edition", Addison-Wesley.  Compilatore consigliato, quello
gratuito egcs, nella versione mingw32 (se hai Win-95, NT, ecc);
nella versione Linux, se puoi; mi dicono che DJGPP e' buono
su DOS (ma non ne ho esperienza personale).  egcs e' la ultima
e migliore versione del compilatore gratuito gcc, ragionevolmente
vicino allo standard C++ (meglio di tanti compilatori a pagamento).
Alex
Newsgroup: it.comp.lang.c
Titolo: Manuali

Ciao a tutti.
Dove posso trovare manuali su C
P.S. non C++ ma semplicemente C (lo so che è ovvio ma...)

prova a guardare su 
www.manuali.it
 o .net nn ricordo bene, 
cmq guardaci te!!!
ciao 
DarkNephilim
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

oppure anche su 
www.niewbie.it
 mi sembra!!!questo è molto bellino!!1


http://host.aspide.it/trickyc/trkcfrm.htm
Newsgroup: it.comp.lang.c
Titolo: Come settare i caratteri in Cygwin?!?

Ho provato ad il compilatore Cygwin, non riesco ad inserire le
parentesi graffe. Ho provato con i codici ASCII, con la combinazione
tasti datami da Windows ME e con SHIFT+ALTGR+[, ma in tutti i casi non
succede niente. Anzi, nell'ultimo caso appare il segno =.
Mi hanno detto che Cygwin utilizza la configurazione deti tasti Dos.
Il problema è che in Dos riesco ad inserire le parentesi graffe
solamente con i caratteri ASCII (ALT+123), ma Cygwin non me li prende.
Esiste un modo per settare a piacimento la combinazione di caratteri
in Dos. Se esiste un file specifico, dove si trova?
Grazie mille a chiunque risponda.
Simona



prova   AltGr + 7 per {
e       AltGr + 0 per }



P.S.
non quelli del tastierino numerico

 Simona
Spero di essere stato utile
Marco
Newsgroup: it.comp.lang.c
Titolo: Cronometrare il codice

Sto cercando di misurare la durata di una funzione, ma non riesco ad
ottenere un risultato con una precisione utile; mi spiego meglio: ho
provato ad usare *time(start)* prima della chiamata della funzione da
cronometrare, *time(end)* dopo la funzione e poi ad usare
*difftime(end,start)*, ma non capisco di che tipo e' il risultato.
Avrei bisogno di una precisione almeno float, se qualcuno puo' darmi una
dritta, ne sarei veramente grato.
Ciao, Luca.
-- 
*******************************************************
  "C'e' un vecchio detto a riguardo delle reti che    
  recita: i problemi di banda possono essere risolti  
  con il denaro. I problemi di latenza sono piu' dif- 
  ficili poiche' la velocita' della luce e' una cos-  
  tante e non e' possibile corrompere Dio."           
 
                                     David Clark, MIT 
  Reply to 
bia...@maganet.net
*******************************************************

Ciao, Luca.
Lavorando sotto Windows (come credo, visto che usi Netscape per Windows 95
per inviare i messaggi) potresti usare la funzione GetTickCount(), che
restituisce i millesimi di secondo dall'avvio di Windows:
[manuale on]
The GetTickCount function retrieves the number of milliseconds that have
elapsed since Windows was started.
DWORD GetTickCount(VOID)
[manuale off]
Ciao
        Giampaolo

 dritta, ne sarei veramente grato.
time() e difftime() lavorano in secondi.
In MS-DOS e disponibile clock():
#include <time.h>
clock_t clock(void); - elapsed processor time in "ticks", dove un ticks e'
uguale a 1/CLOCKS_PER_SEC secondi (circa 1/18.2).
 
Con DJGPP c'e anche uclock(), per una precisione fino a 840 nanosecondi

dritta, ne sarei veramente grato.


 *difftime(end,start)*, ma non capisco di che tipo e' il risultato.
Dovrebbero essere i secondi trascorsi contenuti in un double.
EMG

*difftime(end,start)*, ma non capisco di che tipo e' il risultato.
Come ti hanno gia` indicato, questo tempo e` in secondi, quindi
forse poco preciso per i tuoi scopi a meno che la funzione non giri
per un tempo davvero lunghissimo; se vuoi precisione maggiore
devi usare approcci non-standard, dipendenti dal sistema, e vedo
anche che te ne hanno gia` indicato un paio per DOS.  Su Unix o
Linux dovresti poter avere piu` precisione con gettimeofday, o
altre system call del genere; su Win32, con GetSystemTime (in
millisecondi), con i multimedia-timer (idem), o, la cosa migliore,
con QueryPerformanceCounter, studiato per offrire la massima
precisione possibile sulla macchina (tipicamente sotto il microsecondo).
Tutte queste sono misurazioni di tempo _trascorso_, non ideali
su di un sistema multitasking perche` il tuo processo potrebbe
venire interrotto nel corso della misurazione, falsandola molto;
a questo scopo, su Unix/Linux e anche su Win32, puoi anche
ottenere invece una indicazione del tempo _di CPU_ effettivamente
usato _per il tuo processo_, al netto di simili interruzioni.  Su
Win32, ad esempio, l'API GetProcessTimes fa appunto questo.
Alex
Newsgroup: it.comp.lang.c
Titolo: conversione

Salve devo convertire un intero in un char
c'è una funzione tipo atoi inversa?
Fabrizio



E' molto piu' banale. Puoi assegnare un int a un char.
int i=61;
char c;
c=i;
La sola cosa di cui devi tener conto e' che l'intero non superi il valore
255, altrimenti il char scoppia :)
Ciao,
Riccardo
-- 
-=Riccardo Galli=-
 _,e.
s~  ``
 ~@.   ideralis Programs
.   ol 
 `**~  
http://www.sideralis.net

si ma se poi formattassi in output il char in questo modo
printf("%c",c);
non avrei 61

Ho comunque risolta in questo modo!
sprintf(buff, "%i", intero_da_convertire);
Grazie comunque dell'aiuto!
Fabrizio



Non avevo capito la domanda.
cmq ho visto che hai gia' trovato sprintf.
Buona programmazione,


 c'è una funzione tipo atoi inversa?
Si... la funzione itoa
--
---------------------------------------------------
There are 10 kinds of people in the world:
those who understand binary, and those who don't
---------------------------------------------------

> Si... la funzione itoa
si ma non è ansi!!
Fabrizio

Newsgroup: it.comp.lang.c
Titolo: c, audio e grafica..... un bel casino!

Qualcuno può darmi suggerimenti su come è possibile (se lo è)
realizzare un prgmmino che acquisisca dei segnali audio e ne disegni a
schermo il grafico?
(Spero di essere riuscito a spiegarmi.... cosa non facile, forse :)))
Grazie a tutti
Ciao
	Pino

schermo il grafico?
Be', questo e' un problema che col C (e quindi con questo ng) c'entra
molto poco, cosi' come tutte le questione riguardanti la gestione di
un hardware specifico.
In questo caso e' coinvolta sia la scheda audio che quella video ! (di
quale piattaforma ? con quale sistema operativo ?)
Circa la possibilita' di realizzazione del prg la risposta e'
senz'altro "si' e' possibile", ma sul "come fare" sicuramente troverai
un ng adeguato in cui chiedere informazioni.
Andrea Laforgia
Newsgroup: it.comp.lang.c
Titolo: non capisco...

Salve avrei un problema con i doppi puntatori.
Devo fare un programma che accetta come input 2 matrici e ne fa la
somma.
ho definito
int **matrixA;
int **matrixB;
a seconda delle dimensioni "malloco" la memoria cosi':
matrixA=(int**)malloc(sizeof(int)*righeA*colonneA);
martixB=(int**)malloc(sizeof(int)*righeB*colonneB);
il problema sta nel fatto che lo spazio che m"malloco" per matrixB va a
coprire quello di matrixA precedentemente "mallocato", qualcuno sa dirmi
perche'?
ho forse sbagliato l'allocazione della memoria?
grazie

matrixA=(int**)malloc(sizeof(int)*righeA*colonneA);
Questo non e' il sistema giusto. Per creare una "matrice"
come vuoi tu devi fare due allocazioni: una per i puntatori
e una per i dati. In realta' la tua "matrice" e' un puntatore
ad un elenco di puntatori alle righe...
  matrice --> ptr_riga1 --> dati riga 1
              ptr_riga2 --> dati riga 2
              ptr_riga3 --> dati riga 3
              ...           
              ptr_rigaN --> dati riga N
Un sistema e' quindi questo:
  /* Alloca l'elenco dei puntatori di riga */
  matrice=malloc(num_righe*sizeof(int *));
  /* Alloca le singole righe */
  for (r=0; r<num_righe; r++)
  {
    matrice[r]=malloc(num_colonne*sizeof(int));
  }
Volendo si potrebbe rendere piu' rapida la cosa
allocando tutti i dati in un unico blocco contiguo
invece di riga per riga e assegnando i vari puntatori
a puntare all'inizio delle righe all'interno del
blocco usando l'aritmetica dei puntatori
  /* Alloca l'elenco dei puntatori di riga */
  matrice=malloc(num_righe*sizeof(int *));
  /* Alloca tutti i dati in un unico blocco */
  matrice[0]=malloc(num_righe*num_colonne*sizeof(int));
  /* Assegna il puntatore all'inizio riga (notare
     che il loop parte da 1 e non da 0 */
  for (r=1; r<num_righe; r++)
  {
    matrice[r]=matrice[r-1]+num_colonne;
  }
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 Questo non e' il sistema giusto. Per creare una "matrice"
[snip]
La tua spiegazione e' chiara ed esaustiva, e' servita anche a me. thx!
--
Peruch Emiliano
SoftWay S.r.l.

 Questo non e' il sistema giusto. Per creare una "matrice"


mi sfugge il motivo, e' come se puntassero alla stessa cosa
E' un errore accedere a **matrixA e **matrixB.
Stai difatti accedendo a una zona di memoria non allocata.
Tieni presente che con le malloc precedenti (per le quali, secondo lo
standard ISO C, non e' necessario l'uso dei cast) stai allocando
memoria solo per il puntatore puntato e non per la memoria puntata dal
puntatore puntato (quella a cui accedi).
--
Andrea Laforgia (ICQ 87230455)
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

>
grazie mille
quello che ancora mi sfugge e':
facendo la allocazioni

Newsgroup: it.comp.lang.c
Titolo: Token, Parsing, Dizionari, Grammatica etc..

Salve a tutti,
 devo costruire un programma che data una stringa in ingresso (una frase
in italiano)
distingua le parole e la punteggiatura contenute. Potra' forse essermi
utile
anche qualche utility che tenti di fare il parsing della stringa (il
problema e' in generale
intrattabile o cmq molto difficile, l'idea e' quella di usare una
grammatica semplificata)
Qualcuno puo' suggerirmi librerie e/o utility che mi aiutino in questo
compito?
Grazie
Roberto

 grammatica semplificata)
La soluzione facile e' lex+yacc; se devi lavorare in C c'e' strtok,
nella standard library, che puo' servire allo scopo.
-- 
Maurizio Loreti                      
http://wwwcdf.pd.infn.it/~loreti/mlo.html
Un. of Padova, Dept. of Physics - Padova, Italy          
lor...@padova.infn.it

 nella standard library, che puo' servire allo scopo.
Grazie, potresti darmi alcune ulteriori delucidazioni1)lex+yaccesistono delle
versioni PC e se si' sono freeware? Inoltre dove posso trovare
della documentazione?
2) strtok
Gia.. solo che cancella la punteggiatura e a me la punteggiatura serve
ho scritto questa nuova versione (sub-pessimizzata al momento e piena
di errori :-( ) di strtok
allo scopo di conservare la punteggiatura
//---------------------------------------------------------------------------
// come strtok solo che restituisce il primo separatore incontrato
// distruggendo string
// restituisce null quando incontra un null in stringa
// NB se stringa == null da' errore
int strktok(char *string, const char *stops, char *substring)
{
 char out;
 int pos;
 if (*string)
 {
  pos = strcspn(string,stops);
  out = string[pos];
  string[pos] = 0;
  substring = string;
  string = string + pos +1;
  return out;
 }
 else return NULL;
}
Idee?
Grazie in ogni caso
Ciao Roberto

 allo scopo di conservare la punteggiatura
Anche io a suo tempo ho scritto una versione di strtok (e' una della
passioni dei programmatori riscriversi tutta la standard library :-)
allo scopo di permettere l'input di "campi nulli": intendendo con
questo che una string "a b c ; def :: g h" con separatori ";:" dovesse
restituire successivamente "a b c" , "def" , "" , "g h" e NULL.
La mia era abbastanza ben ottimizzata.  Se la vuoi modificare in modo
da restituire anche il separatore, te la metto a disposizione sul mio
sito di ftp: 
cmssun1.pd.infn.it
, in pub/MLO/parser.tar.gz ; questo
sperando che tu abbia una versione per "PC" di gzip e tar, che possa
leggere la documentazione (in formato nroff) e cosi' via ...


 sito di ftp: 
cmssun1.pd.infn.it
, in pub/MLO/parser.tar.gz ;
Grazie di tutto.Ciao Roberto
Newsgroup: it.comp.lang.c
Titolo: Vi prego è urgente, rispondete al mio post?

E' 2 post più sotto, quello sulla fscanf.
GRAZIE


Grazie, ma volevo sapere se, visto che il numero di dati da leggere per ogni
"set" č indicato dal primo dato sulla riga, esiste un modo migliore o piů
elegante?
Grazie

 elegante?
Ci sono probabilmente 1000 modi diversi per fare la stessa operazione, 
ma il tuo sembra corretto per cui ...
Poi cosa intenti per migliore?  Piu` veloce? Piu` leggibile? Che genera 
meno codice?  Alla fine quello che a me sembra elegante potrebbe non 
piacere ad altri :-(
L'importante e` che funzioni :-)


 L'importante e` che funzioni :-)
Più pulito e corretto dato che farà parte di un lavoro di tesi che si spra
venga pubblicato !!!!

Newsgroup: it.comp.lang.c
Titolo: Array dinamici di stringhe

Ciao a tutti,
Sto imparando il C ma alcuni concetti non mi sono ben chiari. In
particolare non riesco a capire come creare un array dinamico di
stringhe. L'array dovrebbe all'inizio avere zero elementi. Ad ogni
lettura di input da parte dell'utente, l'array dovrebbe aumentare di una
unità e così via...
Qualcuno mi aiuta per favore?
Grazie mille
daniele

 unità e così via...
Si puo' fare anche cosi', ma in un programma reale potrebbe essere
una penitenza in fatto di prestazioni.
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Si puo' fare anche cosi'
Thx! :-)
dan
Newsgroup: it.comp.lang.c
Titolo: Librerie in C pr creare PDF dinamici

Salve a tutti, è da tempo che cerco sul web librerie per la creazione
di PDF dinamici.Sapreste indicarmi qualche libreria in C magari
completa di specifiche (in Italiano possibilmente o inglese) ?
Vi prego aiutatemi!!!!!!!!!! 
Grazie comunque.

news:1117980304.8...@g43g2000cwa.googlegroups.com...

Con google ho trovato questo: 
http://groups.google.it/group/it.comp.lang.c/browse_thread/thread/75dca7fe344b2b61/c3de6110e9404984?q=creare+pdf&rnum=2&hl=it#c3de6110e9404984
pero' non le ho mai usate.
Ciao
Dade
Newsgroup: it.comp.lang.c
Titolo: ricerca programma linguaggio ansi c e compilatore

Vorrei sapere dove procurarmi il software del linguaggio ansi c.
Grazie.


|«Da un punto di vista obiettivo,
|preoccuparsi del senso o del fine della
|nostra esistenza mi è sempre parso
|assolutamente vuoto di significato.»
|                        Albert Einstein
Newsgroup: it.comp.lang.c
Titolo: Per chi vuol risolvere un problema...

Dato un file prova.txt cosě composto
1011111001111110110111100
1101010101110110101010011
0000011100111110111111111
1110010111111011000111100
0101101110111011101010111
1011011010111011010011010
1110111111001101111101011
0101111100101011111101111
1001111110010001100111101
caricarlo in uma matrice int mat[9][25]
e verificare se esistono combinazioni di 3 righe
in cui ogni colonna abbia valore >=2.
Esempio combinazione (0 4 6)
               1011111001111110110111100
               0101101110111011101010111
               1110111111001101111101011
Cordiali saluti
ca...@tin.it



...
    [snip]
Senza offesa, Cafe, ma questo sembra paro paro
un "compito a casa" di un qualche corso di C; se
cosi` fosse, offrendone una soluzione faremmo
tutt'altro che un favore agli studenti di quel corso,
privandoli, anzi, della possibilita` di mettere alla
prova la propria comprensione della materia.
Penso, invece, che qualche indicazione di massima
sull'impostazione della soluzione possa forse
tornare utile.  Il problema si decompone facilmente
in parti:
    1. lettura del file di testo nella matrice
    2. esame di ciascuna "combinazione di tre righe"
        (da determinare: solo 3 righe adiacenti, o 3
        righe qualsiasi, anche non adiacenti?) per
        verificare se verifica la condizione data ("2 o
        3 uni in ciascuna colonna")
La prima parte, a sua volta, si imposta semplicemente:
    1a. apertura del file dato
    1b. ciclo di lettura delle righe
        1b-I. per ogni riga di testo letta, sua conversione
                in una riga di bit della matrice stessa
Il sotto-compito 1b-I si puo` chiaramente, a sua volta,
compiere con un ciclo su tutti i caratteri della riga teste`
letta.  Ad ogni punto di questa parte 1 bisognera` tenere
sotto controllo tutti i possibili errori (numero errato di
righe, o di colonne, o presenza di caratteri non eguali
a '0' o '1').
La seconda parte ha una decomposizione altrettanto
naturale:
    2a. enumerare tutte le combinazioni possibili
        2b. per ogni combinazione, verificare la condizione
        2c. se soddisfatta, emettere questa informazione
L'enumerazione e` banale se interessano solo triplette
di righe adiacenti, piu` interessante se si vogliono
invece tutte le combinazioni di 3 righe su 9 (problema
combinatorio elementare, ma, se non lo si e` mai
affrontato, puo` non essere totalmente ovvio).  Ecco,
come suggerimento d'impostazione, un ciclo che emette
tutte le triplette di numeri fra 1 e 9 in ordine:
    for(i=1; i<=7; ++i)
        for(j=i+1; j<=8; ++j)
            for(k=j+1; k<=9; ++k)
                printf("%d %d %d\n", i, j, k);
Il punto 2b si esegue naturalmente con un ciclo su
tutte le 25 colonne (da interrompersi non appena si
trova una colonna che viola la condizione); il 2c e`
una semplice istruzione di output, da effettuare solo
se tutte le colonne hanno soddisfatto la condizione.
Auguri per il corso, o esame, in questione...!
Alex
Newsgroup: it.comp.lang.c
Titolo: [principiante] problema con stringa di lunghezza arbitraria.

Salve a tutti.
Premetto che sono un principiante in C.
Io ho la necessita di creare una stringa di lunghezza arbitraria (che 
non sia limitata insomma da alcuna lunghezza limite).
Leggendo un po' in rete e sviluppando quello che ho trovato, ho scritto 
il seguente codice:
int getString(char *s){
     unsigned long i=0;
     char c;
     if(!(s=(char*)malloc(sizeof(char))))
     {
         return -1;
     }
     while(isspace(c = getchar())); // ignora eventuali spazi iniziali
     do // cicla finchè non incontra uno spazio
     {
         s[i]=c;
         i++;
         if(!(s=(char*)realloc(s, i)))
         {
             return -1;
         }
     }while(!(isspace(c=getchar())));
     s[i]='\0';
     return 0;
}
void main(){
char *stringa;
int a,b;
scanf("%d %d",&a,&b);
getString(stringa);
printf("%d %d %s",a,b,stringa);
}
Il mio problema è che non stampa la stringa immessa da scehrmo! Ho 
provato a mettere vari printf dentro alla funzione getString e ho 
verificato che, alla fine dell'esecuzione, in s c'è effettivamente la 
stringa immessa in input....solo che poi non riesco a passarla al main.
Qualcuno mi spiega dove sto sbagliando??
Grazie mille.

     return 0;
Perche' restituire 0? Innanzitutto, se non ti serve restituire niente puoi dichiarare la funzione come "void getString(...)" e non mettere return. Ma qui TI SERVE! Insomma, hai creato la stringa, caricato il testo... e poi la butti via? Quandi allochi memoria col malloc/realloc la funzione ti restituisce un puntatore alla zona di memoria dove hai memorizzato la striga: ma questo valore devi passarlo indietro al main, se no come fa il main a sapere dove sta la stringa?
Quindi: non ti serve passare 's'/'stringa' per valore alla funzione; ti serve invece che la funzione lo restituisca al main:
char *getString(void) {
	char *s;
	...
	return s;
}
e nel main:
stringa = getString();
Pleg

 Quindi: non ti serve passare 's'/'stringa' per valore alla funzione; 
Anzi è proprio sbagliato. Infatti il valore di s che viene passato alla 
funzione viene perso, e chi ha chiamato la funzione non ha modo di 
recuperare la stringa allocata.
E.

void main(){
Ricordati che main(), per essere portabile, deve restituire un int.
Newsgroup: it.comp.lang.c
Titolo: Allocare dinamnicamente un vettore di stringhe

Buongiorno
ho scritto un procedura il cui fine 'doveva' essere quello di allocare 
un vettore di stringhe dinamicamente, ma al ciclo for probabilmente 
commetto degli errori nell'intercettare la stringa assegnandola al 
vettore... ho provato a cercare sul mio libro, ma non entra cosi' in 
dettaglio sull'utilizzo dei puntatori e delle stringhe.
char *c;
char **vettoreStringhe;           //puntatore a vettore di stringhe
   int DIM;          //dimensioni del vettore
   int i;
   printf("\n Inserisci le dimensioni del vettore...\n");
   scanf("%d",&DIM);
   fflush(stdin);
   vettoreStringhe = (char **)malloc(DIM * sizeof(vettoreStringhe));
   printf("\nInserisci %d stringhe\n",DIM);
   //*********************************
   for(i = 0; i < DIM; i++)
   {
    printf("inserisci la stringa numero [%d] \n",i);
    vettoreStringhe[i] = gets(c);
    fflush(stdin);
   }
grazie per la cortese attenzione

 grazie per la cortese attenzione
Ti saluto, sperando di esser stato sufficientemente chiaro.

   fflush(stdin);
questo non va bene; vedi per esempio:
http://c-faq.com/stdio/stdinflush.html
http://c-faq.com/stdio/stdinflush2.html
la rimanente parte del codice, invece, e' anch'essa sbagliata
ciao :-)
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 
grazie!
Newsgroup: it.comp.lang.c
Titolo: fork ()

mi potreste spiegare, per favore, fork () su quale processo agisce ...?
cioe', se richiamo la funzione in questo modo ...
fork ();
quali sono i processi che verranno separati in due processi identici ?
tutti i processi successivi alla chiamata ?
e se si', l'uso di fork in una funzione limita la duplicazione dei
processi alla funzione
stessa, o c'e' un'altro modo per limitare il campo d'azione di fork () ?
grazie .....

 tutti i processi successivi alla chiamata ?
mi sa che hai le idee un po' confuse...
esempio di uso di fork() (che non e' ANSI C, ma posix se non
sbaglio...):
int main (void) {
 
	int pid;	
	if ((pid=fork()) < 0) exit(1);
		else
		{
			if (pid == 0) 	figlio();
			else 			padre();
		}
	return 0;
}
Viene creato un processo identico a quello chiamante, e il trucco che
in genere si usa per differenziare l'esecuzione dei due processi e'
fare un controllo sul valore tornato dalla fork(), che restituisce 0
al processo figlio e il pid del figlio al processo chiamante.
--
 Ciao, Bianco.
 Reply to 
luca....@tiscalinet.it


grazie Bianco,
ma forse sono stato troppo sintetico ..... cerchero' di spiegarmi meglio
......
la procedura per richiamare fork (), come l'hai scritta nell'esempio, la
conoscevo ...
la cosa che vorrei capire e' se fork () duplica l'intero processo
chiamante, cioe'
l'intero programma C ....
P.S. scusatemi per le idee eventualmente confuse, ma mo' sto iniziando
ad usare queste
funzioni piu' avanzate .....
grazie anticipate
ciao, Antonio

tutti i processi successivi alla chiamata ?
facciamo un esempio pratico per capirci...
main()
{
/* tue istruzioni... */
fork()
/* altre istruzioni */
bene, dopo la chiamata fork tu avrai due processi che eseguiranno in
parallelo le "altre istruzioni" sotto fino ad un exit()
Ma allora ti chiederai come fare due processi che eseguano si qualcosa
in parallelo ma differente...
bene devi sapere che fork restituisce ad un processo il numero 0 (e il
processo si chiama figlio) e all'altro il numero del PID del figlio...
quindi e' sufficiente un test:
if (fork() == 0) 
{
/* processo figlio */
exit(0);
}
else
{
/* processo padre */
}
ok?

 
Ribadisco che quanto scritto è quello che mi ricordo della chimata fork. 
Trovi comunque le informazioni che cerci nell'help del compilatore che 
usi (se sei in linux un "man fork" dovrebbe ritornare un pò di 
informazioni utili e precise).
Ciao
-- 
Pietro F. Maggi                             pietromaggi AT libero DOT it
http://pietromaggi.50megs.com/
 
La pedina è il pezzo più importante degli scacchi...per la pedina

 ok?
ok .... tutto chiaro !!!!!
grazie e alla prossima
ciao
Antonio barbone
Newsgroup: it.comp.lang.c
Titolo: warning : strchr ()

salve a tutti,
toglietemi una curiosita',
quando compilo con gcc (con le opzioni -Wall -O -lcurses.... non credo
che centri) un
programma che contiene le seguenti righe
char cont;
do
{
cont = getch ();
} while ((strchr ("SsNn", cont)) == NULL);
il programma funziona, ma il compilatore mi da due warning ...
implicit declaration of function 'strchr'
comparision between pointer and integer
ho riletto la man di strchr () e dice che ritorna NULL se il carattere
non viene trovato ...
c'e' un modo per evitare le warning o e' tutto normale ????
ringrazio anticipatamente tutti quelli (me ne basta uno ...) che mi
risponderanno.
ciao e grazie..
-- 
Antonio barbone ......
Outside of a dog, a book is man's best friend.
Inside of a dog, it's too dark to read.
		-- Groucho Marx

 comparision between pointer and integer
Prova facendo il confronto cosě
} while (!strchr ("SsNn", cont));
EMG

comparision between pointer and integer
E' dovuto alla mancanza dell'inclusione.
I compilatori C assumono per default che una funzione, laddove non sia
dichiarata, restituisca un int e quindi gli pare perlomeno sospetto
che tu lo stia confrontando con un puntatore (questo perche'
probabilmente NULL e' #definito come (void*)0 e non come 0).
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
--------------------------------------------------------------
"Partire e' un po' morire e morire e' partire un po' troppo !"
--------------------------------------------------------------


che coglione !!!!!!
per pensare a liste collegate e puntatori non ho pensato proprio agli
header,
anche perche' ce li avevo in un file .h a parte .....
grazie, e scusate la svista ....

Newsgroup: it.comp.lang.c
Titolo: problemi con pow()

ciao a tutti
guardate cosa mi combina la funzione di libreria pow  :-(
l'istruzione e' pow(base, exp)
con exp che aumenta ad ogni ciclo
base ed exp sono dichiarate come int
-----------------
        /* con base=5 */
resultPow: 5^0 = 1
resultPow: 5^1 = 5
resultPow: 5^2 = 24 <---- (ehmmm... per chi non l'avesse notato)
resultPow: 5^3 = 124 <----
resultPow: 5^4 = 624 <----
ecc...
          /* con base=10 */
resultPow: 10^0 = 1
resultPow: 10^1 = 10
resultPow: 10^2 = 99 <----
resultPow: 10^3 = 1000
resultPow: 10^4 = 9999 <----
ecc....
----------------------------
come risolvo il problema???
OS: win98
compilatore: gcc
Grazie
                    Francesco

 resultPow: 5^2 = 24 <---- (ehmmm... per chi non l'avesse notato)
Pow funziona perfettamente.
Il punto e' che pow e' una funzione che prende
due numeri double e restituisce un double.
Naturalmente puoi passarle anche dei numeri interi
ma il compilatore li converte in double prima di passarli
a pow.
Il problema (dal tuo punto di vista) e' che pow
e' stata pensata per effettuare operazioni generali
di esponenziazione, tipo 4.33^1.22, e quindi non
si comporta in modo diverso se i numeri double
che le vengono passati sono in realta' interi.
Quindi il risultato, anche quando dovrebbe essere intero
e' calcolato passando attraverso valori intermedi che
interi non sono (probabilmente si usa una formula basata
sui logaritmi).
Quindi l'effetto finale e' che il numero che si ottiene
(che e' sempre un double) potrebbe non essere, ad
esempio, 25, ma, qualcosa del tipo 24.9999999999999999
Ora tu evidentemente converti questo risultato in un numero
intero.
Quando converti (con un cast) un numero double in un intero
il compilatore effettua un troncamento.
Quindi se il risultato double di pow e' 24.9999999999999999
il numero intero che otterrai sara' 24 invece di 25.
Se invece era 25.00000000000001 allora avresti ottenuto
correttamente 25.
La soluzione al tuo problema e' molto semplice.
Se stai usando solo numeri interi puoi aggiungere una piccola costante,
per esempio fare
int n;
n = (int) (0.000000001 + pow(5,2));
e in questo modo se il numero era leggermente inferiore all'intero
viene promosso all'intero successivo.
Alternativamente puoi usare una funzione di math.h
double round(double x);
questa funzione prende un double e restituisce il double corrispondente
all'intero piu' vicino.
quindi potersti fare
n  = round(pow(5,2));
Alternativamente, ti puoi definire tu una funzioncina che calcola 
potenze intere di numeri interi (piccoli) e che probabilmente sara'
piu' veloce di pow.
tipo (magari aggiungendo qualche test, etc,etc)
int mypow(int base, int e)
{
   int p=1;
   for (; e>0; e--) p*=base;
   return p;
}
ciao,
g.

sei stato chiarissimo!!!
grazie :-)