Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 20. červen 2009, 11:30:46 Předmět: C++ problem s header files |
|
|
Bry den.Skusal som urobit cyklus casu ulozil som to ako cas.h. Naincludoval som to do hlavneho programu a tam som chcel vypisat jednu premennu.Vsetky potrebne premenne v cas.h som definoval ako external a tuto ktoru som potreboval som si znova definoval v main() funkcii.kompilator hlasi: error C2205: 'sec' : cannot initialize extern variables with block scope .Ako sa da tomu predist???Pouzivam microsoft visual studio 2008.
vopred diki za pomoc |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1051
|
Zaslal: 20. červen 2009, 12:04:52 Předmět: |
|
|
takze do *.h suborov patria len makra,prorotypy funkcii a oznacenie premennych za superglobalne pomocou extern. samotna implementacia funkcii a deklaracia premennych patri len do *.cpp suborov.
cas.h
kód: |
#ifndef _CAS_H_ //dolezite aby nam prekladac nehlasil viacnasobnu definiciu.
#define _CAS_H_ //_CAS_H_ by mal byt jedinecne teda pre kazdy subor iny. nemal by byt pozity nikde inde
extern int sek;
int funkcia(int parameter);
#endif
|
cas.cpp
kód: |
#include "cas.h" //dolezite
int sek;
inr funkcia(int parameter)
{
//tu napiseme implementaciu
int i=0;
while(100)
{
sek++;
}
retuen sek;
}
|
_________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 20. červen 2009, 12:15:24 Předmět: |
|
|
Nepomohlo, ale niesom si isty ci som to pouzil spravne . touto problematikou sa zaoberam prvy raz.
prikladam cely kod cas.h:
kód: |
#include<cstdlib>
#include<iostream>
#include<windows.h>
#include<string.h>
int cas()
{
#ifndef _CAS_H_
#define _CAS_H_
extern int sec=0,min=0,hod=0,den=1,tyz=1,mes=1,rok=1992;
extern char den_meno[10], mes_meno[10];
#endif
while (sec!=65)
{
//Sleep(100);
sec=sec+1;
if(sec==60){sec=0; min=min+1;}
if(min==60){min=0; hod=hod+1;}
if(hod==24){hod=0; den=den+1;}
if(den>7){den=1; tyz=tyz+1;}
if(tyz>4){tyz=1; mes=mes+1;}
if(mes>12){mes=1; rok=rok+1;}
/////////////////////////////////
switch(den)
{
case 1: strcpy_s(den_meno, "pondelok");break;
case 2: strcpy_s(den_meno, "utorok");break;
case 3: strcpy_s(den_meno, "streda");break;
case 4: strcpy_s(den_meno, "stvrtok");break;
case 5: strcpy_s(den_meno, "piatok");break;
case 6: strcpy_s(den_meno, "sobota");break;
case 7: strcpy_s(den_meno, "nedela");break;
}
////////////////////////////////////
switch(mes)
{
case 1: strcpy_s(mes_meno, "januar");break;
case 2: strcpy_s(mes_meno, "februar");break;
case 3: strcpy_s(mes_meno, "marec");break;
case 4: strcpy_s(mes_meno, "april");break;
case 5: strcpy_s(mes_meno, "maj");break;
case 6: strcpy_s(mes_meno, "jun");break;
case 7: strcpy_s(mes_meno, "jul");break;
case 8: strcpy_s(mes_meno, "august");break;
case 9: strcpy_s(mes_meno, "september");break;
case 10: strcpy_s(mes_meno, "oktober");break;
case 11: strcpy_s(mes_meno, "november");break;
case 12: strcpy_s(mes_meno, "december");break;
}
/////////////////////////////////////////////
//printf(" %.2d:%.2d:%.2d %s %d.tyzden %s %d\n",hod,min,sec,den_meno,tyz,mes_meno,rok);
}
// system("pause");
return 0;
}
|
|
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1051
|
Zaslal: 20. červen 2009, 12:25:11 Předmět: |
|
|
tak myslim ze najpr ich treba deklarovat cez extern a az potom im priradovat hodnotu _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
michalferko
Založen: 29. 09. 2008 Příspěvky: 83
|
Zaslal: 20. červen 2009, 12:25:28 Předmět: |
|
|
V tom co ti napisal nou pridaj ku premennej sek rovnakym sposobom aj dalsie premenne a telo tvojej funkcie uloz do cas.cpp tak ako to spravil nou. Nie je rozumne tlacit to do jedneho suboru a to co si napisal ty je ocividne nepochopenie jednoducheho navodu, ktory ti nou dal.
cas.h
kód: |
#ifndef _CAS_H
#define _CAS_H
extern int sek;
extern int min;
.
.
.
int cas();
#endif
|
cas.cpp
kód: |
#include "cas.h"
#include<cstdlib>
#include<iostream>
#include<windows.h>
#include<string.h>
int sek = 34;
int min = 43;
.
.
.
int cas()
{
telo funkcie sem!
}
|
|
|
Návrat nahoru |
|
 |
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 20. červen 2009, 12:29:36 Předmět: |
|
|
takze telo funkcie cas() nemoze byt v cas.h? tie vypocty sa musia robit v main.cpp? |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1051
|
Zaslal: 20. červen 2009, 12:46:46 Předmět: |
|
|
nie telo funkcie das do cas.cpp a pridas dany subor do projektu. inak taketo globalne premenne nie su dobra vec. zneprehladnuju kod a stazuju ladenie. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 20. červen 2009, 13:39:14 Předmět: |
|
|
koso, este raz si precitaj, co ti napisal nou a dobre si vsimni, ze su to 2 rozne subory!
Tu direktivu "#ifndef __NAZOV_H_SUBORU" a dalsie z tej ukazky budes davat do kazdeho hlavickoveho suboru na zaciatok (a na koniec podla ukazky).
Ked sa preklada kod, tak direktiva "#include" v podstate "nalepi" cely referencovany subor na to miesto, kde sa vyskytuje (ta direktiva). No a prave direktivy "#ifndef" (v pripade, ze nie je definovane), "#define" a "#endif" ti zabezpecia to, ze sa obsah hlavickoveho .h suboru nenalepi na viacere miesta, ale len na PRVE miesto. A tak bude prekladac happy  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 20. červen 2009, 14:24:56 Předmět: |
|
|
potom ale tie premenne mozem pouzivat aj mimo cas.cpp?potrebujem proste len to aby mi cas.cpp pocital tie cykly casu a potom ich potrebujem v main.cpp vypisat. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1051
|
Zaslal: 20. červen 2009, 15:16:22 Předmět: |
|
|
ano mozes. na to su definovane ako extern v cas.h takze staci includnut cas.h vsade tam kde chces pracovat s premennymi. ale globalne premenne su hnus a superglobalne premenne este vetsi. mal by si sa velmi rychlo oducit taketo nieco pouzivat.
napr co ti brani spravit funkciu cas() takto
kód: |
int cas(int *sec, int *min, int *den, int *tyz, int *mes, int *rok); |
a nasledne implementovat
kód: |
int cas(int *sec, int *min, int *den, int *tyz, int *mes, int *rok)
{
//nejaky kod
*min = 45;//priradim do premennej hodnotu 45
printf("%d ", *rok); //vypisem obsah premennej rok
}
|
a nasledne v kode ju takto volat
kód: |
int a,b,c,d,e,f,g;
cas(&a, &b, &c, &d, &e, &f, &g); |
takto sa da dostat z funkcie viac nez jednu navratovu hodnotu. dalej si mozes aj spravit strukturu datum do ktorej si vsetko toto ulozis. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 20. červen 2009, 15:24:22 Předmět: |
|
|
ten posledny kod, da sa potom ta funkcia cas() volat hocikde v main() a aj inde? |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1051
|
Zaslal: 20. červen 2009, 15:27:48 Předmět: |
|
|
ano samozrejme. ono v C je velmi dolezite pochopenie pojmu ukazovatel,pointer. takze odporucam si to dokladne nastudovat. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 20. červen 2009, 15:33:25 Předmět: |
|
|
mohol by si mi vysvetlit preco su global premenne take zle? zatial som s nimi nerobil, a ako pocuvam tak sa to ani neoplati. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1051
|
Zaslal: 20. červen 2009, 15:55:50 Předmět: |
|
|
pretoze je to nesystemove. neprehladne, extremne nachylne k chybam, tazko laditelne a vsetky mozne nevyhody.
tazko si udrzis prehlad co kde ako pristupuje k danej premennej. kto do nej zapisuje a kde sa tak deje. jedine koser vyuzitie takychto super globalnych premenych je na nacitanie adries funkcii ako sa napr roby v OpenGL.
ked mas globalne premenne tak nemas po urcitom case co to napises potuchy kde a v ako poradi sa pracuje s danou premennou. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 20. červen 2009, 16:00:45 Předmět: |
|
|
mohlo by cas.cpp vyzerat takto:
kód: |
#include<cstdlib>
#include<iostream>
#include<windows.h>
#include<string.h>
int cas(int *sec=0,int *min=0,int *hod=0,int *den=1,int *tyz=1,int *rok=1992)
{
while(*sec!=65)
{
//Sleep(100);
*sec=*sec+1;
if(*sec==60){*sec=0; *min=*min+1;}
if(*min==60){*min=0; *hod=*hod+1;}
if(*hod==24){*hod=0; *den=*den+1;}
if(*den>7){*den=1; *tyz=*tyz+1;}
if(*tyz>4){*tyz=1; *mes=*mes+1;}
if(*mes>12){*mes=1; *rok=*rok+1;}
}
}
char cas_m(char *den_meno[10], char *mes_meno[10])
{
int m, d;
cas()
while(*sec!=65)
{
switch(*den)
{
case 1: strcpy(*den_meno, "pondelok");break;
case 2: strcpy(*den_meno, "utorok");break;
case 3: strcpy(*den_meno, "streda");break;
case 4: strcpy(*den_meno, "stvrtok");break;
case 5: strcpy(*den_meno, "piatok");break;
case 6: strcpy(*den_meno, "sobota");break;
case 7: strcpy(*den_meno, "nedela");break;
}
////////////////////////////////////
switch(*mes)
{
case 1: strcpy(*mes_meno, "januar");break;
case 2: strcpy(*mes_meno, "februar");break;
case 3: strcpy(*mes_meno, "marec");break;
case 4: strcpy(*mes_meno, "april");break;
case 5: strcpy(*mes_meno, "maj");break;
case 6: strcpy(*mes_meno, "jun");break;
case 7: strcpy(*mes_meno, "jul");break;
case 8: strcpy(*mes_meno, "august");break;
case 9: strcpy(*mes_meno, "september");break;
case 10: strcpy(*mes_meno, "oktober");break;
case 11: strcpy(*mes_meno, "november");break;
case 12: strcpy(*mes_meno, "december");break;
}
/////////////////////////////////////////////
//printf(" %.2d:%.2d:%.2d %s %d.tyzden %s %d\n",hod,min,sec,den_meno,tyz,mes_meno,rok);
}
//system("pause");
} |
ako sa daju z volanej funkcie priradit len urcite premenne.ja potrebujem priradit premennu den a mes na premenne m, d |
|
Návrat nahoru |
|
 |
|