C problem s pokazivacem

poruka: 14
|
čitano: 3.048
|
moderatori: XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
14 godina
neaktivan
offline
C problem s pokazivacem

Dobar dan,

 

Tek sam se sad registirao jer ima neke stvari koje jos ne shvacam , a mislim da tu ima dosta ljudi koji ovakve trivijalne stvari znaju i mogli bi mi objasniti. Uglavnom totalni sam nab za programiranje ( tek sam sad poceo radit zbog kolegija na faksu ). Imam sljedeci problem.

 

kod pokretanja programa moram unjeti argumente. To sam vec nasao prek googla " int main (int argc, char *argv[]){ }" i shvatio sam kak funkcinira...

 

argc je broj koji kaze koliko argumenata ima, a argv je array koji ima vrijednosti arugmenata po poljima upisane.

 

Recimo da se program zove test.c kad ga kompajliram i pokrenem sa naredbom "./a.out 15 16 17 18"

 

argc = 5

argv[0] = ./a.out

argv[1] = 15

argv[2] = 16

argv[3] = 17

argv[4] = 18

 

tako sam ja to shvatio da funkcionira..

 

cilj zadatka je izracunati povrsinu i opseg jednakostranicnog mnogokuta i vrijednosti argumenata su : prvi argument ( 15 ) je broj stranica prvog mnogokuta , a drugi argument ( 16 ) je duljina stranice prvog mnogokuta itd... maksimalno je dozovoljeno imati 5 mnogokuta. To sam nekako logicki mislio napravit sa naredbom if gdje cu ispitat argc je li veci od 11 .. ak je znaci ima vise od 5 mnogokuta....prekini program.

 

ja sam to ovako zamislio.... kako cu spremiti argumente i njih koristit. napravio sam for petlju koja ide ovako

int i,bs,ds;

 

for ( i =1 ; i<argc<i=i+2) {

 

bs = argv[i];

ds = argv[i+1];

 

switch (fork()){

 

            case 0: {

                        proces(broj_str, dulj_str);

                        break;

                         }

 

            case -1: {prinft ("Greska");

                            break;

                           }

 

            default: break;

 

 

}

}

 

Sad ono sto mene pati su greske sa koliko sam shvatio pokazivacima.  za linije

bs = argv[i];

ds = argv[i+1];

 

mi kaze gresku  " warning: cast from pointer to integer of different size " . Moze netko objasnit zasto to kaze i kako to rjesit. Moja pretpostavka je da je to zbog tipa podataka.. gore sam reko char , a bs i ds sam kao int deklarirao i jel to mora ici ovako mozda? bs = (int) argv[i]; i ds = (int) argv[i+1];

 

Prije sve toga imo sa konstantnu gresku " Segmentation failed" kod pokretanja programa i isto mi nije jasno zasto to izbacuje.

 

Pod case 0 sam stavio da za svaki mnogokut pokrene "proces " koji ce za taj mnogokut izracunavat opseg i povrsinu .. Stvari koje me zanimaju kod pokretanje funkcija su vrijednosti koje se salju pisu ovako u zagradama kak sam ja napravio ili na neki drugi nacin? i jel bitno da kod funkcije void proces(int br, int ds) da se unutar zagrade stavlja int da se deklarira varijbala posto nije globalna?

 

Ujedno ako netko imam kakvih materijala za te stvari na hrvatskom molim link :)

 

Neznam jesam li sve dobro objasnio , ali ne smijem cijeli kod programa stavit da slucajno ne bi netko doso uzeo program predao ga pa dobijemo oboje negativne bodove.  Te neke stvari mi nisu jasno oko pozivana funkcije i oko pokazivaca... negdje gresku radim i ubija me to...

 

Ako ima kakvih pitanja vezanih da mi pomognete slobodno pitajte.

 

Hvala

Poz

 
0 0 hvala 0
15 godina
neaktivan
offline
Re: C problem s pokazivacem

Problem koji imas je sto npr. argv[3] nije broj (integer) nego je pointer na string "17", da bi taj string pretvorio u broj treba ti funkcija poput atoi().

 

Svi argumenti u komandnoj liniji su pohranjeni kao stringovi, te ih trebas posebno konvertirati u brojeve ako radis s brojevima.

 

int nekibroj;

nekibroj = atoi(argv[x]);

Look at you, hacker. A pathetic creature of meat and bone, panting and sweating as you run through my corridors. How can you challenge a perfect, immortal machine?
Poruka je uređivana zadnji put pon 14.3.2011 19:04 (rustweaver).
14 godina
neaktivan
offline
C problem s pokazivacem

a bok** .... puno hvala , pregledao sam bar jedno 15 stranica sa command line argumentima i nigdje nije ni spomena bilo da se mora taj atoi koristit..

 

 
0 0 hvala 0
14 godina
neaktivan
offline
C problem s pokazivacem

XXX

EDIT:

 

nvm skuzio sam sta je bilo pa sam obrisao pitanje...

 

jos jednom hvala :P ak budem imo jos kakvih problema budem doso opet ^^

Poruka je uređivana zadnji put pon 14.3.2011 22:14 (kR1pt0n1t3).
 
0 0 hvala 0
15 godina
neaktivan
offline
Re: C problem s pokazivacem
kR1pt0n1t3 kaže...

Ajde pregledaj ovo malo ak ti nije tesko pa reci zasto nece uopce da ispise ista na ekranu... kad napises ./a.out 3 6 15 10 uopce nist ne napravi ( ili bar tako izgleda )

 

proces izgleda ovako :

 

void proces(int broj_str,int dulj_str){ KOD };

 

 

Sto je krivo pa nece da radi? ja nemam ideje....

 

zasto koristis switch za samo 2 slucaja? Za to ti je dovoljan if blok
nadalje ne znam sto ti tocno fork() funkcija radi, po svemu sudeci vrsi nekakve provjere greski. Ne bi bilo zgorega da provjeris je li u njoj problem. Pukni jedan printf prije returna u funkciji fork() da vidis vraca li uopce funkcija zeljene rezultate.

Ugl za pocetak ovaj switch zamijeni if blokom ovako:


if (fork()==-1)
   printf("Dogodila se greska prilikom pravljenja procesa");
else
   proces(broj_str,dulj_str);

Look at you, hacker. A pathetic creature of meat and bone, panting and sweating as you run through my corridors. How can you challenge a perfect, immortal machine?
Poruka je uređivana zadnji put pon 14.3.2011 22:16 (rustweaver).
14 godina
neaktivan
offline
Re: C problem s pokazivacem

Koliko sam shvatio fork je grananje neko. Koje radi vezu roditelj , dijete.  Dijete poprima neke vrijednosti od roditelja i zato mora biti switch fork. Gdje -1 je definirana vrijednost ak je nastala greska prilikom kreiranja djeteta, a 0 je vrijednost ako je uspjesno kreirana veza roditelj-dijete.

 

Sad mi program radi dobro skuzio sam u cemu je bio problem i sad sve ispravno radi.

 

Thx jos jednom.

 

http://www.csl.mtu.edu/cs4411/www/NOTES/process/fork/create.html

 

Jos mi ostao napravit programa za dretve...

13 godina
neaktivan
offline
C (problem sa kodom)

Imam sljdeci kod:

 

 

#include "stdafx.h"

#include  "stdio.h"

 

 

void main(void)

{

 

 

 float broj[5];

 int rez = 0;

 float prosjecna_o;

 int prolazna_o;

 int i;  

 

 

 for(i=0; i < 5; i++)

 {

 printf("Unesite ocjenu %d : ", i+1);

 scanf("%f", &broj[i] );

 }

 

 //saberi

 for(i = 4; i+1 ; i--)

 

 rez = rez + broj[i];

 

 

   if (broj[i] == 1){

 printf("Vas uspjeh je nedovoljan 1\n");

 }

 else (broj[i] > 1);{

 prol_o = rez/5;

 printf("Vi prolazite sa ocjenom %d \n", prolazna_o);

 

 }  

 

 pros_o = rez/5;

 

   printf("Prosjecna ocjena je %f  \n", prosjecna_o);

 

 

}

 

 

....

Kad pokrenem program i unesem ocjene npr. 5,4,1,4,3 zelim da mi ispise poruku " Vas uspjeh je nedovoljan 1" dok u mom slucaju odmah izbacuje prosjecnu ocjenu unesenih brojeva..

 

Pomoc 

Oyes
 
0 0 hvala 0
16 godina
neaktivan
offline
Re: C (problem sa kodom)
Oyes kaže...

Imam sljdeci kod:

....

  (neki kod)

....

Kad pokrenem program i unesem ocjene npr. 5,4,1,4,3 zelim da mi ispise poruku "  Vas uspjeh je nedovoljan 1" dok u mom slucaju odmah izbacuje prosjecnu ocjenu unesenih brojeva..

 

Pomoc

#include "stdafx.h"
#include "stdio.h"

void main(void) {

  int broj[5]; //Ovdje sam ti stavio integer jer nema potrebe da bude float, ocjene su cjelobrojne 
  int rez = 0;
  float prosjecna_o;
  int prolazna_o;
  int i; 

  for(i=0; i < 5; i++) {
      printf("Unesite ocjenu %d : ", i+1);
      scanf("%f", &broj[i] );
}
//saberi
  for(i = 4; i+1 ; i--)
      rez = rez + broj[i];

  if (broj[i] == 1){
      printf("Vas uspjeh je nedovoljan 1\n");
      return 0; // ovaj si redak zaboravio jer ti program mora izaci ako je ocjena nedovoljna
  } else (broj[i] > 1);{
      prolazna_o = (rez + 0.5)/5; //mislim da je ovo potrebno zbog toga sto C samo odbija decimalu, a ne zaokruzuje stoga dodamo 0.5 kako bi mu pomogli :), npr 2.4 je prosjecna dodamo 0.5 i to je 2.9 i nakon rezanja imamo 2 sto je ispravno, a npr da je bilo 2.7 ono bi ga odrezalo na 2 sto je neispravno, pa nakon dodavanja 0.5 imamo 3.2 i nakon rezanja to je 3 sto je tocno, nadam se da si shvatio
      printf("Vi prolazite sa ocjenom %d \n", prolazna_o);
  }  

  prosjecna_o = rez/5;
  printf("Prosjecna ocjena je %f \n", prosjecna_o);
  return 0;
}

Ovdje bih nešto kao trebao napisati, jel?
Poruka je uređivana zadnji put pon 15.8.2011 12:30 (Mr. Monster).
13 godina
neaktivan
offline
Re: C (problem sa kodom)

Hvala Vam .. :D sve sad radi kako treba osim ovog  dijela gdje si ubacio return 0; cim taj kod ubacim javi mi gresku pri pokretanju programa .. 

 

'main' : 'void' function returning a value

see declaration of 'main'

 

mozda treba  include jos neku klasu .. 

POzz 

Oyes
14 godina
neaktivan
offline
C problem s pokazivacem

int main umjesto void main

Moj PC  
0 0 hvala 1
16 godina
neaktivan
offline
C problem s pokazivacem

Da ovo sto ti je Tracer rekao, to sam previdio, oprosti bio sam u zurbi  {#}. Inace ti je bolje pisati bez void u glavnom programu. Znaci samo "int main ()". Void se koristi kada imas potprogram koji ne vraca vrijednosti (znaci ne koristis return).

 

EDIT: mbaksa ukazao na gresku pa dio obrisan. Hvala mbaksa.  {#}

Ovdje bih nešto kao trebao napisati, jel?
Poruka je uređivana zadnji put čet 18.8.2011 23:41 (Mr. Monster).
Moj PC  
0 0 hvala 0
17 godina
moderator
online
Re: C problem s pokazivacem
Mr. Monster kaže...

Inace ti je bolje pisati bez void u glavnom programu. Znaci samo "int main ()".

AFAIK void main ili samo main je pogrešno u C++-u, za sam C nisam 100% siguran - netko upućeniji će reći. Uglavnom, ako je i dopušteno standardom, najbolja praksa je ipak koristiti int main. Zašto? Zato jer program kod prekida izvršavanja treba vratiti vrijednost 0 operacijskom sustavu ako je uspješno završen ili neku drugu vrijednost (kôd greške), ako je došlo do neke run-time greške. Dakle, ako i kompajler prevede program tako da će program vraćati (ispravnu) vrijednost operacijskom sustavu, stvar na logičkoj razini ne štima ako koristiš void main. {#}

 

Mr. Monster kaže...

Void se koristi kada imas potprogram koji ne vraca vrijednosti (znaci ne koristis return) nego mu samo pristupas preko pokazivaca.

Na ovo podebljano idu samo upitnici iznad glave. Void se koristi kad imaš potprogram (funkciju, metodu) koja ne vraća vrijednost. Točka. Irelevantno je hoćeš li ti prosljeđivati pokazivače ili reference kao argumente da bi od funkcije na taj način dobio, uvjetno rečeno, povratnu vrijednost.

13 godina
neaktivan
offline
Hvala Vam .. :D

Ja sam pocetnik sa C-om i dobro mi dolaze Vaši savjeti. Imam još nekoliko projekata koje volio uz Vašu pomoć riješit jer izgleda da ima i tu nekih grešaka .. A da li se C razlikuje mnogo od C++ ? 

 

Pozz :D 

Oyes
 
0 0 hvala 0
17 godina
moderator
online
Re: Hvala Vam .. :D
Oyes kaže...

Ja sam pocetnik sa C-om i dobro mi dolaze Vaši savjeti. Imam još nekoliko projekata koje volio uz Vašu pomoć riješit jer izgleda da ima i tu nekih grešaka .. A da li se C razlikuje mnogo od C++ ? 

C++ je nadogradnja C-a s OOP (object-oriented programming) modelom (klase/objekti), predlošcima klasa i još nekim stvarima. Dakle, ako znaš C, možeš takoreći odmah početi raditi u C++-u, međutim da bi iskoristio prednosti C++-a trebat ćeš usvojiti OO paradigmu.

1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice