DOMANDA Programma in C blocca Windows

Peri

Nuovo Utente
82
3
Ho scritto un programma in C (non molto complesso) con una funzione che chiama se stessa al più 7 volte, fino a un massimo di 42 chiamate consecutive.
Dopo una decina di minuti si impalla tutto e sono obbligato a spegnere il pc dal pulsante di on/off.
Il codice usa passaggi elementari del C, ma è parecchio lungo per cui non mi sembra funzionale condividere il codice.
Avete qualche consiglio generico? magari qualcosa che potrei controllare e che potrebbe bloccare tutto?
 

Andretti60

Utente Èlite
6,440
5,091
Molto facile da farsi, per esempio basta creare un ciclo o una funzione ricorsiva che alloca risorse (handle, GDI, thread, memory) quando si raggiunge il limite il computer va in palla.
Vedi per esempio il famoso Fork Bomb.
 

Peri

Nuovo Utente
82
3
Molto facile da farsi, per esempio basta creare un ciclo o una funzione ricorsiva che alloca risorse (handle, GDI, thread, memory) quando si raggiunge il limite il computer va in palla.
Vedi per esempio il famoso Fork Bomb.
Però il mio codice ha, in linea teorica, un termine. E, sempre in linea teorica, esegue al massimo 42 chiamate consecutive sin dall'inizio. Se fosse così non dovrebbe bloccarsi al primo ciclo di chiamate? Tutte le variabili dichiarate sono dentro la funzione che chiama se stessa. Quindi suppongo che la prima "ondata", nella quale sicuramente chiama se stessa 42 volte e non di più, raggiunge il massimo della memoria occupata.
Poi sì la funzione alloca molta memoria con la funzione calloc, ma lo fa una sola volta e tra i primi comandi.
 

Peri

Nuovo Utente
82
3
Come dici tu … in linea teorica. Sei sicuro sia quello che faccia?
nel main si alloca un vettore di notevoli dimensioni con la funzione calloc e fin qua tutto fila liscio poi chiama la funzione F (nel codice ha un altro nome più lungo).
La funzione F presenta le seguenti chiamate e cicli (in ordine):
*chiama la funzione G (presenta un solo ciclo for con potenzialmente molte iterazioni ma finite)
*chiama la funzione H (funzione priva di cicli e priva di chiamate ad altre funzioni)
(in base al return di G e H ci possono essere dei return di F)
*ciclo for con 7 iterazioni (il tipico indice che li conta non viene in alcun modo usato o modificato nelle iterazioni)
**Nel ciclo chiama la funzione F
**In base al risultato di F ci possono essere dei return
Fuori dal ciclo c'è qualche comando e poi un return

prima di ogni return viene chiamata una funzione T che presenta un ciclo finito (al più 42 cicli)

ho usato una variabile esterna ad F che mi diceva quante chiamate consecutive ci sono state e come previsto non supera mai 42 (o almeno le decine del numero che scriveva non superavano il 4)

Per scrupolo ho segnato anche gli indici più grandi che venivano chiamati dal vettore allocato con calloc e da 1M di componenti possibili non aveva superato ancora 700mila

Ho provato ad avviare il programma e vedere l'uso di memoria e processore
24MB di memoria e intorno il 14% l'uso del processore
 

BrutPitt

Utente Attivo
1,166
1,262
Come ha detto @Andretti60, senza poter leggere il tuo codice e' impossibile aiutarti.

Se ti va di condividerlo, puoi farlo, inserendolo all'interno del tag CODE (che trovi nel menu dei 3 puntini verticali: "codice") ... e se il problema e' invece la lunghezza, puoi appoggiarti a PasteBin: https://pastebin.com/

Li' puoi Inserire il tuo codice, anche in modo anonimo, senza registrarti, e poi riportare qui il link generato in modo che possiamo leggerlo e che ti si possa dare una mano.
 

Peri

Nuovo Utente
82
3
Come ha detto @Andretti60, senza poter leggere il tuo codice e' impossibile aiutarti.

Se ti va di condividerlo, puoi farlo, inserendolo all'interno del tag CODE (che trovi nel menu dei 3 puntini verticali: "codice") ... e se il problema e' invece la lunghezza, puoi appoggiarti a PasteBin: https://pastebin.com/

Li' puoi Inserire il tuo codice, anche in modo anonimo, senza registrarti, e poi riportare qui il link generato in modo che possiamo leggerlo e che ti si possa dare una mano.
grazie mille, ma a quanto pare è stata una coincidenza.
Dopo il primo blocco ho modificato il programma togliendo quante più operazioni di troppo, al secondo avvio mi si è bloccato di nuovo il pc. Al che ho aperto questa discussione e il programma per ovvie ragioni non l'ho più avviato ( non credo sia salutare spengere forzatamente il pc ).
Ma dopo un po' è successo che mentre studiavo mi si impallasse completamente il pc, al che ho fatto 1+1 e appena possibile ho avviato di nuovo il programma che per due ore è andato avanti senza interruzioni o lag.
Poi stamattina mi si è bloccato di nuovo il computer...
Scusatemi, ma mi sembrava al momento ragionevole che fosse il programma il problema.
Specie perché si parla di un programma che, come un po' era prevedibile, non termina nemmeno in 2 ore (e ci sta perché ad occhio non fa molto meno di 7^42 chiamate di funzione)

In vista di ciò direi che questa discussione non ha motivo di esistere, ma non so come si eliminano le discussioni da questo forum...
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
ad occhio non fa molto meno di 7^42 chiamate di funzione
7 elevato alla 42 chiamate di funzione? è un numero di 36 cifre, il problema non è che non termina in 2 ore, ma che non bastano 2 miliardi di anni
In vista di ciò direi che questa discussione non ha motivo di esistere, ma non so come si eliminano le discussioni da questo forum
non è necessario eliminare nulla, quello che hai scritto può servire a qualcun altro
 
  • Mi piace
Reazioni: Peri

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!