`
The Only

C stuktūras

8 posts in this topic

Uzdevums viegls, bet komplators izmet kļūdu. Gribu stuktūras loceklī char status[15] pašrocīgi ievadīt vārdu darbā, bet kopilātors izmet kļūdu:

5semmd.c:27:20: error: incompatible types when assigning to type ‘char[15]’ from type ‘char *’

 

Meklēju netā un nevarēju atrast, jo parasti inicializē manīgo pie definēšanas, bet šoreiz tas neder, jo jāievieto jauns ieraksts.

 

struct emp
{
 ...
 char status[15];
};


void insert (struct emp *db)
{

 (db+size)->status="darba";
...
}

Share this post


Link to post
Share on other sites

(labots)

Nu grūti kaut ko pateikt, neredzot, kā atmiņa ir piešķirta utt. Bet viens, kas krīt acīs, kāpēc tiek lietots

(db+size)->status

 

Manuprāt pareizi būtu:

db->status

 

Bet ja runā par kodu kopumā, tad es "status" atmiņu nepiešķirtu struct definīcijā, tur turētu tikai pointeri un piešķirtu amiņu vēlāk:

struct emp
{
char *status;
};

Labots - Uģis Lācis

Share this post


Link to post
Share on other sites

(labots)

Uģi, nav gan grūti, jo viss vajadzīgais jau ir acu priekšā! Ja tikai zinam C (nevis C++) ... ;)

 

Manuprāt pareizi būtu:

db->status

Šo gan Tu nepareizi ieteici, jo tas aizrakstīs masīva, uz kuru norāda db, nulto elementu, bet autoram size ir datu bāzes izmērs un (db+size) aizraksta nākošo elementu aiz pēdējā. Cita lieta, ka visskaistāk tas izskatās šādi:

db[size]->status

 

Par fiksēta masīva izmantošanu vai dinamisko atmiņu runājot, tas arī nav viennozīmīgi. Viss atkarīgs no ierakstu skaita un garuma prasībām, ievietošanas/dzēšanas biežuma, CPU vs RAM vēlamā patēriņa izvēles un plus vēl iesācējs lai labāk sākumā padarbojas ar vienkāršāko variantu un apgūst visu secīgi.

 

Runājot par lietu..

(db+size)->status="darba";

C valodā vērtību piešķiršanu Tu vari veikt tikai tādiem mainīgajiem, ko var ierakstīt CPU reģistros - skaitļiem un adresēm. (Inicializācija definējot ir izņēmums, kur Tavā vietā visu izdara C runtime.) Masīvi, teksti un struktūras ir lieli datu bloki atmiņā, ko reģistros ielikt nevar. Šādām lietām jāizmanto funkcijas, kas kopē atmiņu. Teksta gadījumā tās ir strcpy un strncpy. Vienkāršākais variants:

 

strcpy(db[size]->status, "darba");

Labots - Inspektors Caps

Share this post


Link to post
Share on other sites
[..]Par fiksēta masīva izmantošanu vai dinamisko atmiņu runājot, tas arī nav viennozīmīgi. Viss atkarīgs no ierakstu skaita un garuma prasībām, ievietošanas/dzēšanas biežuma, CPU vs RAM vēlamā patēriņa izvēles un plus vēl iesācējs lai labāk sākumā padarbojas ar vienkāršāko variantu un apgūst visu secīgi.[..]

 

Nu jā, es zinu un lietoju dinamiskos variantus. Ok. Pārtraukšu mēģināt komentēt tēmās, kuras līdz galam nepārvaldu. :D

Share this post


Link to post
Share on other sites
Uģi, nav gan grūti, jo viss vajadzīgais jau ir acu priekšā! Ja tikai zinam C (nevis C++) ... ;) Šo gan Tu nepareizi ieteici, jo tas aizrakstīs masīva, uz kuru norāda db, nulto elementu, bet autoram size ir datu bāzes izmērs un (db+size) aizraksta nākošo elementu aiz pēdējā. Cita lieta, ka visskaistāk tas izskatās šādi:
db[size]->status

Par fiksēta masīva izmantošanu vai dinamisko atmiņu runājot, tas arī nav viennozīmīgi. Viss atkarīgs no ierakstu skaita un garuma prasībām, ievietošanas/dzēšanas biežuma, CPU vs RAM vēlamā patēriņa izvēles un plus vēl iesācējs lai labāk sākumā padarbojas ar vienkāršāko variantu un apgūst visu secīgi. Runājot par lietu..

(db+size)->status="darba";

C valodā vērtību piešķiršanu Tu vari veikt tikai tādiem mainīgajiem, ko var ierakstīt CPU reģistros - skaitļiem un adresēm. (Inicializācija definējot ir izņēmums, kur Tavā vietā visu izdara C runtime.) Masīvi, teksti un struktūras ir lieli datu bloki atmiņā, ko reģistros ielikt nevar. Šādām lietām jāizmanto funkcijas, kas kopē atmiņu. Teksta gadījumā tās ir strcpy un strncpy. Vienkāršākais variants:

strcpy(db[size]->status, "darba");

 

Paldies. Bija man doma par strcpy, bet nezināju vai tā var rakstīt. :)

Share this post


Link to post
Share on other sites

(db+size)->status="darba";

 

šeit man uzreiz uzkrīt 2 lietas

* kas īsti ir (db+size)

* char tipam iekš C nerullē piešķirt vērtību šādi "darba"

Tas ir iespējams C++ un ne ar char tipu

 

Tāds joks ietu cauri apmēram šādi te :

(db+size)->status[0]='d';

(db+size)->status[1]='a';

(db+size)->status[2]='r';

(db+size)->status[3]='b';

(db+size)->status[4]='a';

(db+size)->status[5]='\0';

( neesmu drošs par brīnumu (db+size) )

 

 

Tavā situācijā ļoti vērtīgs ir GCC paziņojums

incompatible types when assigning to type ‘char[15]’ from type ‘char *’

Vēl to ko gribi izdarīt vari mēģināt ar sprintf() , piedevām ar to pa tiešo vari līmēt kopā

int, float ... skaitļus, burtus, stringus ...

 

Iesaku šo lapu ja mācies C

http://cplusplus.com/reference/

 

Šeit ir gatavi piemēri par string funkcijām

http://cplusplus.com/reference/clibrary/cstring/

Share this post


Link to post
Share on other sites

db+size ir normāla operācija. Palasies par pointeru aritmētiku iekš C. Faktiski tas ir ekvivalents &db, lai arī es tagad neņemos apgalvot, ka nav kādas nianses, kas atšķiras.

 

Un Tavi linki ir uz C++ referenci, nevis C. Tās ir divas stipri atšķirīgas valodas.

Share this post


Link to post
Share on other sites

(labots)

Jā, tur starpības nav starp to + vai kvadrātiekavu lietošanu, gaumes lieta (vai nu arī - kā kantorī pieņemtā sintakse liek), nu, vienīgais - ja pēkšņi vajag visādas izvirtušas lietas dabūt gatavas, ta pierakstam ar +, viegli type cast piešaut klāt, un aizadresēties kauču kur ellē ratā (ja nu nepieciešams :).

Labots - Baigais Janka

Share this post


Link to post
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!


Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!


Pierakstīties tagad!

  • Kas ir tiešsaistē   34 biedri, 2 Anonīmi, 52 viesi (Skatīt pilnu sarakstu)

    • snukurins
    • xp
    • waplet
    • rubb
    • ArnisV
    • Koalīcija
    • Notfound
    • Stasss
    • uldise
    • Borhs
    • Anonīms Alkoholiķis
    • Verneris
    • PlayingTheSaint
    • janiz
    • versatile
    • Gints_lv
    • laikamtak
    • Arnis2002
    • alusbundza
    • gromix
    • RitaKafija
    • Ugis
    • rodrigez
    • Destructo
    • Zin...
    • ronalds_
    • mickys
    • Zoom
    • Johny_JK
    • superKrona
    • axxb
    • ezis666
    • CAP
    • V.S.
  • Biedru statistika

    22 436
    Kopā biedri
    456
    Bieži tiešsaistē
    Justin
    Newest Member
    Justin
    Pievienojies