Wskaźnik na tablice i operacje na wartościach.

0

Witam

Dawno już nie kodowałem i muszę przyznać trochę pozapominałem. Trochę sobie przypomniałem, ale nad tym problem siedzę już kilka godzin i nic.

Sytuacja wygląda tak:

 

struct st
{
    string a;
    int b;
};

void przesun(st *s, int i)
{
    s[i].a = s[i+1].a;
    s[i].b = s[i+1].b;
}

int main()
{
int n = 10;
st s[n];
                for(int i = 0; i < n; i++)
                {
                    if(s[i].b < 18)
                    {
                        n--;
                        for(int j = i; j < n; j++)
                        {
                            przesun(s, j);
                        }
                        i--;
                    }
                }
}

Po wyjściu z pętli dane w tablicy są niepoprawne;

Ale gdy zapiszę to w ten sposób, wszystko działa pięknie:

 

struct st
{
    string a;
    int b;
};

int main()
{
int n = 10;
st s[n];
                for(int i = 0; i < n; i++)
                {
                    if(s[i].b < 18)
                    {
                        n--;
                        for(int j = i; j < n; j++)
                        {
                             s[i].a = s[i+1].a;
                             s[i].b = s[i+1].b;
                        }
                        i--;
                    }
                }
}

Może ktoś mi powiedzieć co jest nie tak w pierwszym kodzie?
Oczywiście jest to wycinek programu, należy przyjąć, że tablica jest wypełniana w funkcji main.

0
przesun(s, j);
s[i].a = s[i+1].a;
s[i].b = s[i+1].b;

W jednym kodzie korzystasz ze zmiennej j, a w drugim i

0

Błąd przy przepisywaniu.
Powinno być:

 struct st
{
    string a;
    int b;
};
 
int main()
{
int n = 10;
st s[n];
                for(int i = 0; i < n; i++)
                {
                    if(s[i].b < 18)
                    {
                        n--;
                        for(int j = i; j < n; j++)
                        {
                             s[j].a = s[j+1].a;
                             s[j].b = s[j+1].b;
                        }
                        i--;
                    }
                }
}
0

Mi pierwszy kod działa, chyba o to w nim chodziło, prawda?

#include <iostream>
#include <conio.h>
#include <string.h>

using namespace std;

struct st
{
    string a;
    int b;
};

void przesun(st *s, int i)
{
    s[i].a = s[i+1].a;
    s[i].b = s[i+1].b;
}

int main()
{
int n = 3;
st s[n];

s[0].a="jeden";
s[1].a="dwa";
s[2].a="trzy";

s[0].b=0;
s[1].b=1;
s[2].b=2;

                for(int i = 0; i < n; i++)
                {
                    if(s[i].b < 18)
                    {
                        n--;
                        for(int j = i; j < n; j++)
                        {
                            przesun(s, j);
                        }
                        i--;
                    }
                }

cout << s[1].a;
getch();
return 0;
} 

output: "trzy"

0

W obu ostatnich listingach kodu jest ten sam błąd. Wyłazicie poza tablicę, gdy j = n-1

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