wskaźnik na wskaźniki na elementy new

whitlock

Użytkownik
Dołączył
Czerwiec 20, 2008
Posty
25
Robię to już 3 godziny i nie mogę znaleźć błędu... Stanąłem w funkcji cofnij_wskazniki. Po dodaniu wartości do elementów tablicy wszystkie wskaźniki są ustawione na ostatnich miejscach. Funkcja cofnij_wskazniki miała przelecieć się po tych wskażnikach i poustawiać je na pierwszych miejscach. Myślę, że kod jest ok, ale daję go tu może ktoś znajdzie błąd. Zapewne zagmatwałem się gdzieś bo mam tu wskaźnik na wskaźniki new do elementów new.

Kod:
 g++
#include <iostream>

using namespace std;

int usuwacz (int nn, int moze, int** paker = 0, int* ziomek = 0);
void cofnij_wskazniki (int** master, int h);

int main()
{
   
    cout<<"Podaj liczbe zmiennych: ";
    int n;
    cin>>n;
    cin.ignore();
    
    int **wsk_n = new int* [n + 1];                    //wskaznik do n + 1 wskaznikow new int (orientacja pionowa)
   
    //*****Tworzy wskazniki na elementy*****
    for(int i = 0; i < n + 1; ++i)                    //n + 1 bo n + 1 to wyniki( --> orientacja pionowa)
    {
         wsk_n[i] = new int [n];          
    } 
    
    //*****Pobiera i dopisuje wartosci*****
    for(int i = 0; i < n; ++i)
    { 
         for(int j = 0; j < n + 1; ++j)
         {       
              if(j == n)
              {              
                   cout<<"\npodaj wynik dla funkcji "<<i + 1<<": ";
                   if(i < (n - 1))
                   {
                        (++wsk_n[j]);          
                   }                
              }
              else
              {
                   cout<<"\npodaj x["<<j + 1<<"\\"<<i + 1<<"]: ";
                   if(i < (n - 1))
                   {
                        (++wsk_n[j]);          
                   }                 
              }
         
              int tymczasowa;
              cin>>tymczasowa;
              *wsk_n[j] = tymczasowa;        
         } 
    }
    
  
    
    //*****Cofamy wskazniki*****
    cofnij_wskazniki (wsk_n, n);
    
    //*****Usuwamy wszystkie new*****   
    usuwacz (n, 1, wsk_n); 
     
      
    //*****Koniec programu*****      
    cout<<"\n\n------------------------------------\n";
    cout<<"\nAby zakonczyc nacisnij Enter";
    cin.ignore();
    getchar();
    return 0;    
}

//********************COFNIJ WSKAZNIKI********************
void cofnij_wskazniki (int** master, int h)
{      
   
     for(int i = 0; i < h + 1; ++i)
     {
         cout<<'\n'<<*master[i];    
         (master[i] - (h - 1));    // TO TU SIĘ COFAM 
         cout<<"-"; 
         cout<<'\n'<<*master[i];  //a może ten element już cofnięty, jest ze stosu ?                  
     }
}

//********************USUWACZ********************
int usuwacz (int nn, int moze, int** paker, int* ziomek)
{
    cout<<"\nUsuwam...\n";
    if(moze = 1)
    {
         for(int i = 0; i < nn + 1; ++i)                    //nn + 1 bo nn + 1 to wyniki( --> orientacja pionowa)
         {
              cout<<*paker[i]<<" ";   
              delete [] paker[i];
              cout<<".";
              cout<<*paker[i]<<" ";
              paker[i] = 0;                    //zeruje wskaznik na wszelki wypadek  
              cout<<paker[i]<<" ";                             
         } 
         delete [] paker;
         paker = 0;
         cout<<paker;
    }
    
    return 0;    
}

No w sumie to głównym problemem jest chyba to, że nie umiem poruszać się skaźnikiem do tablicy wskaźników to tablic intów - czyli wskaźnikami podwójnymi --> czyli czy to ++wsk_n przechodzi po kolejnych elementach tablicy czy po wskaźnikach tej tablicy

Poszperałem, pogmerałem aż znalazłem na http://darkcult.gamedev.pl/kursy/kurs03a.html kod o dynamicznych tablicach dwuwymiarowych, gdzie kod jest prawie taki sam jak mój - z deczka lepszy jedynie autor nie gmerał się tak jak ja z inwersją wskaźników ale jechał prosto z mostu wsk[j] - i wiersze j kolumny.
To rozwiązuje problem, ale dalej nie wiem jaki jest błąd w moim kodzie...
 

marccinn

Użytkownik
Dołączył
Grudzień 5, 2007
Posty
19
Może zacznijmy od funkcji cofnij_wskazniki, bo tam jest poważny błąd:
Kod:
master[i] - (h-1);    // TO TU SIĘ COFAM
W tej instrukcji nie dzieje się dosłownie nic
smile.gif
Tzn, faktycznie od wskaźnika jest odjęta liczba h-1, ale wynik nie jest nigdzie zapisany i master pozostaje nadal tym samym wskażnikiem! Nie wiem o co Ci tu dokładnie chodziło, ale może powinno tam być "master -= (h-1);"? Tak swoją drogą, pamięć alokowana dynamicznie (operatorem new) nigdy nie znajduje się na stosie, bo wtedy dostęp do niej byłby nieco utrudniony.

I jeszcze jedna rzecz:
Kod:
if (moze = 1)
W powyższej linijce zmienna `moze' otrzymuje wartość 1, a następnie jest sprawdzane, czy zawiera wartość równą czy różną 0, przez co warunek zawsze jest spełniony. Krótko mówiąc, gdzieś Ci się zapodział drugi znak równości (zamiast = ma być ==) ;]

Pozdr
 
Do góry Bottom