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.
Příspěvky odeslané z IP adresy 193.138.153.–
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á :-)
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
?
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
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;
}