PDA

View Full Version : [C] Consigli, tips & trick per iniziare


*andre*
01-10-2011, 09:47
Ciao ragazzi!
Vado subito al dunque. Quest'anno devo dare un esame di sistemi operativi, quindi devo studiarmi ANSI C in 2 settimane per poter iniziare a fare laboratorio. La programmazione in C avverrà in ambiente UNIX con compilatore gcc. Detto ciò, mi potete dare qualche consiglio riguardo all'ambiente di lavoro?
Quale IDE, facile da usare, mi consigliare? (per ora ho messo su Esclipse + CDT)
Qualche consiglio su errori stupidi che si commettono all'inizio e che portano via una marea di tempo? (sto cercando common pitfalls su google, ma vorrei un commento di esperienza personale)
Pensate sia meglio un IDE o la semplice combinazione Gedit + gcc -o per compilare e eseguire?
Qualche debugger facile da usare? (gdb?)

Grazie a tutti per le risposte :) mi state davvero dando una mano :D (anche perché ho davvero poco tempo per apprendere le basi e evitare gli errori comuni)
Thanks :p

neutronirt
01-10-2011, 14:39
Personalmente uso dev-c++ come ide, mi sono sempre trovato piuttosto bene, ma anche una combinazione di notepad++ e il semplice gcc può andare.
Per quanto riguarda le cose più ostiche del c, ti consiglio di comprendere veramente bene:
1.Allocazione dinamica della memoria.
2.Puntatori e aritmetica dei puntatori: in c non esistono tipi string, quindi ti ritroverai spesso a lavorarci, in più la costruzione di alberi liste ecc passa assolutamente per la conoscenza di questi, quindi...ti servono!
3.Struct: anche qui come sopra, le liste si basano sulle struct, gli alberi idem. Tutti i tipi di dato complessi in generale si basano su queste, quindi sono un'altra parte fondamentale del linguaggio.
Per il resto il c è piuttosto intuitivo essendo un linguaggio procedurale, vai tranquillo, soffermati su questi tre passaggi e lo padroneggerai senza problemi.

Freaxxx
01-10-2011, 15:53
il CDT di eclipse ha un bel po' di bug noti: occhio!

usa CodeBlocks, per progettini piccoli va più che bene, ancora meglio, abituati da subito ad usare gcc da linea di comando perché sarà fin da subito la soluzione migliore e più flessibile di tutte.

*andre*
01-10-2011, 17:56
Grazie per i consigli :)

SI diciamo che è un po problematica la gestione della memoria dinamica, ma ci sto facendo l'abitudine piano piano :D

A presto proverò code::blocks, dev c++ non è purtroppo disponibile per Linux.

A riga di comando si usa gdb per eseguire istruzione per istruzione?

WarDuck
01-10-2011, 18:31
Grazie per i consigli :)

SI diciamo che è un po problematica la gestione della memoria dinamica, ma ci sto facendo l'abitudine piano piano :D

A presto proverò code::blocks, dev c++ non è purtroppo disponibile per Linux.

A riga di comando si usa gdb per eseguire istruzione per istruzione?

Ma non ci pensare nemmeno :D.

Ti consiglio di provare NetBeans con annessa estensione C/C++.

*andre*
01-10-2011, 20:21
Ma non ci pensare nemmeno :D.

Ti consiglio di provare NetBeans con annessa estensione C/C++.

Ci darò un'occhiata ;)

.. ho visto adesso come funziona gdb :D non mi ero ancora informato su come funzionasse :doh:

netburst
02-10-2011, 09:54
Ciao ragazzi!
Vado subito al dunque. Quest'anno devo dare un esame di sistemi operativi, quindi devo studiarmi ANSI C in 2 settimane per poter iniziare a fare laboratorio. La programmazione in C avverrà in ambiente UNIX con compilatore gcc.

Se tra due settimane dovrai programmare in C su UNIX utilizzando gcc ti consiglio di lasciare eclipse e tutti gli ambienti grafici dove sono, e di utilizzare gcc, gdb ed al massimo un editor di testo. Non sarebbe male nemmeno l'idea di metterti a studiare proprio su un ambiente *nix...ma due settimane sono veramente poche...

Saluti, netburst

cdimauro
02-10-2011, 11:03
E al posto delle dita utilizziamo una clava per premere i tasti sulla tastiera. :D

*andre*
02-10-2011, 12:14
Se tra due settimane dovrai programmare in C su UNIX utilizzando gcc ti consiglio di lasciare eclipse e tutti gli ambienti grafici dove sono, e di utilizzare gcc, gdb ed al massimo un editor di testo. Non sarebbe male nemmeno l'idea di metterti a studiare proprio su un ambiente *nix...ma due settimane sono veramente poche...

Saluti, netburst

per l'ambiente *nix è ormai un anno che uso Linux :) Comunque proverò sicuramente con la consolle visto che in laboratorio useremo quella.

E al posto delle dita utilizziamo una clava per premere i tasti sulla tastiera. :D

Vabbè dai sono piccoli programmini :D

Comunque.. una domandina su fork():
dopo la chiamata a fork() qual è il processo che continua subito dopo? E' lo scheduler che decide se far continuare il padre o il figlio o un altro processo no?
Lo dico perché vorrei sapere se si può prevedere chi continuerà la esecuzione del codice.
Grazie :)

cdimauro
02-10-2011, 12:18
No, dipende dall'implementazione del kernel/scheduler.

In teoria potrebbe continuare il padre, mentre il figlio sarebbe inserito nell'elenco dei processi "ready", poiché il suo tempo allocato non è ancora scaduto.

Dall'altra parte, se ho eseguito un fork magari mi aspetterei che il figlio cominciasse subito a lavorare.

Entrambe le scelte hanno pregi e difetti, e non mi sento di propendere per nessuna delle due.

*andre*
02-10-2011, 12:36
per cui dipende dalla politica dello scheduler.. Grazie per chiarirmi questo dubbio :D

banryu79
03-10-2011, 08:36
E al posto delle dita utilizziamo una clava per premere i tasti sulla tastiera. :D
Più... touchscreen di così :sofico:

lishi
04-10-2011, 00:18
Ciao ragazzi!
Vado subito al dunque. Quest'anno devo dare un esame di sistemi operativi, quindi devo studiarmi ANSI C in 2 settimane per poter iniziare a fare laboratorio. La programmazione in C avverrà in ambiente UNIX con compilatore gcc. Detto ciò, mi potete dare qualche consiglio riguardo all'ambiente di lavoro?
Quale IDE, facile da usare, mi consigliare? (per ora ho messo su Esclipse + CDT)
Qualche consiglio su errori stupidi che si commettono all'inizio e che portano via una marea di tempo? (sto cercando common pitfalls su google, ma vorrei un commento di esperienza personale)
Pensate sia meglio un IDE o la semplice combinazione Gedit + gcc -o per compilare e eseguire?
Qualche debugger facile da usare? (gdb?)

Grazie a tutti per le risposte :) mi state davvero dando una mano :D (anche perché ho davvero poco tempo per apprendere le basi e evitare gli errori comuni)
Thanks :p

Chiedi al professore cosa si useranno durante lezioni/esami.

Normalmente mi sembra di ricordare che non si usa nessun IDE.
Il mio esame è stato

vi -> editor
compilare da linea di comando.

*andre*
04-10-2011, 16:52
si penso che per un po, all'inizio, userò la linea di comando + gedit, i problemi sono più che altro "teorici" nel senso che i programmi non sono molto lunghi.

Questa soluzione penso sarà quella usata anche in laboratorio (per l'assembler del mips usavamo kate + simulatore :) )

Mattz
04-10-2011, 17:21
a noi avevano fatto usare gedit + gcc ... abituati giusto a gcc per non avere momenti di panico per non averlo mai usato.

*andre*
05-10-2011, 07:44
a noi avevano fatto usare gedit + gcc ... abituati giusto a gcc per non avere momenti di panico per non averlo mai usato.

Si mi ci sto abituando :)

Comunque adesso sto facendo degli esercizi, magari stasera ne posto qualcuno per vedere come si possono migliorare :p

*andre*
05-10-2011, 18:18
Bene, ho fatto un esercizio e mi funziona, però mi piacerebbe che qualcuno gli desse un'occhiata per vedere dove si può migliorare o se ci sono degli 'errori' da novellino :D
Testo:
Implementare un programma che legga da tastiera una matrice n x m e le sue componenti. Il programma dovrà creare un vettore i cui componenti contengono la somma degli elementi di una colonna della matrice. Bisogna usare la memoria dinamica.
#include <stdio.h>
#include <stdlib.h>

#define CIFRE_MAX 5

int main(){
int n, m, i, j, somma;
int** matrice;
char* stringa_input = (char*) malloc(CIFRE_MAX * sizeof(char));

puts("Inserisci la dimensione n:\n");
fgets(stringa_input, CIFRE_MAX, stdin);
n = atoi(stringa_input);

puts("Inserisci la dimensione m:\n");
fgets(stringa_input, CIFRE_MAX, stdin);
m = atoi(stringa_input);

// creo la matrice dinamica
matrice = (int**) malloc(n * sizeof(int*));
for(i = 0; i < n; i++)
matrice[i] = (int*) malloc(m * sizeof(int));

// chiedo all'utente di inserire i dati
for(i = 0; i < n; i++){
printf("\nRiga %d:\n", i);
for(j = 0; j < m; j++){
printf("\t(%d, %d)\t", i, j);
fgets(stringa_input, CIFRE_MAX, stdin);
matrice[i][j] = atoi(stringa_input);
}
}

// creo il vettore_somma per la somma
int* vettore_somma = (int*) malloc(n * sizeof(int));
for(j = 0; j < m; j++){
somma = 0;

for(i = 0; i < n; i++)
somma = somma + matrice[i][j];

vettore_somma[j] = somma;
}

// stampo il risultato
for(i = 0; i < n; i++){
for(j = 0; j < m; j++)
printf("%5d", matrice[i][j]);
puts("\n");
}
puts("Somma:\n");
for(i = 0; i < m; i++)
printf("%5d", vettore_somma[i]);
puts("\n");

// libero la memoria
for(i = 0; i < n; i++)
free(matrice[i]);
free(matrice);
free(stringa_input);
free(vettore_somma);
exit(0);
}
Grazie :)