Risolto variabile corrotta

mantidereligiosa

Utente Iron
6 Febbraio 2024
9
1
0
2
C++:
for (ic = 0; ic <= 99; ic++) {
                                             if (!blal1[ic][0][0].empty()) {
                                                                           for (l2 = 0; l2 <= 99; l2++) {
                                                                                                         if (blal1[ic][l2][0] == "or" && blal1[ic][l2 + 1][0] == "ob" && blal1[ic][l2 + 1][1] == "2" && blal1[ic][l2 + 2][0] == "or") {
                                                                                                                                                                                                                                       if (lmin == 0 && lmax == 0) {
                                                                                                                                                                                                                                                                    lmin = stoi(blal1[ic][l2][1]) / 2;
                                                                                                                                                                                                                                                                    lmax = lmin * 3;
                                                                                                                                                                                                                                                                    lin = l2;
                                                                                                                                                                                                                                                                    blal1[ic][lin][2] = blal1[ic][lin][1];
                                                                                                                                                                                                                                                                    } else {
                                                                                                                                                                                                                                                                            if (stoi(blal1[ic][l2][1]) > lmin && stoi(blal1[ic][l2][1]) < lmax) {
                                                                                                                                                                                                                                                                                                                                                 //blal1[ic][lin][2] = to_string(stoi(blal1[ic][lin][2]) + stoi(blal1[ic][l2][1]));
                                                                                                                                                                                                                                                                                                                                                 } else {
                                                                                                                                                                                                                                                                                                                                                         lmin = 0;
                                                                                                                                                                                                                                                                                                                                                         lmax = 0;
                                                                                                                                                                                                                                                                                                                                                         lin = 0;
                                                                                                                                                                                                                                                                                                                                                         }
                                                                                                                                                                                                                                                                            }
                                                                                                                                                                                                                                       } else {
                                                                                                                                                                                                                                               if (blal1[ic][l2][0] == "ob" && blal1[ic][l2 + 2][0] == "ob" && blal1[ic][l2 + 1][0] == "or" && blal1[ic][l2][1] == "2") {
                                                                                                                                                                                                                                                                                                                                                                         if (lmin == 0 && lmax == 0) {
                                                                                                                                                                                                                                                                                                                                                                                                      lmin = stoi(blal1[ic][l2 + 1][1]) / 2;
                                                                                                                                                                                                                                                                                                                                                                                                      lmax = lmin * 3;
                                                                                                                                                                                                                                                                                                                                                                                                      lin = l2 + 1;
                                                                                                                                                                                                                                                                                                                                                                                                      blal1[ic][lin][2] = blal1[ic][lin + 1][1];
                                                                                                                                                                                                                                                                                                                                                                                                      } else {
                                                                                                                                                                                                                                                                                                                                                                                                              if (stoi(blal1[ic][l2 + 1][1]) > lmin && stoi(blal1[ic][l2 + 1][1]) < lmax) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           //blal1[ic][lin][2] = to_string(stoi(blal1[ic][lin][2]) + stoi(blal1[ic][l2 + 1][1]));
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           } else {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   lmin = 0;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   lmax = 0;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   lin = 0;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   }
                                                                                                                                                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                                                                                                                         } else {
                                                                                                                                                                                                                                                                                                                                                                                 lmin = 0;
                                                                                                                                                                                                                                                                                                                                                                                 lmax = 0;
                                                                                                                                                                                                                                                                                                                                                                                 lin = 0;
                                                                                                                                                                                                                                                                                                                                                                                 }
                                                                                                                                                                                                                                               }
                                                                                                          }
                                                                          
                                                                           } else {break;}
                                             }
quando eseguo questo codice con quelle due istruzioni commentate funziona tutto bene e la variabile lin è 0 6 10, quando decommento quelle due istruzioni la variabile lin diventa 2 6 10 poi tutto il resto del programma funziona male di conseguenza.
Mi hanno detto su un' altro forum che potrebbe essere dovuto ad una corruzione delle stack delle variabili.
Allego file con il codice in caso non si vede bene.
 

Allegati

  • uplo.txt
    14 KB · Visualizzazioni: 3
Posto il codice in maniera più leggibile:
C:
for (ic = 0; ic <= 99; ic++)
{
    if (!blal1[ic][0][0].empty())
    {
        for (l2 = 0; l2 <= 99; l2++)
        {
            if (blal1[ic][l2][0] == "or" && blal1[ic][l2 + 1][0] == "ob" && blal1[ic][l2 + 1][1] == "2" && blal1[ic][l2 + 2][0] == "or")
            {
                if (lmin == 0 && lmax == 0)
                {
                    lmin = stoi(blal1[ic][l2][1]) / 2;
                    lmax = lmin * 3;
                    lin = l2;
                    blal1[ic][lin][2] = blal1[ic][lin][1];
                }
                else
                {
                    if (stoi(blal1[ic][l2][1]) > lmin && stoi(blal1[ic][l2][1]) < lmax)
                    {
                        //blal1[ic][lin][2] = to_string(stoi(blal1[ic][lin][2]) + stoi(blal1[ic][l2][1]));
                    }
                    else
                    {
                        lmin = 0;
                        lmax = 0;
                        lin = 0;
                    }
                }
            }
            else
            {
                if (blal1[ic][l2][0] == "ob" && blal1[ic][l2 + 2][0] == "ob" && blal1[ic][l2 + 1][0] == "or" && blal1[ic][l2][1] == "2")
                {
                    if (lmin == 0 && lmax == 0)
                    {
                        lmin = stoi(blal1[ic][l2 + 1][1]) / 2;
                        lmax = lmin * 3;
                        lin = l2 + 1;
                        blal1[ic][lin][2] = blal1[ic][lin + 1][1];
                    }
                    else
                    {
                        if (stoi(blal1[ic][l2 + 1][1]) > lmin && stoi(blal1[ic][l2 + 1][1]) < lmax)
                        {
                            //blal1[ic][lin][2] = to_string(stoi(blal1[ic][lin][2]) + stoi(blal1[ic][l2 + 1][1]));
                        }
                        else
                        {
                            lmin = 0;
                            lmax = 0;
                            lin = 0;
                        }
                    }
                }
                else
                {
                    lmin = 0;
                    lmax = 0;
                    lin = 0;
                }
            }
        }

    }
    else
    {
        break;
    }
}

Per il resto concordo con @JunkCoder.
Se vuoi aumentare le probabilità di essere aiutato ti consiglio di spiegare meglio cosa stai cercando di fare.
 
Il problema non è chiaro, a quanto vedo lin è 0, l2 o l2 + 1 ed l2 va da 0 a 99 uno step alla volta, quindi in che senso ti aspetti che il risultato corretto sia 0 6 10?
Un'altra cosa, vedo che oltre ai numeri questa mega variabile contiene stringhe e fai la comparazione con == che mi fa pensare che sia un array multidimensionale di 30k std::string ti consiglio vivamente di convertirlo in un array di int e magari allocarlo nell'heap, oltre a non dover usare più stoi il programma sarà molto più veloce e i dati sono nella loro struttura corretta (occupando molta meno RAM). Al posto di quei "ob" e "or" nello slot 0 dell'ultima dimensione puoi usare una enum o salvare fino a 4 caratteri nello spazio di un int. Ma senza sapere cosa vuoi fare è difficile dare consigli più nello specifico.
 
grazie dell' aiuto ma non penso che il problema siano gli stoi, qui c' è una variabile che viene sbagliata se aggiungo le istruzioni commentate. comuunque ci proverò a fare blal1 come int
 
grazie dell' aiuto ma non penso che il problema siano gli stoi, qui c' è una variabile che viene sbagliata se aggiungo le istruzioni commentate. comuunque ci proverò a fare blal1 come int

Certo il mio era un consiglio per migliorare la struttura dati e il programma, non era il fix al problema perché non ho i dati per saperlo. Ad esempio non hai postato l'inizializzazione di nessuna variabile: se lin non avesse un valore iniziale (es. int lin;) sarebbe normale che quelle linee commentate, se eseguite, causino undefined behavior con risultati errati o crash quando non è ancora stato eseguito un branch che imposta un valore a lin.
 
lin è int e il valore iniziale é 0, poi il problema si verifica quando decommento quelle linee quando sono commentate non dà problemi. lin è impostato a parte lontano dalle istruzioni commentate, comè possibile che le influenzano?
 
grazie dell' aiuto ma non penso che il problema siano gli stoi, qui c' è una variabile che viene sbagliata se aggiungo le istruzioni commentate.
Anche ammesso che il problema sia circoscritto al pezzo di codice da te riportato (e non ne sono convinto), il punto è che è molto difficile che troverai qualcuno che si metta a spulciare un codice del genere che peraltro non si capisce bene cosa fa e cosa dovrebbe fare.
Per questo, come dicevo nel mio precedente post, se vuoi aumentare le probabilità di essere aiutato ti consiglio di spiegare in modo dettagliato cosa stai cercando di fare partendo da zero.
 
  • Mi piace
Reazioni: JunkCoder
il programma scorre con l2 l' array e cerca numeri simili con lmin e lmax e crea dei gruppi di numeri poi li somma man mano che li trova e mette la somma sul terzo elemento dell' array.
meglio di così non sò spiegarlo.
 
meglio di così non sò spiegarlo.
Se è così mi dispiace, ma secondo me potevi sforzarti un po' di più nella spiegazione.
Senza dimenticare che un esempio pratico può essere molto utile in casi del genere.

il programma scorre con l2 l' array e cerca numeri simili con lmin e lmax e crea dei gruppi di numeri poi li somma man mano che li trova e mette la somma sul terzo elemento dell' array.
Questa serie di cose avrà pure un fine, o no?
In ogni caso un programma non nasce così dal nulla... stai svolgendo un esercizio? Stai cercando di implementare un'idea che ti è venuta in mente?
Non penso che uno la mattina si sveglia e dica oggi faccio un programma che "scorre con l2 l' array e cerca numeri simili con lmin e lmax e crea dei gruppi di numeri poi li somma man mano che li trova e mette la somma sul terzo elemento dell' array".
 
Impossibile aiutare chi non vuole essere aiutato... A nessuno qua frega degli affari tuoi, ma non serve altro lo dici tu, almeno i dati di contesto servono, hai postato solo uno snippet parziale e non si vede la dichiarazione di nessuna delle variabili che usi né come inizializzi blal1 e il bug potrebbe benissimo essere scatenato da una di queste cose. Detto questo buona fortuna con il tuo script.
 
Ultima modifica:
Come ti hanno detto nell'altro forum, Marchetto, dove non sei riuscito a postare il codice formattato, il problema è sicuramente nei valori degli indici con cui ad un certo punto vai oltre l'array e sporchi lo stack. Si vede anche quando usi l2+1 e l2+2 che diventeranno 100 e 101. Basta che visualizzi gli indici prima della scrittura e controlli i loro valori (sperando che tu sappia cosa sono gli indici dato che ci avevi risposto che non sapevi di cosa si parlava).
Inutile dire che il codice è molto confuso e non si hanno tutte le informazioni per arrivare a colpo sicuro al problema ma se controlli quello che ti ho detto risolvi.
Sul fatto che dovresti chiarire meglio di cosa si parla sono d'accordo con gli altri (forse nuovamente strani algoritmi sui colori?) e comunque dovresti avere un atteggiamento più collaborativo dato che il problema è tuo.
 
ho risolto parzialmente, ho convertito blal1 in int e ora lin funziona correttamente ma rimane il problema delle somme che non sono corrette
Bash:
2 10 38
3 2 0
2 8 0
3 2 0
2 6 0
3 2 0
2 2 6
3 2 0
2 2 0
3 2 0
2 3 5
3 2 0
2 2 0
3 3 0
4 26 0
2 36 0
4 34 0
viene 38 6 5 invece dovrebbe essere 24 4 5
 
si ho letto non è quello il problema, ho risolto tutto.
il problema era che ciclo con gli if multipli prendeva gli stessi valori più volte e li addizionava
C++:
if (blal1[ic][l2][2] == 0) {
                            blal1[ic][lin][2] = blal1[ic][lin][2] + blal1[ic][l2][1];
                            blal1[ic][l2][2] = 1;
                            }
 
Ma quello è UN problema perchè quando l'indice l2 vale 99 allora tenti di accedere con indice 100 e 101. Capisci che è un errore grave che può portare a malfunzionamenti in futuro?