Inicializace pole retezcu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Inicializace pole retezcu – C / C++ – Fórum – Programujte.comInicializace pole retezcu – C / C++ – Fórum – Programujte.com

 

Dusan R.
~ Anonymní uživatel
6 příspěvků
26. 8. 2008   #1
-
0
-

Ahoj,

potreboval bych vytvorit pole retezcu, do ktereho bych v metode main prekopiroval parametry dane pri spusteni pomoci prikazove radky.

Deklaruju nasldovne

char * params[];

Pote je treba pole inicializovat - to prave nevim jak.

A nakonec vytvorim v poli jednotlive retezce.
int i;

for (i = 0; i < argc; i++) strcpy(params[i], argv[i]);

Diky Dusan

Nahlásit jako SPAM
IP: 217.197.149.–
bukaj0
Věrný člen
26. 8. 2008   #2
-
0
-

Dusan R.
do ktereho bych v metode main prekopiroval parametry dane pri spusteni pomoci prikazove radky
Nějak nechápu účel takového pole :o) Vždyť ty parametry už jsou jednou uložené. Mohu se zeptat, k čemu je potřebuješ mít ještě někde jinde?

Pote je treba pole inicializovat - to prave nevim jak.
Alokuješ pole, např. pomocí malloc()[1], následně každou jeho pozici pro řetězec, který tam potřebuješ dát (strlen()[2] ti vrátí velikost původního řetězce bez posledního nulového bytu, alokace zase např. pomocí malloc()), a nakonec překopíruješ pomocí strcpy() (což už vlastně máš) řetězce z původních pozic do nových. Plus to bude chtít ošetření, kdyby nebyl dostatek paměti (malloc() vrátil NULL).

[1] http://www.cplusplus.com/reference/clibrary/cstdlib/malloc.html
[2] http://www.cplusplus.com/reference/clibrary/cstring/strlen.html

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Master
~ Anonymní uživatel
95 příspěvků
26. 8. 2008   #3
-
+1
-
Zajímavé

Tohle se musi udelat bud pres multidimenzní pole.Pokud budes mit konstatni velikost toho pole,tak neni problem ho vytvorit takhle:



#define MAX 10
char params[MAX][VELIKOST_BUFFERU]; //10radku o 10 znacich


Pokud to ovsem potrebujes delat dynamicky,tak tu mas trochu problem.Nejde totiz pouzit styl zapisu:



char params[argc][VELIKOST_BUFFERU]; //x radku o 10 znacich


Pro dynamicke vytvareni musis pouzit klicove slovo new.Ovsem c++ to ma trochu osemetne vyresene a musi se to delat v cyklu:



char *params = new char[argc];
for(int i = 0;i < argc;i++)
params[i] = new char[VELIKOST_BUFFERU];


Pak by melo fungovat:



for (i = 0; i < argc; i++)
strcpy(params[i][0], argv[i]);


Druhou moznosti pro vytvoreni multidimezniho pole je definovat si klasicke jednodimezni o velikost x*y.A pristupovat k jeho datum pomoci i*y + 0//ta nula je posunuti v ose x,jelikoz bereme cely string,beremeho ho od zacatku.
Tato metoda vyzaduje trochu promyslet parametry pro pristup na jednotlive prvky.Jestli budes mit zajem,muzu sem hodit svoji tridu pro praci s 2D a 3D poli.Ta je naprogramovana pomoci metody jednodimezniho pole.

Nahlásit jako SPAM
IP: 85.135.97.–
KIIV
~ Anonymní uživatel
8632 příspěvků
26. 8. 2008   #4
-
0
-

master proc pres vicerozmerne pole?

jednodussi verze je ze si vsechny parametry postupne ulozis do jednoho retezce oddelene tema \0 a kazdy zacatek si ulozis do jako ukazatel na retezec...


nebo kazdej sam ...
neco jako:



char ** args;
args = malloc( argc * sizeof(char *) );
for ( i=0 ; i < argc ; i++ ) {
args[i] = malloc( strlen(argv[i]) + 1 );
strcpy(args[i], argv[i]);
}


akorat to nemam overene jestli to pojede...

Nahlásit jako SPAM
IP: 77.237.136.–
KIIV
~ Anonymní uživatel
8632 příspěvků
26. 8. 2008   #5
-
0
-

a ovsem ... az to nebudes potrebovat tak vse uvolnit pomoci free :D nejprve ty retezce a na zaver to pole ukazatelu

Nahlásit jako SPAM
IP: 77.237.136.–
Dusan R.
~ Anonymní uživatel
6 příspěvků
26. 8. 2008   #6
-
0
-

To bukaj : K temto parametrum potrebuju pristupovat i z jinych souboru a trid, proto jsem se rozhodl vytvorit globalni promennou, nakopirovat do ni parametry, a z ostatnich souboru k nim pristupovat pomoci kvalifikatoru explicit. Jinak program pisu v C++, takze funkci malloc nepouzivam.

To Master : Diky za vycerpavajici opoved :) Ted v tom mam jasno.

Nahlásit jako SPAM
IP: 217.197.149.–
KIIV
~ Anonymní uživatel
8632 příspěvků
26. 8. 2008   #7
-
0
-

kdyz to pises v C++ tak proc nevyuzijes uz nejaky lepsi objekty? vector a string... zadny otravovani se s new a delete :D

Nahlásit jako SPAM
IP: 77.237.136.–
bukaj0
Věrný člen
26. 8. 2008   #8
-
0
-

Dusan R.
K temto parametrum potrebuju pristupovat i z jinych souboru a trid, proto jsem se rozhodl vytvorit globalni promennou
Dobře, ale nač to kopírování? Vždyť by stačilo vytvořit hlavičkový soubor, řekněme params.h:

extern int global_argc;

extern char **global_argv;

A v souboru s main() pak akorát incializuješ:
#include "params.h"


int main(int argc, char **argv)
{
global_argc = argc;
global_argv = argv;
...
}

Přikládám archiv s kódem pro větší názornost.

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Master
~ Anonymní uživatel
95 příspěvků
26. 8. 2008   #9
-
0
-

2 KIIV: jak jinak chces ulozit pole retezcu nez pres vicerozmerne pole?Navic tvoje reseni o jednom poli a retezcich s \0 je to same,co sem psal ja na konci jako jedna z moznosti.Navic tvuj kod je temer stejny jako muj.

Moznost co pise bukaj je taky dobra.Podle me je to vyhodnejsi.Dalsi moznosti jak bylo psane je ta trida vector.S ni by to mohlo taky krasne.

Nahlásit jako SPAM
IP: 85.135.97.–
KIIV
~ Anonymní uživatel
8632 příspěvků
26. 8. 2008   #10
-
0
-

To Master : sem to myslel na to neco[max][...] tj staticke vicerozmerne pole... jen sem to napsal blbe

Nahlásit jako SPAM
IP: 77.237.136.–
KIIV
~ Anonymní uživatel
8632 příspěvků
26. 8. 2008   #11
-
0
-

btw mam rad kdyz se lidi marne snazi treba o toto:

int pole[2][30] = { ... };

a pak chtej udelat toto: int ** ptr = pole ;
:smile6:

Nahlásit jako SPAM
IP: 77.237.136.–
Dusan R.
~ Anonymní uživatel
6 příspěvků
26. 8. 2008   #12
-
0
-

To bukaj : Tak tato moznostme vubec nenapadla. Je o jednodussi a elegantnejsi. Diky Dusan

Nahlásit jako SPAM
IP: 217.197.149.–
Master
~ Anonymní uživatel
95 příspěvků
26. 8. 2008   #13
-
0
-

2 KIIV: Aha,tak to jo :)

Nahlásit jako SPAM
IP: 85.135.97.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý