Pālekt uz saturu


Foto
- - - - -

C stuktūras


  • Lūdzu pieslēdzies, lai atbildētu
7 atbildes uz šo tēmu

#1 The Only

The Only
  • Biedri
  • 204 raksti

Pievienots 05 May 2012 - 12:22

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


#2 Uģis Lācis

Uģis Lācis
  • Biedri
  • 1351 raksti
  • Atrodos:Stockholm, Sweden
  • Intereses:HDTV, HD Video, Video... Fizika, daba, fantastika. ;)

Pievienots 05 May 2012 - 14:19

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

Šo rakstu rediģēja Uģis Lācis: 05 May 2012 - 14:21


#3 Inspektors Caps

Inspektors Caps
  • Biedri
  • 1759 raksti

Pievienots 05 May 2012 - 14:52

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");

Šo rakstu rediģēja Inspektors Caps: 05 May 2012 - 15:12


#4 Uģis Lācis

Uģis Lācis
  • Biedri
  • 1351 raksti
  • Atrodos:Stockholm, Sweden
  • Intereses:HDTV, HD Video, Video... Fizika, daba, fantastika. ;)

Pievienots 05 May 2012 - 15:47

[..]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

#5 The Only

The Only
  • Biedri
  • 204 raksti

Pievienots 05 May 2012 - 22:24

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

#6 KurmisA

KurmisA
  • Jaunbiedri
  • 15 raksti

Pievienots 14 May 2012 - 12:11

(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...ibrary/cstring/

#7 Vilx-

Vilx-

    Māk izdalīt ar nulli vai cirvi. Tuvojas Tev.

  • Moderators
  • 9277 raksti
  • Atrodos:Rīga
  • Intereses:Datori

Pievienots 14 May 2012 - 12:36

db+size ir normāla operācija. Palasies par pointeru aritmētiku iekš C. Faktiski tas ir ekvivalents &db[size], 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.

#8 Baigais Janka

Baigais Janka
  • Biedri
  • 3148 raksti
  • Atrodos:Rīga
  • Intereses:Programmēšana, compūteri, alus... mhm... jebšu otrādi?

Pievienots 14 May 2012 - 13:42

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

Šo rakstu rediģēja Baigais Janka: 14 May 2012 - 13:42



 
 
 
 
Serveris.lv


0 Lietotāji(s) lasa šo tēmu

0 biedri(s), 0 viesi(s), 0 anonīmi(s) lietotāji(s)