|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
S53DZ Član
Pridružen-a: Čet 28 Apr 2011 9:27 Prispevkov: 951 Aktiv.: 6.05 Kraj: Ljubljana
|
Objavljeno: 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 |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.09 Kraj: Dragomer
|
Objavljeno: 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? _________________ 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.05 Kraj: Ljubljana
|
Objavljeno: 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 |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.09 Kraj: Dragomer
|
Objavljeno: 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! _________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
gregoral Član
Pridružen-a: Pet 24 Nov 2006 9:42 Prispevkov: 688 Aktiv.: 3.26 Kraj: Ljubljana
|
Objavljeno: 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 |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.09 Kraj: Dragomer
|
Objavljeno: 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. _________________ 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.05 Kraj: Ljubljana
|
Objavljeno: Sre Jan 11, 2012 9:22 am Naslov sporočila: |
|
|
Kazalcu je treba index prištevati, sicer je to polje kazalcev. |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.09 Kraj: Dragomer
|
Objavljeno: 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'
|
_________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
gregoral Član
Pridružen-a: Pet 24 Nov 2006 9:42 Prispevkov: 688 Aktiv.: 3.26 Kraj: Ljubljana
|
Objavljeno: 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 |
|
Nazaj na vrh |
|
|
gregoral Član
Pridružen-a: Pet 24 Nov 2006 9:42 Prispevkov: 688 Aktiv.: 3.26 Kraj: Ljubljana
|
Objavljeno: 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;
} |
|
|
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: 49 dni
Powered by phpBB © 2001, 2005 phpBB Group
|