www.elektronik.si
GNU C pomoč začetniku VI
Pojdi na stran Prejšnja  1, 2  :||:
www.elektronik.si -> Linux, unix razprave

Avtor: S53DZKraj: Ljubljana PrispevekObjavljeno: Tor Jan 10, 2012 11:53 pm    Naslov sporočila:  
----------------------------------------------------------------------------
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

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Tor Jan 10, 2012 11:55 pm    Naslov sporočila:  
----------------------------------------------------------------------------
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?

Avtor: S53DZKraj: Ljubljana PrispevekObjavljeno: Sre Jan 11, 2012 12:02 am    Naslov sporočila:  
----------------------------------------------------------------------------
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

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Sre Jan 11, 2012 12:30 am    Naslov sporočila:  
----------------------------------------------------------------------------
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!

Avtor: gregoralKraj: Ljubljana PrispevekObjavljeno: Sre Jan 11, 2012 2:01 am    Naslov sporočila:  
----------------------------------------------------------------------------
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

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Sre Jan 11, 2012 9:05 am    Naslov sporočila:  
----------------------------------------------------------------------------
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.

Avtor: S53DZKraj: Ljubljana PrispevekObjavljeno: Sre Jan 11, 2012 9:22 am    Naslov sporočila:  
----------------------------------------------------------------------------
Kazalcu je treba index prištevati, sicer je to polje kazalcev.

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Sre Jan 11, 2012 9:39 am    Naslov sporočila:  
----------------------------------------------------------------------------
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'

Avtor: gregoralKraj: Ljubljana PrispevekObjavljeno: Sre Jan 11, 2012 10:05 pm    Naslov sporočila:  
----------------------------------------------------------------------------
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

Avtor: gregoralKraj: Ljubljana PrispevekObjavljeno: Sre Jan 11, 2012 10:38 pm    Naslov sporočila:  
----------------------------------------------------------------------------
@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;
}

Stran 2 od 2

Powered by phpBB © 2001,2002 phpBB Group