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.
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;
}
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.
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).
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
Nie łatwiej tak?
int conv[len] = {};
inna sprawa, że to VLA, więc to nie jest poprawny C++...