|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Tor Jan 10, 2012 9:01 am Naslov sporočila: GNU C pomoč začetniku VI |
|
|
Salamenski kazalci.
Nekako razumem, da so to spremenljivke, katerih vsebina je naslov neke druge spremenljivke. Ne zapopadem pa logike, kdaj moram pred ime kazalca dati zvezdico in kdaj ne.
Primer:
Koda: |
int main()
int i,j,k, *ai;
printf("%u \n",&i);
ai = &i;
printf ("%d \n",ai);
*ai = &i;
printf ("%d \n",ai);
ai = &i;
printf ("%d \n",*ai);
|
Dobim
Citiram: |
beagleboard-svetosavska:~$ ./a.e
3196853408
-1098113888
-1098113888
-1098113888
|
Jasno, samo prvi izpis je pravilen.
Ali mi lahko kdo razloži, kdaj moram pred ime kazalca ai dati zvezdico in kdaj ne?
Rad bi izpisal naslov spremenljivke i, tako kot v prvem izpisu, a kot vsebino kazalca.
Hvala
Dodatno vprašanje
Koda: |
pData = (int*) calloc (i,sizeof(int)); |
Kaj pomeni (int*) v zgornjem ukazu? _________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.67
|
Objavljeno: Tor Jan 10, 2012 9:43 am Naslov sporočila: |
|
|
Pri deklaraciji daš zvezdico tam, kjer hočeš imet kazalec in ne "navadno" spremenljivko (v tvojem primeru je to *ai).
V programu potem ai kaže na int, *ai je pa dereferenca tega kazalca, oz. sam int, na katerega kaže ai.
Seveda mora ai kazat na nekaj, kar obstaja. Napišeš lahko "ai=&i", v tem primeru bo ai kazal na i, *ai bo pa vrednost v i.
Upam, da ti je sedaj jasno, zakaj je samo zadnji printf() pravilen, in ne prvi _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.67
|
Objavljeno: Tor Jan 10, 2012 9:44 am Naslov sporočila: |
|
|
(int*) je cast operator. Rezultat funkcije calloc() spremeni v kazalec na int. _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Tor Jan 10, 2012 10:04 am Naslov sporočila: |
|
|
Hvala Gumby,
V prvem primeru bi rad izpisal naslov in ne spremenljivke, in samo z prvim printf stavkom sem to dosegel, rad bi pa isto vsebino dobil tako, da izpišem vsebino kazalca, to mi nikakor ni uspelo.
Kaj je cast operator moram pa še naštudirat, v skriptih FE tega ni noter.
Pozdrav _________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
S53DZ Član
Pridružen-a: Čet 28 Apr 2011 9:27 Prispevkov: 951 Aktiv.: 6.02 Kraj: Ljubljana
|
Objavljeno: Tor Jan 10, 2012 10:19 am Naslov sporočila: |
|
|
Hja tisti naslov int spremenljivke, ki ga želiš, je unsigned integer, kot imaš v formatu prvega printf. |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Tor Jan 10, 2012 10:29 am Naslov sporočila: |
|
|
Hvala, popravil sem format v Printf stavku, sedaj dobil pravo vsebino. _________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
ljudsko Član
Pridružen-a: Pon 31 Mar 2008 8:19 Prispevkov: 1184 Aktiv.: 6.06 Kraj: Koroška-Mežica
|
Objavljeno: Tor Jan 10, 2012 1:28 pm Naslov sporočila: |
|
|
vilko, če pred spremenljivko napišemo v oklepajih nek tip (v tvojem primeru kazalec, ki kaže na celoštevilčno spremenljivko), nam ta stavek spremenljivko, ki sledi zaklepaju spremeni v tip, ki je napisan v oklepajih. kako mi je pa zdaj to uspelo zakomplicirati.
Primer:
imamo int st;
želimo izpisati ascii kodo številke, ki je v spremenljivki st. Seveda moramo tip spremeniti iz int v char. Naredimo takole: printf("%c",(char)st);
Upam, da je sem pomagal. _________________ return;
brake; |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Tor Jan 10, 2012 1:31 pm Naslov sporočila: |
|
|
Hvala LJudsko, sem nekaj takega prebal, seveda moram sprobat, sicer ne morem reč, da sem prebavil... _________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
ljudsko Član
Pridružen-a: Pon 31 Mar 2008 8:19 Prispevkov: 1184 Aktiv.: 6.06 Kraj: Koroška-Mežica
|
Objavljeno: Tor Jan 10, 2012 1:33 pm Naslov sporočila: |
|
|
gumby je napisal/a: |
Pri deklaraciji daš zvezdico tam, kjer hočeš imet kazalec in ne "navadno" spremenljivko (v tvojem primeru je to *ai).
V programu potem ai kaže na int, *ai je pa dereferenca tega kazalca, oz. sam int, na katerega kaže ai.
Seveda mora ai kazat na nekaj, kar obstaja. Napišeš lahko "ai=&i", v tem primeru bo ai kazal na i, *ai bo pa vrednost v i.
Upam, da ti je sedaj jasno, zakaj je samo zadnji printf() pravilen, in ne prvi |
vilko je napisal, da bi rad s pomočjo kazalca izpisal naslov spremenljivke, na katero kazalec kaže in ne vrednosti, ki je v njej. V zadnjem printf stavku pa počne ravno to-dereferencira kazalec in s tem dostopa do vrednosti spremenljivke, na katero kazalec kaže. Pravi printf stavek je torej drugi.
PS.: vilko, poizkusi spremenljivko i inicializirati (int i=nekaj). In potem shrani naslov v ai in ga izpiši s pomočjo ai. Ugibam. _________________ return;
brake;
Nazadnje urejal/a ljudsko Tor Jan 10, 2012 1:35 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.67
|
Objavljeno: Tor Jan 10, 2012 1:35 pm Naslov sporočila: |
|
|
Ja, sem spregledal... _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Tor Jan 10, 2012 1:38 pm Naslov sporočila: |
|
|
ljudsko je napisal/a: |
gumby je napisal/a: |
Pri deklaraciji daš zvezdico tam, kjer hočeš imet kazalec in ne "navadno" spremenljivko (v tvojem primeru je to *ai).
V programu potem ai kaže na int, *ai je pa dereferenca tega kazalca, oz. sam int, na katerega kaže ai.
Seveda mora ai kazat na nekaj, kar obstaja. Napišeš lahko "ai=&i", v tem primeru bo ai kazal na i, *ai bo pa vrednost v i.
Upam, da ti je sedaj jasno, zakaj je samo zadnji printf() pravilen, in ne prvi |
vilko je napisal, da bi rad s pomočjo kazalca izpisal naslov spremenljivke, na katero kazalec kaže in ne vrednosti, ki je v njej. V zadnjem printf stavku pa počne ravno to-dereferencira kazalec in s tem dostopa do vrednosti spremenljivke, na katero kazalec kaže. Pravi printf stavek je torej drugi.
PS.: vilko, poizkusi spremenljivko i inicializirati (int i=nekaj). In potem shrani naslov v ai in ga izpiši s pomočjo ai. Ugibam. |
Sem že skužil..
Zmedlo me je to, da če je spremenljivka string, se pravi niz, se pravi array znakov, pa se takrat, tče hočem izpisati string (%s ) ne smem dati * pred imenom pointerja ki kaže na niz, pri ostalih tipih pa ja. _________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
sundancer Član
Pridružen-a: Ned 08 Avg 2004 22:30 Prispevkov: 374 Aktiv.: 1.68 Kraj: Ljubljana
|
Objavljeno: Tor Jan 10, 2012 4:42 pm Naslov sporočila: |
|
|
Vilko vse pohvale, ker vidim kako mocno si ugriznil v C. Bravo!
Marsikomu si lahko za zgled! |
|
Nazaj na vrh |
|
|
gregoral Član
Pridružen-a: Pet 24 Nov 2006 9:42 Prispevkov: 688 Aktiv.: 3.25 Kraj: Ljubljana
|
Objavljeno: Tor Jan 10, 2012 6:25 pm Naslov sporočila: |
|
|
Le tako naprej Vilko,
kot si že ugotovil je string oz char[] nekaj posebnega.
Namreč v C se večinoma dela z stringi ki imajo na koncu znak 0 (NULL).
Ker je to povrh vsega dovolj pogost tip podatka imaš zato v printf na voljo poseben format ki namesto vrednosti vzame naslov.
printf nato izpisuje znake dokler ne pride do znaka 0.
To je lahko tudi velik problem, ker moraš vedno poskrbeti da string zaključiš z 0.
Paziti pa moraš tudi da v spremenljivko ne vpišeš preveč znakov.
Primer:
char str[1];
// 1 pretvorimo v tekst in zapišemo v str
sprintf(str, "%d", 1);
// znak (char) '1' zapišemo v str
str[0] = '1';
// string str izpišemo na konzolo
printf("%s", str);
tole recimo že ni v redu, zdaj pa ti povej kaj je narobe?
LP, Gregor |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Tor Jan 10, 2012 8:25 pm Naslov sporočila: |
|
|
Hvala vsem za pomoč in vzpodbudo. Se bom še obračal na vas, če dovolite.
So me pa v C vrgle okoliščine, na katere ne morem vplivati: Programirati moram komunikacijo med atmeli, ki me veselo ubogajo v bascomu z Beagleboardom, na katerem teče linux in ki ga bascom ne pozna.
Po pravici povedatno, nisem navdušen nad C-jem, a kot je rekel moj kapetan v JLA davnega leta 1964: "Što se mora, nije težko!"
Hm, pa je težko. C ima ogromno pasti, sintaktičnih posebnosti, da se zgubiš v njih.
Kaj recimo pomeni v C-u dvojno dvopičje :: ?
Ja, z stringi sem delal že v bascomu, tako da mi je jasno, da je potrebno imeti dovolj prostora, ko sestavljaš string, da ne pobrišeš drugih spremenljivk. To si imel v mislih, kaj ne Gregoral?
Pričakujte v kratkem vprašanje na temo malloc in calloc.
Pa še nekaj me še žuli, a nisem še v stanju postaviti vprašanje:
Delal bom v arrayem struktur. To samo po sebi ni kritično, pač daš ime variable-strukture z indeksom pika in ime variable v strukturi.
Kaj pa če se vse skupaj nahaja v posebnem bloku memorije, kjer moram to nasloviti z pointerjem? Ali moram, da pridem do informacije najprej izračunati pointer na konkretno strukturo iz začetnega pointerja memorijskega bloka in indeksa? in še le potem prebrati podatke iz variable v indeksu? Upam, da je kaka prijaznejša pot.
Bom vprašanje postavil še enkrat kasneje z kodo, ki bo vprašanje lepše orisala.
Ppzdrav _________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Tor Jan 10, 2012 11:35 pm Naslov sporočila: |
|
|
Pa nadaljujmo šolo, kjer sem učenec in vi učitelji!
Vzemimo da potrebujem strukturo:
Koda: |
struct list
{ int koda;
char tekst[16];
} vnos, *listp, *listp1 ; |
in sicer 20 komadov le te. A je ne definiram kar tukaj, temveč zahtevam zato poseben memory blok.
Le tega lahko zahtevam ali z
Koda: |
listp = (struct list *)calloc(20, sizeof(struct list ) ); |
ali z
Koda: |
listp = (struct list *)malloc(sizeof(struct list ) * 20); |
Oba ukaza mi napolnita pointer *listp z naslovom memory bloka.
Prvo vprašanje: ali sta oba ukaza enakovredna, dobim z obema isto?
In sedaj želimo ta memory blok napolniti z podatki.
Recimo da želimo v strukturo z indeksom i v polje Koda napisati vrednost 10:
Prenesem pointer listp v listp1. Ker bom z njim računal, ne smem izgubiti originalne vrednosti.
Potem izračunam pointer za i-to strukturo v memory bloku:
Koda: |
listp1 = listp1 + i; |
(Pri računanju s pointerjem se aditiv pomnoži z dolžino variable, za katero velja pointer, v tem slučau z dolžino strukture.)
In sedaj v polje koda prenesem vrednost:
Zapleteno, kaj? A verjetno je preprostejša pot, ki je ne poznam.
Če jo poznate, prosim za poduk. Prosim tudi za popravke, če sem kje zabrljal kaj.
Hvala!
Bo morda kdo rekel, zakaj kompliciram!
Moja rešitev predvideva uporabo Shared Memory Block-a, ki je nekaj podobnega, ravno tako ga za zahtevam od Linuxa in dobim pointer. In v njem imam namen naphati podatke, ki pa bodo na volju tudi drugim (no drugemu) programu v sistemu Linux. Zato moram to tehniko obvladati.
(Tisti drugi program bo, upam, pisal nekdo drug.) _________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
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: 69 dni
Powered by phpBB © 2001, 2005 phpBB Group
|