The Only Ierakstīts Maijs 5, 2012 Share Ierakstīts Maijs 5, 2012 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 More sharing options...
Uģis Lācis Maijs 5, 2012 Share Maijs 5, 2012 (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 Maijs 5, 2012 - Uģis Lācis Link to comment Share on other sites More sharing options...
Inspektors Caps Maijs 5, 2012 Share Maijs 5, 2012 (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 Maijs 5, 2012 - Inspektors Caps Link to comment Share on other sites More sharing options...
Uģis Lācis Maijs 5, 2012 Share Maijs 5, 2012 [..]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. Link to comment Share on other sites More sharing options...
The Only Maijs 5, 2012 Author Share Maijs 5, 2012 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 More sharing options...
KurmisA Maijs 14, 2012 Share Maijs 14, 2012 (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 More sharing options...
Vilx- Maijs 14, 2012 Share Maijs 14, 2012 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 More sharing options...
Baigais Janka Maijs 14, 2012 Share Maijs 14, 2012 (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 Maijs 14, 2012 - Baigais Janka Link to comment Share on other sites More sharing options...
Recommended Posts
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 kontuPierakstīties
Jums jau ir konts? Pierakstieties tajā šeit!
Pierakstīties tagad!