Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 20 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
malloc retazec

Registrovaný: 18.12.06
Prihlásený: 12.09.13
Príspevky: 31
Témy: 8
Príspevok NapísalOffline : 27.01.2012 20:14

Ahojte, mal by som otazku, ze ako alokujem pamat pre pole znakov ked este nepoznam aku dlzku textu zada uzivatel.

Dik


Offline

Užívateľ
Užívateľ
malloc retazec

Registrovaný: 01.10.06
Prihlásený: 19.04.24
Príspevky: 6562
Témy: 15
Bydlisko: Bratislava
Príspevok NapísalOffline : 27.01.2012 22:49

To sa robi tak ze naalokujes char pole velkosti X trebars 100znakov
Potom citas vstup a v priupade ze presiahne velkost pola naalokujes nove pole povedzme 2*X obsah stareho prekopirujes do noveho a das free stare a dalej citas ked zas narazis na obmedzenie velkosti spravis zas toto.
Co takeho citas ze ti tam moze zadat neobmedzenu dlzku lebo ked zrovna naallocujes char pole 1000 alebo aj 10 000 tak to nie su zat tak obrovske velkosti pamate a v 99% ti to bude stacit







_________________
PC: Intel Q6600@3,33GHz, MSI GTX 670 OC (TwinFrozr IV), DDR2 1066 A-data 8Gb, Seagate Barracuda 7200.12 2000GB, Kingston 240GB SSD, Gigabyte EP35-DS4, MSI OPTIX G273QF , Logitech G502 Proteus Spectrum
Notebook: Sony VAIO CW Series (VPC-CW1S1E/B) / LENOVO Legion 5 Pro 16ACH6H Stingray White || Mobil: Samsung Galaxy S21 FE || Auto: Audi S5 Sportback
Offline

Užívateľ
Užívateľ
malloc retazec

Registrovaný: 18.12.06
Prihlásený: 12.09.13
Príspevky: 31
Témy: 8
Príspevok Napísal autor témyOffline : 27.01.2012 22:55

mozes prosimta nejaky jednoduchy priklad? dik


Offline

Užívateľ
Užívateľ
malloc retazec

Registrovaný: 01.10.06
Prihlásený: 19.04.24
Príspevky: 6562
Témy: 15
Bydlisko: Bratislava
Príspevok NapísalOffline : 27.01.2012 23:05

Kód:
void funkcia()
{
char *a, *b;
char c;
int i=0, j, k=1;
a=(char *)malloc(1000* sizeof(char));
while((c=getchar())!='\n');  // citam vstup kym pouzivatel nezada enter
  {
     i++;
     if(i>=(1000*k))
         {
             k++;
             b=(char *)malloc(k*1000* sizeof(char));
             for(j=0;j<(1000*k);j++)
                 {
                      b[j]=a[j];       
                 }
             free(a);
             a=b;          // toto si uz nepamatam proste treba priradit adresu pointera b do pointera a
         }
     a[i]=c;
  }

}



Mohlo bz to bzt cosi taketo ya spravnost nerucim







_________________
PC: Intel Q6600@3,33GHz, MSI GTX 670 OC (TwinFrozr IV), DDR2 1066 A-data 8Gb, Seagate Barracuda 7200.12 2000GB, Kingston 240GB SSD, Gigabyte EP35-DS4, MSI OPTIX G273QF , Logitech G502 Proteus Spectrum
Notebook: Sony VAIO CW Series (VPC-CW1S1E/B) / LENOVO Legion 5 Pro 16ACH6H Stingray White || Mobil: Samsung Galaxy S21 FE || Auto: Audi S5 Sportback
Offline

Skúsený užívateľ
Skúsený užívateľ
malloc retazec

Registrovaný: 11.01.09
Prihlásený: 18.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 27.01.2012 23:15

@MTK: to nie je velmi mudre riesenie, nehovoriac o zbytocnej komplikacii.

@Carm@gedon: pouzi funkciu realloc. Priklad:
Kód:
#include <stdio.h>
#include <stdlib.h>

int main()
{

    int     count = 0;
    char    c = '\0';
    char    *string = NULL;

    printf( "Type some text: " );

    while ( c != '\n' )
    {
        c = getchar();
        count++;
        string = realloc( string, count * sizeof( char ) );
        string[count-1] = c;
    }

    string[count-1] = '\0';
    printf( "Text is: %s\n", string );

    free( string );
    return 0;

}


Offline

Užívateľ
Užívateľ
malloc retazec

Registrovaný: 18.12.06
Prihlásený: 12.09.13
Príspevky: 31
Témy: 8
Príspevok Napísal autor témyOffline : 28.01.2012 9:22

dik skusim ... aspon mam nejaku predstavu

// pridané po 10 hodinách 5 minútach od posledného príspevku

Fico píše:
@MTK: to nie je velmi mudre riesenie, nehovoriac o zbytocnej komplikacii.

@Carm@gedon: pouzi funkciu realloc. Priklad:
Kód:
#include <stdio.h>
#include <stdlib.h>

int main()
{

    int     count = 0;
    char    c = '\0';
    char    *string = NULL;

    printf( "Type some text: " );

    while ( c != '\n' )
    {
        c = getchar();
        count++;
        string = realloc( string, count * sizeof( char ) );
        string[count-1] = c;
    }

    string[count-1] = '\0';
    printf( "Text is: %s\n", string );

    free( string );
    return 0;

}

ked dam free( pole ); alebo free((void*)pole); tak mi hodi chybu :
Kód:
http://img864.imageshack.us/img864/6641/beznzvuz.png

ale ked nedam vobec free tak to ide v poho :P
a v poslednom string[count-1] = '\0'; ma byt asi len [count] :)


Offline

Užívateľ
Užívateľ
malloc retazec

Registrovaný: 01.10.06
Prihlásený: 19.04.24
Príspevky: 6562
Témy: 15
Bydlisko: Bratislava
Príspevok NapísalOffline : 28.01.2012 9:53

FICO mas pravdu realloc je na to lepsi ale ja som to v zivote nepotreboval zatial tak som mu napisal to co som si pamatal. Inak vzhladom na rychlost behu programu by bolo lepsie keby sa ten reallock nevolal po kazdom nacitani pismenka ale kazdych N nacitani a vzdy sa reallocoval vacsi kus pamate.

Ak pouzivas ten retazec aj po prikaze free tak vtedy to hadze chybu. Ono sa to miesto aj tak uvolni po skonceni behu programu







_________________
PC: Intel Q6600@3,33GHz, MSI GTX 670 OC (TwinFrozr IV), DDR2 1066 A-data 8Gb, Seagate Barracuda 7200.12 2000GB, Kingston 240GB SSD, Gigabyte EP35-DS4, MSI OPTIX G273QF , Logitech G502 Proteus Spectrum
Notebook: Sony VAIO CW Series (VPC-CW1S1E/B) / LENOVO Legion 5 Pro 16ACH6H Stingray White || Mobil: Samsung Galaxy S21 FE || Auto: Audi S5 Sportback
Offline

Skúsený užívateľ
Skúsený užívateľ
malloc retazec

Registrovaný: 11.01.09
Prihlásený: 18.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 28.01.2012 10:09

Carm@gedon píše:
ked dam free( pole ); alebo free((void*)pole); tak mi hodi chybu :

Si si isty, ze si opisal tento moj kod spravne ??? Ukaz tvoju cast kodu : pretoze som to skusal a testoval som to aj na memory leaks, cize na mojej strane problem nie je ...

MTK píše:
by bolo lepsie keby sa ten reallock nevolal po kazdom nacitani pismenka ale kazdych N nacitani a vzdy sa reallocoval vacsi kus pamate.

To si nemyslim. Ty predsa nevies, kolko znakov zada uzivatel. Alokujem velku pamat, uzivatel zada jeden znak a ja zbytocne musim prealokovat pamat. Tento sposob, ktory som napisal, alokuje stale potrebnu a presnu velkost pamate, bez akehokolvek plytvania. Po dalsie, predstav si, ze programujes program pre mikrokontroler. Je absolutne nemyslitelne alokovat obrovske bloky pamate ( 1000 bajtov, ako v tvojom priklade ), co ak uz nie je dostatok pamate a co ak nam bude statci len paru bajtov? A este ak spominas rychlost - dokazes stlacat klavesy rychlejsie, ako procesor vykona funkciu realloc? Ja nie :)

MTK píše:
Ono sa to miesto aj tak uvolni po skonceni behu programu

Toto tvrdenie nie je spravne a je obrovskou chybou programatora. Ak neuvolnis alokovanu pamat alokovanu cez malloc/realloc/calloc, tato pamat sa neuvolni az do restartu systemu. Takze na to velky pozor.


Offline

Užívateľ
Užívateľ
malloc retazec

Registrovaný: 18.12.06
Prihlásený: 12.09.13
Príspevky: 31
Témy: 8
Príspevok Napísal autor témyOffline : 28.01.2012 10:42

Kód:
#include <stdio.h>
#include <iostream>
#include <time.h>
char vymen (char *pole){
   
   int i,dlzka;
   char temp;
   
   dlzka=strlen(pole);
   
   for(i=0;i<dlzka/2;i++){

      temp=pole[i];
      pole[i]=pole[dlzka-1-i];
      pole[dlzka-i-1]=temp;
   }
   
return 0;
}


int main(){

   char *pole='\0';
   int c,znaky=0,i=0;
printf("zadaj text\n");
while((c=getchar())!='\n'){
      znaky++;
      pole=(char*)realloc(pole,znaky*sizeof(char));
      pole[i]=c;
      i++;
   
}
pole[i]='\0';
printf("POLE PRED PREVRATENIM: %s\n",pole);
vymen(pole);
printf("POLE PO PREVRATENI: %s\n",pole);
free((void*)pole);

system("PAUSE");
return 0;
}

program prehodi retazec => 'AHOJ'->'JOHA'


Offline

Skúsený užívateľ
Skúsený užívateľ
malloc retazec

Registrovaný: 11.01.09
Prihlásený: 18.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 28.01.2012 11:00

Ved to nerobi problemy, nepada to. Ale tu premennu i tam mas zbytocne - ak si ju pridal iba kvoli tomu, ze ti to neslo, tak si to mohol spravit, ako som pisal, cize takto:
Kód:
while( c!='\n' ) {
      c=getchar();
      znaky++;
      pole=(char*)realloc(pole,znaky*sizeof(char));
      pole[znaky-1]=c;
}
pole[znaky-1]='\0';


Offline

Užívateľ
Užívateľ
malloc retazec

Registrovaný: 18.12.06
Prihlásený: 12.09.13
Príspevky: 31
Témy: 8
Príspevok Napísal autor témyOffline : 28.01.2012 11:26

Fico píše:
Ved to nerobi problemy, nepada to. Ale tu premennu i tam mas zbytocne - ak si ju pridal iba kvoli tomu, ze ti to neslo, tak si to mohol spravit, ako som pisal, cize takto:
Kód:
while( c!='\n' ) {
      c=getchar();
      znaky++;
      pole=(char*)realloc(pole,znaky*sizeof(char));
      pole[znaky-1]=c;
}
pole[znaky-1]='\0';

nie nepridal som ju kvoli tomu a viem ze je zbytocna...to neries... ale mne to pada ked tam dam to free... v com to kompilujes? ja vo visual 2010


Offline

Skúsený užívateľ
Skúsený užívateľ
malloc retazec

Registrovaný: 11.01.09
Prihlásený: 18.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 28.01.2012 11:41

gcc. Skontrolovane valgrindom, ziadne pamatove problemy. Vsimol som si ale jeden vec v tvjomo kode: pridaj si hlavicku:
Kód:
#include <stdlib.h>

a skus znova skompilovat a spustit.


Offline

Užívateľ
Užívateľ
malloc retazec

Registrovaný: 18.12.06
Prihlásený: 12.09.13
Príspevky: 31
Témy: 8
Príspevok Napísal autor témyOffline : 28.01.2012 12:17

Fico píše:
gcc. Skontrolovane valgrindom, ziadne pamatove problemy. Vsimol som si ale jeden vec v tvjomo kode: pridaj si hlavicku:
Kód:
#include <stdlib.h>

a skus znova skompilovat a spustit.

nejde to aj tak... :(


Offline

Skúsený užívateľ
Skúsený užívateľ
malloc retazec

Registrovaný: 11.01.09
Prihlásený: 18.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 28.01.2012 12:37

Skus tento moj program skompilovat, bez zmeny, ci pojde --> http://www.pcforum.sk/malloc-retazec-vt ... ml#1188662

Ja som tvoj program preletel len narychlo, ci ide. Ziadne chyby som nedostal. Vecer sa na to pozriem blizsie, teraz nemam dostatok casu. No ak ti nepojde ani moj hore uvedeny kod, tak potom ti pomoct neviem, nepouzivam microsoft kompilator.


Offline

Užívateľ
Užívateľ
malloc retazec

Registrovaný: 18.12.06
Prihlásený: 12.09.13
Príspevky: 31
Témy: 8
Príspevok Napísal autor témyOffline : 28.01.2012 13:59

Fico píše:
Skus tento moj program skompilovat, bez zmeny, ci pojde --> http://www.pcforum.sk/malloc-retazec-vt ... ml#1188662

Ja som tvoj program preletel len narychlo, ci ide. Ziadne chyby som nedostal. Vecer sa na to pozriem blizsie, teraz nemam dostatok casu. No ak ti nepojde ani moj hore uvedeny kod, tak potom ti pomoct neviem, nepouzivam microsoft kompilator.

ten tvoj ide v poho az na to ze ten realloc mus byt
Kód:
string =(char*) realloc( string, count * sizeof( char ) );

inak ten eror mi nehodi..


Offline

Skúsený užívateľ
Skúsený užívateľ
malloc retazec

Registrovaný: 11.01.09
Prihlásený: 18.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 29.01.2012 13:14

Jasne, ak kompilujes pre C++, navratova hodnota realloc treba pretypovat. V cistom C by sa pretypovat nemala, ja som ti zasielal ukazku v C, kedze podla nazvu temy ( malloc ) pracujes s C.

K problemu: pod g++ mi ziadne chyby nehadze, po kontrole valgrindom vypise:
Citácia:
All heap blocks were freed -- no leaks are possible


Takze ti pomoct neviem. Skus sa pohrat s debuggerom, krokuj program a zisti kde pada, aku hodnotu ma pointer pole na riadku, kde sa uvolni, atd. Skus napr vynechat volanie funkcie vymen, atd atd. Viac ti poradit nedokazem, nakolko mne to bezi v poriadku. Jedine, co som musel pridat do programu, aby sa vobec skompiloval ( nechapem, co za mix kniznic to microsoft ma, ale budis... ) su tieto hlavicky:
Kód:
#include <stdlib.h>
#include <string.h>


Offline

Užívateľ
Užívateľ
malloc retazec

Registrovaný: 18.12.06
Prihlásený: 12.09.13
Príspevky: 31
Témy: 8
Príspevok Napísal autor témyOffline : 29.01.2012 14:49

Fico píše:
Jasne, ak kompilujes pre C++, navratova hodnota realloc treba pretypovat. V cistom C by sa pretypovat nemala, ja som ti zasielal ukazku v C, kedze podla nazvu temy ( malloc ) pracujes s C.

K problemu: pod g++ mi ziadne chyby nehadze, po kontrole valgrindom vypise:
Citácia:
All heap blocks were freed -- no leaks are possible


Takze ti pomoct neviem. Skus sa pohrat s debuggerom, krokuj program a zisti kde pada, aku hodnotu ma pointer pole na riadku, kde sa uvolni, atd. Skus napr vynechat volanie funkcie vymen, atd atd. Viac ti poradit nedokazem, nakolko mne to bezi v poriadku. Jedine, co som musel pridat do programu, aby sa vobec skompiloval ( nechapem, co za mix kniznic to microsoft ma, ale budis... ) su tieto hlavicky:
Kód:
#include <stdlib.h>
#include <string.h>

pracujem s C
slusim to skompilovat v dev++
inak nevies este ze co vypise napr:
*(str)+1 //neni to nahodou blbost ?
Dik

//edit: v Dev mi to ide v pohode, tak nieco vo Visualku bude zle... :/


Offline

Skúsený užívateľ
Skúsený užívateľ
malloc retazec

Registrovaný: 11.01.09
Prihlásený: 18.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 29.01.2012 15:12

Ak pracujes s C, tak nemozes pripojit hlavicku <iostream>, ta je totiz pre jazyk C++. Taktiez plati to, ze by si nemal pretypovat navratove hodnoty malloc/realloc/calloc a treba pripojit kniznice, ktore som uviedol. Visual Studio zrejme podla iostream usudilo, ze ide o C++ kod a tak ho potom aj kompilovalo, preto tie chyby.
Zapis *(str)+1 je chybny, nemal si namysli *(str+1) ? Ak ano, tak je to ekvivalent zapisu str[1];


Offline

Užívateľ
Užívateľ
malloc retazec

Registrovaný: 18.12.06
Prihlásený: 12.09.13
Príspevky: 31
Témy: 8
Príspevok Napísal autor témyOffline : 29.01.2012 23:43

Fico píše:
Ak pracujes s C, tak nemozes pripojit hlavicku <iostream>, ta je totiz pre jazyk C++. Taktiez plati to, ze by si nemal pretypovat navratove hodnoty malloc/realloc/calloc a treba pripojit kniznice, ktore som uviedol. Visual Studio zrejme podla iostream usudilo, ze ide o C++ kod a tak ho potom aj kompilovalo, preto tie chyby.
Zapis *(str)+1 je chybny, nemal si namysli *(str+1) ? Ak ano, tak je to ekvivalent zapisu str[1];

ne prepac... pomylil osm sa ma to byt (*str)+1... to as vrati prvy znak pola a pripocita k nemu +1 nie?
cize napr mam pole "AHOJ " tak vrati A+1 a to je B ... je to spravne ?
//edit: uz viem preco mi hadze error... lebo pre '\0' nieje alokovane miesto v poli :)


Offline

Skúsený užívateľ
Skúsený užívateľ
malloc retazec

Registrovaný: 11.01.09
Prihlásený: 18.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 30.01.2012 9:55

Carm@gedon píše:
cize napr mam pole "AHOJ " tak vrati A+1 a to je B ... je to spravne ?

Ano, spravne. (*str) == str[0], cize znak na danej adrese. A ak uz pripocitas nejaku hodnotu k znaku, tak to bude znak z danou ASCII hodnotou.


Odpovedať na tému [ Príspevkov: 20 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. [C] malloc()

v Assembler, C, C++, Pascal, Java

29

634

29.11.2014 16:37

chrono Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. c# retazec

v Technológia .NET

2

1536

23.08.2009 13:19

piton55 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. C a retazec

v Assembler, C, C++, Pascal, Java

9

639

09.01.2011 14:16

ethi1ca4l Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Výstup ako jeden reťazec

v PHP, ASP

1

348

09.08.2017 12:44

BX Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Assembler 8086 retazec odzadu

v Assembler, C, C++, Pascal, Java

5

718

26.04.2009 13:23

bbeni Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. skratit retazec na 10 znakov

v PHP, ASP

2

579

11.03.2010 18:27

1daemon1 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Retazec v podmienke, jazyk C

v Assembler, C, C++, Pascal, Java

2

450

05.01.2017 19:27

eversio Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ako najefektívnejšie rozdelit určitý retazec

v PHP, ASP

1

368

24.06.2009 8:33

Ďuri Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. C: z getchar() do char *retazec

v Assembler, C, C++, Pascal, Java

9

996

08.10.2010 11:54

Blackshadow Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ASEMBLER:Určte počet slov obsahujúcich reťazec ASM alebo asm

v Assembler, C, C++, Pascal, Java

7

1419

25.03.2011 10:07

dury26 Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra