Anonymní profil NeprijemnePrekvapeny – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil NeprijemnePrekvapeny – Programujte.comAnonymní profil NeprijemnePrekvapeny – Programujte.com

 

Příspěvky odeslané z IP adresy 193.138.153.–

Inzerce › Koupím Visual Studio 6.0, na…
7. 6. 2013   #177469

Koupím Microsoft Visual Studio 6.0 Proffesional. Retail (ne Upgrade, Academic nebo OEM), s krabicí a dokumenty co k tomu jsou. Za tento originální produkt nabízím 5000 Kč. Jen osobní předání. Email v profilu.

NeprijemnePrekvapeny
C / C++ › Podivné chování jazyka C++
26. 4. 2013   #175480

Jo, je to tak, dík za trknutí. Má to co dělat s kompilací, respektive že překladač neposkytne linkeru informace pro správný sestavení.

Záleží na pořadí v jakém ty překladové jednotky linker sestavuje. Když je to v pořadí proc1.cpp proc2.cpp, tak to blbne jak jsem popsal. Když v pořadí obráceném tak to blbne obráceně. :-)

Tedy někde uvnitř mezi překladačem a linkerem ty třídy mají stejný interní název i když jsou v různých překladových jednotkách. A když mají stejný název tak pak linker vidí jen první z ních. Kterou z nich závisí na pořadí sestavování.

Tyhle věci má zdá-se C++ pořádně nedořešený, nebyl by přece vůbec problém aby když je to v různejch překladovejch jednotkách těm třídám překladač automaticky přidělil různý interní názvy aby to linker sestavil správně.

Řešení je umístit ty stejně pojmenovaný třídy do anonymních namespace.

namespace {

class IMP {
// ...
};

};

Pak už to překladač konečně pochopí a chodí to správně. Hurá :-)

NeprijemnePrekvapeny
C / C++ › Podivné chování jazyka C++
26. 4. 2013   #175473

Ahoj,

narazil jsem na podivné chování jazyka C++. Mám dva soubory proc1.cpp a proc2.cpp. V obouch dvou je třída stejného názvu IMP s implementací něčeho, která je zvenčí nepřístupná, proc1.cpp a proc2.cpp vzájemně nevědí co je v tom druhém. Ven jsou vytaženy jen funkce proc1() a proc2() které používají ty třídy IMP s implementací. Potíž je že z proc2 se volá blbý konstruktor, měl by se volat kontruktor IMP z proc2, ale volá se konstruktor IMP z proc1. Samozřejmě když se každá ta třída jmenuje jinak, tak problém zmizí. Není mi ale jasné proč když se jmenujou stejně to takhle blbne, když jsou ty třídy kompletně oddělený. Nejdřív jsem z toho vinil překladač (Visual Studio 6), ale v GCC to dělá taky. Dovede to někdo vysvětlit?

// proc1.cpp :

#include <stdio.h>

class IMP {
public:
  IMP() { printf("Tady konstruktor z proc1.cpp\n"); }
  int a;
  int b;  
}; 

void proc1()  
{                                                                             
  printf("Volam konstruktor z proc1.cpp\n");
  IMP* imp = new IMP;
  delete imp;                                                     
} 

// proc2.cpp :

#include <stdio.h>

class IMP {
public:
  IMP() { printf("Tady konstruktor z proc2.cpp\n"); }
  int a;
}; 

void proc2()  
{                                                                             
  printf("Volam konstruktor z proc2.cpp\n");
  IMP* imp = new IMP;
  delete imp;                                                     
} 

// main.cpp :

#include <stdio.h>

extern void proc1();  
extern void proc2();  

int main(int argc, char* argv[])
{
  proc1();
  proc2();
  getchar();
  return 0;
}

A po spuštění to vypíše:

Volam konstruktor z proc1.cpp
Tady konstruktor z proc1.cpp
Volam konstruktor z proc2.cpp
Tady konstruktor z proc1.cpp

?

OS - Windows › Dávkový soubor - spustí prog…
22. 12. 2011   #151557

Uvnitř dávkových souborů se k parametrům se kterými
je dávkový soubor spouštěn přistupuje prostřednictvím
%0..%9 přičemž parametr %0 obsahuje jméno dávkového
souboru a %1..%9 obsahují parametry z příkazové řádky

např máme v dávkovém souboru spust.bat:

program.exe %1

kdyz se zavola: spust.bat ahoj
tak to vykona: program.exe ahoj

V dávkových souborech se dají delat i slozitejsí
veci např podmínky, větvení a cykly.

Více o možnostech dávkových souborů najdete třeba tady:
http://www.spsemoh.cz/…os/batch.htm
http://fpf.slu.cz/…skripty.html

Java › Sázení česneku
21. 12. 2011   #151541

Hezká úloha, taky se ten algoritmus dá zapsat přímo ze zadání s použitím rekurze a následně zoptimalizovat, sloučit některé podmínky případně odstranit rekurzi bude-li třeba, Javu neumím je to v Cčku, ale s tím už si pohraješ (ve výpisu 'C' je cibule a '*' je česnek :-)

#include <stdio.h>

int vysazej_radek(char* array, int pos, int N)
{
  if (pos == N) { // Kdyz jsem vysazel vsechno vypsat radek
    for (int i = 0; i < N; i++) {
      printf("%c", array[i]);
    }
    printf("\n");
    return 1;
  }

  int pocet = 0;
  
  if (pos == 0) { // Kdyz jsem na zacatku radku muzu zasadit cibuli i cesnek
    array[pos] = 'C';
    pocet += vysazej_radek(array, pos + 1, N);
    array[pos] = '*';
    pocet += vysazej_radek(array, pos + 1, N);
  } else { // Jinak jsem nekde v radku
    if (array[pos - 1] == 'C') { // Kdyz je predchozi sazenicka cibule, muze byt dalsi sazenicka cibule i cesnek
      array[pos] = 'C';
      pocet += vysazej_radek(array, pos + 1, N);
      array[pos] = '*';
      pocet += vysazej_radek(array, pos + 1, N);            
    } else { // Jinak je predchozi sazenicka cesnek a dalsi sazenicka tak muze byt jenom cibule (nemuzou byt dva cesneky za sebou)
      array[pos] = 'C';
      pocet += vysazej_radek(array, pos + 1, N);      
    }
  }
  
  return pocet;
}

const int N = 5;

int main(int argc, char* argv[])
{
  char array[N];
  int pocet = vysazej_radek(array, 0, N);
  printf("Pocet moznosti: %d\n", pocet);

  return 0;
}

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý