Zagadkowy problem z tablicami w C++

0

oto kawałek funkcji która coś tam sobie liczy

  max=0;
  int x,y;
  for(i=0;i<=temp_zmienna;i++)
  {
     w=tablica[0][temp_zmienna-i]+tab_temp[i];
     if (w>max)
     {
       max=w;
       naj_a=temp_zmienna-i;
       naj_b=i;
     }
   }
    tab_temp[zm]=max;
    Form1->Memo1->Lines->Add("Faza3 zakonczona wynikiem PS+F="+IntToStr(max)) ;  // to wyswietla ok, 
   // Form1->Memo2->Lines->Add(naj_a) ;   // TU 
   // Form1->Memo1->Lines->Add(naj_b) ; //TU JEST TO MIEJSCE, wszystkie wyniki w memo zmieniaja wartosc na te samą
}

i cos strasznie dziwnego sie dzieje podczas wyświetlania wyników: chce sobie wyświetlić indeksy ze zmiennych "naj_a" i "naj_b"
i gdy to robię to wszystkie moje wczesniej wypisane wyniki zmieniaja sie w coś zupełnie innego: powstaja jakies losowe liczby w całym Memo1. Natomiast gdy to miejsce w kodzie jest w komentarzu, to program odpala normalnie.
Jaka moze byc tego przyczyna, zbyt duzo razy odwolywałem się w funkcji do tej tablicy. wszystko sypie się gdy w jakimkolwiek miejscu chcę wyswietlić te zmienne "naj_a"

Pewnie to strasznie zawiłe ale może ktoś doradzi co robić i gdzie robię błąd

0

Jeżeli naj_a oraz naj_b są typu int, to musisz użyć IntToStr

0
Patryk27 napisał(a)

Jeżeli naj_a oraz naj_b są typu int, to musisz użyć IntToStr

nie nie musze, bez tego też można wypisywać zawartość zmiennych.
A nawet stosującIntToStr to też nie działa
a tak to wygląda na zdjęciach:
user image

źle
user image

0

up++

0

Moim zdaniem nie dochodzi do spełnienia warunku if'a:

if (w>max)
     {
       max=w;
       naj_a=temp_zmienna-i;
       naj_b=i;
     }

Przez to, naj_a i naj_b nie są zainicjalizowane, w ten sposób masz losowe znaki.

0
xeo545x39 napisał(a)

Moim zdaniem nie dochodzi do spełnienia warunku if'a:

if (w>max)
     {
       max=w;
       naj_a=temp_zmienna-i;
       naj_b=i;
     }

Przez to, naj_a i naj_b nie są zainicjalizowane, w ten sposób masz losowe znaki.

nie.
jeżeli warunek nie jest spełniony, to po prostu pętla leci dalej i wyniki się zmieniają. Te losowe wyniki spowodowane są czymś innym.

0

To w takim razie musisz wychodzić poza zakres tablicy. Nie powinno być np. w warunku pętli for < a nie <=?

0
xeo545x39 napisał(a)

To w takim razie musisz wychodzić poza zakres tablicy. Nie powinno być np. w warunku pętli for < a nie <=?

if (w>max)
     {
       max=w;
      // naj_a=temp_zmienna-i;
    //   naj_b=i;
     }

nawet teraz pojawiają się losowe liczby

dziwne jest to ze mam jeszcze jedna procedure, ktora wyglada tak samo, tylko operuje na innych wierszach w tablicy i tam wyswietla wszystko ok

Tylko te dziwne losowe liczby pokazują się w tej procedurze gdzie wiecej razy wykonywalem operacje na tych tablicach:

void faza2 (int tablica[3][7], int zmienna)  // wyznacza optymalny podzial kapitalu przy malejacych nakładach
               //500tys/400/300/200/100
               //'zmiennna' - okresla dla jakiego nakladu liczyc optymalny podzial kapitalu  (tys/zł)
{
int a, i, j, w, max, zm, naj_a,naj_b;
int temp_zmienna=zmienna;
int tab_temp [7] = {0,0,0,0,0,0,0};      //tablica do przechowywania wynikow podzialu kapitalu przy roznych nakladach
int tablica_temp[3][7];
for(i=0;i<3;i++)
  for(j=0;j<7;j++)
    tablica_temp[i][j]=tablica[i][j];


  Form1->Memo1->Lines->Add("FAZA 2");
  Form1->Memo1->Lines->Add(" ");


  for(zm=1;zm<7;zm++)       //dla takiego nakladu jaki podamy w zmiennej 'zmienna'
   {
    for (a=0;a<7;a++)
      {
       for(i=0;i<7;i++)
        {
          w=tablica[1][a]+tablica[2][j];
           if (a+j<=zm && w>max) //sprawdzenie czy nie wynik nie przewyzsza nakładów
             {
              max=w;
             naj_a=a;
             naj_b=j;
             }
          j++;  //kolejna liczba wkolumnie
         }
       j=0;
      }
    tab_temp[zm]=max;  //przypisanie do tablicy skumulowanej zdolnosci produkcyjnej P+S

    //Form1->Memo1->Lines->Add("---Najlepsza wartosc jest pod indeksem:"+IntToStr(naj_a));
    // wartosci dla roznego poziomu nakladow
    Form1->Memo1->Lines->Add("wartosc w tablicy o nr:"+IntToStr(zm)+" = "+IntToStr(tab_temp[zm]));
    Form1->Memo1->Lines->Add("---------------------------------------");
    } //koniec petli zm<zmienna

    Form1->Memo1->Lines->Add("-Faza2 - zakonczona wynikiem PS="+IntToStr(max));
    Form1->Memo1->Lines->Add("---------------------------------------");
    Form1->Memo1->Lines->Add("---------------------------------------");
   //======+++++=====++++=====++++====++++====++++
        //FAZA 3 PORÓWNANIE P+S z F
  max=0;
  int x,y;
  for(i=0;i<temp_zmienna;i++)
  {
     w=tablica[0][temp_zmienna-i]+tab_temp[i];
     if (w>max)
     {
       max=w;
       naj_a=temp_zmienna-i;
       naj_b=i;
     }
   }
    tab_temp[zm]=max;
    Form1->Memo1->Lines->Add("Faza3 zakonczona wynikiem PS+F="+IntToStr(max)) ;  //najwieksza wartosc dla PS&F
    Form1->Memo1->Lines->Add(IntToStr(naj_a)) ;
    Form1->Memo1->Lines->Add(IntToStr(naj_b)) ; 

A tutaj w tej procedurce wszystko działa:

void faza3 (int tablica[3][7], int zmienna)
{    // !!!!!!!!!!!!!!!!!!!!!!! FAZA 3 !!!!!!!!!!!!!!!!!!!!!
// wsprawdzam indeksy najlepszej pary P&S
int i, w, max,naj_a=0,naj_b=0,wybor ;
int tab_temp [7] = {0,0,0,0,0,0,0};



   for(i=0;i<=zmienna;i++)
  {
     w=tablica[1][i]+tablica[2][zmienna-i];
     if (w>max)
     {
       max=w;
       naj_b=zmienna-i;
       naj_a=i;
     }
   }

   Form1->Memo2->Lines->Add(naj_a);          //S wiersz (1,0)
   Form1->Memo2->Lines->Add(naj_b);          //P wiersz (2,0)

     Form1->Memo2->Lines->Add("S- naklad ="+IntToStr(naj_a)+" = "+IntToStr(tablica[1][naj_a]));
     Form1->Memo2->Lines->Add("P - naklad ="+IntToStr(naj_b)+" = "+IntToStr(tablica[2][naj_b]));
     //SP & F
 
0

Skoro masz nieoczekiwane znaki, a operujesz gdzieś na tablicach to znaczy, że wychodzisz gdzieś poza jej zakres, przeanalizuj dokładnie kod, sprawdź czy liczniki się zgadzają wszędzie i nie wychodzą poza zakres, zrób se w pętli wypisywanie "na żywo" liczników pętli i sprawdzaj, w którym miejscu jesteś poza rozmiarem tablicy. Jeżeli chcesz przeiterować po tablicy to np.: for (int i = 0; i < liczba_elementow_tablicy; i++) - to chyba najprostsza pętla.

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