Autor Wątek: [C++]Arytmetyka Wskaźników  (Przeczytany 1414 razy)

Offline Bloodian

  • Użytkownik

# Grudzień 23, 2011, 19:52:12
Mam zadanie do szkoły, aby napisać program bez "[]", a więc muszę użyć arytmetyki wskaźników.
Zadanie z pozoru proste, ale jednak nie do końca bo coś mi się krzaczy :)

tworzę sobie mapę :

NODE ** map = new NODE*[y];
for ( int i = 0; i < y ; i++)
map[i] = new NODE[x];

NODE to typ struktury.
wiem że dalej mam brackety, ale później zamienię sobie na alokację pamięci w C ( malloc ) - whatever.

teraz chcę sobie stworzyć funkcję która będzie zwracać wskaźnik do danego elementu tablicy :

NODE * getArray ( int dim1 , int dim2)
{
    NODE ** temp = map;
    for ( int i = 0 ; i < dim1 ; i++)
    {
        temp++;
    }
    for ( int i = 0; i < dim2 ; i++)
    {
        (*temp)++;
    }
 
    return *temp;
}

jest tutaj pewnie jakiś głupi błąd. Może ten kod w ogóle nie ma sensu. Ale operacje na wskaźnikach są dalej dla mnie trochę abstrakcyjne.

Dzięki z góry za pomoc :)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Liosan

  • Redaktor

# Grudzień 23, 2011, 20:05:17
Co prawda nie napisałeś, jaki masz dokładnie problem, ale...

O tu:
(*temp)++
Rozrysuj sobie na kartce, co to robi :)

Liosan

Offline Bloodian

  • Użytkownik

# Grudzień 23, 2011, 20:11:45
NODE * getArray ( int dim1 , int dim2)
{
    NODE ** temp = map;
    NODE * temp1;
    for ( int i = 0 ; i < dim1 ; i++)
    {
        temp++;
    }
    temp1 = *temp;
    for ( int i = 0; i < dim2 ; i++)
    {
        temp1++;
    }
   
    return temp1;
   
}
tak działa mi "lepiej". Dla tablicy dwuwymiarowej 6x20 crashuje dla 2x0.

Offline MaxGarden

  • Użytkownik
    • Profil na warsztacie

# Grudzień 23, 2011, 20:13:16
Jak może być tablica 2x0 ?

Offline Bloodian

  • Użytkownik

# Grudzień 23, 2011, 20:14:49
Chodzi o indeks [2][0];
(dim1 = 2 , dim2 = 0)
« Ostatnia zmiana: Grudzień 23, 2011, 20:16:21 wysłana przez Bloodian »

Offline Kos

  • Użytkownik
    • kos.gd

# Grudzień 23, 2011, 20:20:20
Jesteś pewien, że nie masz błędu gdzie indziej? (ja nie jestem pewien. :))

Offline Bloodian

  • Użytkownik

# Grudzień 23, 2011, 20:26:16
nie wiem. Program jest trochę rozległy.
Jak mi ktoś powie że ta funkcja powinna działać dobrze, to będę szukał dalej.
edit:
nie to funkcja jest jakaś lewa :P

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

struct NODE
{
    int _x; // where am I in the array ?
};
       


NODE ** map = new NODE*[6];

NODE * getArray ( int dim1 , int dim2)
{
    NODE ** temp = map;
    NODE * temp1;
    for ( int i = 0 ; i < dim1 ; i++)
    {
        temp++;
    }
    temp1 = *temp;
    for ( int i = 0; i < dim2 ; i++)
    {
        temp1++;
    }
   
    return temp1;
   
}

main ()
{
    map[2][0]._x = 2;
   
    for ( int i = 0; i <6  ; i++)
map[i] = new NODE[20];

std::cout << getArray(2,0)->_x;
getch();
}
   

crashuje.
« Ostatnia zmiana: Grudzień 23, 2011, 20:28:45 wysłana przez Bloodian »

# Grudzień 23, 2011, 20:44:14
#include<stdlib.h>
#include<stdio.h>
// Władek, iis12752, Elbląg
int main()
{
unsigned int s,x,y,xr=5,yr=100;
// inicjalizowanie
char **tab=(char**)malloc(sizeof(char*)*xr);
for(s=0;s<xr;s++)
*(tab+s)=(char*)malloc(sizeof(char)*yr);

// uzupełnianie
for(y=0;y<yr;y++)
for(x=0;x<xr;x++)
*(*(tab+x)+y)=(1+x)*(y+1);


//Wyświetlanie
for(y=0;y<yr;y++)
{
for(x=0;x<xr;x++)
{
printf("%3d:",*(*(tab+x)+y));
}
printf("\n");
}


// czyszczenie
for(s=0;s<xr;s++)
free(*(tab+s));
free(tab);
}
Poczytaj o wskaźnikach.
Jak widzisz nie użyłem znaku "[" lub/i "]"

Offline Kos

  • Użytkownik
    • kos.gd

# Grudzień 23, 2011, 21:08:07
@up- wędkę, nie rybę (i to nieświeżą, bo bez formatowania) :)

@Bloodian- dlaczego ma nie crashować, jak w pierwszej linijce maina już masz jeżdżenie po niezainicjowanej pamięci?

Offline Bloodian

  • Użytkownik

# Grudzień 23, 2011, 21:15:49
Dzięki Władek : ) Przyda się do następnej części konwersji kodu.

Kos -> Właśnie takiej pomocy potrzebowałem. Żeby znaleźć swój durny błąd :)) alokowanie pamięci w segmencie globalnym.

Dzięki wszystkim.

Offline Kos

  • Użytkownik
    • kos.gd

# Grudzień 23, 2011, 22:01:21
To teraz zadanie na czwórkę- zrób to za pomocą jednej alokacji pamięci, a nie blok wskaźników + po bloku danych na wiersz (hint: zrób jeden duży blok pamięci, w którym będą po kolei poukładane wiersz po wierszu).

# Grudzień 23, 2011, 23:50:32
Tutaj pierwszy post.
Praca domowa na piątkę:
NODE ***map =(NODE***)malloc(sizeof(NODE**)*z)
Wskaźnik na bufor wskaźników wskazujących na bufor wskaźników wskazujących na tablicę struktury NODE
Mam jeden projekt który używa takiego dinozaura :P

Offline Kos

  • Użytkownik
    • kos.gd

# Grudzień 24, 2011, 13:12:12
Mam jeden projekt który używa takiego dinozaura :P
Usuń :D