Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  GNU C massiivi muutmine funktsioonis märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
Karlsson
Kreisi kasutaja

liitunud: 20.08.2004



Autoriseeritud ID-kaardiga

sõnum 14.10.2015 15:19:14 GNU C massiivi muutmine funktsioonis vasta tsitaadiga

Oma lõbuks uurin C ja hetkel jäin toppama sellise probleemi juurde.
Oleks vaja funktsioonis sees massiivi muuta ja peale lõptutuid katseid on tulemus selline.
Sooviks jätta "int main" võimalikult muutmata kujule.
Spoiler Spoiler Spoiler
Kommentaarid: 88 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 79
tagasi üles
vaata kasutaja infot saada privaatsõnum
DoS
HV veteran
DoS

liitunud: 19.08.2002




sõnum 14.10.2015 15:45:33 vasta tsitaadiga

c:
  1. void lisa_arvud(int arvud[3]){
  2.     arvud[0] = 2;
  3.     /* ... */
  4. }
  5.  
  6. int main() {
  7.    /* ... */
  8.    lisa_arvud(paaris);
  9.    /* ... */
  10. }
  11.  


Teise massiiviga samamoodi.
Kommentaarid: 50 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 47
tagasi üles
vaata kasutaja infot saada privaatsõnum
Karlsson
Kreisi kasutaja

liitunud: 20.08.2004



Autoriseeritud ID-kaardiga

sõnum 14.10.2015 17:17:20 vasta tsitaadiga

Tänan, töötas. Nüüd sarnane probleem "struct isikud" muutmisega. Veateateid pole, kuid nime ja vanust ei muudeta.

c:
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. typedef struct isik {
  7.   char nimi[20];
  8.   int vanus;
  9. }empty;
  10.  
  11. struct isik isikud[2];
  12.  
  13. void lisa_nimed (struct isik tegelased[2]){ //OK
  14.   strcpy(tegelased[0].nimi, "Kalle");
  15.   tegelased[0].vanus = 30;
  16.   strcpy(tegelased[1].nimi, "Malle");
  17.   tegelased[1].vanus = 20;
  18. }
  19.  
  20. void valjasta_isikud(struct isik tegelased[2]){ //OK
  21.   int i = 0;
  22.   while (i < 2){
  23.     printf("%s %d \n",tegelased[i].nimi, tegelased[i].vanus);
  24.     i++;
  25.   }
  26. }
  27.  
  28. void muuda_isik (struct isik tegelane, char nimi[20], int vanus){ //vigane
  29.   strcpy(tegelane.nimi, nimi);
  30.   tegelane.vanus = vanus;
  31.   printf("Muudetud isik %s \n", tegelane.nimi);
  32. }
  33.  
  34. int main()
  35. {
  36.   lisa_nimed(isikud);
  37.   valjasta_isikud(isikud);
  38.  
  39.   //järgnev osa ei tööta
  40.   muuda_isik(isikud[0], "Pille", 22);
  41.   muuda_isik(isikud[1], "Ülle", 23);
  42.   valjasta_isikud(isikud);
  43.  
  44.   return 0;
  45. }
  46.  
Kommentaarid: 88 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 79
tagasi üles
vaata kasutaja infot saada privaatsõnum
DoS
HV veteran
DoS

liitunud: 19.08.2002




sõnum 14.10.2015 20:47:49 vasta tsitaadiga

Praegu sa saadad muuda_isik funktsiooni isiku structi väärtuse ehk sisuliselt tehakse structist koopia, muudetakse seda ja originaal jääb alles.
Ehk siis pead saatma pointeri "&isikud[0]" ja funktsioonis esimeseks parameetriks "struct isik *tegelane" ja muutmiseks "strcpy(tegelane->nimi, nimi)" ja "tegelane->vanus = vanus".
Kommentaarid: 50 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 47
tagasi üles
vaata kasutaja infot saada privaatsõnum
Karlsson
Kreisi kasutaja

liitunud: 20.08.2004



Autoriseeritud ID-kaardiga

sõnum 15.10.2015 01:28:40 vasta tsitaadiga

Selge, toimib. Lootsin ilma viideteta läbi ajada. Igatahes, oli abi!
Kommentaarid: 88 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 79
tagasi üles
vaata kasutaja infot saada privaatsõnum
andresv
HV kasutaja

liitunud: 06.12.2004




sõnum 15.10.2015 16:48:57 vasta tsitaadiga

Kui pointereid ei taha kasutada, siis kasuta reference
c++:
  1.  
  2. void muuda_isik (struct isik &tegelane, char nimi[20], int vanus)
  3.  
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
Karlsson
Kreisi kasutaja

liitunud: 20.08.2004



Autoriseeritud ID-kaardiga

sõnum 15.10.2015 17:33:15 vasta tsitaadiga

See annab süntaksi veateate C, kuid C++ toimib täiesti. Hea teada.
Kommentaarid: 88 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 79
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  GNU C massiivi muutmine funktsioonis
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.