Errore calcolatricce

nel test 003 dell’ esercizio calcolatrice mi riporta l’errore “Execution killed with signal 11 (could be triggered by violating memory limits)”, come posso risolvere?

Dovresti pubblicare il tuo codice altrimenti è realmente difficile riuscire a capire il tuo errore :wink:

Comunque un consiglio, quando crei un topic dovresti linkare il problema di cui stai parlando (https://cms.di.unipi.it/#/task/calcolatrice/statement), e successivamente il link al tuo codice, per farlo basta che cliccki new paste su https://pastebin.com/ e successivamente copi i link così https://pastebin.com/ZmqPj6Sw, altrimenti è molto difficile aiutarti

grazie per aver risposto e del consiglio, ecco il link: https://pastebin.com/JfckM8rx

Quando svogli un problema e devi dichiarare delle strutture che necessitano di inserire la loro dimensione, quando le crei: innanzitutto sarebbe meglio usare una costante, infatti prima del main di solito si dichiara una costante, chiamata MAXN e gli si assegna il valore massimo che può avere n , poi quando si dichiare l’ array gli si passa come "parametro " MAXN A[MAXN] mentre quando ci lavori usi n, for( int i=0; i < n; i++). Poi onestamente credo che nel tuo algoritmo ci siano alcuni errori, comunque prova a eseguire il cambiamento che ti ho detto :smile:.

Ho provato a farlo io e mi ha dAto 80/100 sbagliando solo il subtask, quindi presumo che l errore sia nella funzione log, faccio qualche prova e ti dico

il numero massimo di valori dell’array non posso inserirlo finché non ho il numero in input, pertanto non posso dichiararli prima del main e dell’input del numero. Voglio precisare che tutti i test risultano corretti e solo lo 003 da errore ma non causato da un output errato.

Ho risolto: questo è il tuo codice corretto: https://pastebin.com/tyeksFkU , le mie presunzioni erano giuste, ossia che l’errore è generato dalla funzione log, infatti essa come altre funzioni di libreria alcune volte creano errori, la motivazione esatta non la so, ma ero a conoscenza che alcune delle funzioni di math.h creassero problemi in quanto lavoro con numeri in floating point(come detto anche qui Problema “allocazione di memoria”) infatti solitamente conviene riscrivere la funzione.

Per quanto riguarda il sovradimensionare puoi anche non farlo ma solitamente ripeto è più corretto farlo per quanto riguarda la dimensione credo di essermi spiegato male ma posso rimediare facendo un esempio:

Esercizio trova il massimo fra N numeri , con al massimo 1000000 dovrebbe essere svolto cosi (è totalmente inutile inserire i valori nell’array in questo caso ma è il primo esempio che mi è venuto in mente :wink: ) https://pastebin.com/eUX2AqkY , anche se dovrebbe darti corretta anche la versione nella quale dichiari A[n] direttamente.

Beh diciamo che quando tu dichiari un array di dimensione una variabile stai sbagliando a livello “concettuale”. In poche parole stai dichiarando in array semistatico, il quale non ricordo esattamente a livello di memoria come viene salvato, ma sicuramente male cioé in un modo poco efficiente.
Poi per carità funziona lo stesso, ma é buona norma non fare mai cosí, piuttosto crei un array statico di dimensione costante scelta a priori e quindi lo salvi nella stack. Oppure fai un array dinamico salvato nella heap (seppure l’accesso alla heap é leggermente più lento che non l’accesso alla stack).

Un array dichiarato all’interno di una funzione, sia che sia a dimensione prefissata che a dimensione dipendente da una variabile, viene salvato in stack. Di solito è sconsigliabile farlo perchè lo stack è relativamente limitato in dimensione. Quello che consiglio di fare è o allocare l’array staticamente a livello globale alla dimensione massima necessaria (metodo da preferire in gara) o allocarlo dinamicamente con malloc()/free() o new/delete, da preferire quando si sta lavorando a un progetto più grande.

1 Mi Piace

grazie a tutti per i consigli e i chiarimenti