|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.96
|
Objavljeno: Čet Sep 15, 2011 1:39 pm Naslov sporočila: |
|
|
Ja, točno to je bilo. Null terminator stringa mi je "povozil" polovico int cifre 35-10 in jo predelal v (najverjetneje) 0-10.
Ampak, ali ni pri velikosti arraya [16] le ta dolg pravzaprav 17 polj? Saj se šteje od 0, 1, 2, ...16. In v tistem zadnjem 17.tem (z oznako 16) sem računal skrajni doseg za null terminator.. |
|
Nazaj na vrh |
|
|
chaos Član
Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.96 Kraj: Zagorje ob Savi
|
Objavljeno: Čet Sep 15, 2011 1:54 pm Naslov sporočila: |
|
|
lojzek je napisal/a: |
Ampak, ali ni pri velikosti arraya [16] le ta dolg pravzaprav 17 polj? Saj se šteje od 0, 1, 2, ...16. In v tistem zadnjem 17.tem (z oznako 16) sem računal skrajni doseg za null terminator..
|
Ne, pri deklaraciji polja podas njegovo tocno velikost, torej int a[16]; je deklaracija polja z 16-imi elementi, prvi je a[0], zadnji a[15].
LP! |
|
Nazaj na vrh |
|
|
trobida Član
Pridružen-a: Ned 09 Jul 2006 12:13 Prispevkov: 1250 Aktiv.: 5.77 Kraj: Savinjska dolina-okolica Gornjega Grada
|
Objavljeno: Sre Sep 21, 2011 1:02 pm Naslov sporočila: |
|
|
Pozdravljeni !
Ponovno se oglašam z nekim začetniškim problemom . Neko kodo iz Bascoma še verzije 8051 prevajam v C. Programiram za AVR studio in WinAvr-jem. Spodaj prilagam kodo, katera je napisana v Bascom8051:
Koda: |
V_nap_sp:
Cls
Lcd "St.Vrt. ->:" ; V_naprej
Lowerline
Lcd "(OK)/(-)/(+)"
[b] Do[/b]
A1 = P3.3 ' (-) 239
A2 = P3.5 ' (+) 223
A3 = P3.4 ' (OK) 247
Ar = P3.2 ' Avtomatsko/Ročno 251
If A2 = 0 Then
If A1 = 0 Then
V_naprej = -1
Gosub V_nap_1
Else
Gosub V_nap_1
End If
Set Sprememba
Elseif A1 = 0 Then
Gosub V_nap_2
Set Sprememba
Elseif A3 = 0 Then
[b]Exit Do[/b]
End If
Waitms 250
[b] Loop[/b]
Return
|
Napisan je le delček kode oziroma funkcija ki čaka pritiske tipk. Sedaj sem se lotil kodo prepisati v C vendar imam manjši problem. V Bascom kodi so uporabljeni ukazi ki so napisani krepko. Ti so: Do, Loop in exit do.
Mi lahko kdo prosim pove ali poda kakšen primer kako naj se te kode lotim v C-ju oziroma kaj naj uporabim namesto bascom ukazov Do, Loop in Exit do ? Spodaj sem kodo po večini prevedel, vendar se mi je zaradi zgornjih ukazov zataknilo .
Prilagam še prevedeno kodo:
Koda: |
void V_nap_sp()
{
char lcdstr1[16];
char lcdstr2[16];
LCDclr();
sprintf(lcdstr1, "Vrtljaji: %i", Vrtljaji);
LCDGotoXY(0, 1); //Kurzor postavi na drugo vrstico
LCDstring("(OK)/(-)/(+)", 12);
????? Do
if (PLUS_is_pressed())
{
if (MINUS_is_pressed())
{
V_naprej = -1;
V_nap_1();
else
{
V_nap_1();
}
}
Sprememba = 1
else if (MINUS_is_pressed())
{
V_nap_2;
Sprememba = 1;
}
else if (OK_is_pressed())
{
????? exit do;
}
}
delay_ms(LOCK_INPUT_TIME1);
????? Loop;
}
|
Hvala vsem za nasvete. _________________ Lp
Tomaž, S57KO |
|
Nazaj na vrh |
|
|
žrepko Član
Pridružen-a: Tor 23 Mar 2010 20:12 Prispevkov: 700 Aktiv.: 4.08 Kraj: Ptuj-Maribor
|
Objavljeno: Sre Sep 21, 2011 1:39 pm Naslov sporočila: |
|
|
Potrebuješ funkcijo do while.
lahko tudi samo while(pogoj) { ... }
izvaja tisto kar je v while funkciji tako dolgo dokler pogoj ni izpolnjen. |
|
Nazaj na vrh |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.26 Kraj: Ljubljana
|
Objavljeno: Sre Sep 21, 2011 5:50 pm Naslov sporočila: |
|
|
Koda: |
do ... loop -> for(;;) { ... }, ali while() { ... }
exit do -> break;
next -> continue; |
|
|
Nazaj na vrh |
|
|
trobida Član
Pridružen-a: Ned 09 Jul 2006 12:13 Prispevkov: 1250 Aktiv.: 5.77 Kraj: Savinjska dolina-okolica Gornjega Grada
|
Objavljeno: Sre Sep 21, 2011 7:17 pm Naslov sporočila: |
|
|
Hvala za info, bom poizkušal zgornjo kodo "prebekslati" tako, kot sta svetovala. Poročam ... _________________ Lp
Tomaž, S57KO |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.96
|
Objavljeno: Čet Sep 22, 2011 6:11 am Naslov sporočila: |
|
|
Če je tista do - loop zanka pravzaprav glavni program in se mora stalno izvajati, ga označiš takole:
Koda: |
while(1)
{
//tvoj programček
} //zaključek while zanke - in s tem tudi programa |
V glavnem while (1) in oklepaja označujeta program. Z oklepaji tudi označiš dele programa - ukaze, ki po funkciji spadajo skupaj in se morajo tudi skupaj izvesti.
Seveda, če je to glavni program, iz njega ne moreš "izskočiti". Kaj bo pač mikro potem počel? Če pa je to samo ena funkcija (podprogram), pa iz nje izskočiš na več načinov: 1. ko se enkrat izvrši, 2. z ukazom return (ko je npr izpolnjen pogoj).
V primeru, da je to funkcija, pa bi tudi zanko funkcije mogoče naredil z 1. while(pogoj), ali pa 2. do --funkcija--- while (pogoj).
Malce branja , drugače pa se podobnega na netu kar najde.. |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.96
|
Objavljeno: Sre Sep 28, 2011 1:03 pm Naslov sporočila: |
|
|
Zopet eno vprašanje, nekdo ki zna, bo hitreje odgovoril, kot pa se bom jaz prebil skozi morje branja na netu.
V eni podfunkciji programa imam lokalno (v njej) definirani recimo dve int spremenljivki. Mikro pri izvajanju funkcije ti spremenljivki spreminja.
Kaj se s tema spremenljivkama zgodi po izhodu iz funkcije. Ali se njuna vrednost "izniči", ali še vedno ta vrednost ostane nekje v spominu mikroja?
Pravzaprav to niti ni bistvo željene informacije. Najbolj me zanima, kaj se s tema spremenljivkama zgodi ob ponovnem klicu podfunkcije. Ali je njihova vrednost še vedno taka, kot je bila ob prejšnjem obisku funkcije? Oz. kolikšna je verjetnost, da se njuna vrednost ni spremenila?
Izsek problema za lažje razumevanje:
Koda: |
void podfunkcija ()
{
unsigned int a, b;
if (en pogoj == true)
++a;
else
++b;
} |
Sem poizkušal sicer z AVR studiovim simulatorjem sam ugotoviti, ampak mi nekaj v tem delu simulacije ne dela po željah (seveda ne, ko ga pa nekje biksam), tako da točnega odgovora sam nisem ugotovil. |
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.65
|
Objavljeno: Sre Sep 28, 2011 1:14 pm Naslov sporočila: |
|
|
a in b ne obstajata zunaj funkcije. Načeloma vrednost sicer ostane nekje v RAM-u, vendar je kakršnokoli zanašanje na to vrednost recept za kasnejši glavobol.
Biblijo v roke in naštudiraj "doseg" spremenljivk. _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.96
|
Objavljeno: Sre Sep 28, 2011 1:45 pm Naslov sporočila: |
|
|
Se mi je kar zdelo, da tako na easy ne bo šlo. Ali bom moral uporabiti globalne spremenljivke, ali pa povsem drug princip.... |
|
Nazaj na vrh |
|
|
matjazkariz Član
Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.60
|
Objavljeno: Sre Sep 28, 2011 2:11 pm Naslov sporočila: |
|
|
Eni compilerji podpirajo deklaracijo globalnih spremenljivk v funkciji in sicer ponavadi jo definiraš s static...
Koda: |
static unsigned char blabla; |
_________________ LP, Matjaž |
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.65
|
Objavljeno: Sre Sep 28, 2011 2:17 pm Naslov sporočila: |
|
|
Static ne pomaga. Spremenljivka znotraj funkcije navzven ne bo vidna. _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.26 Kraj: Ljubljana
|
Objavljeno: Sre Sep 28, 2011 3:19 pm Naslov sporočila: |
|
|
Rabiš za rekurzijo?
V tem primeru bi šlo s static. |
|
Nazaj na vrh |
|
|
aly Član
Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 42.18 Kraj: Kranj - struževo
|
Objavljeno: Sre Sep 28, 2011 9:02 pm Naslov sporočila: |
|
|
Globalno spremeljivko narediš. Ali imaš premalo RAM-a ali v čem je težava? _________________ I'm going to stand outside, so if anyone asks, I'm outstanding |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.96
|
Objavljeno: Sre Sep 28, 2011 10:47 pm Naslov sporočila: |
|
|
Se je kar debata razvila. Moja želja je, da bi pravzaprav štel, kolikokrat je program poklical podfunkcijo in je bil hkrati nek pogoj izpolnjen (tuhtam o neki moji vrsti debounce-ja tipke,. Zakaj? Ker ne vem, kako to profiji naredijo) Ob X-kratni ponovitvi klica podfunkcije in hkratno izpolnjenem pogoju- pritisnjeni tipki bi pa postavil zastavico v neki globalni - za cel program veljavni spremenljivki.
Drugače pa, o "static" deklaraciji bom še malo prebral- ni pa frke, če kdo od vas tudi kaj o tem omeni. Ni pa to problem rešiti z nekaj več globalnimi spremenljivkami.
Rad bi pač ugotovil neko "drugo" pot , če je seveda kolikor-toliko enostavno rešljiva.
Aja.... Rekurzija je pa kaj?
..... Naslednjič se oglasim (najverjetneje) šele v ponedeljek. Grem familijo v hribe terat... |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 76 dni
Powered by phpBB © 2001, 2005 phpBB Group
|