| Autor | Správa |
Carm@gedon
 Užívateľ
 Založený: 18.12.2006 Príspevky: 28
 | Zaslal: Pi 27.01.12 21:14 |   |
Ahojte, mal by som otazku, ze ako alokujem pamat pre pole znakov ked este nepoznam aku dlzku textu zada uzivatel.
Dik |
| |
  |
 |
MTK
 Užívateľ
 Založený: 01.10.2006 Príspevky: 2395 Bydlisko: Bratislava
 | Zaslal: Pi 27.01.12 23: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 |
_________________ Intel Q6600, Nvidia MSI 8800 GTS 512 OC, A-data 4Gb DDR2 1066, WD 500GB, Asus P5E X38, Samsung 225 BW,
Intel Q6600, Nvidia Gigabyte 8800GTS 512, Kingston 4GB DDR2 1066, WD 500GB, Gigabyte EP35-DS4, Philips 170S | |
  |
 |
Carm@gedon
 Užívateľ
 Založený: 18.12.2006 Príspevky: 28
 | Zaslal: Pi 27.01.12 23:55 |   |
mozes prosimta nejaky jednoduchy priklad? dik |
| |
  |
 |
MTK
 Užívateľ
 Založený: 01.10.2006 Príspevky: 2395 Bydlisko: Bratislava
 |
| 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 |
_________________ Intel Q6600, Nvidia MSI 8800 GTS 512 OC, A-data 4Gb DDR2 1066, WD 500GB, Asus P5E X38, Samsung 225 BW,
Intel Q6600, Nvidia Gigabyte 8800GTS 512, Kingston 4GB DDR2 1066, WD 500GB, Gigabyte EP35-DS4, Philips 170S | |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 |
@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;
} |
|
| |
   |
 |
Carm@gedon
 Užívateľ
 Založený: 18.12.2006 Príspevky: 28
 | Zaslal: So 28.01.12 10:22 |   |
dik skusim ... aspon mam nejaku predstavu
// pridané po 10 hodinách 5 minútach od posledného príspevku
| Fico napísal: | @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
a v poslednom string[count-1] = '\0'; ma byt asi len [count]  |
| |
  |
 |
MTK
 Užívateľ
 Založený: 01.10.2006 Príspevky: 2395 Bydlisko: Bratislava
 | Zaslal: So 28.01.12 10: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 |
_________________ Intel Q6600, Nvidia MSI 8800 GTS 512 OC, A-data 4Gb DDR2 1066, WD 500GB, Asus P5E X38, Samsung 225 BW,
Intel Q6600, Nvidia Gigabyte 8800GTS 512, Kingston 4GB DDR2 1066, WD 500GB, Gigabyte EP35-DS4, Philips 170S | |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: So 28.01.12 11:09 |   |
| Carm@gedon napísal: | | 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 napísal: | | 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 napísal: | | 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. |
| |
   |
 |
Carm@gedon
 Užívateľ
 Založený: 18.12.2006 Príspevky: 28
 | Zaslal: So 28.01.12 11: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' |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: So 28.01.12 12: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'; |
|
| |
   |
 |
Carm@gedon
 Užívateľ
 Založený: 18.12.2006 Príspevky: 28
 | Zaslal: So 28.01.12 12:26 |   |
| Fico napísal: | 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 |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: So 28.01.12 12:41 |   |
gcc. Skontrolovane valgrindom, ziadne pamatove problemy. Vsimol som si ale jeden vec v tvjomo kode: pridaj si hlavicku:
a skus znova skompilovat a spustit. |
| |
   |
 |
Carm@gedon
 Užívateľ
 Založený: 18.12.2006 Príspevky: 28
 | Zaslal: So 28.01.12 13:17 |   |
| Fico napísal: | gcc. Skontrolovane valgrindom, ziadne pamatove problemy. Vsimol som si ale jeden vec v tvjomo kode: pridaj si hlavicku:
a skus znova skompilovat a spustit. |
nejde to aj tak...  |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: So 28.01.12 13:37 |   |
Skus tento moj program skompilovat, bez zmeny, ci pojde --> http://www.pcforum.sk/malloc-retazec-vt128991.html#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. |
| |
   |
 |
Carm@gedon
 Užívateľ
 Založený: 18.12.2006 Príspevky: 28
 | Zaslal: So 28.01.12 14:59 |   |
| Fico napísal: | Skus tento moj program skompilovat, bez zmeny, ci pojde --> http://www.pcforum.sk/malloc-retazec-vt128991.html#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.. |
| |
  |
 |
|