Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Jiri Furst

Stran: [1]
1
Vývoj / Re:STL Vector ukazatelu na instance tridy a sort c++
« kdy: 16. 03. 2012, 13:06:58 »
Ono zrejme take zalezi na verzi prekladace. Ja to zkusil s g++ verze 4.6. S nim je to v poradku. Prekladac intel composer xe (sp1, 8.273) tj. icpc to neprelozi a dava stejnou chybovou hlasku jako u Vas. Staci mu ale vnutit novy standard pomoci -std=c++0x a pak to jde.

Nasledujici priklad (doplneni predchoziho) je vyzkousen v linuxu s g++ a s icpc -std=c++0x. Jaky prekladac pouzivate Vy?

P.S. miluji prenositelnost programu C/C++  :)

Kód: [Vybrat]
#include <iostream>
#include <vector>
#include <algorithm>

class TZaznam
{
public:
  char Zanr;
  char Typ;
  char Novinka;
};

using namespace std;

class TPlaylist
{

  struct {
    bool operator()(const TZaznam *prvni,  const TZaznam *druhy ) {
      return prvni->Zanr < druhy->Zanr;
    };
  } PorovnejZaznam;

public:
  vector <TZaznam*>PoleZaznamu;

  void SetridPoleZaznamu()
  {   
    std::sort( PoleZaznamu.begin(), PoleZaznamu.end(), PorovnejZaznam);
  }
};


int main() {

  TPlaylist pl;
  TZaznam *z;

  z = new TZaznam;
  z-> Zanr = 'r';
  pl.PoleZaznamu.push_back(z);

  z = new TZaznam;
  z-> Zanr = 'p';
  pl.PoleZaznamu.push_back(z);

  z = new TZaznam;
  z-> Zanr = 's';
  pl.PoleZaznamu.push_back(z);

  cout << "Puvodni playlist:" << endl;
  for (int i = 0; i< pl.PoleZaznamu.size(); i++)
    cout << pl.PoleZaznamu[i]->Zanr << " ";
  cout << endl;

  // Setridim
  pl.SetridPoleZaznamu();

  cout << "Setrideny playlist:" << endl;
  for (int i = 0; i< pl.PoleZaznamu.size(); i++)
    cout << pl.PoleZaznamu[i]->Zanr << " ";
  cout << endl;

  return 0;
}

S g++:
Kód: [Vybrat]
petanque:~/Vyuka/PIA/STL$ g++ sort.cpp
petanque:~/Vyuka/PIA/STL$ ./a.out
Puvodni playlist:
r p s
Setrideny playlist:
p r s

s intelem:
Kód: [Vybrat]
petanque:~/Vyuka/PIA/STL$ icpc -std=c++0x sort.cpp
Warning #2928: the __GXX_EXPERIMENTAL_CXX0X__ macro is disabled when using GNU version 4.6 with the c++0x option

petanque:~/Vyuka/PIA/STL$ ./a.out
Puvodni playlist:
r p s
Setrideny playlist:
p r s

2
Vývoj / Re:STL Vector ukazatelu na instance tridy a sort c++
« kdy: 16. 03. 2012, 10:12:16 »
Co treba takhle (viz Sten):
Kód: [Vybrat]
#include <vector>
#include <algorithm>

class TZaznam
{
public:
  char Zanr;
  char Typ;
  char Novinka;
};

using namespace std;

class TPlaylist
{

  struct {
    bool operator()(const TZaznam *prvni,  const TZaznam *druhy );
  } PorovnejZaznam;

public:
  vector <TZaznam*>PoleZaznamu;

  void SetridPoleZaznamu()
  {   
    sort( PoleZaznamu.begin(), PoleZaznamu.end(), PorovnejZaznam);
  }
};

3
Obecně bych nedoporučoval měnit obsah knihovny. Vhodnejším řešením je napsat wrapper a nebo využít introperability fortranu s C.

Predpokladejme, ze v knihovne je napr. nejake funkce

int knihovniFunkce(double x);

pak by jednoduchy wrapper mel vypadat takto (soubor wrapper.c):

int kfunkce_(double *x) {
  return knihovniFunkce(*x);
}

Je treba 1) pridat spravny pocet podtrzitek (nektere prekladace davaji 0, nektere 1 a nektere 2 podtrzitka) a 2)pouzit spravnou velikost pismen a konecne 3) prizpusobit predevani parametru vcetne ohlidani typu (int neni vzdy stejne, jako INTEGER).

Pak je mozne z fortranu volat
  J = KFUNKCE(X)


Jeste lepsi se mi ale jevi pouziti interoperability fortranu a C. Ta je zavedena tusim az ve fortranu 2003, ale nektere f90/f95 prekladace (vcetne gfortranu a intelovskeo ifortu) to umi.
Ja napriklad pouzivam volani jazyka lua z fortranu a k tomu jsem si napsal modul, ktery vypada zhruba takto (kraceno):

module flua
  use ISO_C_BINDING
  ...
  interface
    subroutine lua_close(L) bind(C,name="lua_close")
      use ISO_C_BINDING
      type(C_PTR), value :: L
    end subroutine lua_close
  ...
end module flua

Predpokladam, ze pro vyse uvedeny priklad s wrapperem by stacilo misto wrapperu do fortranskeho zdrojaku dat

use ISO_C_BINDING

interface
  function kfunkce(double x) result(f) bind(C,name="knihovniFunkce")
    use ISO_C_BINDING
    integer(C_INT) :: f
    real(C_DOUBLE), value :: x
  end function kfunkce
  end function kfunkce
end interface


 

Stran: [1]