Jump to content

C stuktūras


The Only
 Share

Recommended Posts

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";
...
}

Link to comment
Share on other sites

Uģis Lācis
(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
Link to comment
Share on other sites

Inspektors Caps
(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
Link to comment
Share on other sites

Uģis Lācis
[..]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

Link to comment
Share on other sites

The Only
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. :)

Link to comment
Share on other sites

  • 2 weeks later...
KurmisA

(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/

Link to comment
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.

Link to comment
Share on other sites

Baigais Janka

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
Link to comment
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!
 Share

×
×
  • Izveidot jaunu...