Problem z vectorem

0

Witam
Postanowiłem ostatnio pobawić się z zadaniami z c++ w sieci i natknąłem się na mały problem, kiedy staram się wrzucać do vectora (v.push_back()) wartości z przedziału 1-4 to czasami zostanie tam wepchnięta wartość ujemna, czasami bardzo duża ujemna (-132212992), ktoś może wyjaśnić dlaczego może się tak dziać? W załącznikach zawarty jest kod aplikacji oraz wyniki testów.

0

vector<int> solution(string &S, vector<int> &P, vector<int> &Q) {

int len = S.length();
int conv[len];

for(int i = 0; i < len; i++){
switch(S[i]){
case 'A':
conv[i] = 1;
break;
case 'C':
conv[i] = 2;
break;
case 'G':
conv[i] = 3;
break;
case 'T':
conv[i] = 4;
break;
}
}

int lenP = P.size();
int ans[lenP];
for(int i = 0; i<lenP; i++){
for(int j = P[i]; j <= Q[i]; j++){
if(ans[i] > conv[j] || ans[i] == 0){
ans[i] = conv[j];
}
}
}
vector<int> ansP;
for(int i = 0; i < lenP; i++){
ansP.push_back(ans[i]);
}
return ansP;
}

0
TheManOfUselessness napisał(a):

vector<int> solution(string &S, vector<int> &P, vector<int> &Q) {

int len = S.length();
int conv[len];

for(int i = 0; i < len; i++){
switch(S[i]){
case 'A':
conv[i] = 1;
break;
case 'C':
conv[i] = 2;
break;
case 'G':
conv[i] = 3;
break;
case 'T':
conv[i] = 4;
break;
}
}

int lenP = P.size();
int ans[lenP];
for(int i = 0; i<lenP; i++){
for(int j = P[i]; j <= Q[i]; j++){
if(ans[i] > conv[j] || ans[i] == 0){
ans[i] = conv[j];
}
}
}
vector<int> ansP;
for(int i = 0; i < lenP; i++){
ansP.push_back(ans[i]);
}
return ansP;
}

Na przyszłość sformatuj kod przed wysłaniem posta.

W Twoim kodzie nie ma pewności, że ans[i] będzie wypełnione dla każdego i, tylko dla i spełniających warunek:

ans[i] > conv[j] || ans[i] == 0

zatem czasami wrzucasz jakieś przypadkowe wartości.

Zresztą już w samym warunku masz błąd, bo w iteracji i sprawdzasz wartość ans[i], jeszcze przez jej wypełnieniem po raz pierwszy.

1

Sformatowane i otoczone znacznikami kodu:

vector<int> solution(string& S, vector<int>& P, vector<int>& Q)
{
    int len = S.length();
    int conv[len];

    for (int i = 0; i < len; i++) {
        switch (S[i]) {
        case 'A':
            conv[i] = 1;
            break;
        case 'C':
            conv[i] = 2;
            break;
        case 'G':
            conv[i] = 3;
            break;
        case 'T':
            conv[i] = 4;
            break;
        }
    }

    int lenP = P.size();
    int ans[lenP];
    for (int i = 0; i < lenP; i++) {
        for (int j = P[i]; j <= Q[i]; j++) {
            if (ans[i] > conv[j] || ans[i] == 0) {
                ans[i] = conv[j];
            }
        }
    }
    vector<int> ansP;
    for (int i = 0; i < lenP; i++) {
        ansP.push_back(ans[i]);
    }
    return ansP;
}

Swoją drogą niby co ten kod robi? Nazwy są takie, że nic nie wiadomo, poza tym, że coś rozwiązuje (jak każdy kod chyba).

1

Własnie, nie zawsze to ans[i] jest czyms inicjalizowane, bo nie zawsze wchodzi do ifa w zwiazku z tym czasem w pamięci znajdują się śmieci

1

Nie łatwiej tak?

int conv[len] = {};

inna sprawa, że to VLA, więc to nie jest poprawny C++...

1 użytkowników online, w tym zalogowanych: 0, gości: 1