| | |
| Stránka: 1 z 1
| [ Príspevkov: 20 ] | |
Autor | Správa |
---|
Registrovaný: 18.12.06 Prihlásený: 12.09.13 Príspevky: 31 Témy: 8 |
Ahojte, mal by som otazku, ze ako alokujem pamat pre pole znakov ked este nepoznam aku dlzku textu zada uzivatel.
Dik
|
|
Registrovaný: 01.10.06 Prihlásený: 19.04.24 Príspevky: 6562 Témy: 15 Bydlisko: Bratislava | Napísal MTK: 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 |
|
Registrovaný: 18.12.06 Prihlásený: 12.09.13 Príspevky: 31 Témy: 8 |
mozes prosimta nejaky jednoduchy priklad? dik
|
|
Registrovaný: 01.10.06 Prihlásený: 19.04.24 Príspevky: 6562 Témy: 15 Bydlisko: Bratislava | Napísal MTK: 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 |
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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;
}
|
|
Registrovaný: 18.12.06 Prihlásený: 12.09.13 Príspevky: 31 Témy: 8 |
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
a v poslednom string[count-1] = '\0'; ma byt asi len [count]
|
|
Registrovaný: 01.10.06 Prihlásený: 19.04.24 Príspevky: 6562 Témy: 15 Bydlisko: Bratislava | Napísal MTK: 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 |
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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.
|
|
Registrovaný: 18.12.06 Prihlásený: 12.09.13 Príspevky: 31 Témy: 8 |
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'
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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';
|
|
Registrovaný: 18.12.06 Prihlásený: 12.09.13 Príspevky: 31 Témy: 8 |
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
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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.
|
|
Registrovaný: 18.12.06 Prihlásený: 12.09.13 Príspevky: 31 Témy: 8 |
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...
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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.
|
|
Registrovaný: 18.12.06 Prihlásený: 12.09.13 Príspevky: 31 Témy: 8 |
Fico píše: Skus tento moj program skompilovat, bez zmeny, ci pojde --> http://www.pcforum.sk/malloc-retazec-vt ... ml#1188662Ja 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..
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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>
|
|
Registrovaný: 18.12.06 Prihlásený: 12.09.13 Príspevky: 31 Témy: 8 |
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... :/
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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];
|
|
Registrovaný: 18.12.06 Prihlásený: 12.09.13 Príspevky: 31 Témy: 8 |
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
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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.
|
|
| Stránka: 1 z 1
| [ Príspevkov: 20 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| [C] malloc() v Assembler, C, C++, Pascal, Java | 29 | 634 | 29.11.2014 16:37 chrono | | c# retazec v Technológia .NET | 2 | 1536 | 23.08.2009 13:19 piton55 | | C a retazec v Assembler, C, C++, Pascal, Java | 9 | 639 | 09.01.2011 14:16 ethi1ca4l | | Výstup ako jeden reťazec v PHP, ASP | 1 | 348 | 09.08.2017 12:44 BX | | Assembler 8086 retazec odzadu v Assembler, C, C++, Pascal, Java | 5 | 718 | 26.04.2009 13:23 bbeni | | skratit retazec na 10 znakov v PHP, ASP | 2 | 579 | 11.03.2010 18:27 1daemon1 | | Retazec v podmienke, jazyk C v Assembler, C, C++, Pascal, Java | 2 | 450 | 05.01.2017 19:27 eversio | | ako najefektívnejšie rozdelit určitý retazec v PHP, ASP | 1 | 368 | 24.06.2009 8:33 Ďuri | | C: z getchar() do char *retazec v Assembler, C, C++, Pascal, Java | 9 | 996 | 08.10.2010 11:54 Blackshadow | | 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 |
| 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
|
|