Poslao: 04 Okt 2012 17:29
|
offline
- crusher
- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Ovako, dobio sam vezbu da napravim umesto funkcije znak() iz sledeceg programa da stavim kao makro kao funkcija. Evo programa:
#include <stdio.h>
#include <stdlib.h>
#define BRLIN 10
void
znak (int n, char ch)
{
while (n-- > 0)
putchar (ch);
}
int
main (void)
{
int n;
for (n = 1; n <= BRLIN; ++n) {
znak (n, '*');
putchar ('\n');
}
return EXIT_SUCCESS;
}
Ja, uopste ne razumem kako da napravim, krenuo bih ovako, ali..
#define STRING(broj, znak) (((broj) ..pa sta treba dalje.
Hvala uanpred!
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 04 Okt 2012 18:03
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Pišem iz glave, pa možda neće raditi:
#include <stdio.h>
#include <stdlib.h>
#define BRLIN 10
#define znak(n, ch) while (n-- > 0) putchar (ch)
int
main (void)
{
int n;
for (n = 1; n <= BRLIN; ++n) {
znak(n, '*');
putchar ('\n');
}
return EXIT_SUCCESS;
}
|
|
|
|
Poslao: 04 Okt 2012 19:15
|
offline
- Aleksandr1996
- Ugledni građanin
- Na odmoru xD
- Na odmoru xD
- Pridružio: 15 Feb 2012
- Poruke: 430
|
@Srki_82 to gore nece uspet zbog konflikta while petlje u makrou i for petlje. Makro petlja smanjuje a for petlja povecava n.
#include <stdio.h>
#define znak(n,ch) while (n-- > 0) {putchar(ch); putchar('\n');}
int main(void)
{
int n = 10;
znak(n,'*');
system("PAUSE");
return 0;
}
Ovako bi jato resio.
Prvi put cujem(procitao sam negde da se tako po neki put definicu getchar() i putchar()) za ovakve funkcije (kao makro) da li su one brze od obcnih?
|
|
|
|
Poslao: 04 Okt 2012 19:44
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Ako je samo to problem, onda može ovako
#include <stdio.h>
#include <stdlib.h>
#define BRLIN 10
#define znak(n, ch) int i = n; while (i-- > 0) putchar (ch)
int
main (void)
{
int n;
for (n = 1; n <= BRLIN; ++n) {
znak(n, '*');
putchar ('\n');
}
return EXIT_SUCCESS;
}
Tako kod izgleda isto bez obzira da li koristiš funkciju ili makro
Makroi su brži od funkcija jer nisu funkcije Kad pozoveš funkciju, program mora da spremi stack memoriju za nju, da prenese promenljive, da snimi razna trenutna stanja i registre, da promeni pokazivač instrukcije na početak funkcije i još mnogo drugih stvari. S druge strane, makro se prilikom kompajliranja bukvalno zameni kodom koji ga definiše. Kao da si uradio Search and replace i zamenio makro kodom koji se nalazi desno od njega. Na taj način dobijaš bržu, ali i veću izvršnu datoteku.
Postoje još i inline funkcije koje se ponašaju skoro isto kao i makroi, ali nemaju svi kompajleri podršku za njih.
|
|
|
|
|
Poslao: 05 Okt 2012 13:43
|
offline
- crusher
- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Hvala vam puno, obojici, Znam da su makroi brzi ali ce biti veca kolicina programa, ali su zato funkcije sporije ali manja kolicina programa. Zato treba da se kombunuju i makroi i funkcije kako bi se dostigla neka ravnoteza.
Hvala vam!
|
|
|
|