www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 
Sponsored by SiOL

GNU C pomoč začetniku VI
Pojdi na stran Prejšnja  1, 2
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Linux, unix razprave
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
S53DZ
Član
Član



Pridružen-a: Čet 28 Apr 2011 9:27
Prispevkov: 946
Aktiv.: 9.01
Kraj: Ljubljana

PrispevekObjavljeno: Tor Jan 10, 2012 11:53 pm    Naslov sporočila:   Odgovori s citatom

Najprej definiraj spremenljivko, ki bo polje strukture list.
Koda:
//npr.
list polje[100];

Potem pa lahko vpisuješ neposredno z indeksom ali pa s kazalcem.
Pa na piko med elementi strukture ne pozabi.


Nazadnje urejal/a S53DZ Tor Jan 10, 2012 11:56 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3315
Aktiv.: 19.53
Kraj: Dragomer

PrispevekObjavljeno: Tor Jan 10, 2012 11:55 pm    Naslov sporočila:   Odgovori s citatom

Hvala Bojan, a v tem slučaju polje strukture ne bo v posebnem memory bloku, ki ga potrebujem, beri zadnji odstavek!

In še nekaj mi ne gre:
Kako v polje tekst vnesem podatke, kako moram napisati kam v strcpy funkcijo?

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
S53DZ
Član
Član



Pridružen-a: Čet 28 Apr 2011 9:27
Prispevkov: 946
Aktiv.: 9.01
Kraj: Ljubljana

PrispevekObjavljeno: Sre Jan 11, 2012 12:02 am    Naslov sporočila:   Odgovori s citatom

Res, v tem primeru moraš prej rezervirati prostor za celo polje in ne samo za strukturo (s sizeof()).

str manipulacija je možna z več funkcijami (na hitro):
Koda:
strcpy(); // za kopiranje niza na niz
strncpy(); // za prepis n znakov iz izvora na ponor
strcat(); // za sestavljanje dveh nizov
Prosim, poglej si help, da boš videl točno sintakso.

EDIT:
Še ideja za naprej:
Koda:
strcpy(polje[i].tekst, niz);

Upam, da tole dela, ker je že pozna ura.


Nazadnje urejal/a S53DZ Sre Jan 11, 2012 9:31 am; skupaj popravljeno 1 krat
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3315
Aktiv.: 19.53
Kraj: Dragomer

PrispevekObjavljeno: Sre Jan 11, 2012 12:30 am    Naslov sporočila:   Odgovori s citatom

S53DZ je napisal/a:

EDIT:
Še ideja za naprej:
Koda:
strcpy(polje[i].tekst, niz);

Upam, da tole dela, ker je že pozna ura.


Ja to res dela, če je polje struktur alocirano v glavnem programu in ne v posebnem memory bloku. Tam se stvari zapletejo.
Nekaj sem čaral, dobil cel kup warning pri kompilu, a je delalo. Nisem pa zadovoljen, ker je program tako kompliciran in nepregleden.
Definiral sem pointer za tip strukture in poseben pointer za tip character, da sem končno nekako prišel do naslova teksta v strukturi. Veliko računanja ...
Mora biti boljša pot, enostavno mora biti! To je vendar C z veliko začetnico!

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 4.33
Kraj: Ljubljana

PrispevekObjavljeno: Sre Jan 11, 2012 2:01 am    Naslov sporočila:   Odgovori s citatom

Nekako takole bi moralo delat:

Koda:
struct list
  {   int koda;
   char tekst[16];
  } vnos, *listp, *listp1 ;

   listp = (struct list *)malloc(sizeof(struct list ) * 20);

strcpy(listp[i].tekst, niz);


si pa moraš pogledat kako je definiran strcpy, recimo:
char *strcpy( char *dest, const char *src );

lahko da ti bo prevajalnik javil warning če boš dal za prvi parameter char[] namesto char*.
v osnovi gre v obeh primerih za naslov kjer se začne "string" vendar sta to za prevajalnik načeloma različna tipa, ki pa sta zamenljiva.

V mojem prejšnjem postu so tri oz. štiri napake!
1. ker je array dolg samo 1 byte je noter lahko samo prazen string.

2. sprintf(str, "%d", 1);
za zapis "1" string ki ima en znak potrebujemo v resnici 2 znaka "1\0" (\0 je oznaka za NULL ccharacter), pišemo pa v array ki ima samo 1 byte

3. str[0] = '1';
tukaj sem "pozabil" na terminacijo stringa (\0)

4. printf("%s", str);
tukaj bo pa printf izpisoval dokler ne pride do \0 (ker je prej nisem zapisal se bo tu poznala napaka, ki je sicer posledica napake v prejšnjem stavku)

LP, Gregor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3315
Aktiv.: 19.53
Kraj: Dragomer

PrispevekObjavljeno: Sre Jan 11, 2012 9:05 am    Naslov sporočila:   Odgovori s citatom

gregoral je napisal/a:
Nekako takole bi moralo delat:

Koda:
struct list
  {   int koda;
   char tekst[16];
  } vnos, *listp, *listp1 ;

   listp = (struct list *)malloc(sizeof(struct list ) * 20);

strcpy(listp[i].tekst, niz);

LP, Gregor


To :
Koda:
strcpy(listp[i].tekst, niz);

se mi zdi krasno, če res dela. Kar preveč simpl za C
Bo takoj probal in javil. Malo me bega to, ker listp ni definiran kot variabla z indeksom.

Če pa ne bo šlo, sem ponoči prišel na idejo, da definiram še en enako delovno strukturo. Potem pa naredim sledeči postopek:
Izračunam pointer do konktretne strukture v memorybloku
prenesem celo strukturo iz memora bloka v delovno struktoro, to je kolikotoliko simple
obdelam vse variable v delovni strukturi in
potem vrnem delovno strukturo na izračunano mesto v memory block.

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
S53DZ
Član
Član



Pridružen-a: Čet 28 Apr 2011 9:27
Prispevkov: 946
Aktiv.: 9.01
Kraj: Ljubljana

PrispevekObjavljeno: Sre Jan 11, 2012 9:22 am    Naslov sporočila:   Odgovori s citatom

Kazalcu je treba index prištevati, sicer je to polje kazalcev.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3315
Aktiv.: 19.53
Kraj: Dragomer

PrispevekObjavljeno: Sre Jan 11, 2012 9:39 am    Naslov sporočila:   Odgovori s citatom

Ja, tako bo izgleda šlo:
Koda:
int main ()
{ int i,n;
  struct list
  {   char tekst[16];
    int koda;   
  } vnos, *listp, *listp1 ;
  char  *tekstp;
 
 
  // listp = (struct list *)malloc(sizeof(struct list ) * 20);
   listp = (struct list *)calloc(20, sizeof(struct list ) );
   if (listp == NULL)
   {  printf ("malloc neuspešen \n");
     return 10;
   }
   listp1 = listp + 10;     // recimo da hočem deseti vpis
   vnos = *listp1;          // prenos v delovno strukturo
   strcpy (vnos.tekst, "Hej, ljudje!");     // zakaj dobim tukaj warning? 
   vnos.koda = 10;
   *listp1 = vnos;          // vpisem nazaj v memory block
   // in nazaj:
   listp1 = listp + 10; 
   vnos = *listp1; 
   printf ("%d %s \n", vnos.koda, vnos.tekst);
   
   printf ("malloc uspešen \n");
   free (listp);   
   return 0;
}


Program dela, kot zamišljeno, le moti me warning, ki ga dobim:
Citiram:
calloc2.c:24: warning: incompatible implicit declaration of built-in function 'strcpy'

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 4.33
Kraj: Ljubljana

PrispevekObjavljeno: Sre Jan 11, 2012 10:05 pm    Naslov sporočila:   Odgovori s citatom

Sicer pišem na pamet ampak če sklepam po analogiji bi moralo delat.

Koda:

struct strukturax
{
   int xyz;
} strukturax;

char *str;
strukturax *pStruktura;

str[0] = 'a';
pStruktura[0].xyz = 1;


Microsoft VC++ tole prevede in pravilno interpretira.

EDIT: sem še malo pogooglal.

http://en.wikibooks.org/wiki/C_Programming/Pointers_and_arrays
The interaction of pointers and arrays can be confusing but here are two fundamental statements about it:

1) A variable declared as an array of some type acts as a pointer to that type. When used by itself, it points to the first element of the array.
2) A pointer can be indexed like an array name.


Koda:

int *p;
int *ap[10];


zgoraj je p pointer na int,
ap pa array pointerjev na int
v obeh primerih lahko naredim p[0] oziroma ap[0]
v prvem primeru to pomeni prvi int na naslovu kamor kaže p
v drugem pa prvi pointer iz arraya pointerjev

LP, Gregor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 4.33
Kraj: Ljubljana

PrispevekObjavljeno: Sre Jan 11, 2012 10:38 pm    Naslov sporočila:   Odgovori s citatom

@Vilko: sem preveril malo tvoj program
Koda:
int main ()
{ int i,n;
  struct list
  {   char tekst[16];
    int koda;   
  } vnos, *listp, *listp1 ;
  char  *tekstp;
 
 
  // listp = (struct list *)malloc(sizeof(struct list ) * 20);
   listp = (struct list *)calloc(20, sizeof(struct list ) );
   if (listp == NULL)
   {  printf ("malloc neuspešen \n");
     return 10;
   }

   // indexi se začnejo z 0 zato je to 11 zapis
   listp1 = listp + 10;     // recimo da hočem deseti vpis

   // tukaj povsem brez potrebe kopiraš vsebino
   vnos = *listp1;          // prenos v delovno strukturo

   strcpy (vnos.tekst, "Hej, ljudje!");     // zakaj dobim tukaj warning?

   vnos.koda = 10;

   *listp1 = vnos;          // vpisem nazaj v memory block

   // tole dvoje pa sploh ni potrebno saj
   // listp1 že/še vedno kaže na listp + 10
   // vnos že vsebuje podatke iz strukture listp+10
   // in nazaj:
   //listp1 = listp + 10;
   //vnos = *listp1;

   printf ("%d %s \n", vnos.koda, vnos.tekst);
   
   printf ("malloc uspešen \n");
   free (listp);   
   return 0;
}


če to spremenim (delam na pamet zato je lahko noter kakšna napaka)
Koda:
int main ()
{ int i,n;
  struct list
  {   char tekst[16];
    int koda;   
  } vnos, *listp, *listp1 ;
  char  *tekstp;
 
 
  // listp = (struct list *)malloc(sizeof(struct list ) * 20);
   listp = (struct list *)calloc(20, sizeof(struct list ) );
   if (listp == NULL)
   {  printf ("malloc neuspešen \n");
     return 10;
   }

   // recimo da hočem deseti vpis
   listp1 = listp + 9;

   strcpy (listp1->tekst, "Hej, ljudje!");     // zakaj dobim tukaj warning?

   listp1->koda = 10;

   printf ("%d %s \n", vnos.koda, vnos.tekst);
   
   printf ("malloc uspešen \n");
   free (listp);   
   return 0;
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Linux, unix razprave Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2
Stran 2 od 2

 
Pojdi na:  
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: 226 dni


Powered by phpBB © 2001, 2005 phpBB Group