PDA

View Full Version : Programmare in c con Mandrake


Edde
05-11-2003, 18:02
Ciao :)

Mi consigliate un buon programmino, semplice e potente (stile dev c++ per intenderci) con cui programmare in C?

Nei cd della Mandrake 9.1 c'e' una milionata di programmi, e mi sono un po' perso


Ho provato kDevelop, e sarebbe anche un bel programmino se non ti costringesse a creare dei progetti per ogni cosa: ho fatto un programmino semplice per provare i primi comandi sui processi (1,5 kb), e lui mi ha costretto a creare un progetto di decine di file inutili (1,5 mb).... :eek:

Ma e' possibile che non si possa fare altrimenti?
Se volessi scrivere il classico "Hello world" sono per forza costretto a sorbirmi l'ingombrantissimo contorno?

Allora ho provato Kate. Certo, non ha le comodita' di kDevelop (e di Dev c++ ...... ahhhh, che gran bel programma.... possibile che non ci sia l'equivalente su Linux?), ma almeno non mi costringe a fare cose che non voglio. Certo, poi devo compilare con gcc, e non e' il massimo della vita (anche perche' non ho ben capito le varie opzioni che offre).

Un altro paio di domande e chiudo :)

Sotto win quando compilo il file "pippo.c" mi da "pippo.exe", che e' un eseguibile, e che quindi posso provare semplicemente cliccandoci sopra.
In Linux invece mi da "pippo.o"
Qual'e' il comando per eseguirlo?

Questa invece non riguarda linux, ma il c in generale.
Immaginiamo che il main si trovi nel file "main.c"
In "pippo.c" ci sono delle funzioni che ho scritto io, e che vorrei usare in "main.c"
Per far capire questa cosa al compilatore, cosa devo dirgli?

Grazie :p

NA01
05-11-2003, 18:17
se non vuoi interfacce in stile visual c++ basta un editor qualunque (da bluefish a gedit, a kedit, a vi, a emacs) ecc...
il .o è un file oggetto, non è un esegubile (gcc dovrebbe dare un .out alla fine).
il .out si lancia con
./nome.out
che linea usi per gcc?
fossi in te non abbandonerei gcc per nulla al mondo!
tenere due finestre aperte non è poi così impossibile, su una scrivi e sull'altra lanci gcc (il comando tra l'altro ti rimane nell'history, lo puoi richiamare con la freccia su).
per c++ devi usare g++ .
se usi emacs puoi anche compilare nella stessa schermata dell'editor.
se vuooi un buon libro che ti spieghi la programmazione c/c++ su linux lo trovi su www.advancedlinuxprogramming.com
sono dei pdf da scaricare.
nei primi capitoli ti spiega anche come usare gcc.

per l'ultima domanda...
non ho capito se vuoi una cosa tipo

#include "pippo.c"

o se intendi la linea di comando da usare

cc -c main.c -o main.o
cc -c pippo.c -o pippo.o
cc main.o pippo.o -o ciao



ciao

maxithron
05-11-2003, 18:37
Oltre agli editor che ti ha suggerito NA01 io aggiungerei anche Quanta:
è ottimo dato che ti consente anche di scegliere l'high-light mode a seconda del codice che devi scrivere(c/c++, php,etc...)

Se invece vuoi un ide meno "inglobante" di kdevelop, puoi utilizzare anjuta.

VegetaSSJ5
05-11-2003, 22:20
guarda che dev-c++ c'è anche per linux, vai sul sito del produttore e vedrai che c'è, ma non so se si può scaricare, altrimenti lo cerchi in rete.

cn73
05-11-2003, 22:50
Editor di testo e linea di comando...niente di meglio per cominciare e capire i meccanismi basilari...

Pinocchio
06-11-2003, 11:58
Originariamente inviato da cn73
Editor di testo e linea di comando...niente di meglio per cominciare e capire i meccanismi basilari...
Già, scusate se mi intrufolo, ma era inutile magari aprire un nuovo 3d.

Posto le mie domande:

1)Sotto Gcc, con quale funzione si pulisce lo schermo e a quale libreria fa riferimento?
2)e per getch() va bene la libreria curses.h o ce ne sono altre?

C i a o.

Edde
07-11-2003, 14:59
Grazie a tutti :)

Ho optato per Kate (che ti permette anche di compilare senza dover cambiare applicazione, visto che in finestra ti mette la console), e dopo un periodo di assestamento, comincio a trovarmici discretamente bene :)

Edde
07-11-2003, 18:47
Ragazzi, ora ho una domanda di quelle difficili :D
Sto muovendo i primi passi coi semafori, e ho scritto questo programmino: il classico programma del Produttore-Consumatore.

Il processo padre crea due figli e rimane in attesa.

Il primo chiama la funzione "produttore", che manda un msg a video, prende una stringa dalla tastiera, e la copia in un'area di memoria condivisa.

Il secondo invece chiama la funzione "consumatore", che legge la stringa dalla mem condivisa e la stampa a video.

La cosa si ripete (con un ciclo) fino a quando l'utente non inserisce la stringa "quit".

Chiaramente i due processi non possono accedere contemporaneamente alla memoria, e l'esclusione avviene con i semafori.

Dico subito che c'e' un errore: infatti non c'e' niente che impedisca al consumatore di entrare nell'area critica prima del produttore (e la cosa non dovrebbe accadere).
Il padre genera prima il produttore, che quindi in genere riesce ad accedere alla memoria prima dell'altro, ma e' cmq una soluzione scorretta.

Il problema pero' e' un altro:
il consumatore non riesce ad entrare nell'area critica prima della morte del produttore.

Esempio di esecuzione:

>Inserisci il dato ('quit' per uscire):
pippo
>Inserisci il dato ('quit' per uscire):
pluto
>Inserisci il dato ('quit' per uscire):
quit
>quit

Mentre invece dovrebbe essere:

>Inserisci il dato ('quit' per uscire):
pippo
>pippo
>Inserisci il dato ('quit' per uscire):
pluto
>pluto
>Inserisci il dato ('quit' per uscire):
quit
>quit

Ecco il codice:

---------------------------------------- ------------
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <stdio.h>

/* Produttorre-Consumatore con i semafori */

/* Metodi per le operazioni sul semaforo */

int waitSem(int ds_sem)
{
struct sembuf oper;
oper.sem_num = 0;
oper.sem_op = -1;
oper.sem_flg = 0;

return semop(ds_sem, &oper, 1);
}

int signalSem(int ds_sem)
{
struct sembuf oper;
oper.sem_num = 0;
oper.sem_op = +1;
oper.sem_flg = 0;

return semop(ds_sem, &oper, 1);
}


-----
/* Metodo produttore di dati. Chiede il dato e lo memorizza in memoria condivisa */
void produttore(int ds_mem, int ds_sem)
{
void *indirizzo;
int ret;
char dato[256];


/* Attacco la memoria allo spazio di indirizzamento */
indirizzo = shmat(ds_mem, 0, SHM_W);
if( indirizzo == (void*) -1 ) printf("Errore nella shmat del produttore\n");

/* Produco */

do{
ret = waitSem(ds_sem);
if(ret == -1) printf("Errore nella wait del produttore\n");

printf("Inserisci il dato ('quit' per uscire): \n");
scanf("%s", dato);


/* Inizio area critica */
strcpy(indirizzo, dato);
/* Fine area critica */

ret = signalSem(ds_sem);
if(ret == -1) printf("Errore nella signal del produttore\n");


}while( (strcmp(dato, "quit") != 0) );


exit(0);
}

-----
/* Metodo consumatore. Prende il dato dalla memoria condivisa e lo mette a schermo */
void consumatore(int ds_mem, int ds_sem)
{
void *indirizzo;
char dato[256];
int ret;

/* Attacco la memoria allo spazio di indirizzamento */
indirizzo = shmat(ds_mem, 0, SHM_R);
if( indirizzo == (void*) -1 ) printf("Errore nella shmat del consumatore\n");

/* Consumo */

do{
ret = waitSem(ds_sem);
if(ret == -1) printf("Errore nella wait del consumatore\n");
/* Inizio area critica */
strcpy(dato, indirizzo);
/* Fine area critica */

ret = signalSem(ds_sem);
if(ret == -1) printf("Errore nella signal del consumatore\n");

printf("%s\n", dato);
}while( (strcmp(dato, "quit") != 0) );


exit(0);

}


-----
/* Metodo Main */
int main()
{

int ds_shm, ds_sem, ret, status;
long chiave_shm = 30, chiave_sem = 50;

/* Inizializzo il fottuto semaforo */
ds_sem = semget(chiave_sem, 1, IPC_CREAT | 0666);
if(ds_sem == -1) printf("Errore nella creazione del semaforo\n");

ret = semctl(ds_sem, 0, SETVAL, 1);

/*Inizializzo la memoria condivisa*/
ds_shm = shmget(chiave_shm, 256, IPC_CREAT | 0666);
if( ds_shm == -1 ) printf("Errore nella creazione della memoria\n");

/* Facciamo nascere i due figli */
if(fork() != 0)
{
if(fork() != 0)
{
wait(&status);
wait(&status);
}
else consumatore(ds_shm, ds_sem);
}
else produttore(ds_shm, ds_sem);

/* Elimino la memoria condivisa */
ret = shmctl(ds_shm, IPC_RMID, NULL);
if(ret == -1) printf("Errore nella rimozione della memoria\n");

/* Elimino il fottutissimo semaforo */
ret = semctl(ds_sem, 0, IPC_RMID, 1);
if(ret == -1) printf("Errore nella rimozione del semaforo\n");

} /* Fine del main */
---------------------------------------- ------------

Se avete letto fino a qui, grazie :)
Se poi potete anche aiutarmi, allora alla prima occasione vi offriro' anche da bere :p

Grazie :D

Pinocchio
14-11-2003, 14:54
Originariamente inviato da Pinocchio
Già, scusate se mi intrufolo, ma era inutile magari aprire un nuovo 3d.

Posto le mie domande:

1)Sotto Gcc, con quale funzione si pulisce lo schermo e a quale libreria fa riferimento?
2)e per getch() va bene la libreria curses.h o ce ne sono altre?

C i a o.
UP :(

NA01
14-11-2003, 14:59
non ho ancora letto la parte sui semafori per i processi (sono al cap 4) :(
se vuoi puoi darci un'occhiata
www.advancedlinuxprogramming.com
credo che tu stia cercando le informazioni del capitolo 5, non essendoci ancora arrivato non ti sò dire altro...
ciao

sebyweb
14-11-2003, 17:29
scusate, ma come si compila direttamente da emacs?

NA01
14-11-2003, 19:16
una volta salvato vai su tool->compile
ti compare la linea di comando in fondo e puoi lanciare la compilazione

ciao

Krakz
14-11-2003, 19:26
http://www.scintilla.org/SciTEImage.html

Scite ;)