Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Pkora Forumaš(ica)
Pridružen/a: 17. 11. 2009. (17:14:03) Postovi: (21)16
Spol:
Lokacija: Tangenta
|
Postano: 17:00 ned, 6. 6. 2010 Naslov: Ajmo o C-u, pokazivačima i skripti (Programiranje 2)... |
|
|
Točnije dio o alociranju memorije i cast operatoru...
da sumiram
[code:1]
#include <stdio.h>
#include <stdlib.h> //Pozornost
int main()
{
int *x=(int*) malloc(sizeof(int));
*x=10;
printf("%d",*x);
free(x);
return 0;
}[/code:1]
Ovdje pričamo o C jeziku tako da
[code:1]
#include <stdio.h>
#include <stdlib.h> //Pozornost
int main()
{
int *x=malloc(sizeof(int));
*x=10;
printf("%d",*x);
free(x);
return 0;
}[/code:1]
je cast operator nepotreban, prema ansi c-u i iso standardu ovo je normalno ponašanje,
cast je bio potreban prije dok *void nije postojao već se koristio *char (to sam guglao samo radi informacije dok sam vidio skriptu)
ako još dodamo i
[code:1]int *x=malloc(sizeof *x)//Zagrade nisu potrebne[/code:1]umjesto
[code:1]int *x=malloc(sizeof (int))[/code:1]onda nam to pomaže još više kod dvodimenzionalnih polja
[code:1]int **x = malloc(n * sizeof *x);
int i;
for (i=n;i--;) //ili for(i=0;i<n;i++)
x[i] = malloc(n * sizeof **x);
[/code:1]
u stvarnosti je funkcionalnije kod drugih primjera, ovdje recimo da je ljepše,nebitno, odoh sa teme,
sad ako netko ovo otrči kompajlirat u svoj visual c++ normalno da će dobit grešku, jer c++ compileri prema standardu traže cast operator, ali ako to ode frknut u gcc, sve će biti ok, kao što je i zamišljeno,
C i C++ nisu isti jezici, pa smatram da to treba izmjeniti, u skripti stoji (vsego) da će compiler izbaciti grešku ako ne stavimo cast operator, što je netočno, mi programiramo u c-u i greške pouzdano nema,
inaće ja smijem koristiti for (int i=0...) :D
Mislio sam da sam u krivu kad sam vidio skriptu pa eto potražih po netu
http://c-faq.com/malloc/decl.html
http://c-faq.com/malloc/cast.html
http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284351&answer=1047673478
http://users.powernet.co.uk/eton/c/hackerhotel.html
Ima toga brdo i brdo, poanta je da su rasprave nebitne i kužim zašto bi netko stavljao cast operator, pogotovo jer ćemo raditi u c++-u ali sam navod u skripti je netočan za nas [b]C-ovce[/b], a ja sam uvijek za optimizaciju i sažimanje kôda pa me taj malloc i više nego muči, pa da na kolokviju ne bi bilo nismo znali...
Ja sam rođeni c++ programer pa nije da me to smeta, i uvijek sam za tuđe mišljenje pa ako ima nešto...
što se tiće sizeof(int) vs sizeof (*x) jasno ako je x pokazivač na int, (točnije kod drugog pristupa nije ni bitno) da će dat isto, ovdje se ne vidi prednost tog pristupa i to mi je nebitno ali nije navedeno, a koristim...
PS stdlib.h označio zato jer vidim da se normalno navodi u skripti pa ako se navodi onda nema potrebe za cast operatorom...
Točnije dio o alociranju memorije i cast operatoru...
da sumiram
Kod: |
#include <stdio.h>
#include <stdlib.h> //Pozornost
int main()
{
int *x=(int*) malloc(sizeof(int));
*x=10;
printf("%d",*x);
free(x);
return 0;
} |
Ovdje pričamo o C jeziku tako da
Kod: |
#include <stdio.h>
#include <stdlib.h> //Pozornost
int main()
{
int *x=malloc(sizeof(int));
*x=10;
printf("%d",*x);
free(x);
return 0;
} |
je cast operator nepotreban, prema ansi c-u i iso standardu ovo je normalno ponašanje,
cast je bio potreban prije dok *void nije postojao već se koristio *char (to sam guglao samo radi informacije dok sam vidio skriptu)
ako još dodamo i
Kod: | int *x=malloc(sizeof *x)//Zagrade nisu potrebne | umjesto
Kod: | int *x=malloc(sizeof (int)) | onda nam to pomaže još više kod dvodimenzionalnih polja
Kod: | int **x = malloc(n * sizeof *x);
int i;
for (i=n;i--;) //ili for(i=0;i<n;i++)
x[i] = malloc(n * sizeof **x);
|
u stvarnosti je funkcionalnije kod drugih primjera, ovdje recimo da je ljepše,nebitno, odoh sa teme,
sad ako netko ovo otrči kompajlirat u svoj visual c++ normalno da će dobit grešku, jer c++ compileri prema standardu traže cast operator, ali ako to ode frknut u gcc, sve će biti ok, kao što je i zamišljeno,
C i C++ nisu isti jezici, pa smatram da to treba izmjeniti, u skripti stoji (vsego) da će compiler izbaciti grešku ako ne stavimo cast operator, što je netočno, mi programiramo u c-u i greške pouzdano nema,
inaće ja smijem koristiti for (int i=0...)
Mislio sam da sam u krivu kad sam vidio skriptu pa eto potražih po netu
http://c-faq.com/malloc/decl.html
http://c-faq.com/malloc/cast.html
http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284351&answer=1047673478
http://users.powernet.co.uk/eton/c/hackerhotel.html
Ima toga brdo i brdo, poanta je da su rasprave nebitne i kužim zašto bi netko stavljao cast operator, pogotovo jer ćemo raditi u c++-u ali sam navod u skripti je netočan za nas C-ovce, a ja sam uvijek za optimizaciju i sažimanje kôda pa me taj malloc i više nego muči, pa da na kolokviju ne bi bilo nismo znali...
Ja sam rođeni c++ programer pa nije da me to smeta, i uvijek sam za tuđe mišljenje pa ako ima nešto...
što se tiće sizeof(int) vs sizeof (*x) jasno ako je x pokazivač na int, (točnije kod drugog pristupa nije ni bitno) da će dat isto, ovdje se ne vidi prednost tog pristupa i to mi je nebitno ali nije navedeno, a koristim...
PS stdlib.h označio zato jer vidim da se normalno navodi u skripti pa ako se navodi onda nema potrebe za cast operatorom...
|
|
[Vrh] |
|
Milojko Forumaš(ica)
Pridružen/a: 07. 11. 2008. (14:57:52) Postovi: (453)16
Spol:
Lokacija: Hilbertov hotel
|
|
[Vrh] |
|
Pkora Forumaš(ica)
Pridružen/a: 17. 11. 2009. (17:14:03) Postovi: (21)16
Spol:
Lokacija: Tangenta
|
|
[Vrh] |
|
Boris B. Forumaš(ica)
Pridružen/a: 19. 01. 2010. (18:01:54) Postovi: (32)16
Spol:
|
Postano: 18:19 ned, 6. 6. 2010 Naslov: Re: Ajmo o C-u, pokazivačima i skripti (Programiranje 2)... |
|
|
Stvari poput "for(int i =..." i deklaracija dalje od početka bloka općenito su uvedene u C u najnovijem standardu (C99), no mislim da nema još nijedna kompajler koji njega 100% podržava, pa možda i bolje da se to ne uči :D iako su neke od uvedenih stvari definitivno korisne...
Ali da, ako se ne varam, void kao tip podatka postoji u C otkad je i najranijega ANSI standarda, a poanta void * je upravo da bude pointer neodređen po tipu, koji može pokazivati na bilo šta, pa se zato i automatski kasta u to isto bilo šta, bez upozorenja :)
Zato baš i ne vidim poantu u inzistiranju na tome da se kastanje kod malloca bilježi eksplicitno, pogotovo zato što ću rađe vjerovati kompajleru da određuje tip varijable, nego sebi. ;)
Jedino da, svakako je dobro upozoriti da bi se puno kompajlera moglo buniti, jer su prije namjenjeni C++-u, nego C-u... ne sjećam se više kako se po tom pitanju ponašao Dev-C++ kojeg najviše ljudi koristi :?
No dobro, riječ je o relativno sitnoj stvari :P
Stvari poput "for(int i =..." i deklaracija dalje od početka bloka općenito su uvedene u C u najnovijem standardu (C99), no mislim da nema još nijedna kompajler koji njega 100% podržava, pa možda i bolje da se to ne uči iako su neke od uvedenih stvari definitivno korisne...
Ali da, ako se ne varam, void kao tip podatka postoji u C otkad je i najranijega ANSI standarda, a poanta void * je upravo da bude pointer neodređen po tipu, koji može pokazivati na bilo šta, pa se zato i automatski kasta u to isto bilo šta, bez upozorenja
Zato baš i ne vidim poantu u inzistiranju na tome da se kastanje kod malloca bilježi eksplicitno, pogotovo zato što ću rađe vjerovati kompajleru da određuje tip varijable, nego sebi.
Jedino da, svakako je dobro upozoriti da bi se puno kompajlera moglo buniti, jer su prije namjenjeni C++-u, nego C-u... ne sjećam se više kako se po tom pitanju ponašao Dev-C++ kojeg najviše ljudi koristi
No dobro, riječ je o relativno sitnoj stvari
_________________ The lyf so short, the craft so long to lerne
|
|
[Vrh] |
|
Pkora Forumaš(ica)
Pridružen/a: 17. 11. 2009. (17:14:03) Postovi: (21)16
Spol:
Lokacija: Tangenta
|
Postano: 18:36 ned, 6. 6. 2010 Naslov: |
|
|
da, i ja dođem na kolokvij i napišem int *x=malloc(sizeof *x) i izgubim bodove...oko toga se vrti priča, da mi se to ne bi desilo, i nije bitno, strana 48 u skripti, ispraviti :P
da, i ja dođem na kolokvij i napišem int *x=malloc(sizeof *x) i izgubim bodove...oko toga se vrti priča, da mi se to ne bi desilo, i nije bitno, strana 48 u skripti, ispraviti
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 19:22 ned, 6. 6. 2010 Naslov: |
|
|
Skoro svake godine se nadje netko tko zna [b]ispredavati[/b] C bolje od ekipe s kolegija. :lol:
Kao prvo, [tt]sizeof()[/tt] se cesce koristi na tipovima nego na varijablama. Probaj ovo svoje tako da umjesto [tt]*x[/tt] stavis [tt]int[/tt].
[code:1]$ cat t.c; gcc -ansi --pedantic-error t.c
#include <stdio.h>
#include <stdlib.h>
int main () {
printf("%d", sizeof int);
return 0;
}
t.c: In function ‘main’:
t.c:5: error: expected expression before ‘int’[/code:1]
Naravno, ja mogu u detalje pricati kad zagrade mogu, a kad ne mogu ici, ali moj posao nije zbuniti 90% studenata zato da bi jedan bio sretan da negdje pise da zagrade ponekad ne trebaju.
Kao drugo, castanje ispred [tt]malloc()[/tt] i [tt]realloc()[/tt] sluzi tome da se rijese warningsi koje ce neki compileri puknuti, a onda vecina ostati zbunjena sto se dogadja. Kako su ovo prvi, a ne jedini kolegiji iz C-a, moj je posao pripremiti ljude za ono sto dolazi. A prema mom iskustvu, velika vecina studenata ne zna procitati niti poruke o greski niti warninge.
Zanimljivo je da ti to s castanjem isto nije smetalo u predavanjima (koja su takodjer dostupna na webu).
Ako imas problem s time da su ti bodovi negdje skinuti, a nisu trebali biti... tome sluzi uvid u kolokvije.
A konacna poanta tvog ranta je... sto? Da u skripti pise da treba napisati 10-20 znakova vise nego sto je nuzno? :lol:
Skoro svake godine se nadje netko tko zna ispredavati C bolje od ekipe s kolegija.
Kao prvo, sizeof() se cesce koristi na tipovima nego na varijablama. Probaj ovo svoje tako da umjesto *x stavis int.
Kod: | $ cat t.c; gcc -ansi --pedantic-error t.c
#include <stdio.h>
#include <stdlib.h>
int main () {
printf("%d", sizeof int);
return 0;
}
t.c: In function ‘main’:
t.c:5: error: expected expression before ‘int’ |
Naravno, ja mogu u detalje pricati kad zagrade mogu, a kad ne mogu ici, ali moj posao nije zbuniti 90% studenata zato da bi jedan bio sretan da negdje pise da zagrade ponekad ne trebaju.
Kao drugo, castanje ispred malloc() i realloc() sluzi tome da se rijese warningsi koje ce neki compileri puknuti, a onda vecina ostati zbunjena sto se dogadja. Kako su ovo prvi, a ne jedini kolegiji iz C-a, moj je posao pripremiti ljude za ono sto dolazi. A prema mom iskustvu, velika vecina studenata ne zna procitati niti poruke o greski niti warninge.
Zanimljivo je da ti to s castanjem isto nije smetalo u predavanjima (koja su takodjer dostupna na webu).
Ako imas problem s time da su ti bodovi negdje skinuti, a nisu trebali biti... tome sluzi uvid u kolokvije.
A konacna poanta tvog ranta je... sto? Da u skripti pise da treba napisati 10-20 znakova vise nego sto je nuzno?
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
Pkora Forumaš(ica)
Pridružen/a: 17. 11. 2009. (17:14:03) Postovi: (21)16
Spol:
Lokacija: Tangenta
|
Postano: 20:21 ned, 6. 6. 2010 Naslov: |
|
|
[quote="vsego"]Skoro svake godine se nadje netko tko zna [b]ispredavati[/b] C bolje od ekipe s kolegija. :lol:[/quote]Da ziher, to je bila poanta mog posta :roll:
[quote]
Kao prvo, [tt]sizeof()[/tt] se cesce koristi na tipovima nego na varijablama. Probaj ovo svoje tako da umjesto [tt]*x[/tt] stavis [tt]int[/tt].
[code:1]$ cat t.c; gcc -ansi --pedantic-error t.c
#include <stdio.h>
#include <stdlib.h>
int main () {
printf("%d", sizeof int);
return 0;
}
t.c: In function ‘main’:
t.c:5: error: expected expression before ‘int’[/code:1]
Naravno, ja mogu u detalje pricati kad zagrade mogu, a kad ne mogu ici, ali moj posao nije zbuniti 90% studenata zato da bi jedan bio sretan da negdje pise da zagrade ponekad ne trebaju.
[/quote]Zato su kod mene zagrade gore navedene u primjeru inta, znam da compiler baca grešku ako ih nema, nije to ništa moje, a kao prvo 98% ljudi ga koristi na tipovima nego na varijablama, isto tih 98% ne zna što je vezana lista
sizeof(*x) valja kao i sizeof(int), onaj ko kuži pointere koje treba kužit kuži zašto, a onaj ko se bavi programiranjem, kuži zašto je bolje da pokazuje točno na ono što treba, ako ništa drugo, baš zato jer pokazuje na ono što treba, sizeof *x je naveden kao još brži način, bez zagrada jest, to je brže za pisat...
[quote]
A konacna poanta tvog ranta je... sto? Da u skripti pise da treba napisati 10-20 znakova vise nego sto je nuzno? :lol:[/quote]
Točno to :P...osim dijela gdje mi je eto sad pojašnjeno da nije ni čudo da faks-programeri to ne znaju kad sam dobio ovakvo objašnjenje...
Poanta posta je da se nauči nešto novo, zato se ovo zove forum, meni nije ni najmanje stalo do ijednog tog zadatka i kako se oni školski rješavaju s obzirom da je programiranje razlog zbog kojeg upisah faks ;)
btw, stranica 67, double *y je viška, zaostalo od starog primjera, to je sizeof(y) bajta viška..., a ovo gore je na 48 stranici
također dinamičko učitavanje stringa na stranici 78 se može napisati tim gore ljudima na jednostavniji način no vidim da smo nešto osjetljivi...[img]http://foolstown.com/sm/popc1.gif[/img]
nhf, ovo je zbog novih ideja meni osobno, a zar je loše poboljšat skriptu...
vsego (napisa): | Skoro svake godine se nadje netko tko zna ispredavati C bolje od ekipe s kolegija. | Da ziher, to je bila poanta mog posta
Citat: |
Kao prvo, sizeof() se cesce koristi na tipovima nego na varijablama. Probaj ovo svoje tako da umjesto *x stavis int.
Kod: | $ cat t.c; gcc -ansi --pedantic-error t.c
#include <stdio.h>
#include <stdlib.h>
int main () {
printf("%d", sizeof int);
return 0;
}
t.c: In function ‘main’:
t.c:5: error: expected expression before ‘int’ |
Naravno, ja mogu u detalje pricati kad zagrade mogu, a kad ne mogu ici, ali moj posao nije zbuniti 90% studenata zato da bi jedan bio sretan da negdje pise da zagrade ponekad ne trebaju.
| Zato su kod mene zagrade gore navedene u primjeru inta, znam da compiler baca grešku ako ih nema, nije to ništa moje, a kao prvo 98% ljudi ga koristi na tipovima nego na varijablama, isto tih 98% ne zna što je vezana lista
sizeof(*x) valja kao i sizeof(int), onaj ko kuži pointere koje treba kužit kuži zašto, a onaj ko se bavi programiranjem, kuži zašto je bolje da pokazuje točno na ono što treba, ako ništa drugo, baš zato jer pokazuje na ono što treba, sizeof *x je naveden kao još brži način, bez zagrada jest, to je brže za pisat...
Citat: |
A konacna poanta tvog ranta je... sto? Da u skripti pise da treba napisati 10-20 znakova vise nego sto je nuzno? |
Točno to ...osim dijela gdje mi je eto sad pojašnjeno da nije ni čudo da faks-programeri to ne znaju kad sam dobio ovakvo objašnjenje...
Poanta posta je da se nauči nešto novo, zato se ovo zove forum, meni nije ni najmanje stalo do ijednog tog zadatka i kako se oni školski rješavaju s obzirom da je programiranje razlog zbog kojeg upisah faks
btw, stranica 67, double *y je viška, zaostalo od starog primjera, to je sizeof(y) bajta viška..., a ovo gore je na 48 stranici
također dinamičko učitavanje stringa na stranici 78 se može napisati tim gore ljudima na jednostavniji način no vidim da smo nešto osjetljivi...
nhf, ovo je zbog novih ideja meni osobno, a zar je loše poboljšat skriptu...
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 21:40 ned, 6. 6. 2010 Naslov: |
|
|
Nije lose, dapace, ali ti si nastupio s time da je krivo, a ne da "moze bolje". :P
Ako ijedan fax upises zbog programiranja... :tapsh: Ajd, javi mi se za koju godinu, da te probam utjesiti da nije sve tako crno i da se mozda ipak i dalje zelis baviti programiranjem. 8)
Ma, samo keep in mind da vecina studenata [b]ne zeli[/b] uciti programiranje (i to je, IMO, ok - mi smo Matematika). Da se mene pita, Programiranja bi bila izborni kolegiji i onda bi se to ozbiljnije radilo (pogotovo kasniji kolegiji). No, dok me se ne pita i dok je to obavezno, moja koncentracija - na zalost - mora biti na onoj vecini koja to uci (uzeti ovo "uci" s rezervom) jer mora (ako zele zavrsiti Matematiku).
Nije lose, dapace, ali ti si nastupio s time da je krivo, a ne da "moze bolje".
Ako ijedan fax upises zbog programiranja... Ajd, javi mi se za koju godinu, da te probam utjesiti da nije sve tako crno i da se mozda ipak i dalje zelis baviti programiranjem.
Ma, samo keep in mind da vecina studenata ne zeli uciti programiranje (i to je, IMO, ok - mi smo Matematika). Da se mene pita, Programiranja bi bila izborni kolegiji i onda bi se to ozbiljnije radilo (pogotovo kasniji kolegiji). No, dok me se ne pita i dok je to obavezno, moja koncentracija - na zalost - mora biti na onoj vecini koja to uci (uzeti ovo "uci" s rezervom) jer mora (ako zele zavrsiti Matematiku).
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
|