Nowe posty

Autor Wątek: [C++] alokacja pamieci  (Przeczytany 5676 razy)

Gosik

  • Gość
[C++] alokacja pamieci
« dnia: 2013-03-10, 00:58:27 »
Chcialabym stworzyc funkcje, ktora bedzie alokowala dynamicznie pamiec i funkcje zwalniajaca pamiec:

Napisalam nastepujacy kod:
plik array.cpp:
#include "array.h"
#include
using namespace std;

double **new_array(double **A, int m, int n)
{
   A=new double *[m];
  for (int i=0;i
 return A;
}

void del_array(double **A, int m)
{
 for(int i=0;i  delete []A;
}
Plik array.h ma postac:
#ifndef alloc_h_
#define alloc_h_

double **new_array(double **A, int m, int n);
void del_array(double **A, int m);

#endif
i w pliku main.cpp wywoluje powyzsze funkcje:

#include "array.h"
#include
using namespace std;


int main()
{
  double **T;
  int m=3;
  int n=3;

  new_array(T,m,n);
  del_array(T, m);
}
Jednakze po kompilacji otrzymuje bledy:
nic.cpp:(.text+0x8): undefined reference to `std::ios_base::Init::~Init()'
nic.cpp:(.text+0x25): undefined reference to `std::ios_base::Init::Init()'
/tmp/cc-L2LGfD.o: In function `__cxx_global_var_init':
alloc_tab.cpp:(.text+0x8): undefined reference to `std::ios_base::Init::~Init()'
alloc_tab.cpp:(.text+0x25): undefined reference to `std::ios_base::Init::Init()'
/tmp/cc-L2LGfD.o: In function `new_array(double**, int, int)':
alloc_tab.cpp:(.text+0x84): undefined reference to `operator new[](unsigned int)'
alloc_tab.cpp:(.text+0xbb): undefined reference to `operator new[](unsigned int)'
/tmp/cc-L2LGfD.o: In function `del_array(double**, int)':
alloc_tab.cpp:(.text+0x135): undefined reference to `operator delete[](void*)'
alloc_tab.cpp:(.text+0x161): undefined reference to `operator delete[](void*)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Bede niezmiernie wdzieczna za wskazanie mojego bledu/bledow.

Pozdr!

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3068
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
[C++] alokacja pamieci
« Odpowiedź #1 dnia: 2013-03-10, 19:33:10 »
Jak kompilujesz i linkujesz?
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Gosik

  • Gość
[C++] alokacja pamieci
« Odpowiedź #2 dnia: 2013-03-10, 19:57:00 »
Kompiluje w nastepujacy sposob:
clang main.cpp array.cpp -o nnn.x
i wyskakuja mi bledy jak wyzej napisalam.

Jesli kompiluje :
g++ main.cpp array.cpp -o nnn.x
To nie wyrzuca bledow, ale po uruchominiu programu otrzymuje: Segmentation fault

snajper_8383

  • Gość
[C++] alokacja pamieci
« Odpowiedź #3 dnia: 2013-03-10, 22:22:11 »
clang jest kompilatorem do języka C, a nie C++. Użyj clang++ (albo z opcją clang -x c++ ).
Skompiluj z opcją -g i sprawdź w gdb gdzie jest błąd segmentacji.

Gosik

  • Gość
[C++] alokacja pamieci
« Odpowiedź #4 dnia: 2013-03-10, 23:15:02 »
Dzieki za pomoca.  Uzywajac dgb otrzymalam:

#0  0xb7dd2eee in free () from /lib/i386-linux-gnu/libc.so.6
#1  0xb7f8c80f in operator delete(void*) () from /usr/lib/i386-linux-gnu/libstdc++.so.6
#2  0xb7f8c86b in operator delete[](void*) () from /usr/lib/i386-linux-gnu/libstdc++.so.6
#3  0x080485cb in del_array (A=0xb7edaff4, m=3) at array.cpp:15
#4  0x08048695 in main () at main.cpp:14

Juz wiem, ze funkcji del_array sie sypie, ale nie wiem co dokladnie.

darkdancer

  • Gość
[C++] alokacja pamieci
« Odpowiedź #5 dnia: 2013-03-10, 23:21:57 »
Cytat: Gosik
Chcialabym stworzyc funkcje, ktora bedzie alokowala dynamicznie pamiec i funkcje zwalniajaca pamiec:
Kod: c++ [Zaznacz]
#include "array.h"
#include
using namespace std;

double **new_array(double **&A, int m, int n)
{
   A=new double *[m]; // <- zmieniasz wartość zmiennej "A"
  for (int i=0;i
 return A;
}
Jeśli już te przeklęte wskaźniki to chyba raczej tak - nie sądzisz? W funkcji robisz operacje na zmiennej wskaźnikowej (która jest mimo wszystko zmienną przecież, gdybyś skorzystała z tego return i dała podstawienie pewnie przeszłoby "bezboleśnie"). Generalnie unikać cholerstwa jak można. Dawno nie miałem do czynienia z C++ więc jeśli napisałem jakąś głupotę niech ktoś mnie poprawi.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3068
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
[C++] alokacja pamieci
« Odpowiedź #6 dnia: 2013-03-11, 22:43:38 »
darkdancer: zgadza się.
gosik: posługujesz się wskaźnikami jak cepem.

Po kiego grzyba przekazujesz wskaźnik jako parametr i potem i tak go zwracasz? Zdecyduj się na którąś konwencję.

Zabawy z wpychaniem wskaźników w gardło funkcji robi się tak (jak już w ogóle - po to w C++ są referencje):
int * tablica; // <- Jedna gwiazdka, tablica jednowymiarowa

// Albo
void funkcja1(int ** t, int n) // <- dwie gwiazdki, wskaźnik na zmienną typu tablica jednowymiarowa
{
 *t = new int[n]; // <- przypisanie po dereferencji
}

funckja1(&tablica,5); // <- do funkcji przekazujesz ADRES zmiennej tablica, tylko wtedy
  // możesz zmienić zawartość

// Albo

int * funcja2(int n)  // <- funkcja po prostu zwraca wskaźnik
{
 int * t = new int[n];
 return t;
}

tablica = funkcja2(20);
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Gosik

  • Gość
[C++] alokacja pamieci
« Odpowiedź #7 dnia: 2013-03-13, 18:30:13 »
Bardzo dziekuje za pomoc! :)