|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2007
Messaggi: 80
|
[C] albero semplice
hola!
come posso costruire in C un albero di questo tipo?: ----8541 --/ -- |-- \ 8542 8543 8548 -------| ------8544 ----/----|----\ 8545 8546 8547 In questo caso riceve 4 in input e quindi lo fa4 volte.. ![]() quando io provo a fare fork() mi agiunge un figlio per ogni figlio! ps partito dalla radice creo 3 figlio e solo uno di questi puo' fare3 figli(non piu, non mneo..) |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Potresti spiegare meglio? Magari con il codice e il problema riscontrato
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Oct 2007
Messaggi: 80
|
Devo riuscire a fare un programma in C che prende in input "x"
e fa l'albero alto x. se per esempio x è 2 sara cosi: 8541 processo padre 8542 - 8543 - 8544 processi figli (i numeri sono i pid) se x è 4 8541 processo padre 8542 - 8543 - 8548 processi figli di 8541 ...........8544..........processo figlo di 8543 8545 - 8546 - 8547 processi figli di 8544 il problema è che se faccio i fork(), non mi aggiunge solo un figlio al processo padre ma aggiunge figli a tutte le "foglie" spero di essermi spiegato un po meglio ![]() |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Quote:
![]() Comunque una cosa che non ho capito è questa: il programma prende in input x, e poi con quale criterio decide quanti processi figli lanciare per ogni singolo processo? Nel senso, se la richiesta è solo quella di avere alla fine un albero di altezza x, basta creare un figlio solo per ogni processo fino a raggiungere l'altezza desiderata, es: 8541 --|-- 8542 --|-- 8543 --|-- 8544 |
|
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Oct 2007
Messaggi: 80
|
la richiesta è come l'immagine che ti ho allegato
mettiamo x=5 con livelli da 1 a 5 il processo del livello 1 fa3 figli nel livello 2 ci sono 3 figli ma solo un figlio fa un'altro figlio nel livello 3 cè solo un figlio e ne fa 3 nel livello 4 ci sono 3 figli ma solo un figlio fa un'altro figlio ... l'immagine allegata rende un po piu l'idea ![]() piu tardi posto il codice ma non ho fatto molto.. (la maggior parte sono stati tentativi accompagnati da relative arrabbiature) |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Sì, ora è tutto chiaro. Appena puoi posta il codice, nel frattempo provo a scrivermi una soluzione in pseudocodice (all'uni abbiamo visto solo la teoria per ora).
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Oct 2007
Messaggi: 80
|
son disperato..
devo consegnare per lunedi un mega esercizio e l'albero è solo una minima parte... una delle tante prove è questa: #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { pid_t pid; pid = fork(); switch (pid) { case -1: printf ("No he podido crear el proceso hijo \n"); break; case 0: printf ("Soy el hijo, mi PID es %d y mi PPID es %d \n", getpid(), getppid()); fork(); fork(); sleep (20); break; default: printf ("Soy el padre, mi PID es %d y el PID de mi hijo es %d \n", getpid(), pid); sleep (30); } printf ("Final de ejecución de %d \n", getpid()); exit (0); } ma mi crea un albero sbilanciato (come tutte le altre prove che ho fatto) |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Allora, io ho scritto uno pseudocodice, ecco quello che ho scritto:
Codice:
altezza=x triplo=false while(x>0){ triplo=!triplo x-- pidcorrente=pid if(triplo){ pid=fork() if(pid==0) break } pid=fork() if(pid==0) continue wait(pid) if(triplo) fork() break } all'inizio ho un processo, questo prenderà in input l'altezza dell'albero ed entrerà nel ciclo. Per questo processo triplo sarà true, quindi, dopo aver decrementato x lancerà un processo figlio A (primo ramo sinistro) che però non proseguirà il ciclo, poi lancerà un altro processo B (il ramo centrale) (*). Poi attenderà che questo abbia terminato e solo allora farà partire un altro processo C (il ramo destro), a quel punto sia C che il processo padre usciranno dal ciclo. (*) B ripartirà dall'inizio del ciclo, stavolta triplo sarà false e x sarà di nuovo decrementata. Verrà lanciato solo il processo B2 (ramo centrale). B2 ripartirà dall'inizio del ciclo, triplo sarà true e così via... Spero di non aver scritto cose sbagliate e di esserti stato di aiuto. Ciao |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Oct 2007
Messaggi: 80
|
? triplo=!triplo ?
ciao,
sì, sei d'aiuto! ho capito cosa vorresti fare ma non conosco il comando: triplo=!triplo cosa fa?? grazie! |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Si usa proprio così in C, ! è l'operatore di negazione, quindi se prima triplo era true !triplo è false. Comunque in C non c'è true e false, quindi false sarà lo zero e true 1.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:32.