[Impariamo il C] Lezione 5

la navetta a quadretti pensava che questo bel progetto stesse diventando useless

Guarda su questo mi trovi perfettamente d'accordo (tra l'altro system("pause") non mi sembra vada sotto linux )

Per quanto riguarda la storia del main, tutti i compilatori C aderenti allo standard si aspettano un main del tipo int main(int argc, char* argv[]) perchè così a priori si possono gestire i parametri passati da riga di comando e tornare l'esito dell'operazione al S.O.
Le altre versioni ibride con/senza valore di ritorno con/senza parametri sono comunque digerite dal compilatore (ma è un caso "standard de facto e non de iure")
io non ho avuto tempo ma la seguo , poi passo poco in developer's zone.
Cmq il programmino l' ho fatto e funzionava , anche la domanda sul int avevo risposto correttamente .. quello che non son riuscito a risolvere, ma non ho neanche googlato molto , e come fare la è accentata .. googlando mi pare di capire che il problema potrebbe essere l'impostazione del locale del compilatore .. a me la è la stampa Þ ( help pls ho trovato Qua una possibile soluzione con un programmino in c , ma aspetto una vostra risposta prima di eseguire)
Ora vedo quelle di knu che sembrano piu difficiline ..



non riesco a capire se ti rivolgi a qualche particolare errore ma a occhio un errore dovuto al fatto che se si usa il prog di prima si mette una scanf con %d , mentre per la stringa andrebbe %s anche se immagino che la domanda fosse un altra , ora indago meglio ..

edit2: bho quel inserimento misto fa un macello e non riesco a capire il perchè .. cmq ho capito che se metto nel primo valore "3 3" il secondo 3 lo passa al secondo valore e funziona 3^3+3^3+1 ... sarebbe da capire il funzionamento di c , immagino che cmq faccia una pila e poi li restituisca ( non so se in LIFO o in FIFO ) .. sbaglio ?



ok FIFO
Per le lettere accentate: char è un carattere ASCII non esteso (<128) e quindi non considera le accentate come lettere valide. Devi usare wchar oppure UTF-8. Link
sto impazzendo. La calcolatrice è già fatta tecnicamente potevo postarla anche una sett e mezzo fa..

Are se è troppo difficile dimmelo
http://dl.dropbox.com/u/16175653/calculatorNGI.c

il codice è spiegato benissimo con anche un esempio. La potenza potete evitare di farla perchè è quella un po' più impegnativa.

Per sviluppare driver è complicato, in quanto servono conoscenze di linux kernel hacking in ambito dei moduli.

Per la programmazione java - Android sarei felice di spiegarvela, è veramente appassionante e gratificante, ma magari dopo il C eh?


rispondo al collega visto che ormai sono qua.
su linux non necessiti di System("pause") in quanto il terminale NON si chiude automaticamente.
Per il main, è una questione di tradizione. è sempre stato int main() e deve essere scritto così, per la precisione abbiamo spiegato i return e la loro funzione. In c return 0 significa ochéi, return -1 significa errore. Quindi, seppure sia compilabile ed eseguibile senza errori anche omettendolo, è buona norma metterci un bel return 0 alla fine per chiudere il programma, che significa che il programma è stato eseguito senza errori. In programmi semplici non gliene frega nulla a nessuno, ma se ad esempio quel programma è stato chiamato da un altro (es è il figlio di un superserver di rete, il quale ha passato a lui dei file descriptor) può essere importante sapere se io programma ha avuto successo o è stato terminato con un errore. Soprattutto se sei in linux, evita getChar e System("pause"), non ti servono.

Per gli esercizi anche io ho tutte le dispense dei miei vecchi esercizi, non servono ma grazie per la disponibilità

Per i puntatori non vorrei spoilerare contenuti agli altri.. Ma sono abbastanza semplici da capire se te li spiega uno con le palle. Visto che è una cosa lunga e non posso scrivertela in un reply solo, chiedimi in pm se ti servono slide fatte bene


interessante anche il linux kernel blabla...

per il cell...non avendo android direi java basilare che ormai tutti accettano...almeno all'inizio, e ovviamente solo dopo aver finito questo corso.

altra cosa.
io per questi esercizi/corso praticamente NON faccio ricerce su internet.
Mi spiego, se è una cosa semplice/cazzata la faccio...

Se è per una dimenticanza qui, lo segnalo e attendo.

Se non ho capito qualcosa chiedo.
Altrimenti potrei leggermi le guide online e fare tutto da solo...
bravo bravo.

Linux kernel hacking credimi che non è così semplice / simpatico, per compilare un kernel ci vuole anche un'ora ed è C molto avanzato. E se sbagli anche solo una cosa mandi la macchina in kernel panic, il debugging è molto difficile.
Fa conto che è un corso del secondo anno di ing informatica da 9CFU..
wow..
beh, se le cose vanno per il meglio e qualcuno qui prosegue con l'insegnamento...
io di certo non ho fretta e ringrazio

ho sempre sognato un corso simile che sfociasse anche in qualcosa di avanzato ma a fare da solo dopo un po' perdo la motivazione

detto questo, personalmente non vado più OT per oggi ^_^


spero riuscirò a farti chiarezza sull'uso dei puntatori, la loro algebra e la gestione della memoria. sono tra gli ultimi argomenti che faremo (se ci arriviamo )



immagino si possa addirittura omettere il tipo ritornato su alcuni compilatori. può essere

preferisco la consistenza, però.

il main è una funzione. come tutte le funzioni deve ritornare un valore (è l'argomento di questa lezione) a meno di non dichiararlo come void. in questo secondo caso, il return si può omettere (o fare return e basta, senza un valore).



nì.

capita non di rado che getchar() si ciucci anche il carattere "avanza di una riga" del tasto invio, dopo una scanf, invalidando l'attesa. prova questo codice per capire cosa intendo:


int main(int argc, char *argv[])
{
int valore;
scanf("%d", &valore);
getchar();
return 0;
}


system("Pause") non richiede librerie aggiuntive in Windows, e mi da la certezza che ci sia un output a video.

non sarà elegante, sarà fuori standard, ma siamo quì per imparare



certamente



valuta tu. se ritieni che ci siano sufficienti competenze per farli, anche sì


1) infatti non lo uso e nemmeno getchar() proprio perchè non si chiude. ma è la stessa cosa come in windows. se apri prima il terminale e poi il programma il terminale resta aperto al termine del programma altrimenti si chiude... inoltre mi sembra che system("pause") non funzioni nemmeno su linux, ma non vorrei dire baggianate. per quel poco che ho capito, la funzione di system è quella di far fare al terminale le cose come se le scrivessi tu dentro. voglio dire: con system("color xy") in windows puoi cambiare il colore del prompt dei comandi nei colori x di sfondo e y di caratteri (o il contrario. non ricordo bene, ma vabbè). se apri il prompt dei comandi e ci scrivi direttamente "color xy" fai la stessa cosa.

2) ok credo di aver capito

3) ah ok. comunque considera che io ho fatto giusto 3 lezioni di lab quindi sono considerabili per voi delle cazzatelle gli esercizi che ho xD

4) guarda, attendo di arrivarci con le lezioni di lab e se non ci capisco ancora un accidente chiederò a te. ti ringrazio

ok


ah, va bene...


ho capito...


ma non bisogna aggiungere stdlib.h?
prima non intendevo dire che rispetto a linux in win necessita della roba in più... solo che bisogna includere anche stdlib.h
era solo un pensiero così, non sono qua per contestare


eh boh, vai a sapere... comunque ha detto kaehell che non vi servono, quindi va bene così. ^^

comunque, io nel dubbio ve le linko, poi vedete voi. per me solo la 3 ha dato qualche grattacapo all'esercizio del rettangolo, la 1 e la 2 mi sembrano decisamente affrontabili... magari la 2 non tutta...
metto solo la 1, così mi dite voi qualcosa, io ho una capacità critica molto discutibile (nel senso: se riesco a fare una cosa io allora anche un babbuino ce la farebbe....)
http://moodle.mfn.unipmn.it/file.php/82/Lab/esercizi1.pdf
non consente l'accesso agli ospiti


a me da



tira fuori i PDF da moodle e caricali altrove

ah, bene,...

si, bisognerebbe installare i certificati (anche se con chrome dà l'avviso comunque)
stai tranquillo è normale che lo dica

ok!

http://www.mediafire.com/?3xtph2vhotqw71u

li ho messi tutti e 3 già che c'ero...

chiedo scusa per la mia nabbità


il codice e pieno di errori ... provo a debbuggare e completare e sistemare ..

ad esempio

prima fai un double divisione e poi lo richiami con int divisione .. nella media hai messo un bel double y = (double)y; quando immagino andasse double y = (double)b;

hai una funzione square che penso sia radice , ma in sto caso non ha senso avere 2 valori di ingresso .. sarebbe da riscrivere il programma che prima chieda l' operazione da fare , e poi chieda l' imput , oppure trovare un altra soluzione.

printf("MEDIA!\n Result is %f\n",media(x , y); manca una tonda di chiusura e x,y dovrebbe essere a,b ...

e 1000 altri ..

edit2: ho bestemmiato con la divisione , dopo un po googlando ho imparato a castare e ho risolto .. procedo
volevo postare ieri notte ma è morto il forum ..
questa e la mia calc
http://pastebin.com/heidk15n

se qualcuno ha voglia di controllare eventuali errori , ma dovrebbe funzionare ...


Scusate se vado OT rispondendo a Pier: in object pascal (lazarus o delphi) la direttiva virtual indica semplicemente che un metodo concreto può essere riscritto tramite override nelle classi derivate.
I metodi astratti sono invece definiti dalla coppia di direttive virtual e abstract.

Riguardo il corso: molto chiaro e diretto, complimenti a chi sta contribuendo a crearlo. L'avessi avuto a disposizione quando ho imparato il C anni fa, sarebbe stata una manna dal cielo.


ahahah perchè avevo messo io i parametri da passare nel main, poi li ho tolti, poi però li avevo rimessi perchè volevo che il codice fosse compilabile senza errori, poi però nella divisione ecc dovevo mettere i cast, insomma ho fatto del casino ci do un'occhiata