[ 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 | 8
NapísalOffline : 27.01.2012 20:14 | malloc retazec

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ý: 17.07.25
Príspevky: 6561
Témy: 15 | 15
Bydlisko: Bratislava
NapísalOffline : 27.01.2012 22:49 | malloc retazec

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 | 8
Napísal autor témyOffline : 27.01.2012 22:55 | malloc retazec

mozes prosimta nejaky jednoduchy priklad? dik


Offline

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

Registrovaný: 01.10.06
Prihlásený: 17.07.25
Príspevky: 6561
Témy: 15 | 15
Bydlisko: Bratislava
NapísalOffline : 27.01.2012 23:05 | malloc retazec

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ý: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 27.01.2012 23:15 | malloc retazec

@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 | 8
Napísal autor témyOffline : 28.01.2012 9:22 | malloc retazec

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ý: 17.07.25
Príspevky: 6561
Témy: 15 | 15
Bydlisko: Bratislava
NapísalOffline : 28.01.2012 9:53 | malloc retazec

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ý: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 28.01.2012 10:09 | malloc retazec

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 | 8
Napísal autor témyOffline : 28.01.2012 10:42 | malloc retazec

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ý: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 28.01.2012 11:00 | malloc retazec

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 | 8
Napísal autor témyOffline : 28.01.2012 11:26 | malloc retazec

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ý: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 28.01.2012 11:41 | malloc retazec

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 | 8
Napísal autor témyOffline : 28.01.2012 12:17 | malloc retazec

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ý: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 28.01.2012 12:37 | malloc retazec

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 | 8
Napísal autor témyOffline : 28.01.2012 13:59 | malloc retazec

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ý: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 29.01.2012 13:14 | malloc retazec

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 | 8
Napísal autor témyOffline : 29.01.2012 14:49 | malloc retazec

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ý: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 29.01.2012 15:12 | malloc retazec

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 | 8
Napísal autor témyOffline : 29.01.2012 23:43 | malloc retazec

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ý: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 30.01.2012 9:55 | malloc retazec

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.


 [ Príspevkov: 20 ] 


malloc retazec



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 Backend

29

773

29.11.2014 16:37

chrono

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

c# retazec

v Backend

2

1643

23.08.2009 13:19

piton55

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

C a retazec

v Backend

9

723

09.01.2011 14:16

ethi1ca4l

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

Assembler 8086 retazec odzadu

v Backend

5

823

26.04.2009 13:23

bbeni

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

Výstup ako jeden reťazec

v Backend

1

445

09.08.2017 12:44

BX

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

skratit retazec na 10 znakov

v Backend

2

648

11.03.2010 18:27

1daemon1

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

Retazec v podmienke, jazyk C

v Backend

2

546

05.01.2017 19:27

eversio

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

ako najefektívnejšie rozdelit určitý retazec

v Backend

1

433

24.06.2009 8:33

Ďuri

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

C: z getchar() do char *retazec

v Backend

9

1074

08.10.2010 11:54

Blackshadow

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 Backend

7

1534

25.03.2011 10:07

dury26



© 2005 - 2026 PCforum, edited by JanoF