Näytä kirjoitukset

Tässä osiossa voit tarkastella kaikkia tämän jäsenen viestejä. Huomaa, että näet viestit vain niiltä alueilta, joihin sinulla on pääsy.


Viestit - teele

Sivuja: [1] 2 3 ... 42
1
 
Asia on juuri niin. Pitäisi tulostaa i, eikä olisi pitänyt valita sellaista muuttujanimeä, josta on vaikea päätellä, että kyseessähän on taulkon elementti.

Yritin kirjoittaa sellaista koodia, jossa voisi mahdollisimman helposti vaihtaa alla olevan rakenteen int ktab[10] std::vector ktab -rakenteeksi ja päinvastoin. sizeof ei oikein toiminut iteraatiorajana, mutta kokeiltu for -rakenne taitaisi toimia.

Kiitos vastauksesta, pähkinän ratkaisu helpotti tilannetta ainakin täällä päässä  :)

2
Taas on tullut vastaan pieni ainakin toistaiseksi ratkaisematon pulma.

Koodia: [Valitse]

#include <vector>
#include <iostream>

int main()
{
  int ktab[10];
  ktab[4] = 44;
  for(auto i : ktab) std::cout << ktab[i] << " ";
  std::cout <<ktab[4];
return 0;
}


Ohjelma on kännetty näin
Koodia: [Valitse]
g++ -std=c++20 -pedantic koe.cpp -o koe

Käännös ja suoritus menevät hyvin, mutta tulostus on tällainen
Koodia: [Valitse]
0 0 0 0 0 0 0 0 0 0 44

Ajatuksena on, että taulukon kohdan 4 pitäisi näkyä myös for-osassa. Eikö automaattinen for toimikaan säilöjen ulkopuolella, virheilmoituksia eikä varoituksia kuitenkaan tule.

Olisiko tällainen kesäpähkinä sopiva: Etsi  virhe edellä esitetyssä päättelyssä     




3

Kiitos esismerkistä, pitääpä katsoa javascript-vaihtoehtoa  :)

4

Vielä ei ole mitään koodia, mietinnässä on, millaista koodia pitäisi kokeilla. Netistä löytyi asiaan liittyviä linkkejä haulla:   c++ linux memory pool free

Luultavasti järjestelmältä varataan muistia lohkoina ja vaikka yksittäisiä olioita poistetaan, se ei suoraan heti näy järjestelmälle.

5
Lainaus
Pitäisi vertailla kahta eri tekstitiedostoa rinnakkain. Saan ne auki vain yhden kerrallaan niin että toinen on näkymättömissä ja molemmat ovat yhden tiedoston sisällä.

Miten saat auki kaksi tiedostoa niin, että ne ovat yhden tiedoston sisällä, mikä silloin avautuu, voivatko tiedostot olla toistensa sisällä?

Joskus olen yrittänyt vertailla joitain tiedostoja tavallisen takstinkäsittelyohjelman kanssa, mutta se on aika hankalaa. Olisi hyvä, jos niissä ohjelmissa olisi juuri se vertailutoiminto. Eli mielenkiintoinen aihe. Jotkut bash-komennot osannevat vertailla?

6
Kiitos linkistä, pitääpä käydä tutkimassa  :)

Siitä tiedosta voi olla apua, jos ei muuten selviä, miten ja milloin deletoidut oliot vapauttavat viemänsä tilan järjetelmälle. Muistinkulutuksen seuraamisen avulla voisi ehkä arvailla, milloin olioiden tila vapautuu.

Mutta parempi tietysti olisi, jos deletoitujen olioiden viemän tilan vapautumisesta  löytyisi suoraan tietoa. Koneessa on aika vähän muistia ja olisi toive, että oman ohjelman voisi jättää turvallisesti ajoon eikä se veisi turhaan muistitilaa ainakaan deletoitujen olioiden osalta.


7

Jos c++:ssa tehdään paljon objecteja listaan tai mappiin ja ne tuhotaan, niin milloin ja missä vaiheessa ne oikeasti vapautuvat käyttikselle eivätkä enää kuulu ohjelman muistitilaan.

Luultavasti on niin, että yksi merkkijonoobjecti listassa tai mapissa ei vapautuessaan näy käyttiksessä, mutta milloin iso määrä vapautettuja stringejä näkyisi. Millä tavalla c++ oikeasti varaa muistia ohjelmalle, ehkä jonkilaisina muistilohkoina tms?

Onnistuisiko käytännössä ohjelman muistinkäytön seuraaminen system monitorilla vai onko olemassa joku sopiva käyttiskomento ohjelman kulloinkin viemän muistimäärän seuraamiseksi.


8
Pikatestillä Libreofficella voi tallentaa myös html muodossa.

Niin tosiaan voi, mutta en onnistunut saamaan kahta palstaa näkymään kahtena palstana sitten selaimella tekstin avauduttua.

Lainaus
HTML-sivua voi vierittää niin pitkälle kuin tekstiä riittää, ja kehyksien avulla pidetään osa sivusta paikallaan kun toista osaa vieritetään. See ei ole mitenkään verrattavissa niihin palstiohin joita paperiarkeille tehdään, joten en ymmärrä minkälaista palstojen käyttöä teele oikein HTML:stä etsii?

Alkuperäinen kysymys oli ehkä vähän epätäsmällisesti muotoiltu. Toiveena olisi kaksi riippumatonta palstaa, jolloin teksti toisessa palstassa ei koskaan kulkeudu eikä muutenkaan kulkeude toiseen palstaan. Ensimmäisessä palstassavoisi olla vaikka 5 riviä ja toisessa 80 tai miten paljon vain sinne haluaa kirjoittaa, eikä sen rivimäärä vaikuttaisi toisen palstan näkymään millään tavalla.

Netissä ehdotettiin taulukoita, mutta huomautettiin niitten kuitenkin olevan vähän kömpelöitä tekstikäyttöön.

html:llä voi tehdä kaksi palstaa niin kuin tämän säikeen ekassa vastauksessa kerrotaan, mutta en vielä ole onnistunut tekstinkäsittelemään tällaista sivua libreoffikella ja sitten tallentamaan sitä v a i n teksti muokattuna mutta asettelu entisellään.

Tavoite olisi siis html-sivu, jonka toista palstaa voi muokata tekstinkäsittelyllä näkymän pysyessä kaksipalstaisena niin muokatessa kuin sitten tallennettaessa sivu html-muotoisena tekstinkäsittelystä.

9

Samantyylistä ratkaisua kuin vastauksessakin joutuu varmaan toistaiseksi käyttämään. Sarakkeita html-muotoisena lukevaa ja kirjoittavaa tekstinkäsittelyohjelmaa ei vielä taida olla jakelussa.

Kiitos vastauksesta :)

10
Olisiko jotain tekstinkäsittelyohjelmaa, joka osaisi tehdä vaikka kaksipalstaista html-koodia. Kokeilujen mukaan palstat eivät onnistu libreofficen tekstinkäsittelyllä, muistaakseni ei kumpaankaan suuntaan.

Ehkä on joku muu tapa kirjoittaa suunnilleen oikein myös selaimessa näkyvä sivu, joku sivusto tms?

11

Tällekin ongelmalle on siis ratkaisu. Toisen indexin paikka on käyttäjän kotihakemistossa, toisen paikka on alihakemistossa, jossa ei ole käyttäjän piilotiedostoja. Tällainen selitys ei tullut heti mieleen, kun piilotiedostot eivät tule usein esille tiedostoselaimella tai perus ls:llä hakemistoja katsellessa.

Kiitos vastauksesta :)

12
Kokeilin php:n scandi-komentoa

Koodia: [Valitse]
$my_files = array_slice(scandir( "./" ), 2);
slice on mkana vain poistamassa ylähakemistomerkintöjä eli ./ ja ../  -sanat tuloksesta, muuten näkyy hakemiston tiedostot. Näin toivoisinkin asian olevan, ja näin php toimii toisella virtuaalidomainilla pilvikoneessa.

Mutta sama komento toisessa domainissa tulostaa lisäksi selaimessa

Koodia: [Valitse]
bash logout
bashrc
cache
cloud-locale-test
gnupg
local
profile

Mielestäni laitoin ihan samanlaisena php-sivun kumpaankin virtuaalidomainin indexinä.

Olisiko virtuaalidomaineilla joitain säätöjä, joita pitäisi muutella, mutta miksi ne olisivat erilaisia, en ainakaan tietääkseni ole ollut asian kanssa missään tekemisissä aikaisemmin enkä ole yrittänyt mitään muutoksia tehdä.




13
php:llä pitäisi korvata pikku pätkä nettisivun tekstiä. Tämä versio ei näytä toimivan

Koodia: [Valitse]

<?php

function replaceVariable($body$s$e$replacement)
{
  while(
strpos($body$s) )
  {
    
$start strpos($body$s);
    
$end strrpos($body$e);
    
$body substr_replace($body,  $replacement $start+4$end-$start+4);
  }
  return 
$body;
}

$var "333 uusiotsikko 444";
$body file_get_contents(&#39;index2.html&#39;);
$newBody1 replaceVariable($body"333 "" 444" ,$var); 
file_put_contents(&#39;index3.html&#39;, $newBody1 );
?>



Ongelma vaikuttaa olevevan se, että korvattavan alussa on sama tokeni kuin korvaavassa tekstissä vaikka lisäyspaikan alkua on kokeilun takia jopa siirretty 4 merkkiä eteen päin.

Käytännön ongelma voisi olla vaikka tällainen

<h1>  vanha otsikko </h1> 

halautaan korvata nettisivulla tekstillä

<h1> uusi otsikko </h1>

Kokeilujen mukaan ongelma on se, että korvattava pätkä alkaa samalla tokenillä kuin korvaava. Kyse lienee niin yleisestä toimesta, että sen pitänee hoitua helposti eli tässä yrittämässäni versiossa on varmaan jotain periaatteellista häikkää.

Miten oikeassa nettimaailmassa uusittaisiin php:llä joku otsikko nettisivulla.

Muokk.

Kahden tokenin rajoittaman tekstin korvaaminen näyttäisi onnistuvan kikkailun avulla

Koodia: [Valitse]
function replaceVariable($body, $s, $e, $replacement)
{
  while(strpos($body, $s) )
  {
    $start = strpos($body, $s);
    $end = strrpos($body, $e);
    $body = substr_replace($body,  $replacement , $start, $end-$start+4);
  }
  return $body;
}

$var = "555 uusiotsikko 444";
$body = file_get_contents('index2.html');
$newBody1 = replaceVariable($body, "333 ", " 444" ,$var); //////// äääääääääääääääääääääääääääääääääääääää
$var = "333 uusiotsikko 444";
$newBody2 = replaceVariable($newBody1, "555 ", " 444" ,$var);
file_put_contents('index3.html', $newBody2 );


Mutta luulisin, että asia on niin yleinen, että sen hoitamiseen ei tarvita kikkailua. En oikein uskaltaisi tällaisessa tilanteessa laittaa säiettä ratkaistuksi.



14
Tarvitseeko zoom, teams tai jitsi javascriptin päälle tai perustuuko keskusteluvälitys pelkkään html 5:een. Jitsi voi ainakin vaatia javascriptiä, mutta onko kyse teknisestä vaatimuksesta vai sivun pitäjän halusta saada javascript päälle.

Mieluusti pitäisi javascriptin pois päältä, jos sitä ei oikeesti tarviata.



15
valgrind on itselleni uutta ja luultavasti hyödyllistäkin tietoa, pitääpä tutustua aiheeseen.

kiitoksia vihjeestä  :)


Muokk.

pikaisella lukemisella näyttää siltä, että muistintarkistusohjelmat osaavat etsiä vapauttamattomia muistialueita, new  -peräisiä tai mallocoituja tai alueita, joihin on osoite, vaikka osoitetta tai aluetta käytetä enää.

Tällaiset tapaukset ovat vähän kuin ohjelmoijan huolimattomuusvirheitä. Hakemiston tapauksessa std-oliot vapautetaan luultavastikin oman koodin osalta. Mutta jos avaimien hännät ovat eripituisia, vapautettavat muistipätkät ovat erimittaisia ja sijaitsevat siellä täällä koneen muistitilassa.

Pirstaloituva muisti pitäisi kai jotenkin siivota yhtenäiseksi. Toivottavasti kääntäjän tekijät ovat ottaneet asian huomioon?


16

Kysymyksenä oli, vapauttaako c++ oikeasti muistia, kun hakemistoon lisäillään ja sieltä poistellaan avaimia täysin eripituisine häntineen.

Nettiselvittelyn perusteella näyttäisi siltä,

https://lemire.me/blog/2020/03/03/calling-free-or-delete/

https://notes.secretsauce.net/notes/2016/04/08_glibc-malloc-inefficiency.html

https://www.geeksforgeeks.org/delete-and-free-in-cpp/

että vastaus voisi olla muotoa "Saattaapi vapauttaa mutta saattaapi olla vapauttamattakin" eli asia riippuu vapautettavista kooista ja kääntäjän parametreista.

malloc_trim -komennolla voinee vaikuttaa vapauttamistoimintoon, mutta silläkin on omat parametrinsa.

Mielenkiintoinen kokeilu olisi, millaisilla häntäpituuksilla ja malloc_trim -parametrien arvoilla päästäisiin surimpaan tai pieneimpään muistirohmuamiseen.

Mutta ehkä kysymys on ratkennut niin paljon, kuin se harrastelijan kannalta voi ratketa, joten uskaltanen laittaa sen ratkaistuksi?


17
Hakemisto on tosiaan muotoa

std::map<std::string, std::vector<std::string>>

niin kuin vastauksessa.

Kun tästä hakemistosta poistellaan avaimia eripituisine häntineen, niin muistitilaan syntryy erikokoisia koloja, koska poistojärjestys voi olla mikä vain. c++ vapauttaa poistetun tilan, mutta mitä oikeasti tapahtuu muistiavaruuden alueessa, joka sisältää eripituisia vapaita pätkiä siellä täällä. Miten c++ osaa ne hyödyntää tai pirstoukuuko muisti vain ja tarvittava uusi muistitila oteaan uudelta, käyttämättömältä alueelta.



18
On kohtalainen joukko merkkijonoalkioita, joita laitetaan c++ sdt:map:iin niin, että yksi alkio on avain ja sen häntänä on vaihtelevan pituinen vektori muita joukon merkkijonoalkioita.

Mikä tahansa joukon merkkijono voi olla avaimena ja mitkä tahansa muut merkkijonoalkiot voivat kuulua sen häntään.

Kun mikä tahansa avaimena oleva merkkijonoalkio tekee muutoksia häntäänsä, hakemistossa korvataan sille uusi, muutettu häntä eli koko avain-häntä-pari korvataan uudella avain-häntä-parilla hakemistossa.

Vanhasta hännästä taitaa tulla roskaa. Osaako std:map huolehtia roskistaan vai jääkö se ohjelmoijan tehtäväksi. Mitä tapahtuu, jos map-rakenteessa muutetaan ja korvaillaan häntiä pitkä aika, kerääntyvätkö roskat jonnekin?



19

Oma ajatusvirhe selvästi. Kaksi vektori-iteraattoria tuntuivat niin ilmeisiltä vektorin alustusparametreila, että en ymmärtänyt, että melkein minkä tahansa itsekin määritellyn tyypin muodostimessa voisi olla kaksi vektori-iteraattoria. Se, että ne sopivat vektorin alustusparametreiksi, ei tietenkään tarkoita, että ne sopivat vain vektorin alustusparametreiksi.

Kiitoksia :)

20
Netin ohjesivulla

https://www.tutorialspoint.com/cpp_standard_library/cpp_vector_range_constructor.htm

on hyvä esimerkkiohjelma, jonka voi kääntää suoraan sivulla. Tässä ohjelmassa vektorin v2 esittely ei toimi autona, vaikka näyttäisi, että kääntäjällä on tarpeeksi tietoa vektorin tyypin määrittelmiseksi. Yritin saada siistimmän näköistä ohjelmakoodia auton kanssa, mutta ei siis onnistu.

Mikä auton rajoite tässä kohtaa voisi olla kyseessä, miksi auto ei toimi. Kääntäjä antaa kyllä pitkät selitykset, mutta en oikein osaa niitä liiemmälti tulkita.

Tässä on alkuperäinen ohjelma, joka toimii

Koodia: [Valitse]
#include <iostream>
#include <vector>

using namespace std;

int main(void) {
   vector<int> v1(5);

   /* assigned value to vector v1 */
   for (int i = 0; i < v1.size(); ++i)
      v1[i] = i + 1;

   /* create a range constructor v2 from v1 */
   vector<int> v2(v1.begin(), v1.end());

   for (int i = 0; i < v2.size(); ++i)
      cout << v2[i] << endl;

   return 0;
}

ja tässä autoversio, joka ei toimi


Koodia: [Valitse]
#include <iostream>
#include <vector>

using namespace std;

int main(void) {
   vector<int> v1(5);

   /* assigned value to vector v1 */
   for (int i = 0; i < v1.size(); ++i)
      v1[i] = i + 1;

   /* create a range constructor v2 from v1 */
   auto v2(v1.begin(), v1.end());

   for (int i = 0; i < v2.size(); ++i)
      cout << v2[i] << endl;

   return 0;
}



Sivuja: [1] 2 3 ... 42